public function onView()
 {
     // TODO: use $this->useTransactionalTimeLimit(); when POST only
     wfTransactionalTimeLimit();
     $details = null;
     $request = $this->getRequest();
     $user = $this->getUser();
     $result = $this->page->doRollback($request->getVal('from'), $request->getText('summary'), $request->getVal('token'), $request->getBool('bot'), $details, $this->getUser());
     if (in_array(array('actionthrottledtext'), $result)) {
         throw new ThrottledError();
     }
     if (isset($result[0][0]) && ($result[0][0] == 'alreadyrolled' || $result[0][0] == 'cantrollback')) {
         $this->getOutput()->setPageTitle($this->msg('rollbackfailed'));
         $errArray = $result[0];
         $errMsg = array_shift($errArray);
         $this->getOutput()->addWikiMsgArray($errMsg, $errArray);
         if (isset($details['current'])) {
             /** @var Revision $current */
             $current = $details['current'];
             if ($current->getComment() != '') {
                 $this->getOutput()->addHTML($this->msg('editcomment')->rawParams(Linker::formatComment($current->getComment()))->parse());
             }
         }
         return;
     }
     #NOTE: Permission errors already handled by Action::checkExecute.
     if ($result == array(array('readonlytext'))) {
         throw new ReadOnlyError();
     }
     #XXX: Would be nice if ErrorPageError could take multiple errors, and/or a status object.
     #     Right now, we only show the first error
     foreach ($result as $error) {
         throw new ErrorPageError('rollbackfailed', $error[0], array_slice($error, 1));
     }
     /** @var Revision $current */
     $current = $details['current'];
     $target = $details['target'];
     $newId = $details['newid'];
     $this->getOutput()->setPageTitle($this->msg('actioncomplete'));
     $this->getOutput()->setRobotPolicy('noindex,nofollow');
     $old = Linker::revUserTools($current);
     $new = Linker::revUserTools($target);
     $this->getOutput()->addHTML($this->msg('rollback-success')->rawParams($old, $new)->parseAsBlock());
     if ($user->getBoolOption('watchrollback')) {
         $user->addWatch($this->page->getTitle(), WatchedItem::IGNORE_USER_RIGHTS);
     }
     $this->getOutput()->returnToMain(false, $this->getTitle());
     if (!$request->getBool('hidediff', false) && !$this->getUser()->getBoolOption('norollbackdiff', false)) {
         $contentHandler = $current->getContentHandler();
         $de = $contentHandler->createDifferenceEngine($this->getContext(), $current->getId(), $newId, false, true);
         $de->showDiff('', '');
     }
 }
Example #2
0
 /**
  * Call wfTransactionalTimeLimit() if this request was POSTed
  * @since 1.26
  */
 protected function useTransactionalTimeLimit()
 {
     if ($this->getRequest()->wasPosted()) {
         wfTransactionalTimeLimit();
     }
 }