X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/includes/api/ApiRollback.php diff --git a/includes/api/ApiRollback.php b/includes/api/ApiRollback.php index 7783e7ad..76b6cc67 100644 --- a/includes/api/ApiRollback.php +++ b/includes/api/ApiRollback.php @@ -1,10 +1,10 @@ .@home.nl + * Copyright © 2007 Roan Kattouw ".@gmail.com" * * 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 @@ -24,47 +24,73 @@ * @file */ -if ( !defined( 'MEDIAWIKI' ) ) { - // Eclipse helper - will be ignored in production - require_once( "ApiBase.php" ); -} - /** * @ingroup API */ class ApiRollback extends ApiBase { - public function __construct( $main, $action ) { - parent::__construct( $main, $action ); - } + /** + * @var Title + */ + private $mTitleObj = null; - private $mTitleObj = null, $mUser = null; + /** + * @var User + */ + private $mUser = null; public function execute() { + $this->useTransactionalTimeLimit(); + + $user = $this->getUser(); $params = $this->extractRequestParams(); - // User and title already validated in call to getTokenSalt from Main - $titleObj = $this->getTitle(); - $articleObj = new Article( $titleObj ); - $summary = ( isset( $params['summary'] ) ? $params['summary'] : '' ); - $details = null; - $retval = $articleObj->doRollback( $this->getUser(), $summary, $params['token'], $params['markbot'], $details ); + $titleObj = $this->getRbTitle( $params ); + $pageObj = WikiPage::factory( $titleObj ); + $summary = $params['summary']; + $details = []; + + // If change tagging was requested, check that the user is allowed to tag, + // and the tags are valid + if ( count( $params['tags'] ) ) { + $tagStatus = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user ); + if ( !$tagStatus->isOK() ) { + $this->dieStatus( $tagStatus ); + } + } + + $retval = $pageObj->doRollback( + $this->getRbUser( $params ), + $summary, + $params['token'], + $params['markbot'], + $details, + $user, + $params['tags'] + ); if ( $retval ) { - // We don't care about multiple errors, just report one of them - $this->dieUsageMsg( reset( $retval ) ); + $this->dieStatus( $this->errorArrayToStatus( $retval, $user ) ); } - $this->setWatch( $params['watchlist'], $titleObj ); + $watch = 'preferences'; + if ( isset( $params['watchlist'] ) ) { + $watch = $params['watchlist']; + } - $info = array( + // Watch pages + $this->setWatch( $watch, $titleObj, 'watchrollback' ); + + $info = [ 'title' => $titleObj->getPrefixedText(), 'pageid' => intval( $details['current']->getPage() ), 'summary' => $details['summary'], 'revid' => intval( $details['newid'] ), + // The revision being reverted (previously the current revision of the page) 'old_revid' => intval( $details['current']->getID() ), + // The revision being restored (the last revision before revision(s) by the reverted user) 'last_revid' => intval( $details['target']->getID() ) - ); + ]; $this->getResult()->addValue( null, $this->getModuleName(), $info ); } @@ -78,112 +104,104 @@ class ApiRollback extends ApiBase { } public function getAllowedParams() { - return array( - 'title' => array( - ApiBase::PARAM_TYPE => 'string', + return [ + 'title' => null, + 'pageid' => [ + ApiBase::PARAM_TYPE => 'integer' + ], + 'tags' => [ + ApiBase::PARAM_TYPE => 'tags', + ApiBase::PARAM_ISMULTI => true, + ], + 'user' => [ + ApiBase::PARAM_TYPE => 'user', ApiBase::PARAM_REQUIRED => true - ), - 'user' => array( - ApiBase::PARAM_TYPE => 'string', - ApiBase::PARAM_REQUIRED => true - ), - 'token' => null, - 'summary' => null, + ], + 'summary' => '', 'markbot' => false, - 'watchlist' => array( + 'watchlist' => [ ApiBase::PARAM_DFLT => 'preferences', - ApiBase::PARAM_TYPE => array( + ApiBase::PARAM_TYPE => [ 'watch', 'unwatch', 'preferences', 'nochange' - ), - ), - ); - } - - public function getParamDescription() { - return array( - 'title' => 'Title of the page you want to rollback.', - 'user' => 'Name of the user whose edits are to be rolled back. If set incorrectly, you\'ll get a badtoken error.', - 'token' => "A rollback token previously retrieved through {$this->getModulePrefix()}prop=revisions", - 'summary' => 'Custom edit summary. If not set, default summary will be used', - 'markbot' => 'Mark the reverted edits and the revert as bot edits', - 'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch', - ); - } - - public function getDescription() { - return array( - 'Undo the last edit to the page. If the last user who edited the page made multiple edits in a row,', - 'they will all be rolled back' - ); - } - - public function getPossibleErrors() { - return array_merge( parent::getPossibleErrors(), array( - array( 'invalidtitle', 'title' ), - array( 'notanarticle' ), - array( 'invaliduser', 'user' ), - ) ); + ], + ], + 'token' => [ + // Standard definition automatically inserted + ApiBase::PARAM_HELP_MSG_APPEND => [ 'api-help-param-token-webui' ], + ], + ]; } public function needsToken() { - return true; - } - - public function getTokenSalt() { - return array( $this->getTitle()->getPrefixedText(), $this->getUser() ); + return 'rollback'; } - private function getUser() { + /** + * @param array $params + * + * @return string + */ + private function getRbUser( array $params ) { if ( $this->mUser !== null ) { return $this->mUser; } - $params = $this->extractRequestParams(); - // We need to be able to revert IPs, but getCanonicalName rejects them $this->mUser = User::isIP( $params['user'] ) ? $params['user'] : User::getCanonicalName( $params['user'] ); if ( !$this->mUser ) { - $this->dieUsageMsg( array( 'invaliduser', $params['user'] ) ); + $this->dieWithError( [ 'apierror-invaliduser', wfEscapeWikiText( $params['user'] ) ] ); } return $this->mUser; } /** + * @param array $params + * * @return Title */ - private function getTitle() { + private function getRbTitle( array $params ) { if ( $this->mTitleObj !== null ) { return $this->mTitleObj; } - $params = $this->extractRequestParams(); - - $this->mTitleObj = Title::newFromText( $params['title'] ); - - if ( !$this->mTitleObj ) { - $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) ); + $this->requireOnlyOneParameter( $params, 'title', 'pageid' ); + + if ( isset( $params['title'] ) ) { + $this->mTitleObj = Title::newFromText( $params['title'] ); + if ( !$this->mTitleObj || $this->mTitleObj->isExternal() ) { + $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] ); + } + } elseif ( isset( $params['pageid'] ) ) { + $this->mTitleObj = Title::newFromID( $params['pageid'] ); + if ( !$this->mTitleObj ) { + $this->dieWithError( [ 'apierror-nosuchpageid', $params['pageid'] ] ); + } } + if ( !$this->mTitleObj->exists() ) { - $this->dieUsageMsg( array( 'notanarticle' ) ); + $this->dieWithError( 'apierror-missingtitle' ); } return $this->mTitleObj; } - protected function getExamples() { - return array( - 'api.php?action=rollback&title=Main%20Page&user=Catrope&token=123ABC', - 'api.php?action=rollback&title=Main%20Page&user=217.121.114.116&token=123ABC&summary=Reverting%20vandalism&markbot=1' - ); + protected function getExamplesMessages() { + return [ + 'action=rollback&title=Main%20Page&user=Example&token=123ABC' => + 'apihelp-rollback-example-simple', + 'action=rollback&title=Main%20Page&user=192.0.2.5&' . + 'token=123ABC&summary=Reverting%20vandalism&markbot=1' => + 'apihelp-rollback-example-summary', + ]; } - public function getVersion() { - return __CLASS__ . ': $Id$'; + public function getHelpUrls() { + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Rollback'; } }