/**
  * Returns a row from the history printout.
  *
  * @todo document some more, and maybe clean up the code (some params redundant?)
  *
  * @param stdClass $row The database row corresponding to the previous line.
  * @param mixed $next The database row corresponding to the next line
  *   (chronologically previous)
  * @param bool|string $notificationtimestamp
  * @param bool $latest Whether this row corresponds to the page's latest revision.
  * @param bool $firstInList Whether this row corresponds to the first
  *   displayed on this history page.
  * @return string HTML output for the row
  */
 function historyLine($row, $next, $notificationtimestamp = false, $latest = false, $firstInList = false)
 {
     $rev = new Revision($row);
     $rev->setTitle($this->getTitle());
     if (is_object($next)) {
         $prevRev = new Revision($next);
         $prevRev->setTitle($this->getTitle());
     } else {
         $prevRev = null;
     }
     $curlink = $this->curLink($rev, $latest);
     $lastlink = $this->lastLink($rev, $next);
     $curLastlinks = $curlink . $this->historyPage->message['pipe-separator'] . $lastlink;
     $histLinks = Html::rawElement('span', array('class' => 'mw-history-histlinks'), $this->msg('parentheses')->rawParams($curLastlinks)->escaped());
     $diffButtons = $this->diffButtons($rev, $firstInList);
     $s = $histLinks . $diffButtons;
     $link = $this->revLink($rev);
     $classes = array();
     $del = '';
     $user = $this->getUser();
     // Show checkboxes for each revision
     if ($user->isAllowed('deleterevision')) {
         $this->preventClickjacking();
         // If revision was hidden from sysops, disable the checkbox
         if (!$rev->userCan(Revision::DELETED_RESTRICTED, $user)) {
             $del = Xml::check('deleterevisions', false, array('disabled' => 'disabled'));
             // Otherwise, enable the checkbox...
         } else {
             $del = Xml::check('showhiderevisions', false, array('name' => 'ids[' . $rev->getId() . ']'));
         }
         // User can only view deleted revisions...
     } elseif ($rev->getVisibility() && $user->isAllowed('deletedhistory')) {
         // If revision was hidden from sysops, disable the link
         if (!$rev->userCan(Revision::DELETED_RESTRICTED, $user)) {
             $del = Linker::revDeleteLinkDisabled(false);
             // Otherwise, show the link...
         } else {
             $query = array('type' => 'revision', 'target' => $this->getTitle()->getPrefixedDBkey(), 'ids' => $rev->getId());
             $del .= Linker::revDeleteLink($query, $rev->isDeleted(Revision::DELETED_RESTRICTED), false);
         }
     }
     if ($del) {
         $s .= " {$del} ";
     }
     $lang = $this->getLanguage();
     $dirmark = $lang->getDirMark();
     $s .= " {$link}";
     $s .= $dirmark;
     $s .= " <span class='history-user'>" . Linker::revUserTools($rev, true) . "</span>";
     $s .= $dirmark;
     if ($rev->isMinor()) {
         $s .= ' ' . ChangesList::flag('minor');
     }
     # Sometimes rev_len isn't populated
     if ($rev->getSize() !== null) {
         # Size is always public data
         $prevSize = isset($this->parentLens[$row->rev_parent_id]) ? $this->parentLens[$row->rev_parent_id] : 0;
         $sDiff = ChangesList::showCharacterDifference($prevSize, $rev->getSize());
         $fSize = Linker::formatRevisionSize($rev->getSize());
         $s .= ' <span class="mw-changeslist-separator">. .</span> ' . "{$fSize} {$sDiff}";
     }
     # Text following the character difference is added just before running hooks
     $s2 = Linker::revComment($rev, false, true);
     if ($notificationtimestamp && $row->rev_timestamp >= $notificationtimestamp) {
         $s2 .= ' <span class="updatedmarker">' . $this->msg('updatedmarker')->escaped() . '</span>';
         $classes[] = 'mw-history-line-updated';
     }
     $tools = array();
     # Rollback and undo links
     if ($prevRev && $this->getTitle()->quickUserCan('edit', $user)) {
         if ($latest && $this->getTitle()->quickUserCan('rollback', $user)) {
             // Get a rollback link without the brackets
             $rollbackLink = Linker::generateRollback($rev, $this->getContext(), array('verify', 'noBrackets'));
             if ($rollbackLink) {
                 $this->preventClickjacking();
                 $tools[] = $rollbackLink;
             }
         }
         if (!$rev->isDeleted(Revision::DELETED_TEXT) && !$prevRev->isDeleted(Revision::DELETED_TEXT)) {
             # Create undo tooltip for the first (=latest) line only
             $undoTooltip = $latest ? array('title' => $this->msg('tooltip-undo')->text()) : array();
             $undolink = Linker::linkKnown($this->getTitle(), $this->msg('editundo')->escaped(), $undoTooltip, array('action' => 'edit', 'undoafter' => $prevRev->getId(), 'undo' => $rev->getId()));
             $tools[] = "<span class=\"mw-history-undo\">{$undolink}</span>";
         }
     }
     // Allow extension to add their own links here
     wfRunHooks('HistoryRevisionTools', array($rev, &$tools));
     if ($tools) {
         $s2 .= ' ' . $this->msg('parentheses')->rawParams($lang->pipeList($tools))->escaped();
     }
     # Tags
     list($tagSummary, $newClasses) = ChangeTags::formatSummaryRow($row->ts_tags, 'history');
     $classes = array_merge($classes, $newClasses);
     if ($tagSummary !== '') {
         $s2 .= " {$tagSummary}";
     }
     # Include separator between character difference and following text
     if ($s2 !== '') {
         $s .= ' <span class="mw-changeslist-separator">. .</span> ' . $s2;
     }
     wfRunHooks('PageHistoryLineEnding', array($this, &$row, &$s, &$classes));
     $attribs = array();
     if ($classes) {
         $attribs['class'] = implode(' ', $classes);
     }
     return Xml::tags('li', $attribs, $s) . "\n";
 }
