Example #1
0
 private function doPost()
 {
     global $wgOut, $wgRequest, $wgMemc;
     $method = $wgRequest->getVal('method');
     if ($method == 'by_id') {
         $new_id = $wgRequest->getInt('new_sysop_id');
         if (empty($new_id) || $new_id < 0) {
             $wgOut->addHTML(Wikia::errorbox("bad input"));
             return false;
         }
         if (!User::whois($new_id)) {
             $wgOut->addHTML(Wikia::errorbox("no user with that id"));
             return false;
         }
         #$wgOut->addHTML( "text['new_sysop_id']=" . $new_id . "<br/>\n");
         // BugId:41817 - if ( 1 == $new_id ) { notify Mix }
         if (1 == $new_id) {
             $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($new_id, true)));
         }
         $wgMemc->set(wfMemcKey("last-sysop-id"), $new_id, 86400);
         $wgOut->addHTML(Wikia::successbox("new value saved"));
     } elseif ($method == 'by_name') {
         $new_text = $wgRequest->getText('new_sysop_text');
         if (empty($new_text)) {
             $wgOut->addHTML(Wikia::errorbox("bad input"));
             return false;
         }
         $new_id = User::idFromName($new_text);
         if (empty($new_id)) {
             $wgOut->addHTML(Wikia::errorbox("name not found as user"));
             return false;
         }
         #$wgOut->addHTML( "text['new_sysop_text']=[" . $new_text . "]<br/>\n");
         // BugId:41817 - if ( 1 == $new_id ) { notify Mix }
         if (1 == $new_id) {
             $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($new_id, true)));
         }
         $wgMemc->set(wfMemcKey("last-sysop-id"), $new_id, 86400);
         $wgOut->addHTML(Wikia::successbox("new value saved"));
     } elseif ($method == 'clear') {
         $wgMemc->delete(wfMemcKey("last-sysop-id"));
         $wgOut->addHTML(Wikia::successbox("cleared"));
     } else {
         $wgOut->addHTML("unknown method [{$method}] used to POST<br/>\n");
     }
 }
 private function doPost()
 {
     global $wgOut, $wgRequest, $wgMemc;
     $method = $wgRequest->getVal('method');
     if ($method == 'by_id') {
         $new_id = $wgRequest->getInt('new_sysop_id');
         if (empty($new_id) || $new_id < 0) {
             $wgOut->addHTML("bad input");
             return false;
         }
         if (!User::whois($new_id)) {
             $wgOut->addHTML("no user with that id");
             return false;
         }
         $wgMemc->set(wfMemcKey("last-sysop-id"), $new_id, 86400);
         $wgOut->addHTML("new value saved");
     } elseif ($method == 'by_name') {
         $new_text = $wgRequest->getText('new_sysop_text');
         if (empty($new_text)) {
             $wgOut->addHTML("bad input");
             return false;
         }
         $new_id = User::idFromName($new_text);
         if (empty($new_id)) {
             $wgOut->addHTML("name not found as user");
             return false;
         }
         $wgMemc->set(wfMemcKey("last-sysop-id"), $new_id, 86400);
         $wgOut->addHTML("new value saved");
     } elseif ($method == 'clear') {
         $wgMemc->delete(wfMemcKey("last-sysop-id"));
         $wgOut->addHTML("cleared");
     } else {
         $wgOut->addHTML("unknown method [{$method}] used to POST<br/>\n");
     }
 }
 function formatRow($row)
 {
     global $wgLang, $wgUser;
     ## One-time setup
     static $sk = null;
     if (is_null($sk)) {
         $sk = $wgUser->getSkin();
     }
     ## Setup
     $timestamp = $row->gb_timestamp;
     $expiry = $row->gb_expiry;
     $options = array();
     # Messy B/C until $wgLang->formatExpiry() is well embedded
     if (Block::decodeExpiry($expiry) == 'infinity') {
         $options[] = wfMsgExt('infiniteblock', 'parseinline');
     } else {
         $expiry = Block::decodeExpiry($expiry);
         $options[] = wfMsgExt('expiringblock', 'parseinline', $wgLang->date($expiry), $wgLang->time($expiry));
     }
     # Check for whitelisting.
     $wlinfo = GlobalBlocking::getWhitelistInfo($row->gb_id);
     if ($wlinfo) {
         $options[] = wfMsg('globalblocking-list-whitelisted', User::whois($wlinfo['user']), $wlinfo['reason']);
     }
     $timestamp = $wgLang->timeanddate(wfTimestamp(TS_MW, $timestamp), true);
     if ($row->gb_anon_only) {
         $options[] = wfMsg('globalblocking-list-anononly');
     }
     ## Do afterthoughts (comment, links for admins)
     $info = array();
     if ($wgUser->isAllowed('globalunblock')) {
         $unblockTitle = SpecialPage::getTitleFor("RemoveGlobalBlock");
         $info[] = $sk->link($unblockTitle, wfMsgExt('globalblocking-list-unblock', 'parseinline'), array(), array('address' => $row->gb_address));
     }
     global $wgApplyGlobalBlocks;
     if ($wgUser->isAllowed('globalblock-whitelist') && $wgApplyGlobalBlocks) {
         $whitelistTitle = SpecialPage::getTitleFor("GlobalBlockStatus");
         $info[] = $sk->link($whitelistTitle, wfMsgExt('globalblocking-list-whitelist', 'parseinline'), array(), array('address' => $row->gb_address));
     }
     if ($wgUser->isAllowed('globalblock')) {
         $reblockTitle = SpecialPage::getTitleFor('GlobalBlock');
         $msg = wfMsgExt('globalblocking-list-modify', 'parseinline');
         $info[] = $sk->link($reblockTitle, $msg, array(), array('wpAddress' => $row->gb_address, 'modify' => 1));
     }
     ## Userpage link / Info on originating wiki
     $display_wiki = GlobalBlocking::getWikiName($row->gb_by_wiki);
     $user_display = GlobalBlocking::maybeLinkUserpage($row->gb_by_wiki, $row->gb_by);
     $infoItems = count($info) ? wfMsg('parentheses', $wgLang->pipeList($info)) : '';
     ## Put it all together.
     return Html::rawElement('li', array(), wfMsgExt('globalblocking-list-blockitem', array('parseinline'), $timestamp, $user_display, $display_wiki, $row->gb_address, $wgLang->commaList($options)) . ' ' . $sk->commentBlock($row->gb_reason) . ' ' . $infoItems);
 }
