X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/b311bee4b7600bfbf2500bfae0f994719c620a8e..96940cda03e7d46e1ce0b13d087122e157391a04:/includes/api/ApiDelete.php diff --git a/includes/api/ApiDelete.php b/includes/api/ApiDelete.php index 9431ad78..c4550a96 100644 --- a/includes/api/ApiDelete.php +++ b/includes/api/ApiDelete.php @@ -1,10 +1,10 @@ .@home.nl + * Copyright © 2007 Roan Kattouw .@home.nl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,12 +22,11 @@ * http://www.gnu.org/copyleft/gpl.html */ -if (!defined('MEDIAWIKI')) { +if ( !defined( 'MEDIAWIKI' ) ) { // Eclipse helper - will be ignored in production - require_once ("ApiBase.php"); + require_once( "ApiBase.php" ); } - /** * API module that facilitates deleting pages. The API eqivalent of action=delete. * Requires API write mode to be enabled. @@ -36,8 +35,8 @@ if (!defined('MEDIAWIKI')) { */ class ApiDelete extends ApiBase { - public function __construct($main, $action) { - parent :: __construct($main, $action); + public function __construct( $main, $action ) { + parent::__construct( $main, $action ); } /** @@ -49,65 +48,60 @@ class ApiDelete extends ApiBase { */ public function execute() { global $wgUser; + $params = $this->extractRequestParams(); - $this->requireOnlyOneParameter($params, 'title', 'pageid'); - if(!isset($params['token'])) - $this->dieUsageMsg(array('missingparam', 'token')); + $this->requireOnlyOneParameter( $params, 'title', 'pageid' ); - if(isset($params['title'])) - { - $titleObj = Title::newFromText($params['title']); - if(!$titleObj) - $this->dieUsageMsg(array('invalidtitle', $params['title'])); + if ( isset( $params['title'] ) ) { + $titleObj = Title::newFromText( $params['title'] ); + if ( !$titleObj ) { + $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) ); + } + } elseif ( isset( $params['pageid'] ) ) { + $titleObj = Title::newFromID( $params['pageid'] ); + if ( !$titleObj ) { + $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) ); + } } - else if(isset($params['pageid'])) - { - $titleObj = Title::newFromID($params['pageid']); - if(!$titleObj) - $this->dieUsageMsg(array('nosuchpageid', $params['pageid'])); + if ( !$titleObj->exists() ) { + $this->dieUsageMsg( array( 'notanarticle' ) ); } - if(!$titleObj->exists()) - $this->dieUsageMsg(array('notanarticle')); - - $reason = (isset($params['reason']) ? $params['reason'] : NULL); - if ($titleObj->getNamespace() == NS_FILE) { - $retval = self::deleteFile($params['token'], $titleObj, $params['oldimage'], $reason, false); - if(count($retval)) - // We don't care about multiple errors, just report one of them - $this->dieUsageMsg(reset($retval)); + + $reason = ( isset( $params['reason'] ) ? $params['reason'] : null ); + if ( $titleObj->getNamespace() == NS_FILE ) { + $retval = self::deleteFile( $params['token'], $titleObj, $params['oldimage'], $reason, false ); + if ( count( $retval ) ) { + $this->dieUsageMsg( reset( $retval ) ); // We don't care about multiple errors, just report one of them + } } else { - $articleObj = new Article($titleObj); - if($articleObj->isBigDeletion() && !$wgUser->isAllowed('bigdelete')) { - global $wgDeleteRevisionsLimit; - $this->dieUsageMsg(array('delete-toobig', $wgDeleteRevisionsLimit)); + $articleObj = new Article( $titleObj ); + $retval = self::delete( $articleObj, $params['token'], $reason ); + + if ( count( $retval ) ) { + $this->dieUsageMsg( reset( $retval ) ); // We don't care about multiple errors, just report one of them } - $retval = self::delete($articleObj, $params['token'], $reason); - - if(count($retval)) - // We don't care about multiple errors, just report one of them - $this->dieUsageMsg(reset($retval)); - - if($params['watch'] || $wgUser->getOption('watchdeletion')) + + if ( $params['watch'] || $wgUser->getOption( 'watchdeletion' ) ) { $articleObj->doWatch(); - else if($params['unwatch']) + } elseif ( $params['unwatch'] ) { $articleObj->doUnwatch(); + } } - $r = array('title' => $titleObj->getPrefixedText(), 'reason' => $reason); - $this->getResult()->addValue(null, $this->getModuleName(), $r); + $r = array( 'title' => $titleObj->getPrefixedText(), 'reason' => $reason ); + $this->getResult()->addValue( null, $this->getModuleName(), $r ); } - private static function getPermissionsError(&$title, $token) { + private static function getPermissionsError( &$title, $token ) { global $wgUser; - + // Check permissions - $errors = $title->getUserPermissionsErrors('delete', $wgUser); - if (count($errors) > 0) return $errors; - - // Check token - if(!$wgUser->matchEditToken($token)) - return array(array('sessionfailure')); + $errors = $title->getUserPermissionsErrors( 'delete', $wgUser ); + if ( count( $errors ) > 0 ) { + return $errors; + } + return array(); } @@ -119,70 +113,84 @@ class ApiDelete extends ApiBase { * @param string $reason - Reason for the deletion. Autogenerated if NULL * @return Title::getUserPermissionsErrors()-like array */ - public static function delete(&$article, $token, &$reason = NULL) - { + public static function delete( &$article, $token, &$reason = null ) { global $wgUser; + if ( $article->isBigDeletion() && !$wgUser->isAllowed( 'bigdelete' ) ) { + global $wgDeleteRevisionsLimit; + return array( array( 'delete-toobig', $wgDeleteRevisionsLimit ) ); + } $title = $article->getTitle(); - $errors = self::getPermissionsError($title, $token); - if (count($errors)) return $errors; + $errors = self::getPermissionsError( $title, $token ); + if ( count( $errors ) ) { + return $errors; + } // Auto-generate a summary, if necessary - if(is_null($reason)) - { - # Need to pass a throwaway variable because generateReason expects - # a reference + if ( is_null( $reason ) ) { + // Need to pass a throwaway variable because generateReason expects + // a reference $hasHistory = false; - $reason = $article->generateReason($hasHistory); - if($reason === false) - return array(array('cannotdelete')); + $reason = $article->generateReason( $hasHistory ); + if ( $reason === false ) { + return array( array( 'cannotdelete' ) ); + } } $error = ''; - if (!wfRunHooks('ArticleDelete', array(&$article, &$wgUser, &$reason, $error))) - $this->dieUsageMsg(array('hookaborted', $error)); + if ( !wfRunHooks( 'ArticleDelete', array( &$article, &$wgUser, &$reason, $error ) ) ) { + $this->dieUsageMsg( array( 'hookaborted', $error ) ); + } // Luckily, Article.php provides a reusable delete function that does the hard work for us - if($article->doDeleteArticle($reason)) { - wfRunHooks('ArticleDeleteComplete', array(&$article, &$wgUser, $reason, $article->getId())); + if ( $article->doDeleteArticle( $reason ) ) { + wfRunHooks( 'ArticleDeleteComplete', array( &$article, &$wgUser, $reason, $article->getId() ) ); return array(); } - return array(array('cannotdelete', $article->mTitle->getPrefixedText())); + return array( array( 'cannotdelete', $article->mTitle->getPrefixedText() ) ); } - public static function deleteFile($token, &$title, $oldimage, &$reason = NULL, $suppress = false) - { - $errors = self::getPermissionsError($title, $token); - if (count($errors)) return $errors; + public static function deleteFile( $token, &$title, $oldimage, &$reason = null, $suppress = false ) { + $errors = self::getPermissionsError( $title, $token ); + if ( count( $errors ) ) { + return $errors; + } - if( $oldimage && !FileDeleteForm::isValidOldSpec($oldimage) ) - return array(array('invalidoldimage')); + if ( $oldimage && !FileDeleteForm::isValidOldSpec( $oldimage ) ) { + return array( array( 'invalidoldimage' ) ); + } - $file = wfFindFile($title, false, FileRepo::FIND_IGNORE_REDIRECT); + $file = wfFindFile( $title, array( 'ignoreRedirect' => true ) ); $oldfile = false; - - if( $oldimage ) + + if ( $oldimage ) { $oldfile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $title, $oldimage ); - - if( !FileDeleteForm::haveDeletableFile($file, $oldfile, $oldimage) ) - return array(array('nofile')); - if (is_null($reason)) # Log and RC don't like null reasons + } + + if ( !FileDeleteForm::haveDeletableFile( $file, $oldfile, $oldimage ) ) { + return self::delete( new Article( $title ), $token, $reason ); + } + if ( is_null( $reason ) ) { // Log and RC don't like null reasons $reason = ''; + } $status = FileDeleteForm::doDelete( $title, $file, $oldimage, $reason, $suppress ); - - if( !$status->isGood() ) - return array(array('cannotdelete', $title->getPrefixedText())); - + + if ( !$status->isGood() ) { + return array( array( 'cannotdelete', $title->getPrefixedText() ) ); + } + return array(); } - - public function mustBePosted() { return true; } + + public function mustBePosted() { + return true; + } public function isWriteMode() { return true; } public function getAllowedParams() { - return array ( + return array( 'title' => null, 'pageid' => array( ApiBase::PARAM_TYPE => 'integer' @@ -196,7 +204,7 @@ class ApiDelete extends ApiBase { } public function getParamDescription() { - return array ( + return array( 'title' => 'Title of the page you want to delete. Cannot be used together with pageid', 'pageid' => 'Page ID of the page you want to delete. Cannot be used together with title', 'token' => 'A delete token previously retrieved through prop=info', @@ -213,14 +221,31 @@ class ApiDelete extends ApiBase { ); } + public function getPossibleErrors() { + return array_merge( parent::getPossibleErrors(), array( + array( 'invalidtitle', 'title' ), + array( 'nosuchpageid', 'pageid' ), + array( 'notanarticle' ), + array( 'hookaborted', 'error' ), + ) ); + } + + public function needsToken() { + return true; + } + + public function getTokenSalt() { + return ''; + } + protected function getExamples() { - return array ( + return array( 'api.php?action=delete&title=Main%20Page&token=123ABC', 'api.php?action=delete&title=Main%20Page&token=123ABC&reason=Preparing%20for%20move' ); } public function getVersion() { - return __CLASS__ . ': $Id: ApiDelete.php 48122 2009-03-07 12:58:41Z catrope $'; + return __CLASS__ . ': $Id: ApiDelete.php 74217 2010-10-03 15:53:07Z reedy $'; } -} +} \ No newline at end of file