Esempio n. 2
0
 /** Inserts a rollback link
  *
  * @param $s string
  * @param $rc RecentChange
  */
 public function insertRollback(&$s, &$rc)
 {
     if (!$rc->mAttribs['rc_new'] && $rc->mAttribs['rc_this_oldid'] && $rc->mAttribs['rc_cur_id']) {
         $page = $rc->getTitle();
         /** Check for rollback and edit permissions, disallow special pages, and only
          * show a link on the top-most revision */
         if ($this->getUser()->isAllowed('rollback') && $rc->mAttribs['page_latest'] == $rc->mAttribs['rc_this_oldid']) {
             $rev = new Revision(array('id' => $rc->mAttribs['rc_this_oldid'], 'user' => $rc->mAttribs['rc_user'], 'user_text' => $rc->mAttribs['rc_user_text'], 'deleted' => $rc->mAttribs['rc_deleted']));
             $rev->setTitle($page);
             $s .= ' ' . Linker::generateRollback($rev, $this->getContext());
         }
     }
 }
 /**
  * Format a row, providing the timestamp, links to the page/history, size, user links, and a comment
  *
  * @param $result Result row
  * @return String
  */
 public function formatRow($result)
 {
     $title = Title::newFromRow($result);
     # Revision deletion works on revisions, so we should cast one
     $row = array('comment' => $result->rc_comment, 'deleted' => $result->rc_deleted, 'user_text' => $result->rc_user_text, 'user' => $result->rc_user);
     $rev = new Revision($row);
     $rev->setTitle($title);
     $classes = array();
     $lang = $this->getLanguage();
     $dm = $lang->getDirMark();
     $spanTime = Html::element('span', array('class' => 'mw-newpages-time'), $lang->userTimeAndDate($result->rc_timestamp, $this->getUser()));
     $time = Linker::linkKnown($title, $spanTime, array(), array('oldid' => $result->rc_this_oldid), array());
     $query = array('redirect' => 'no');
     if ($this->patrollable($result)) {
         $query['rcid'] = $result->rc_id;
     }
     // Linker::linkKnown() uses 'known' and 'noclasses' options. This breaks the colouration for stubs.
     $plink = Linker::link($title, null, array('class' => 'mw-newpages-pagename'), $query, array('known'));
     $histLink = Linker::linkKnown($title, $this->msg('hist')->escaped(), array(), array('action' => 'history'));
     $hist = Html::rawElement('span', array('class' => 'mw-newpages-history'), $this->msg('parentheses')->rawParams($histLink)->escaped());
     $length = Html::element('span', array('class' => 'mw-newpages-length'), $this->msg('brackets')->params($this->msg('nbytes')->numParams($result->length)->text()));
     $ulink = Linker::revUserTools($rev);
     $comment = Linker::revComment($rev);
     if ($this->patrollable($result)) {
         $classes[] = 'not-patrolled';
     }
     # Add a class for zero byte pages
     if ($result->length == 0) {
         $classes[] = 'mw-newpages-zero-byte-page';
     }
     # Tags, if any.
     if (isset($result->ts_tags)) {
         list($tagDisplay, $newClasses) = ChangeTags::formatSummaryRow($result->ts_tags, 'newpages');
         $classes = array_merge($classes, $newClasses);
     } else {
         $tagDisplay = '';
     }
     $css = count($classes) ? ' class="' . implode(' ', $classes) . '"' : '';
     # Display the old title if the namespace/title has been changed
     $oldTitleText = '';
     $oldTitle = Title::makeTitle($result->rc_namespace, $result->rc_title);
     if (!$title->equals($oldTitle)) {
         $oldTitleText = $this->msg('rc-old-title')->params($oldTitle->getPrefixedText())->escaped();
     }
     return "<li{$css}>{$time} {$dm}{$plink} {$hist} {$dm}{$length} {$dm}{$ulink} {$comment} {$tagDisplay} {$oldTitleText}</li>\n";
 }
