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', 'notarget');
+ $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->isAllowed('rollback'))
- $this->dieUsage('You don\'t have permission to rollback', 'permissiondenied');
- 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');
+ $this->dieUsageMsg(array('invalidtitle', $params['title']));
+ if(!$titleObj->exists())
+ $this->dieUsageMsg(array('notanarticle'));
+
+ $username = User::getCanonicalName($params['user']);
+ if(!$username)
+ $this->dieUsageMsg(array('invaliduser', $params['user']));
$articleObj = new Article($titleObj);
$summary = (isset($params['summary']) ? $params['summary'] : "");
- $info = array();
- $retval = $articleObj->doRollback($params['user'], $params['token'], isset($params['markbot']), $summary, &$info);
-
- switch($retval)
- {
- case ROLLBACK_SUCCESS:
- break; // We'll deal with that later
- case ROLLBACK_PERM:
- $this->dieUsage('You don\'t have permission to rollback', 'permissiondenied');
- case ROLLBACK_BLOCKED: // If we get BLOCKED or PERM that's very weird, but it's possible
- $this->dieUsage('You have been blocked from editing', 'blocked');
- case ROLLBACK_READONLY:
- $this->dieUsage('The wiki is in read-only mode', 'readonly');
- case ROLLBACK_BADTOKEN:
- $this->dieUsage('Invalid token', 'badtoken');
- case ROLLBACK_BADARTICLE:
- $this->dieUsage("The article ``{$params['title']}'' doesn't exist", 'missingtitle');
- case ROLLBACK_ALREADYROLLED:
- $this->dieUsage('The edit(s) you tried to rollback is/are already rolled back', 'alreadyrolled');
- case ROLLBACK_ONLYAUTHOR:
- $this->dieUsage("{$params['user']} is the only author of the page", 'onlyauthor');
- case ROLLBACK_EDITFAILED:
- $this->dieDebug(__METHOD__, 'Article::doEdit() failed');
- 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 ROLLBACK_SUCCESS if we get here
- $this->getResult()->addValue(null, 'rollback', $info);
- }
+ $details = null;
+ $dbw = wfGetDb(DB_MASTER);
+ $dbw->begin();
+ $retval = $articleObj->doRollback($username, $summary, $params['token'], $params['markbot'], $details);
+
+ if(!empty($retval))
+ // We don't care about multiple errors, just report one of them
+ $this->dieUsageMsg(current($retval));
+ $dbw->commit();
+ $current = $target = $summary = NULL;
+ extract($details);
+
+ $info = array(
+ 'title' => $titleObj->getPrefixedText(),
+ 'pageid' => $current->getPage(),
+ 'summary' => $summary,
+ 'revid' => $titleObj->getLatestRevID(),
+ 'old_revid' => $current->getID(),
+ 'last_revid' => $target->getID()
+ );
+
+ $this->getResult()->addValue(null, $this->getModuleName(), $info);
+ }
+
+ public function mustBePosted() { return true; }
+
protected function getAllowedParams() {
return array (
'title' => null,
'user' => null,
'token' => null,
'summary' => null,
- 'markbot' => null
+ 'markbot' => false
);
}
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiRollback.php 22289 2007-05-20 23:31:44Z yurik $';
+ return __CLASS__ . ': $Id$';
}
}
-?>