Fixes for fixme comments on my r59655
[lhc/web/wiklou.git] / includes / api / ApiRollback.php
index 1c7606e..b826c56 100644 (file)
@@ -28,7 +28,7 @@ if (!defined('MEDIAWIKI')) {
 }
 
 /**
- * @addtogroup API
+ * @ingroup API
  */
 class ApiRollback extends ApiBase {
 
@@ -37,86 +37,57 @@ class ApiRollback extends ApiBase {
        }
 
        public function execute() {
-               global $wgUser;
-               $this->getMain()->requestWriteMode();
                $params = $this->extractRequestParams();
-               
+
                $titleObj = NULL;
                if(!isset($params['title']))
-                       $this->dieUsage('The title parameter must be set', 'notitle');
+                       $this->dieUsageMsg(array('missingparam', 'title'));
                if(!isset($params['user']))
-                       $this->dieUsage('The user parameter must be set', 'nouser');
+                       $this->dieUsageMsg(array('missingparam', 'user'));
                if(!isset($params['token']))
-                       $this->dieUsage('The token parameter must be set', 'notoken');
-
-               // doRollback() also checks for these, but we wanna save some work
-               if($wgUser->isBlocked())
-                       $this->dieUsage('You have been blocked from editing', 'blocked');
-               if(wfReadOnly())
-                       $this->dieUsage('The wiki is in read-only mode', 'readonly');
+                       $this->dieUsageMsg(array('missingparam', 'token'));
 
                $titleObj = Title::newFromText($params['title']);
                if(!$titleObj)
-                       $this->dieUsage("Bad title ``{$params['title']}''", 'invalidtitle');
-               if(!$titleObj->userCan('rollback'))
-                       $this->dieUsage('You don\'t have permission to rollback', 'permissiondenied');
-
-               $username = User::getCanonicalName($params['user']);
+                       $this->dieUsageMsg(array('invalidtitle', $params['title']));
+               if(!$titleObj->exists())
+                       $this->dieUsageMsg(array('notanarticle'));
+
+               #We need to be able to revert IPs, but getCanonicalName rejects them
+               $username = User::isIP($params['user'])
+                       ? $params['user']
+                       : User::getCanonicalName($params['user']);
                if(!$username)
-                       $this->dieUsage("Invalid username ``{$params['user']}''", 'invaliduser');
+                       $this->dieUsageMsg(array('invaliduser', $params['user']));
 
                $articleObj = new Article($titleObj);
                $summary = (isset($params['summary']) ? $params['summary'] : "");
-               $details = NULL;
-               $dbw = wfGetDb(DB_MASTER);
-               $dbw->begin();
-               $retval = $articleObj->doRollback($username, $summary, $params['token'], $params['markbot'], &$details);
-
-               switch($retval)
-               {
-                       case Article::SUCCESS:
-                               break; // We'll deal with that later
-                       case Article::PERM_DENIED:
-                               $this->dieUsage("You don't have permission to rollback", 'permissiondenied');
-                       case Article::BLOCKED: // If we get BLOCKED or PERM_DENIED that's very weird, but it's possible
-                               $this->dieUsage('You have been blocked from editing', 'blocked');
-                       case Article::READONLY:
-                               $this->dieUsage('The wiki is in read-only mode', 'readonly');
-                       case Article::BAD_TOKEN:
-                               $this->dieUsage('Invalid token', 'badtoken');
-                       case Article::BAD_TITLE:
-                               $this->dieUsage("``{$params['title']}'' doesn't exist", 'missingtitle');
-                       case Article::ALREADYROLLED:
-                               $current = $details['current'];
-                               $currentID = $current->getId();
-                               $this->dieUsage("The edit(s) you tried to rollback is/are already rolled back." .
-                                               "The current revision ID is ``$currentID''", 'alreadyrolled');
-                       case Article::ONLY_AUTHOR:
-                               $this->dieUsage("User ``$username'' is the only author of the page", 'onlyauthor');
-                       case Article::RATE_LIMITED:
-                               $this->dieUsage("You can't rollback too many articles in too short a time. Please wait a little while and try again", 'ratelimited');
-                       default:
-                               // rollback() has apparently invented a new error, which is extremely weird
-                               $this->dieDebug(__METHOD__, "rollback() returned an unknown error ($retval)");
-               }
-               // $retval has to be Article::SUCCESS if we get here
-               $dbw->commit();
-               $current = $target = $summary = NULL;
-               extract($details);
+               $details = null;
+               $retval = $articleObj->doRollback($username, $summary, $params['token'], $params['markbot'], $details);
+
+               if($retval)
+                       // We don't care about multiple errors, just report one of them
+                       $this->dieUsageMsg(reset($retval));
 
                $info = array(
                        'title' => $titleObj->getPrefixedText(),
-                       'pageid' => $current->getPage(),
-                       'summary' => $summary,
-                       'revid' => $titleObj->getLatestRevID(),
-                       'old_revid' => $current->getID(),
-                       'last_revid' => $target->getID()
+                       'pageid' => intval($details['current']->getPage()),
+                       'summary' => $details['summary'],
+                       'revid' => intval($details['newid']),
+                       'old_revid' => intval($details['current']->getID()),
+                       'last_revid' => intval($details['target']->getID())
                );
 
                $this->getResult()->addValue(null, $this->getModuleName(), $info);
        }
-       
-       protected function getAllowedParams() {
+
+       public function mustBePosted() { return true; }
+
+       public function isWriteMode() {
+               return true;
+       }
+
+       public function getAllowedParams() {
                return array (
                        'title' => null,
                        'user' => null,
@@ -126,20 +97,20 @@ class ApiRollback extends ApiBase {
                );
        }
 
-       protected function getParamDescription() {
+       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 prop=info',
+                       'token' => 'A rollback token previously retrieved through 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'
                );
        }
 
-       protected function getDescription() {
+       public function getDescription() {
                return array(
-                               'Undoes 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. You need to be logged in as a sysop to use this function, see also action=login.'
+                               '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.'
                        );
        }