Esempio n. 4
0
 /**
  * revisionInsertComplete
  *
  * static method called as hook
  *
  * @static
  * @access public
  *
  * @param Revision	$revision	revision object
  * @param string	$url		url to external object
  * @param string	$flags		flags for this revision
  *
  * @return true means process other hooks
  */
 public static function revisionInsertComplete(&$revision, $url, $flags)
 {
     global $wgUser, $wgCityId, $wgCommandLineMode, $wgSharedDB, $wgErrorLog, $wgMemc, $wgRequest;
     wfProfileIn(__METHOD__);
     /**
      * Do not create task when DB is locked (rt#12229)
      * Do not create task when we are in $wgCommandLineMode
      */
     $oldValue = $wgErrorLog;
     $wgErrorLog = true;
     if (!wfReadOnly() && !$wgCommandLineMode) {
         /**
          * Revision has valid Title field but sometimes not filled
          */
         $Title = $revision->getTitle();
         if (!$Title) {
             $Title = Title::newFromId($revision->getPage(), Title::GAID_FOR_UPDATE);
             $revision->setTitle($Title);
         }
         /**
          * get groups for user rt#12215
          */
         $groups = $wgUser->getEffectiveGroups();
         $invalid = array("bot" => true, "bot-global" => true, "staff" => true, "helper" => true, "sysop" => true, "bureaucrat" => true, "vstf" => true);
         $canWelcome = true;
         foreach ($groups as $group) {
             if (isset($invalid[$group]) && $invalid[$group]) {
                 $canWelcome = false;
                 Wikia::log(__METHOD__, $wgUser->getId(), "Skip welcome, user is at least in group: " . $group);
                 break;
             }
         }
         /**
          * put possible welcomer into memcached, RT#14067
          */
         if ($wgUser->getId() && self::isWelcomer($wgUser)) {
             // BugId:41817 - if ( 1 == $wgUser->getId() ) { notify Mix }
             if (1 == $wgUser->getId()) {
                 $oTo = $oFrom = new MailAddress('*****@*****.**');
                 UserMailer::send($oTo, $oFrom, 'BugId:41817 Occurrence Report', sprintf("File: %s\nLine: %s, Date: %s\nOutput: %s", __FILE__, __LINE__, date('Y-m-d H:i:s'), var_export($wgUser->getId(), true)));
             }
             $wgMemc->set(wfMemcKey("last-sysop-id"), $wgUser->getId(), 86400);
             Wikia::log(__METHOD__, $wgUser->getId(), "Store possible welcomer in memcached");
         }
         if ($Title && $canWelcome && !empty($wgSharedDB)) {
             Wikia::log(__METHOD__, "title", $Title->getFullURL());
             $welcomer = trim(wfMsgForContent("welcome-user"));
             Wikia::log(__METHOD__, "welcomer", $welcomer);
             if ($welcomer !== "@disabled" && $welcomer !== "-") {
                 /**
                  * check if talk page for wgUser exists
                  *
                  * @todo check editcount for user
                  */
                 Wikia::log(__METHOD__, "user", $wgUser->getName());
                 $talkPage = $wgUser->getUserPage()->getTalkPage();
                 if ($talkPage) {
                     $talkArticle = new Article($talkPage, 0);
                     if (!self::isPosted($talkArticle, $wgUser)) {
                         $welcomeJob = new HAWelcomeJob($Title, array("is_anon" => $wgUser->isAnon(), "user_id" => $wgUser->getId(), "user_ip" => $wgRequest->getIP(), "user_name" => $wgUser->getName()));
                         $welcomeJob->insert();
                         Wikia::log(__METHOD__, "job");
                         /**
                          * inform task manager
                          */
                         $Task = new HAWelcomeTask();
                         $taskId = $Task->createTask(array("city_id" => $wgCityId), TASK_QUEUED);
                         Wikia::log(__METHOD__, "task", $taskId);
                     } else {
                         Wikia::log(__METHOD__, "exists", sprintf("Talk page for user %s already exits", $wgUser->getName()));
                     }
                 }
             } else {
                 Wikia::log(__METHOD__, "disabled");
             }
         }
     }
     $wgErrorLog = $oldValue;
     wfProfileOut(__METHOD__);
     return true;
 }
