protected function autoreview_current(User $user) { $this->output("Auto-reviewing all current page versions...\n"); if (!$user->getID()) { $this->output("Invalid user specified.\n"); return; } elseif (!$user->isAllowed('review')) { $this->output("User specified (id: {$user->getID()}) does not have \"review\" rights.\n"); return; } $db = wfGetDB(DB_MASTER); $this->output("Reviewer username: "******"\n"); $start = $db->selectField('page', 'MIN(page_id)', false, __METHOD__); $end = $db->selectField('page', 'MAX(page_id)', false, __METHOD__); if (is_null($start) || is_null($end)) { $this->output("...page table seems to be empty.\n"); return; } # Do remaining chunk $end += $this->mBatchSize - 1; $blockStart = $start; $blockEnd = $start + $this->mBatchSize - 1; $count = 0; $changed = 0; $flags = FlaggedRevs::quickTags(FR_CHECKED); // Assume basic level while ($blockEnd <= $end) { $this->output("...doing page_id from {$blockStart} to {$blockEnd}\n"); $res = $db->select(array('page', 'revision'), '*', array("page_id BETWEEN {$blockStart} AND {$blockEnd}", 'page_namespace' => FlaggedRevs::getReviewNamespaces(), 'rev_id = page_latest'), __METHOD__); # Go through and autoreview the current version of every page... foreach ($res as $row) { $title = Title::newFromRow($row); $rev = Revision::newFromRow($row); # Is it already reviewed? $frev = FlaggedRevision::newFromTitle($title, $row->page_latest, FR_MASTER); # Rev should exist, but to be safe... if (!$frev && $rev) { $article = new Article($title); $db->begin(); FlaggedRevs::autoReviewEdit($article, $user, $rev, $flags, true); FlaggedRevs::HTMLCacheUpdates($article->getTitle()); $db->commit(); $changed++; } $count++; } $db->freeResult($res); $blockStart += $this->mBatchSize - 1; $blockEnd += $this->mBatchSize - 1; // XXX: Don't let deferred jobs array get absurdly large (bug 24375) DeferredUpdates::doUpdates('commit'); wfWaitForSlaves(5); } $this->output("Auto-reviewing of all pages complete ..." . "{$count} rows [{$changed} changed]\n"); }
/** * When an user makes a null-edit we sometimes want to review it... * (a) Null undo or rollback * (b) Null edit with review box checked * Note: called after edit ops are finished */ public static function maybeNullEditReview(Page $article, $user, $text, $s, $m, $a, $b, $flags, $rev, &$status, $baseId) { global $wgRequest; # Revision must *be* null (null edit). We also need the user who made the edit. if (!$user || $rev !== null) { return true; } # Rollback/undo or box checked $reviewEdit = $wgRequest->getCheck('wpReviewEdit'); if (!$baseId && !$reviewEdit) { return true; // short-circuit } $fa = FlaggableWikiPage::getTitleInstance($article->getTitle()); $fa->loadPageData('fromdbmaster'); if (!$fa->isReviewable()) { return true; // page is not reviewable } $title = $article->getTitle(); // convenience # Get the current revision ID $rev = Revision::newFromTitle($title, false, Revision::READ_LATEST); if (!$rev) { return true; // wtf? } $flags = null; # Is this a rollback/undo that didn't change anything? if ($baseId > 0) { $frev = FlaggedRevision::newFromTitle($title, $baseId); // base rev of null edit $pRev = Revision::newFromId($rev->getParentId()); // current rev parent $revIsNull = $pRev && $pRev->getTextId() == $rev->getTextId(); # Was the edit that we tried to revert to reviewed? # We avoid auto-reviewing null edits to avoid confusion (bug 28476). if ($frev && !$revIsNull) { # Review this revision of the page... $ok = FlaggedRevs::autoReviewEdit($article, $user, $rev, $flags); if ($ok) { FlaggedRevs::markRevisionPatrolled($rev); // reviewed -> patrolled FlaggedRevs::extraHTMLCacheUpdate($title); return true; } } } # Get edit timestamp, it must exist. $editTimestamp = $wgRequest->getVal('wpEdittime'); # Is the page checked off to be reviewed? if ($editTimestamp && $reviewEdit && $title->userCan('review')) { # Check wpEdittime against current revision's time. # If an edit was auto-merged in between, review only up to what # was the current rev when this user started editing the page. if ($rev->getTimestamp() != $editTimestamp) { $dbw = wfGetDB(DB_MASTER); $rev = Revision::loadFromTimestamp($dbw, $title, $editTimestamp); if (!$rev) { return true; // deleted? } } # Review this revision of the page... $ok = FlaggedRevs::autoReviewEdit($article, $user, $rev, $flags, false); if ($ok) { FlaggedRevs::markRevisionPatrolled($rev); // reviewed -> patrolled FlaggedRevs::extraHTMLCacheUpdate($title); } } return true; }
/** * Submit the form parameters for the page config to the DB. * * @return mixed (true on success, error string on failure) */ public function doSubmit() { # Double-check permissions if (!$this->isAllowed()) { return 'stablize_denied'; } # Parse and cleanup the expiry time given... $expiry = $this->getExpiry(); if ($expiry === false) { return 'stabilize_expiry_invalid'; } elseif ($expiry !== Block::infinity() && $expiry < wfTimestampNow()) { return 'stabilize_expiry_old'; } # Update the DB row with the new config... $changed = FRPageConfig::setStabilitySettings($this->page, $this->getNewConfig()); # Log if this actually changed anything... if ($changed) { $article = new FlaggableWikiPage($this->page); if (FlaggedRevs::useOnlyIfProtected()) { # Config may have changed to allow stable versions, so refresh # the tracking table to account for any hidden reviewed versions... $frev = FlaggedRevision::determineStable($this->page, FR_MASTER); if ($frev) { $article->updateStableVersion($frev); } else { $article->clearStableVersion(); } } # Update logs and make a null edit $nullRev = $this->updateLogsAndHistory($article); # Null edit may have been auto-reviewed already $frev = FlaggedRevision::newFromTitle($this->page, $nullRev->getId(), FR_MASTER); $updatesDone = (bool) $frev; // stableVersionUpdates() already called? # Check if this null edit is to be reviewed... if ($this->reviewThis && !$frev) { $flags = null; # Review this revision of the page... $ok = FlaggedRevs::autoReviewEdit($article, $this->user, $nullRev, $flags, true); if ($ok) { FlaggedRevs::markRevisionPatrolled($nullRev); // reviewed -> patrolled $updatesDone = true; // stableVersionUpdates() already called } } # Update page and tracking tables and clear cache. if (!$updatesDone) { FlaggedRevs::stableVersionUpdates($this->page); } } # Apply watchlist checkbox value (may be NULL) $this->updateWatchlist(); # Take this opportunity to purge out expired configurations FRPageConfig::purgeExpiredConfigurations(); return true; }