Example #4
0
 function writeMerge($userid, &$userMerge)
 {
     $foundFamilyTitle = null;
     $foundPeopleCount = 0;
     $familyCount = 0;
     $mergeCount = count($userMerge->merges);
     $preMergeTimestamp = wfTimestamp(TS_MW, wfTimestamp(TS_UNIX, $userMerge->firstTimestamp) - 2);
     foreach ($userMerge->merges as $merge) {
         $mergeNs = $merge->target->title->getNamespace();
         if ($mergeNs != NS_PERSON && $mergeNs != NS_FAMILY && $mergeNs != NS_PERSON_TALK && $mergeNs != NS_FAMILY_TALK) {
             return "invalid target for merge: title={$merge->target->title->getPrefixedText()}";
         }
         if ($foundFamilyTitle && $mergeNs == NS_FAMILY) {
             return "invalid merge sequence - {$merge->target->title->getPrefixedText()} after family: {$foundFamilyTitle->getPrefixedText()}";
         }
         if ($mergeNs == NS_FAMILY) {
             $familyCount = count($merge->sources) + 1;
             $foundFamilyTitle = $merge->target->title;
         } else {
             if ($mergeNs == NS_PERSON) {
                 $foundPeopleCount++;
             }
         }
         // get target preRevid
         $revid = StructuredData::getRevidForTimestamp($merge->target->title, $preMergeTimestamp);
         // its ok if revid was created during the merge for talk pages
         if ($revid == 0 || $revid > $userMerge->lastRevid || $revid >= $userMerge->firstRevid && $mergeNs != NS_PERSON_TALK && $mergeNs != NS_FAMILY_TALK) {
             return "revision not found for target={$merge->target->title->getPrefixedText()} revid={$revid} firstRevid={$userMerge->firstRevid} timestamp={$preMergeTimestamp}";
         }
         $merge->target->preRevid = $revid >= $userMerge->firstRevid ? 0 : $revid;
         // 0 if created during the merge
         $revision = Revision::newFromId($revid);
         $merge->target->revPage = $revision->getPage();
         // get target postRevid and comment
         list($revid, $comment) = $this->getNextRevidComment($merge->target->revPage, $merge->target->preRevid);
         if ($revid != 0 && $revid <= $userMerge->lastRevid) {
             // if target was edited in the merge
             $merge->target->postRevid = $revid;
             $merge->target->comment = $comment;
         }
         // get source preRevid's and titles
         foreach ($merge->sources as $source) {
             $revid = $this->getPrevRevid($source->revPage, $source->postRevid);
             if (!$revid) {
                 return "previous revision not found for source={$source->postRevid}";
             }
             $source->preRevid = $revid;
             $revision = Revision::newFromId($revid);
             $title = $revision->getTitle();
             if (!$title) {
                 return "title not found for source={$source->postRevid}";
             }
             $source->title = $title;
             if ($title->getNamespace() != $mergeNs) {
                 return "invalid source={$title->getPrefixedText()} target={$merge->target->title->getPrefixedText()}";
             }
         }
     }
     if ($foundPeopleCount > 1 && !$foundFamilyTitle) {
         return "invalid merge sequence: multiple merges without a family: count={$mergeCount}";
     }
     if (!$foundFamilyTitle && $foundPeopleCount == 0) {
         return "invalid merge sequence: no people or families count={$mergeCount}";
     }
     // put merge revids into their proper rows and columns, and add roles
     $mergeRows = array();
     for ($m = 0; $m < count($userMerge->merges); $m++) {
         $mergeRows[$m] = (object) array('role' => '', 'revids' => array());
         if ($foundFamilyTitle && $userMerge->merges[$m]->target->title->getNamespace() == NS_PERSON) {
             for ($p = 0; $p < count($familyCount); $p++) {
                 $mergeRows[$m]->revids[$p] = array();
             }
         }
     }
     $mainTitle = null;
     $totalScore = 0;
     $totalCount = 0;
     $seenRevids = array();
     for ($m = 0; $m < count($userMerge->merges); $m++) {
         $merge =& $userMerge->merges[$m];
         $ns = $merge->target->title->getNamespace();
         // read baseData and data, calc match score
         if ($ns == NS_PERSON || $ns == NS_FAMILY) {
             $baseData = $this->readData($merge->target->title, $merge->target->preRevid);
             if (!$baseData) {
                 return "unable to read data for {$merge->target->title->getPrefixedText()} revid={$merge->target->preRevid}";
             }
             if ($ns == NS_FAMILY) {
                 $baseStdData = MergeForm::standardizeFamilyData($baseData);
             } else {
                 $baseStdData = MergeForm::standardizePersonData($baseData);
             }
             $data = array();
             for ($p = 0; $p < count($merge->sources); $p++) {
                 $data[$p] = $this->readData($merge->sources[$p]->title, $merge->sources[$p]->preRevid);
                 if (!$data[$p]) {
                     return "unable to read data for {$merge->sources[$p]->title->getPrefixedText()} revid={$merge->sources[$p]->preRevid}";
                 }
                 if ($ns == NS_FAMILY) {
                     $stdData = MergeForm::standardizeFamilyData($data[$p]);
                 } else {
                     $stdData = MergeForm::standardizePersonData($data[$p]);
                 }
                 $totalScore += MergeForm::calcMatchScore($baseStdData, $stdData);
                 $totalCount++;
             }
         }
         if ($foundFamilyTitle && $ns == NS_FAMILY) {
             // use pre-merge family revisions to get roles, row numbers
             $this->recordFamilyMembers($baseData['husbands'], 'husband', 0, $userMerge->merges, $preMergeTimestamp, $familyCount, $mergeRows, $seenRevids);
             $this->recordFamilyMembers($baseData['wives'], 'wife', 0, $userMerge->merges, $preMergeTimestamp, $familyCount, $mergeRows, $seenRevids);
             $this->recordFamilyMembers($baseData['children'], 'child', 0, $userMerge->merges, $preMergeTimestamp, $familyCount, $mergeRows, $seenRevids);
             for ($p = 0; $p < count($data); $p++) {
                 $this->recordFamilyMembers($data[$p]['husbands'], 'husband', $p + 1, $userMerge->merges, $preMergeTimestamp, $familyCount, $mergeRows, $seenRevids);
                 $this->recordFamilyMembers($data[$p]['wives'], 'wife', $p + 1, $userMerge->merges, $preMergeTimestamp, $familyCount, $mergeRows, $seenRevids);
                 $this->recordFamilyMembers($data[$p]['children'], 'child', $p + 1, $userMerge->merges, $preMergeTimestamp, $familyCount, $mergeRows, $seenRevids);
             }
         }
         if (!$foundFamilyTitle || $ns != NS_PERSON) {
             // handle people in families above
             $mergeRows[$m]->revids[0] = array();
             $mergeRows[$m]->revids[0][] = $merge->target->preRevid;
             for ($p = 0; $p < count($merge->sources); $p++) {
                 $mergeRows[$m]->revids[$p + 1] = array();
                 $mergeRows[$m]->revids[$p + 1][] = $merge->sources[$p]->preRevid;
             }
             if ($ns == NS_PERSON_TALK || $ns == NS_FAMILY_TALK) {
                 $mergeRows[$m]->role = 'talk';
             } else {
                 if ($ns == NS_PERSON) {
                     $mergeRows[$m]->role = 'Person';
                 } else {
                     if ($ns == NS_FAMILY) {
                         $mergeRows[$m]->role = 'Family';
                     }
                 }
             }
         }
         if ($ns == NS_FAMILY || $ns == NS_PERSON && !$foundFamilyTitle) {
             $mainTitle = $merge->target->title;
         }
     }
     if ($foundFamilyTitle && $mainTitle->getPrefixedText() != $foundFamilyTitle->getPrefixedText()) {
         return "family titles not equal: {$mainTitle->getPrefixedText()} and {$foundFamilyTitle->getPrefixedText()}";
     }
     if ($foundFamilyTitle) {
         // verify that all merging people have been recorded in mergeRows somewhere
         foreach ($userMerge->merges as &$merge) {
             if ($merge->target->title->getNamespace() == NS_PERSON) {
                 if (!@$seenRevids[$merge->target->preRevid]) {
                     return "target person not found: {$merge->target->title->getPrefixedText()}";
                 }
                 foreach ($merge->sources as &$source) {
                     if (!@$seenRevids[$source->preRevid]) {
                         return "source person not found: {$source->title->getPrefixedText()}";
                     }
                 }
             }
         }
     }
     // write mergelog record
     $mergeScore = $totalCount > 0 ? $totalScore / $totalCount : 0;
     $isTrustedUser = CompareForm::isTrustedMerger(User::newFromName(User::whois($userid)));
     $isTrustedMerge = MergeForm::isTrustedMerge($mergeScore, $isTrustedUser);
     $mergeId = $this->writeMergelog($userid, $userMerge, $mergeScore, $isTrustedMerge, $mainTitle, $mergeRows);
     // update post-merge comments with ml_id
     $this->updateMergeComments($userMerge, $mainTitle, $mergeId);
     $this->log("INFO", "writeMerge id={$mergeId} score={$mergeScore} isTrusted={$isTrustedMerge} merges={$mergeCount} title={$mainTitle->getPrefixedText()}", $userid, $userMerge->firstTimestamp);
     return '';
 }
 public function execute($par)
 {
     global $wgContLang, $wgFlaggedRevsStats, $wgFlaggedRevsProtection;
     $out = $this->getOutput();
     $lang = $this->getLanguage();
     $this->setHeaders();
     $this->db = wfGetDB(DB_SLAVE);
     $this->maybeUpdate();
     $ec = $this->getEditorCount();
     $rc = $this->getReviewerCount();
     $mt = $this->getMeanReviewWaitAnon();
     $mdt = $this->getMedianReviewWaitAnon();
     $pt = $this->getMeanPendingWait();
     $pData = $this->getReviewPercentilesAnon();
     $timestamp = $this->getLastUpdate();
     $out->addWikiMsg('validationstatistics-users', $lang->formatnum($ec), $lang->formatnum($rc));
     # Most of the output depends on background queries
     if (!$this->readyForQuery()) {
         return false;
     }
     # Is there a review time table available?
     if (count($pData)) {
         $headerRows = $dataRows = '';
         foreach ($pData as $percentile => $perValue) {
             $headerRows .= "<th>P<sub>" . intval($percentile) . "</sub></th>";
             $dataRows .= '<td>' . $lang->formatTimePeriod($perValue, 'avoidminutes') . '</td>';
         }
         $css = 'wikitable flaggedrevs_stats_table';
         $reviewChart = "<table class='{$css}' style='white-space: nowrap;'>\n";
         $reviewChart .= "<tr align='center'>{$headerRows}</tr>\n";
         $reviewChart .= "<tr align='center'>{$dataRows}</tr>\n";
         $reviewChart .= "</table>\n";
     } else {
         $reviewChart = '';
     }
     if ($timestamp != '-') {
         # Show "last updated"...
         $out->addWikiMsg('validationstatistics-lastupdate', $lang->date($timestamp, true), $lang->time($timestamp, true));
     }
     $out->addHtml('<hr/>');
     # Show pending time stats...
     $out->addWikiMsg('validationstatistics-pndtime', $lang->formatTimePeriod($pt, 'avoidminutes'));
     # Show review time stats...
     if (!FlaggedRevs::useOnlyIfProtected()) {
         $out->addWikiMsg('validationstatistics-revtime', $lang->formatTimePeriod($mt, 'avoidminutes'), $lang->formatTimePeriod($mdt, 'avoidminutes'), $reviewChart);
     }
     # Show per-namespace stats table...
     $out->addWikiMsg('validationstatistics-table');
     $out->addHTML(Xml::openElement('table', array('class' => 'wikitable flaggedrevs_stats_table')));
     $out->addHTML("<tr>\n");
     // Headings (for a positive grep result):
     // validationstatistics-ns, validationstatistics-total, validationstatistics-stable,
     // validationstatistics-latest, validationstatistics-synced, validationstatistics-old,
     // validationstatistics-unreviewed
     $msgs = array('ns', 'total', 'stable', 'latest', 'synced', 'old');
     // our headings
     if (!$wgFlaggedRevsProtection) {
         $msgs[] = 'unreviewed';
     }
     foreach ($msgs as $msg) {
         $out->addHTML('<th>' . $this->msg("validationstatistics-{$msg}")->parse() . '</th>');
     }
     $out->addHTML("</tr>\n");
     $namespaces = FlaggedRevs::getReviewNamespaces();
     foreach ($namespaces as $namespace) {
         $total = $this->getTotalPages($namespace);
         $reviewed = $this->getReviewedPages($namespace);
         $synced = $this->getSyncedPages($namespace);
         if ($total === '-' || $reviewed === '-' || $synced === '-') {
             continue;
             // NS added to config recently?
         }
         $NsText = $wgContLang->getFormattedNsText($namespace);
         $NsText = $NsText ? $NsText : $this->msg('blanknamespace')->escaped();
         $percRev = intval($total) == 0 ? '-' : $this->msg('parentheses', $this->msg('percent')->numParams(sprintf('%4.2f', 100 * intval($reviewed) / intval($total)))->escaped())->text();
         $percLatest = intval($total) == 0 ? '-' : $this->msg('parentheses', $this->msg('percent')->numParams(sprintf('%4.2f', 100 * intval($synced) / intval($total)))->escaped())->text();
         $percSynced = intval($reviewed) == 0 ? '-' : $this->msg('percent')->numParams(sprintf('%4.2f', 100 * intval($synced) / intval($reviewed)))->escaped();
         $outdated = intval($reviewed) - intval($synced);
         $outdated = $lang->formatnum(max(0, $outdated));
         // lag between queries
         $unreviewed = intval($total) - intval($reviewed);
         $unreviewed = $lang->formatnum(max(0, $unreviewed));
         // lag between queries
         $out->addHTML("<tr align='center'>\n\t\t\t\t\t<td>" . htmlspecialchars($NsText) . "</td>\n\t\t\t\t\t<td>" . htmlspecialchars($lang->formatnum($total)) . "</td>\n\t\t\t\t\t<td>" . htmlspecialchars($lang->formatnum($reviewed) . $wgContLang->getDirMark()) . " <i>{$percRev}</i>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td>" . htmlspecialchars($lang->formatnum($synced) . $wgContLang->getDirMark()) . " <i>{$percLatest}</i>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td>" . $percSynced . "</td>\n\t\t\t\t\t<td>" . Linker::linkKnown(SpecialPage::getTitleFor('PendingChanges'), htmlspecialchars($outdated), array(), array('namespace' => $namespace)) . "</td>");
         if (!$wgFlaggedRevsProtection) {
             $out->addHTML("\n\t\t\t\t\t<td>" . Linker::linkKnown(SpecialPage::getTitleFor('UnreviewedPages'), htmlspecialchars($unreviewed), array(), array('namespace' => $namespace)) . "</td>");
         }
         $out->addHTML("\n\t\t\t\t</tr>");
     }
     $out->addHTML(Xml::closeElement('table'));
     # Is there a top X user list? If so, then show it...
     $data = $this->getTopReviewers();
     if (is_array($data) && count($data)) {
         $out->addWikiMsg('validationstatistics-utable', $lang->formatNum($wgFlaggedRevsStats['topReviewersCount']), $lang->formatNum($wgFlaggedRevsStats['topReviewersHours']));
         $css = 'wikitable flaggedrevs_stats_table';
         $reviewChart = "<table class='{$css}' style='white-space: nowrap;'>\n";
         $reviewChart .= '<tr><th>' . $this->msg('validationstatistics-user')->escaped() . '</th><th>' . $this->msg('validationstatistics-reviews')->escaped() . '</th></tr>';
         foreach ($data as $userId => $reviews) {
             $reviewChart .= '<tr><td>' . htmlspecialchars(User::whois($userId)) . '</td><td>' . $lang->formatNum($reviews) . '</td></tr>';
         }
         $reviewChart .= "</table>\n";
         $out->addHTML($reviewChart);
     }
     return true;
 }
	public function getReviewedBy() {
		return User::whois( $this->mStrickenBy );

	}