Esempio n. 5
0
 /**
  * Create a new null-revision for insertion into a page's
  * history. This will not re-save the text, but simply refer
  * to the text from the previous version.
  *
  * Such revisions can for instance identify page rename
  * operations and other such meta-modifications.
  *
  * @param $dbw DatabaseBase
  * @param $pageId Integer: ID number of the page to read from
  * @param string $summary revision's summary
  * @param $minor Boolean: whether the revision should be considered as minor
  * @return Revision|null on error
  */
 public static function newNullRevision($dbw, $pageId, $summary, $minor)
 {
     global $wgContentHandlerUseDB;
     wfProfileIn(__METHOD__);
     $fields = array('page_latest', 'page_namespace', 'page_title', 'rev_text_id', 'rev_len', 'rev_sha1');
     if ($wgContentHandlerUseDB) {
         $fields[] = 'rev_content_model';
         $fields[] = 'rev_content_format';
     }
     $current = $dbw->selectRow(array('page', 'revision'), $fields, array('page_id' => $pageId, 'page_latest=rev_id'), __METHOD__);
     if ($current) {
         $row = array('page' => $pageId, 'comment' => $summary, 'minor_edit' => $minor, 'text_id' => $current->rev_text_id, 'parent_id' => $current->page_latest, 'len' => $current->rev_len, 'sha1' => $current->rev_sha1);
         if ($wgContentHandlerUseDB) {
             $row['content_model'] = $current->rev_content_model;
             $row['content_format'] = $current->rev_content_format;
         }
         $revision = new Revision($row);
         $revision->setTitle(Title::makeTitle($current->page_namespace, $current->page_title));
     } else {
         $revision = null;
     }
     wfProfileOut(__METHOD__);
     return $revision;
 }
Esempio n. 6
0
 /**
  * Generate a FeedItem object from a given revision table row
  * Borrows Recent Changes' feed generation functions for formatting;
  * includes a diff to the previous revision (if any).
  *
  * @param $row
  * @return FeedItem
  */
 function feedItem($row)
 {
     $rev = new Revision($row);
     $rev->setTitle($this->mTitle);
     $text = rcFormatDiffRow($this->mTitle, $this->mTitle->getPreviousRevisionID($rev->getId()), $rev->getId(), $rev->getTimestamp(), $rev->getComment());
     if ($rev->getComment() == '') {
         global $wgContLang;
         $title = wfMsgForContent('history-feed-item-nocomment', $rev->getUserText(), $wgContLang->timeanddate($rev->getTimestamp()));
     } else {
         $title = $rev->getUserText() . ": " . $this->stripComment($rev->getComment());
     }
     return new FeedItem($title, $text, $this->mTitle->getFullUrl('diff=' . $rev->getId() . '&oldid=prev'), $rev->getTimestamp(), $rev->getUserText(), $this->mTitle->getTalkPage()->getFullUrl());
 }
