}
/**
- * @addtogroup API
+ * @ingroup API
*/
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,
);
}
- 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.'
);
}