Esempio n. 7
0
 /**
  * Returns a row from the history printout.
  *
  * @todo document some more, and maybe clean up the code (some params redundant?)
  *
  * @param $row Object: the database row corresponding to the previous line.
  * @param $next Mixed: the database row corresponding to the next line.
  * @param $notificationtimestamp
  * @param $latest Boolean: whether this row corresponds to the page's latest revision.
  * @param $firstInList Boolean: whether this row corresponds to the first displayed on this history page.
  * @return String: HTML output for the row
  */
 function historyLine($row, $next, $notificationtimestamp = false, $latest = false, $firstInList = false)
 {
     global $wgUser, $wgLang;
     $rev = new Revision($row);
     $rev->setTitle($this->title);
     $curlink = $this->curLink($rev, $latest);
     $lastlink = $this->lastLink($rev, $next);
     $diffButtons = $this->diffButtons($rev, $firstInList);
     $histLinks = Html::rawElement('span', array('class' => 'mw-history-histlinks'), '(' . $curlink . $this->historyPage->message['pipe-separator'] . $lastlink . ') ');
     $s = $histLinks . $diffButtons;
     $link = $this->revLink($rev);
     $classes = array();
     $del = '';
     // Show checkboxes for each revision
     if ($wgUser->isAllowed('deleterevision')) {
         $this->preventClickjacking();
         // If revision was hidden from sysops, disable the checkbox
         if (!$rev->userCan(Revision::DELETED_RESTRICTED)) {
             $del = Xml::check('deleterevisions', false, array('disabled' => 'disabled'));
             // Otherwise, enable the checkbox...
         } else {
             $del = Xml::check('showhiderevisions', false, array('name' => 'ids[' . $rev->getId() . ']'));
         }
         // User can only view deleted revisions...
     } else {
         if ($rev->getVisibility() && $wgUser->isAllowed('deletedhistory')) {
             // If revision was hidden from sysops, disable the link
             if (!$rev->userCan(Revision::DELETED_RESTRICTED)) {
                 $cdel = $this->getSkin()->revDeleteLinkDisabled(false);
                 // Otherwise, show the link...
             } else {
                 $query = array('type' => 'revision', 'target' => $this->title->getPrefixedDbkey(), 'ids' => $rev->getId());
                 $del .= $this->getSkin()->revDeleteLink($query, $rev->isDeleted(Revision::DELETED_RESTRICTED), false);
             }
         }
     }
     if ($del) {
         $s .= " {$del} ";
     }
     $s .= " {$link}";
     $s .= " <span class='history-user'>" . $this->getSkin()->revUserTools($rev, true) . "</span>";
     if ($rev->isMinor()) {
         $s .= ' ' . ChangesList::flag('minor');
     }
     if (!is_null($size = $rev->getSize()) && !$rev->isDeleted(Revision::DELETED_TEXT)) {
         $s .= ' ' . $this->getSkin()->formatRevisionSize($size);
     }
     $s .= $this->getSkin()->revComment($rev, false, true);
     if ($notificationtimestamp && $row->rev_timestamp >= $notificationtimestamp) {
         $s .= ' <span class="updatedmarker">' . wfMsgHtml('updatedmarker') . '</span>';
     }
     $tools = array();
     # Rollback and undo links
     if (!is_null($next) && is_object($next)) {
         if ($latest && $this->title->userCan('rollback') && $this->title->userCan('edit')) {
             $this->preventClickjacking();
             $tools[] = '<span class="mw-rollback-link">' . $this->getSkin()->buildRollbackLink($rev) . '</span>';
         }
         if ($this->title->quickUserCan('edit') && !$rev->isDeleted(Revision::DELETED_TEXT) && !$next->rev_deleted & Revision::DELETED_TEXT) {
             # Create undo tooltip for the first (=latest) line only
             $undoTooltip = $latest ? array('title' => wfMsg('tooltip-undo')) : array();
             $undolink = $this->getSkin()->link($this->title, wfMsgHtml('editundo'), $undoTooltip, array('action' => 'edit', 'undoafter' => $next->rev_id, 'undo' => $rev->getId()), array('known', 'noclasses'));
             $tools[] = "<span class=\"mw-history-undo\">{$undolink}</span>";
         }
     }
     if ($tools) {
         $s .= ' (' . $wgLang->pipeList($tools) . ')';
     }
     # Tags
     list($tagSummary, $newClasses) = ChangeTags::formatSummaryRow($row->ts_tags, 'history');
     $classes = array_merge($classes, $newClasses);
     $s .= " {$tagSummary}";
     wfRunHooks('PageHistoryLineEnding', array($this, &$row, &$s, &$classes));
     $attribs = array();
     if ($classes) {
         $attribs['class'] = implode(' ', $classes);
     }
     return Xml::tags('li', $attribs, $s) . "\n";
 }
Esempio n. 8
0
 /**
  * Returns a row from the history printout.
  *
  * @todo document some more, and maybe clean up the code (some params redundant?)
  *
  * @param $row Object: the database row corresponding to the previous line.
  * @param $next Mixed: the database row corresponding to the next line. (chronologically previous)
  * @param $notificationtimestamp
  * @param $latest Boolean: whether this row corresponds to the page's latest revision.
  * @param $firstInList Boolean: whether this row corresponds to the first displayed on this history page.
  * @return String: HTML output for the row
  */
 function historyLine($row, $next, $notificationtimestamp = false, $latest = false, $firstInList = false)
 {
     $rev = new Revision($row);
     $rev->setTitle($this->getTitle());
     if (is_object($next)) {
         $prevRev = new Revision($next);
         $prevRev->setTitle($this->getTitle());
     } else {
         $prevRev = null;
     }
     $curlink = $this->curLink($rev, $latest);
     $lastlink = $this->lastLink($rev, $next);
     $diffButtons = $this->diffButtons($rev, $firstInList);
     $histLinks = Html::rawElement('span', array('class' => 'mw-history-histlinks'), '(' . $curlink . $this->historyPage->message['pipe-separator'] . $lastlink . ') ');
     $s = $histLinks . $diffButtons;
     $link = $this->revLink($rev);
     $classes = array();
     $del = '';
     $user = $this->getUser();
     // Show checkboxes for each revision
     if ($user->isAllowed('deleterevision')) {
         $this->preventClickjacking();
         // If revision was hidden from sysops, disable the checkbox
         if (!$rev->userCan(Revision::DELETED_RESTRICTED, $user)) {
             $del = Xml::check('deleterevisions', false, array('disabled' => 'disabled'));
             // Otherwise, enable the checkbox...
         } else {
             $del = Xml::check('showhiderevisions', false, array('name' => 'ids[' . $rev->getId() . ']'));
         }
         // User can only view deleted revisions...
     } elseif ($rev->getVisibility() && $user->isAllowed('deletedhistory')) {
         // If revision was hidden from sysops, disable the link
         if (!$rev->userCan(Revision::DELETED_RESTRICTED, $user)) {
             $cdel = Linker::revDeleteLinkDisabled(false);
             // Otherwise, show the link...
         } else {
             $query = array('type' => 'revision', 'target' => $this->getTitle()->getPrefixedDbkey(), 'ids' => $rev->getId());
             $del .= Linker::revDeleteLink($query, $rev->isDeleted(Revision::DELETED_RESTRICTED), false);
         }
     }
     if ($del) {
         $s .= " {$del} ";
     }
     $lang = $this->getLanguage();
     $dirmark = $lang->getDirMark();
     $s .= " {$link}";
     $s .= $dirmark;
     $s .= " <span class='history-user'>" . Linker::revUserTools($rev, true) . "</span>";
     $s .= $dirmark;
     if ($rev->isMinor()) {
         $s .= ' ' . ChangesList::flag('minor');
     }
     # Size is always public data
     $prevSize = $prevRev ? $prevRev->getSize() : 0;
     $sDiff = ChangesList::showCharacterDifference($prevSize, $rev->getSize());
     $fSize = Linker::formatRevisionSize($rev->getSize());
     $s .= " . . {$fSize} {$sDiff} . . ";
     $s .= Linker::revComment($rev, false, true);
     if ($notificationtimestamp && $row->rev_timestamp >= $notificationtimestamp) {
         $s .= ' <span class="updatedmarker">' . $this->msg('updatedmarker')->escaped() . '</span>';
     }
     $tools = array();
     # Rollback and undo links
     if ($prevRev && !count($this->getTitle()->getUserPermissionsErrors('edit', $this->getUser()))) {
         if ($latest && !count($this->getTitle()->getUserPermissionsErrors('rollback', $this->getUser()))) {
             $this->preventClickjacking();
             $tools[] = '<span class="mw-rollback-link">' . Linker::buildRollbackLink($rev) . '</span>';
         }
         if (!$rev->isDeleted(Revision::DELETED_TEXT) && !$prevRev->isDeleted(Revision::DELETED_TEXT)) {
             # Create undo tooltip for the first (=latest) line only
             $undoTooltip = $latest ? array('title' => $this->msg('tooltip-undo')->text()) : array();
             $undolink = Linker::linkKnown($this->getTitle(), $this->msg('editundo')->escaped(), $undoTooltip, array('action' => 'edit', 'undoafter' => $prevRev->getId(), 'undo' => $rev->getId()));
             $tools[] = "<span class=\"mw-history-undo\">{$undolink}</span>";
         }
     }
     if ($tools) {
         $s .= ' (' . $lang->pipeList($tools) . ')';
     }
     # Tags
     list($tagSummary, $newClasses) = ChangeTags::formatSummaryRow($row->ts_tags, 'history');
     $classes = array_merge($classes, $newClasses);
     $s .= " {$tagSummary}";
     wfRunHooks('PageHistoryLineEnding', array($this, &$row, &$s, &$classes));
     $attribs = array();
     if ($classes) {
         $attribs['class'] = implode(' ', $classes);
     }
     return Xml::tags('li', $attribs, $s) . "\n";
 }
Esempio n. 9
0
 /**
  * Create a new null-revision for insertion into a page's
  * history. This will not re-save the text, but simply refer
  * to the text from the previous version.
  *
  * Such revisions can for instance identify page rename
  * operations and other such meta-modifications.
  *
  * @param DatabaseBase $dbw
  * @param int $pageId ID number of the page to read from
  * @param string $summary Revision's summary
  * @param bool $minor Whether the revision should be considered as minor
  * @param User|null $user User object to use or null for $wgUser
  * @return Revision|null Revision or null on error
  */
 public static function newNullRevision($dbw, $pageId, $summary, $minor, $user = null)
 {
     global $wgContentHandlerUseDB, $wgContLang;
     $fields = array('page_latest', 'page_namespace', 'page_title', 'rev_text_id', 'rev_len', 'rev_sha1');
     if ($wgContentHandlerUseDB) {
         $fields[] = 'rev_content_model';
         $fields[] = 'rev_content_format';
     }
     $current = $dbw->selectRow(array('page', 'revision'), $fields, array('page_id' => $pageId, 'page_latest=rev_id'), __METHOD__);
     if ($current) {
         if (!$user) {
             global $wgUser;
             $user = $wgUser;
         }
         // Truncate for whole multibyte characters
         $summary = $wgContLang->truncate($summary, 255);
         $row = array('page' => $pageId, 'user_text' => $user->getName(), 'user' => $user->getId(), 'comment' => $summary, 'minor_edit' => $minor, 'text_id' => $current->rev_text_id, 'parent_id' => $current->page_latest, 'len' => $current->rev_len, 'sha1' => $current->rev_sha1);
         if ($wgContentHandlerUseDB) {
             $row['content_model'] = $current->rev_content_model;
             $row['content_format'] = $current->rev_content_format;
         }
         $revision = new Revision($row);
         $revision->setTitle(Title::makeTitle($current->page_namespace, $current->page_title));
     } else {
         $revision = null;
     }
     return $revision;
 }
Esempio n. 10
0
 /**
  * revisionInsertComplete
  *
  * static method called as hook
  *
  * @static
  * @access public
  *
  * @param Revision	$revision	revision object
  * @param string	$url		url to external object
  * @param string	$flags		flags for this revision
  *
  * @return true means process other hooks
  */
 public static function revisionInsertComplete(&$revision, $url, $flags)
 {
     global $wgUser, $wgCityId, $wgCommandLineMode, $wgSharedDB, $wgErrorLog, $wgMemc, $wgRequest;
     //do nothing if the user clicked 'undo'
     if ($wgRequest->getVal('wpUndoEdit')) {
         return true;
     }
     wfProfileIn(__METHOD__);
     /* first edit? */
     //if (User::edits($wgUser->getID()) == 1) {
     /**
      * Do not create task when DB is locked (rt#12229)
      * Do not create task when we are in $wgCommandLineMode
      */
     $oldValue = $wgErrorLog;
     $wgErrorLog = true;
     if (!wfReadOnly() && !$wgCommandLineMode) {
         wfLoadExtensionMessages("HAWelcome");
         /**
          * Revision has valid Title field but sometimes not filled
          */
         $Title = $revision->getTitle();
         if (!$Title) {
             $Title = Title::newFromId($revision->getPage(), GAID_FOR_UPDATE);
             $revision->setTitle($Title);
         }
         /**
          * get groups for user rt#12215
          */
         $groups = $wgUser->getEffectiveGroups();
         $invalid = array("bot" => true, "staff" => true, "helper" => true, "sysop" => true, "bureaucrat" => true, "vstf" => true);
         $canWelcome = true;
         foreach ($groups as $group) {
             if (isset($invalid[$group]) && $invalid[$group]) {
                 $canWelcome = false;
                 break;
             }
         }
         /**
          * put possible welcomer into memcached, RT#14067
          */
         if ($wgUser->getId() && self::isWelcomer($wgUser)) {
             //$wgMemc->set( wfMemcKey( "last-sysop-id" ), $wgUser->getId(), 86400 );
             $wgMemc->set(wfMemcKey("last-sysop-id"), $wgUser->getId(), 3600);
         }
         if ($Title && $canWelcome && !empty($wgSharedDB)) {
             $welcomer = trim(wfMsgForContent("welcome-user"));
             if ($welcomer !== "@disabled" && $welcomer !== "-") {
                 /**
                  * check if talk page for wgUser exists
                  *
                  * @todo check editcount for user
                  */
                 $talkPage = $wgUser->getUserPage()->getTalkPage();
                 if ($talkPage) {
                     $talkArticle = new Article($talkPage, 0);
                     if (!$talkArticle->exists()) {
                         //run the talk page stuff
                         self::runEditThanks($Title);
                     }
                 }
             }
         }
     }
     //}
     $wgErrorLog = $oldValue;
     wfProfileOut(__METHOD__);
     return true;
 }
	/**
	 * @param $revision REvision
	 * @return mixed
	 */
	function showDiff( $revision ){
		global $wgOut;

		$dbr = wfGetDB( DB_SLAVE );
		$result = $this->getRevisions( $dbr, array( 'hidden_rev_id' => $revision ) );

		foreach ( $result as $row ) {
			$info = $this->listRow( $row );
			$list = $this->revisionInfo( $row );
			$rev = new Revision( $row );
			$title = Title::makeTitle( $row->page_namespace, $row->page_title );
			$rev->setTitle( $title );
			$prevId = $title->getPreviousRevisionID( $row->rev_id );
			if ( $prevId ) {
				$prev = Revision::newFromTitle( $title, $prevId );
				if( $prev ) {
					$otext = strval( $prev->getText( Revision::FOR_THIS_USER ) );
				} else {
					$otext = '';
				}
			} else {
				$wgOut->addHTML(
				"<ul>" .
				$info .
				"</ul>\n" .
				$list );
				$wgOut->addWikiText( wfMsgNoTrans( 'oversight-nodiff' ) );
				return;
			}
			$ntext = strval( $rev->getText( Revision::FOR_THIS_USER ) );

			$diffEngine = new DifferenceEngine( $title );
			$diffEngine->showDiffStyle();
			$wgOut->addHTML(
				"<ul>" .
				$info .
				"</ul>\n" .
				$list .
				"<p><strong>" .
				wfMsgHTML('oversight-difference') .
				"</strong>" .
				"</p>" .
				"<div>" .
				"<table border='0' width='98%' cellpadding='0' cellspacing='4' class='diff'>" .
				"<col class='diff-marker' />" .
				"<col class='diff-content' />" .
				"<col class='diff-marker' />" .
				"<col class='diff-content' />" .
				"<tr>" .
					"<td colspan='2' width='50%' align='center' class='diff-otitle'>" . wfMsgHTML('oversight-prev') . " (#$prevId)" . "</td>" .
					"<td colspan='2' width='50%' align='center' class='diff-ntitle'>" . wfMsgHTML('oversight-hidden') . "</td>" .
				"</tr>" .
				$diffEngine->generateDiffBody( $otext, $ntext ) .
				"</table>" .
				"</div>\n" );
		}
	}
Esempio n. 12
0
 /** Inserts a rollback link
  *
  * @param $s string
  * @param $rc RecentChange
  */
 public function insertRollback(&$s, &$rc)
 {
     if (!$rc->mAttribs['rc_new'] && $rc->mAttribs['rc_this_oldid'] && $rc->mAttribs['rc_cur_id']) {
         $page = $rc->getTitle();
         /** Check for rollback and edit permissions, disallow special pages, and only
          * show a link on the top-most revision */
         if ($this->getUser()->isAllowed('rollback') && $rc->mAttribs['page_latest'] == $rc->mAttribs['rc_this_oldid']) {
             $rev = new Revision(array('id' => $rc->mAttribs['rc_this_oldid'], 'user' => $rc->mAttribs['rc_user'], 'user_text' => $rc->mAttribs['rc_user_text'], 'deleted' => $rc->mAttribs['rc_deleted']));
             $rev->setTitle($page);
             /** Start of Wikia change @author nAndy */
             $rollbackLink = Linker::generateRollback($rev, $this->getContext());
             wfRunHooks('ChangesListInsertRollback', array($this, &$s, &$rollbackLink, $rc));
             $s .= ' ' . $rollbackLink;
             /*End of Wikia change*/
         }
     }
 }
Esempio n. 13
0
 /**
  * Create a new null-revision for insertion into a page's
  * history. This will not re-save the text, but simply refer
  * to the text from the previous version.
  *
  * Such revisions can for instance identify page rename
  * operations and other such meta-modifications.
  *
  * @param $dbw DatabaseBase
  * @param $pageId Integer: ID number of the page to read from
  * @param $summary String: revision's summary
  * @param $minor Boolean: whether the revision should be considered as minor
  * @return Revision|null on error
  */
 public static function newNullRevision($dbw, $pageId, $summary, $minor)
 {
     wfProfileIn(__METHOD__);
     $current = $dbw->selectRow(array('page', 'revision'), array('page_latest', 'page_namespace', 'page_title', 'rev_text_id', 'rev_len', 'rev_sha1'), array('page_id' => $pageId, 'page_latest=rev_id'), __METHOD__);
     if ($current) {
         $revision = new Revision(array('page' => $pageId, 'comment' => $summary, 'minor_edit' => $minor, 'text_id' => $current->rev_text_id, 'parent_id' => $current->page_latest, 'len' => $current->rev_len, 'sha1' => $current->rev_sha1));
         $revision->setTitle(Title::makeTitle($current->page_namespace, $current->page_title));
     } else {
         $revision = null;
     }
     wfProfileOut(__METHOD__);
     return $revision;
 }