/** * @return bool Whether this sign-off has been struck */ public function isStruck() { return $this->timestampStruck !== Block::infinity(); }
public function convertExpiry($str) { if (strlen($str) == 0) { return; } if ($str == 'infinite' || $str == 'indefinite') { return Block::infinity(); } else { # Convert GNU-style date, on error returns -1 for PHP <5.1 and false for PHP >=5.1 $expiry = strtotime($str); if ($expiry < 0 || $expiry === false) { return; } return wfTimestamp(TS_MW, $expiry); } }
public function execute() { global $wgUser, $wgRestrictionTypes, $wgRestrictionLevels; $params = $this->extractRequestParams(); $titleObj = NULL; if (!isset($params['title'])) { $this->dieUsageMsg(array('missingparam', 'title')); } if (!isset($params['token'])) { $this->dieUsageMsg(array('missingparam', 'token')); } if (empty($params['protections'])) { $this->dieUsageMsg(array('missingparam', 'protections')); } if (!$wgUser->matchEditToken($params['token'])) { $this->dieUsageMsg(array('sessionfailure')); } $titleObj = Title::newFromText($params['title']); if (!$titleObj) { $this->dieUsageMsg(array('invalidtitle', $params['title'])); } $errors = $titleObj->getUserPermissionsErrors('protect', $wgUser); if ($errors) { // We don't care about multiple errors, just report one of them $this->dieUsageMsg(reset($errors)); } $expiry = (array) $params['expiry']; if (count($expiry) != count($params['protections'])) { if (count($expiry) == 1) { $expiry = array_fill(0, count($params['protections']), $expiry[0]); } else { $this->dieUsageMsg(array('toofewexpiries', count($expiry), count($params['protections']))); } } $protections = array(); $expiryarray = array(); $resultProtections = array(); foreach ($params['protections'] as $i => $prot) { $p = explode('=', $prot); $protections[$p[0]] = $p[1] == 'all' ? '' : $p[1]; if ($titleObj->exists() && $p[0] == 'create') { $this->dieUsageMsg(array('create-titleexists')); } if (!$titleObj->exists() && $p[0] != 'create') { $this->dieUsageMsg(array('missingtitles-createonly')); } if (!in_array($p[0], $wgRestrictionTypes) && $p[0] != 'create') { $this->dieUsageMsg(array('protect-invalidaction', $p[0])); } if (!in_array($p[1], $wgRestrictionLevels) && $p[1] != 'all') { $this->dieUsageMsg(array('protect-invalidlevel', $p[1])); } if (in_array($expiry[$i], array('infinite', 'indefinite', 'never'))) { $expiryarray[$p[0]] = Block::infinity(); } else { $exp = strtotime($expiry[$i]); if ($exp < 0 || $exp == false) { $this->dieUsageMsg(array('invalidexpiry', $expiry[$i])); } $exp = wfTimestamp(TS_MW, $exp); if ($exp < wfTimestampNow()) { $this->dieUsageMsg(array('pastexpiry', $expiry[$i])); } $expiryarray[$p[0]] = $exp; } $resultProtections[] = array($p[0] => $protections[$p[0]], 'expiry' => $expiryarray[$p[0]] == Block::infinity() ? 'infinite' : wfTimestamp(TS_ISO_8601, $expiryarray[$p[0]])); } $cascade = $params['cascade']; $articleObj = new Article($titleObj); if ($params['watch']) { $articleObj->doWatch(); } if ($titleObj->exists()) { $ok = $articleObj->updateRestrictions($protections, $params['reason'], $cascade, $expiryarray); } else { $ok = $titleObj->updateTitleProtection($protections['create'], $params['reason'], $expiryarray['create']); } if (!$ok) { // This is very weird. Maybe the article was deleted or the user was blocked/desysopped in the meantime? // Just throw an unknown error in this case, as it's very likely to be a race condition $this->dieUsageMsg(array()); } $res = array('title' => $titleObj->getPrefixedText(), 'reason' => $params['reason']); if ($cascade) { $res['cascade'] = ''; } $res['protections'] = $resultProtections; $this->getResult()->setIndexedTagName($res['protections'], 'protection'); $this->getResult()->addValue(null, $this->getModuleName(), $res); }
/** * Update the article's restriction field, and leave a log entry. * * @param $limit Array: set of restriction keys * @param $reason String * @param &$cascade Integer. Set to false if cascading protection isn't allowed. * @param $expiry Array: per restriction type expiration * @return bool true on success */ public function updateRestrictions($limit = array(), $reason = '', &$cascade = 0, $expiry = array()) { global $wgUser, $wgContLang; $restrictionTypes = $this->mTitle->getRestrictionTypes(); $id = $this->mTitle->getArticleID(); if ($id <= 0) { wfDebug("updateRestrictions failed: article id {$id} <= 0\n"); return false; } if (wfReadOnly()) { wfDebug("updateRestrictions failed: read-only\n"); return false; } if (!$this->mTitle->userCan('protect')) { wfDebug("updateRestrictions failed: insufficient permissions\n"); return false; } if (!$cascade) { $cascade = false; } // Take this opportunity to purge out expired restrictions Title::purgeExpiredRestrictions(); # FIXME: Same limitations as described in ProtectionForm.php (line 37); # we expect a single selection, but the schema allows otherwise. $current = array(); $updated = Article::flattenRestrictions($limit); $changed = false; foreach ($restrictionTypes as $action) { if (isset($expiry[$action])) { # Get current restrictions on $action $aLimits = $this->mTitle->getRestrictions($action); $current[$action] = implode('', $aLimits); # Are any actual restrictions being dealt with here? $aRChanged = count($aLimits) || !empty($limit[$action]); # If something changed, we need to log it. Checking $aRChanged # assures that "unprotecting" a page that is not protected does # not log just because the expiry was "changed". if ($aRChanged && $this->mTitle->mRestrictionsExpiry[$action] != $expiry[$action]) { $changed = true; } } } $current = Article::flattenRestrictions($current); $changed = $changed || $current != $updated; $changed = $changed || $updated && $this->mTitle->areRestrictionsCascading() != $cascade; $protect = $updated != ''; # If nothing's changed, do nothing if ($changed) { if (wfRunHooks('ArticleProtect', array(&$this, &$wgUser, $limit, $reason))) { $dbw = wfGetDB(DB_MASTER); # Prepare a null revision to be added to the history $modified = $current != '' && $protect; if ($protect) { $comment_type = $modified ? 'modifiedarticleprotection' : 'protectedarticle'; } else { $comment_type = 'unprotectedarticle'; } $comment = $wgContLang->ucfirst(wfMsgForContent($comment_type, $this->mTitle->getPrefixedText())); # Only restrictions with the 'protect' right can cascade... # Otherwise, people who cannot normally protect can "protect" pages via transclusion $editrestriction = isset($limit['edit']) ? array($limit['edit']) : $this->mTitle->getRestrictions('edit'); # The schema allows multiple restrictions if (!in_array('protect', $editrestriction) && !in_array('sysop', $editrestriction)) { $cascade = false; } $cascade_description = ''; if ($cascade) { $cascade_description = ' [' . wfMsgForContent('protect-summary-cascade') . ']'; } if ($reason) { $comment .= ": {$reason}"; } $editComment = $comment; $encodedExpiry = array(); $protect_description = ''; foreach ($limit as $action => $restrictions) { if (!isset($expiry[$action])) { $expiry[$action] = Block::infinity(); } $encodedExpiry[$action] = Block::encodeExpiry($expiry[$action], $dbw); if ($restrictions != '') { $protect_description .= "[{$action}={$restrictions}] ("; if ($encodedExpiry[$action] != 'infinity') { $protect_description .= wfMsgForContent('protect-expiring', $wgContLang->timeanddate($expiry[$action], false, false), $wgContLang->date($expiry[$action], false, false), $wgContLang->time($expiry[$action], false, false)); } else { $protect_description .= wfMsgForContent('protect-expiry-indefinite'); } $protect_description .= ') '; } } $protect_description = trim($protect_description); if ($protect_description && $protect) { $editComment .= " ({$protect_description})"; } if ($cascade) { $editComment .= "{$cascade_description}"; } # Update restrictions table foreach ($limit as $action => $restrictions) { if ($restrictions != '') { $dbw->replace('page_restrictions', array(array('pr_page', 'pr_type')), array('pr_page' => $id, 'pr_type' => $action, 'pr_level' => $restrictions, 'pr_cascade' => $cascade && $action == 'edit' ? 1 : 0, 'pr_expiry' => $encodedExpiry[$action]), __METHOD__); } else { $dbw->delete('page_restrictions', array('pr_page' => $id, 'pr_type' => $action), __METHOD__); } } # Insert a null revision $nullRevision = Revision::newNullRevision($dbw, $id, $editComment, true); $nullRevId = $nullRevision->insertOn($dbw); $latest = $this->getLatest(); # Update page record $dbw->update('page', array('page_touched' => $dbw->timestamp(), 'page_restrictions' => '', 'page_latest' => $nullRevId), array('page_id' => $id), 'Article::protect'); wfRunHooks('NewRevisionFromEditComplete', array($this, $nullRevision, $latest, $wgUser)); wfRunHooks('ArticleProtectComplete', array(&$this, &$wgUser, $limit, $reason)); # Update the protection log $log = new LogPage('protect'); if ($protect) { $params = array($protect_description, $cascade ? 'cascade' : ''); $log->addEntry($modified ? 'modify' : 'protect', $this->mTitle, trim($reason), $params); } else { $log->addEntry('unprotect', $this->mTitle, $reason); } } # End hook } # End "changed" check return true; }
public function execute() { global $wgUser; $this->getMain()->requestWriteMode(); $params = $this->extractRequestParams(); $titleObj = NULL; if (!isset($params['title'])) { $this->dieUsageMsg(array('missingparam', 'title')); } if (!isset($params['token'])) { $this->dieUsageMsg(array('missingparam', 'token')); } if (!isset($params['protections']) || empty($params['protections'])) { $this->dieUsageMsg(array('missingparam', 'protections')); } if (!$wgUser->matchEditToken($params['token'])) { $this->dieUsageMsg(array('sessionfailure')); } $titleObj = Title::newFromText($params['title']); if (!$titleObj) { $this->dieUsageMsg(array('invalidtitle', $params['title'])); } $errors = $titleObj->getUserPermissionsErrors('protect', $wgUser); if (!empty($errors)) { // We don't care about multiple errors, just report one of them $this->dieUsageMsg(current($errors)); } if (in_array($params['expiry'], array('infinite', 'indefinite', 'never'))) { $expiry = Block::infinity(); } else { $expiry = strtotime($params['expiry']); if ($expiry < 0 || $expiry == false) { $this->dieUsageMsg(array('invalidexpiry')); } $expiry = wfTimestamp(TS_MW, $expiry); if ($expiry < wfTimestampNow()) { $this->dieUsageMsg(array('pastexpiry')); } } $protections = array(); foreach ($params['protections'] as $prot) { $p = explode('=', $prot); $protections[$p[0]] = $p[1] == 'all' ? '' : $p[1]; if ($titleObj->exists() && $p[0] == 'create') { $this->dieUsageMsg(array('create-titleexists')); } if (!$titleObj->exists() && $p[0] != 'create') { $this->dieUsageMsg(array('missingtitles-createonly')); } } $dbw = wfGetDb(DB_MASTER); $dbw->begin(); if ($titleObj->exists()) { $articleObj = new Article($titleObj); $ok = $articleObj->updateRestrictions($protections, $params['reason'], $params['cascade'], $expiry); } else { $ok = $titleObj->updateTitleProtection($protections['create'], $params['reason'], $expiry); } if (!$ok) { // This is very weird. Maybe the article was deleted or the user was blocked/desysopped in the meantime? // Just throw an unknown error in this case, as it's very likely to be a race condition $this->dieUsageMsg(array()); } $dbw->commit(); $res = array('title' => $titleObj->getPrefixedText(), 'reason' => $params['reason']); if ($expiry == Block::infinity()) { $res['expiry'] = 'infinity'; } else { $res['expiry'] = wfTimestamp(TS_ISO_8601, $expiry); } if ($params['cascade']) { $res['cascade'] = ''; } $res['protections'] = $protections; $this->getResult()->addValue(null, $this->getModuleName(), $res); }
$wgUser = User::newFromName($userName); if (!$wgUser) { print "Invalid username\n"; exit(1); } if ($wgUser->isAnon()) { $wgUser->addToDatabase(); } if (empty($wgWikiaKeyPages)) { $wgWikiaKeyPages = array('Image:Wiki.png', 'Image:Favicon.ico'); } #--- define restriction level and duration $restrictions['edit'] = 'sysop'; $restrictions['move'] = 'sysop'; $titleRestrictions = 'sysop'; $expiry = Block::infinity(); #--- define reason msg and fetch it $wgMessageCache->addMessages(array('createwiki-protect-reason' => 'Part of the official interface')); $reason = wfMsgForContent('createwiki-protect-reason'); $wgUser->addGroup('staff'); $wgUser->addGroup('bot'); foreach ($wgWikiaKeyPages as $pageName) { $title = Title::newFromText($pageName); $article = new Article($title); if ($article->exists()) { $ok = $article->updateRestrictions($restrictions, $reason, 0, $expiry); } else { $ok = $title->updateTitleProtection($titleRestrictions, $reason, $expiry); } if ($ok) { print "Protected key page: {$pageName}\n";
/** * Callback function to output a block */ function formatRow($block) { global $wgUser, $wgLang; wfProfileIn(__METHOD__); static $sk = null, $msg = null; if (is_null($sk)) { $sk = $wgUser->getSkin(); } if (is_null($msg)) { $msg = array(); $keys = array('infiniteblock', 'expiringblock', 'unblocklink', 'anononlyblock', 'createaccountblock', 'noautoblockblock', 'emailblock'); foreach ($keys as $key) { $msg[$key] = wfMsgHtml($key); } $msg['blocklistline'] = wfMsg('blocklistline'); } # Prepare links to the blocker's user and talk pages $blocker_id = $block->getBy(); $blocker_name = $block->getByName(); $blocker = $sk->userLink($blocker_id, $blocker_name); $blocker .= $sk->userToolLinks($blocker_id, $blocker_name); # Prepare links to the block target's user and contribs. pages (as applicable, don't do it for autoblocks) if ($block->mAuto) { $target = $block->getRedactedName(); # Hide the IP addresses of auto-blocks; privacy } else { $target = $sk->userLink($block->mUser, $block->mAddress) . $sk->userToolLinks($block->mUser, $block->mAddress, false, Linker::TOOL_LINKS_NOBLOCK); } $formattedTime = $wgLang->timeanddate($block->mTimestamp, true); $properties = array(); if ($block->mExpiry === "" || $block->mExpiry === Block::infinity()) { $properties[] = $msg['infiniteblock']; } else { $properties[] = wfMsgReplaceArgs($msg['expiringblock'], array($wgLang->timeanddate($block->mExpiry, true))); } if ($block->mAnonOnly) { $properties[] = $msg['anononlyblock']; } if ($block->mCreateAccount) { $properties[] = $msg['createaccountblock']; } if (!$block->mEnableAutoblock && $block->mUser) { $properties[] = $msg['noautoblockblock']; } if ($block->mBlockEmail && $block->mUser) { $properties[] = $msg['emailblock']; } $properties = implode(', ', $properties); $line = wfMsgReplaceArgs($msg['blocklistline'], array($formattedTime, $blocker, $target, $properties)); $unblocklink = ''; if ($wgUser->isAllowed('block')) { $titleObj = SpecialPage::getTitleFor("Ipblocklist"); $unblocklink = ' (' . $sk->makeKnownLinkObj($titleObj, $msg['unblocklink'], 'action=unblock&id=' . urlencode($block->mId)) . ')'; } $comment = $sk->commentBlock($block->mReason); $s = "{$line} {$comment}"; if ($block->mHideName) { $s = '<span class="history-deleted">' . $s . '</span>'; } wfProfileOut(__METHOD__); return "<li>{$s} {$unblocklink}</li>\n"; }
/** * Backend block code. * $userID and $expiry will be filled accordingly * @return array(message key, arguments) on failure, empty array on success */ function doBlock(&$userId = null, &$expiry = null) { global $wgUser, $wgSysopUserBans, $wgSysopRangeBans; $userId = 0; # Expand valid IPv6 addresses, usernames are left as is $this->BlockAddress = IP::sanitizeIP($this->BlockAddress); # isIPv4() and IPv6() are used for final validation $rxIP4 = '\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}'; $rxIP6 = '\\w{1,4}:\\w{1,4}:\\w{1,4}:\\w{1,4}:\\w{1,4}:\\w{1,4}:\\w{1,4}:\\w{1,4}'; $rxIP = "({$rxIP4}|{$rxIP6})"; # Check for invalid specifications if (!preg_match("/^{$rxIP}\$/", $this->BlockAddress)) { $matches = array(); if (preg_match("/^({$rxIP4})\\/(\\d{1,2})\$/", $this->BlockAddress, $matches)) { # IPv4 if ($wgSysopRangeBans) { if (!IP::isIPv4($this->BlockAddress) || $matches[2] < 16 || $matches[2] > 32) { return array('ip_range_invalid'); } $this->BlockAddress = Block::normaliseRange($this->BlockAddress); } else { # Range block illegal return array('range_block_disabled'); } } else { if (preg_match("/^({$rxIP6})\\/(\\d{1,3})\$/", $this->BlockAddress, $matches)) { # IPv6 if ($wgSysopRangeBans) { if (!IP::isIPv6($this->BlockAddress) || $matches[2] < 64 || $matches[2] > 128) { return array('ip_range_invalid'); } $this->BlockAddress = Block::normaliseRange($this->BlockAddress); } else { # Range block illegal return array('range_block_disabled'); } } else { # Username block if ($wgSysopUserBans) { $user = User::newFromName($this->BlockAddress); if (!is_null($user) && $user->getID()) { # Use canonical name $userId = $user->getID(); $this->BlockAddress = $user->getName(); } else { return array('nosuchusershort', htmlspecialchars($user ? $user->getName() : $this->BlockAddress)); } } else { return array('badipaddress'); } } } } $reasonstr = $this->BlockReasonList; if ($reasonstr != 'other' && $this->BlockReason != '') { // Entry from drop down menu + additional comment $reasonstr .= ': ' . $this->BlockReason; } elseif ($reasonstr == 'other') { $reasonstr = $this->BlockReason; } $expirestr = $this->BlockExpiry; if ($expirestr == 'other') { $expirestr = $this->BlockOther; } if (strlen($expirestr) == 0) { return array('ipb_expiry_invalid'); } if ($expirestr == 'infinite' || $expirestr == 'indefinite') { $expiry = Block::infinity(); } else { # Convert GNU-style date, on error returns -1 for PHP <5.1 and false for PHP >=5.1 $expiry = strtotime($expirestr); if ($expiry < 0 || $expiry === false) { return array('ipb_expiry_invalid'); } $expiry = wfTimestamp(TS_MW, $expiry); } # Create block # Note: for a user block, ipb_address is only for display purposes $block = new Block($this->BlockAddress, $userId, $wgUser->getID(), $reasonstr, wfTimestampNow(), 0, $expiry, $this->BlockAnonOnly, $this->BlockCreateAccount, $this->BlockEnableAutoblock, $this->BlockHideName, $this->BlockEmail); if (wfRunHooks('BlockIp', array(&$block, &$wgUser))) { if (!$block->insert()) { return array('ipb_already_blocked', htmlspecialchars($this->BlockAddress)); } wfRunHooks('BlockIpComplete', array($block, $wgUser)); # Prepare log parameters $logParams = array(); $logParams[] = $expirestr; $logParams[] = $this->blockLogFlags(); # Make log entry, if the name is hidden, put it in the oversight log $log_type = $this->BlockHideName ? 'oversight' : 'block'; $log = new LogPage($log_type); $log->addEntry('block', Title::makeTitle(NS_USER, $this->BlockAddress), $reasonstr, $logParams); # Report to the user return array(); } else { return array('hookaborted'); } }
public static function doNamespaceRestriction($uid, $user) { global $wgUser, $wgRequest; $r = new UserRestriction(); $r->setType(UserRestriction::NAMESPACE); $r->setNamespace($wgRequest->getVal('namespace')); $r->setSubjectId($uid); $r->setSubjectText($user); $r->setBlockerId($wgUser->getId()); $r->setBlockerText($wgUser->getName()); $r->setReason($wgRequest->getVal('reason')); $r->setExpiry(UserRestriction::convertExpiry($wgRequest->getVal('expiry'))); $r->setTimestamp(wfTimestampNow(TS_MW)); $r->commit(); $logExpiry = $wgRequest->getVal('expiry') ? $wgRequest->getVal('expiry') : Block::infinity(); $l = new LogPage('restrict'); $l->addEntry('restrict', Title::makeTitle(NS_USER, $user), $r->getReason(), array($r->getType(), $r->getNamespace(), $logExpiry)); }
/** * @static * @param $result ApiResult * @param $vals * @param $params * @param $type * @param $ts * @return array */ public static function addLogParams($result, &$vals, $params, $type, $ts) { $params = explode("\n", $params); switch ($type) { case 'move': if (isset($params[0])) { $title = Title::newFromText($params[0]); if ($title) { $vals2 = array(); ApiQueryBase::addTitleInfo($vals2, $title, 'new_'); $vals[$type] = $vals2; } } if (isset($params[1]) && $params[1]) { $vals[$type]['suppressedredirect'] = ''; } $params = null; break; case 'patrol': $vals2 = array(); list($vals2['cur'], $vals2['prev'], $vals2['auto']) = $params; $vals[$type] = $vals2; $params = null; break; case 'rights': $vals2 = array(); list($vals2['old'], $vals2['new']) = $params; $vals[$type] = $vals2; $params = null; break; case 'block': $vals2 = array(); list($vals2['duration'], $vals2['flags']) = $params; // Indefinite blocks have no expiry time if (Block::parseExpiryInput($params[0]) !== Block::infinity()) { $vals2['expiry'] = wfTimestamp(TS_ISO_8601, strtotime($params[0], wfTimestamp(TS_UNIX, $ts))); } $vals[$type] = $vals2; $params = null; break; } if (!is_null($params)) { $result->setIndexedTagName($params, 'param'); $vals = array_merge($vals, $params); } return $vals; }
/** * 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; }
public function showForm($err = null) { $out = $this->getOutput(); $form = $this->form; // convenience $title = $this->form->getPage(); $oldConfig = $form->getOldConfig(); $s = ''; // form HTML string # Add any error messages if ("" != $err) { $out->setSubtitle(wfMsgHtml('formerror')); $out->addHTML("<p class='error'>{$err}</p>\n"); } # Add header text if (!$form->isAllowed()) { $s .= wfMsgExt('stabilization-perm', 'parse', $title->getPrefixedText()); } else { $s .= wfMsgExt('stabilization-text', 'parse', $title->getPrefixedText()); } # Borrow some protection messages for dropdowns $reasonDropDown = Xml::listDropDown('wpReasonSelection', wfMsgForContent('protect-dropdown'), wfMsgForContent('protect-otherreason-op'), $form->getReasonSelection(), 'mwStabilize-reason', 4); $scExpiryOptions = wfMsgForContent('protect-expiry-options'); $showProtectOptions = $scExpiryOptions !== '-' && $form->isAllowed(); $dropdownOptions = array(); // array of <label,value> # Add the current expiry as a dropdown option if ($oldConfig['expiry'] && $oldConfig['expiry'] != Block::infinity()) { $timestamp = $this->getLang()->timeanddate($oldConfig['expiry']); $d = $this->getLang()->date($oldConfig['expiry']); $t = $this->getLang()->time($oldConfig['expiry']); $dropdownOptions[] = array(wfMsg('protect-existing-expiry', $timestamp, $d, $t), 'existing'); } # Add "other time" expiry dropdown option $dropdownOptions[] = array(wfMsg('protect-othertime-op'), 'othertime'); # Add custom expiry dropdown options (from MediaWiki message) foreach (explode(',', $scExpiryOptions) as $option) { if (strpos($option, ":") === false) { $show = $value = $option; } else { list($show, $value) = explode(":", $option); } $dropdownOptions[] = array($show, $value); } # Actually build the options HTML... $expiryFormOptions = ''; foreach ($dropdownOptions as $option) { $show = htmlspecialchars($option[0]); $value = htmlspecialchars($option[1]); $expiryFormOptions .= Xml::option($show, $value, $form->getExpirySelection() === $value) . "\n"; } # Build up the form... $s .= Xml::openElement('form', array('name' => 'stabilization', 'action' => $this->getTitle()->getLocalUrl(), 'method' => 'post')); # Add stable version override and selection options $s .= Xml::fieldset(wfMsg('stabilization-def'), false) . "\n" . Xml::radioLabel(wfMsg('stabilization-def1'), 'wpStableconfig-override', 1, 'default-stable', 1 == $form->getOverride(), $this->disabledAttr()) . '<br />' . "\n" . Xml::radioLabel(wfMsg('stabilization-def2'), 'wpStableconfig-override', 0, 'default-current', 0 == $form->getOverride(), $this->disabledAttr()) . "\n" . Xml::closeElement('fieldset'); # Add autoreview restriction select $s .= Xml::fieldset(wfMsg('stabilization-restrict'), false) . $this->buildSelector($form->getAutoreview()) . Xml::closeElement('fieldset') . Xml::fieldset(wfMsg('stabilization-leg'), false) . Xml::openElement('table'); # Add expiry dropdown to form... if ($showProtectOptions && $form->isAllowed()) { $s .= "\n\t\t\t\t<tr>\n\t\t\t\t\t<td class='mw-label'>" . Xml::label(wfMsg('stabilization-expiry'), 'mwStabilizeExpirySelection') . "</td>\n\t\t\t\t\t<td class='mw-input'>" . Xml::tags('select', array('id' => 'mwStabilizeExpirySelection', 'name' => 'wpExpirySelection', 'onchange' => 'onFRChangeExpiryDropdown()') + $this->disabledAttr(), $expiryFormOptions) . "</td>\n\t\t\t\t</tr>"; } # Add custom expiry field to form... $attribs = array('id' => "mwStabilizeExpiryOther", 'onkeyup' => 'onFRChangeExpiryField()') + $this->disabledAttr(); $s .= "\n\t\t\t<tr>\n\t\t\t\t<td class='mw-label'>" . Xml::label(wfMsg('stabilization-othertime'), 'mwStabilizeExpiryOther') . '</td> <td class="mw-input">' . Xml::input("mwStabilize-expiry", 50, $form->getExpiryCustom(), $attribs) . '</td> </tr>'; # Add comment input and submit button if ($form->isAllowed()) { $watchLabel = wfMsgExt('watchthis', 'parseinline'); $watchAttribs = array('accesskey' => wfMsg('accesskey-watch'), 'id' => 'wpWatchthis'); $watchChecked = $this->getUser()->getOption('watchdefault') || $title->userIsWatching(); $reviewLabel = wfMsgExt('stabilization-review', 'parseinline'); $s .= ' <tr> <td class="mw-label">' . xml::label(wfMsg('stabilization-comment'), 'wpReasonSelection') . '</td> <td class="mw-input">' . $reasonDropDown . '</td> </tr> <tr> <td class="mw-label">' . Xml::label(wfMsg('stabilization-otherreason'), 'wpReason') . '</td> <td class="mw-input">' . Xml::input('wpReason', 70, $form->getReasonExtra(), array('id' => 'wpReason', 'maxlength' => 255)) . '</td> </tr> <tr> <td></td> <td class="mw-input">' . Xml::check('wpReviewthis', $form->getReviewThis(), array('id' => 'wpReviewthis')) . "<label for='wpReviewthis'>{$reviewLabel}</label>" . '     ' . Xml::check('wpWatchthis', $watchChecked, $watchAttribs) . " <label for='wpWatchthis' " . Xml::expandAttributes(array('title' => Linker::titleAttrib('watch', 'withaccess'))) . ">{$watchLabel}</label>" . '</td> </tr> <tr> <td></td> <td class="mw-submit">' . Xml::submitButton(wfMsg('stabilization-submit')) . '</td> </tr>' . Xml::closeElement('table') . Html::hidden('title', $this->getTitle()->getPrefixedDBKey()) . Html::hidden('page', $title->getPrefixedText()) . Html::hidden('wpEditToken', $this->getUser()->editToken()); } else { $s .= Xml::closeElement('table'); } $s .= Xml::closeElement('fieldset') . Xml::closeElement('form'); $out->addHTML($s); $out->addHTML(Xml::element('h2', null, htmlspecialchars(LogPage::logName('stable')))); LogEventsList::showLogExtract($out, 'stable', $title->getPrefixedText(), '', array('lim' => 25)); # Add some javascript for expiry dropdowns $out->addScript("<script type=\"text/javascript\">\n\t\t\t\tfunction onFRChangeExpiryDropdown() {\n\t\t\t\t\tdocument.getElementById('mwStabilizeExpiryOther').value = '';\n\t\t\t\t}\n\t\t\t\tfunction onFRChangeExpiryField() {\n\t\t\t\t\tdocument.getElementById('mwStabilizeExpirySelection').value = 'othertime';\n\t\t\t\t}\n\t\t\t</script>"); }
function poUpdateRestrictions($article, $restrictions, $cascade = false, $expiration = null) { global $wgProtectOwnDoProtect, $wgUser, $wgProtectOwnCacheUserCan, $wgProtectOwnCacheIsOwner; if ($expiration === null) { $expiration = array(); $infinity = Block::infinity(); foreach ($restrictions as $action => $level) { $expiration[$action] = $infinity; } } # temporary assign protect right, in order to update the restricitons $wgProtectOwnDoProtect = true; // tells spSetRestrictionsAssignDynamicRights to add the "protect" right // wfDebugLog( 'ProtectOwn', 'Form: purge user\'s rights then force reload'); $wgUser->mRights = null; // clear current user rights $wgUser->getRights(); // force rights reloading $wgProtectOwnDoProtect = false; wfDebugLog('ProtectOwn', "UpdateRestrictions: restrictions =\n " . var_export($restrictions, true) . "\nexpiration=\n" . var_export($expiration, true)); // update restrictions $success = $article->updateRestrictions($restrictions, 'ProtectOwn', $cascade, $expiration); // note that this article function check that the user has sufficient rights # clear userCan and isOwner caches # because of protect right granted few instants # IsOwner cache clearing should not be necessary, but IsOwner hook may be affected by restrictions update // wfDebugLog( 'ProtectOwn', 'Form: purge userCan and isOwner caches'); $wgProtectOwnCacheUserCan = array(); $wgProtectOwnCacheIsOwner = array(); # remove temporary assigned protect right by reloading rights with $wgSetRestrictionsDoProtect = false // wfDebugLog( 'ProtectOwn', 'Form: purge user\'s rights then force reload'); $wgUser->mRights = null; // clear current user rights (and clear the "protect" right $wgUser->getRights(); // force rights reloading return $success; }
/** * protect key pages * * @author Lucas 'TOR' Garczewski <*****@*****.**> */ private function protectKeyPages() { global $wgUser, $wgWikiaKeyPages; $saveUser = $wgUser; $wgUser = \User::newFromName(self::WIKIA_USER); if (empty($wgWikiaKeyPages)) { $wgWikiaKeyPages = array('File:Wiki.png', 'File:Favicon.ico'); } /** * define restriction level and duration */ $restrictions["edit"] = 'sysop'; $restrictions["move"] = 'sysop'; $restrictions["create"] = 'sysop'; $titleRestrictions = 'sysop'; $expiry_string = \Block::infinity(); $expiry_array = array('edit' => $expiry_string, 'move' => $expiry_string); /** * define reason msg and fetch it */ $reason = wfMsgForContent('autocreatewiki-protect-reason'); foreach ($wgWikiaKeyPages as $pageName) { $title = \Title::newFromText($pageName); $article = new \Article($title); if ($article->exists()) { $cascade = 0; $ok = $article->updateRestrictions($restrictions, $reason, $cascade, $expiry_array); } else { $wikiPage = \WikiPage::factory($title); $ignored_reference = false; // doing this because MW1.19 doUpdateRestrictions() is weird, and has this passed by reference $status = $wikiPage->doUpdateRestrictions(array('create' => $titleRestrictions), array('create' => $expiry_string), $ignored_reference, $reason, $wgUser); $ok = $status->isOK(); } if ($ok) { $this->info('Protected key page', ['page_name' => $pageName]); } else { $this->warning('failed to protect key page', ['page_name' => $pageName]); } } $wgUser = $saveUser; }
function doScrapeInsert() { foreach ($this->streams as &$stream) { if (!isset($stream->date_start_time)) { $stream->date_start_time = 0; } if ($stream->date_start_time == 0) { print 'error stream ' . $stream->name . ' missing time info' . "\n"; continue; } $hors = strpos($stream->name, 'house') !== false ? 'h' : 's'; $date_req = date('Y-m-d', $stream->date_start_time); if (strpos($stream->name, date('m-d-y', $stream->date_start_time)) === false) { $dTitle = Title::newFromText('Archive:Stream_DateMissMatch'); append_to_wiki_page($dTitle, 'DateMissMatch:[[Stream:' . $stream->stream_name . ']]:' . date('m-d-y', $stream->date_start_time) . "\n"); // use date from stream name: // house_da_01-01-07_ preg_match('/[0-9]+\\-[0-9]+\\-[0-9][0-9]/U', $stream->name, $matches); if (isset($matches[0])) { list($month, $day, $year) = explode('-', $matches[0]); $date_req = '20' . $year . '-' . $month . '-' . $day; } else { die('could not find date in stream name'); } } $cspan_url = $this->base_url . $this->base_query . '&date=' . $date_req . '&hors=' . $hors; echo $cspan_url . "\n"; $rawpage = $this->doRequest($cspan_url); // get the title and href if present: $patern = '/overlib\\(\'(.*)\\((Length: ([^\\)]*)).*CAPTION,\'<font size=2>(.*)<((.*href="([^"]*))|.*)>/'; preg_match_all($patern, $rawpage, $matches); $cspan_person_ary = array(); // format matches: foreach ($matches[0] as $k => $v) { $href = ''; $href_match = array(); preg_match('/href="(.*)"/', $matches[5][$k], $href_match); if (count($href_match) != 0) { $href = $href_match[1]; } $porg = str_replace('<br />', ' ', $matches[4][$k]); $porg = preg_replace('/[D|R|I]+\\-\\[.*\\]/', '', $porg); $pparts = explode(',', $porg); if (isset($pparts[1]) && isset($pparts[0])) { $pname = trim($pparts[1]) . '_' . trim($pparts[0]); if (mv_is_valid_person($pname)) { $cspan_person_ary[] = array('start_time' => strip_tags($matches[1][$k]), 'length' => $matches[3][$k], 'person_title' => str_replace('<br />', ' ', $matches[4][$k]), 'Spoken_by' => $pname, 'href' => $href); } } } // group people in page matches // $g_cspan_matches=array(); // $prev_person=null; // foreach($person_time_ary as $ptag){ // $g_cspan_matches[strtolower($ptag['Spoken_by'])][]=$ptag; // } // retrive db rows to find match: $dbr = wfGetDB(DB_SLAVE); // $mvd_res = MV_Index::getMVDInRange($stream->id, null, null, $mvd_type='ht_en',false,$smw_properties=array('Spoken_by'), ''); /*while ($row = $dbr->fetchObject($mvd_res)) { $db_person_ary=$g_row_matches=array(); //group peole in db matches: $cur_person = ''; $curKey=0; while ($row = $dbr->fetchObject($mvd_res)) { if(!isset($row->Spoken_by))continue; if($cur_person!=$row->Spoken_by){ $g_row_matches[]=get_object_vars($row); $curKey=count($g_row_matches)-1; $cur_person=$row->Spoken_by; }else{ $g_row_matches[$curKey]['end_wiki_title']=$row->wiki_title; $g_row_matches[$curKey]['end_time']+=($row->end_time-$row->start_time); } //print_r($g_row_matches); //if($curKey>2){ // die; //} } */ // get people from metavid table (and conform to mvd_res) $sql = 'SELECT (`people_time`.`time`-`streams`.`adj_start_time`) as `time`, `person_lookup`.`name_clean` as `Spoken_by`, `person_lookup`.`first` as `first`, `person_lookup`.`last` as `last` FROM `metavid`.`people_attr_stream_time` as `people_time` RIGHT JOIN `metavid`.`streams` as `streams` ON `streams`.`id`=`people_time`.`stream_fk` LEFT JOIN `metavid`.`people` as `person_lookup` ON `person_lookup`.`id` = `people_time`.`people_fk` WHERE `streams`.`name`=\'' . $stream->name . '\' ORDER BY `people_time`.`time` '; $people_res = $dbr->query($sql); $cur_person = ''; $curKey = 0; while ($row = $dbr->fetchObject($people_res)) { if (!isset($row->Spoken_by)) { continue; } $cur_row_person = $row->first . '_' . $row->last; if ($cur_person != $cur_row_person) { $db_person_ary[] = get_object_vars($row); $curKey = count($db_person_ary) - 1; $db_person_ary[$curKey]['Spoken_by'] = $row->first . '_' . $row->last; $db_person_ary[$curKey]['start_time'] = $row->time; // not on screen a long time if only one hit: $db_person_ary[$curKey]['end_time'] = $row->time + 10; $cur_person = $cur_row_person; } else { // update the end time: $db_person_ary[$curKey]['end_time'] = $row->time; } } // list on screen times for everyone: foreach ($db_person_ary as $row) { print $row['Spoken_by'] . ' on screen for ' . ($row['end_time'] - $row['start_time']) . "\n"; // $db_person_ary[]=$row; } // print_r($db_person_ary); // die; // count($cspan_person_ary) $cur_db_inx = 0; $cur_person = null; $fistValid = true; for ($i = 0; $i < count($cspan_person_ary); $i++) { // print "looking at: ". $cspan_person_ary[$i]['Spoken_by'] . "\n"; print "\tCSPAN: " . $cspan_person_ary[$i]['Spoken_by'] . ' on screen for ' . $cspan_person_ary[$i]['length'] . ' or:' . npt2seconds($cspan_person_ary[$i]['length']) . "\n"; // set up cur, the next and prev pointers: $cur_person = $cspan_person_ary[$i]['Spoken_by']; // make sure next is not the same as current: // note: we don't group above since the same person can give two subsequent different speeches $next_person = $cur_person; $k_person_inx = 1; $person_insert_set = array(); while ($next_person == $cur_person) { if (isset($cspan_person_ary[$i + $k_person_inx])) { $potential_next_person = mv_is_valid_person($cspan_person_ary[$i + $k_person_inx]['Spoken_by']) ? $cspan_person_ary[$i + $k_person_inx]['Spoken_by'] : null; if ($potential_next_person == null && $k_person_inx == 1) { $next_person = null; break; } elseif ($potential_next_person != null) { $next_person = $potential_next_person; } $k_person_inx++; } else { $next_person = null; } } // should be no need to make sure prev is not the same as current (as we do greedy look ahead below) // $prev_person = $cur_person; // $k=1; // while($prev_person==$cur_person){ if (isset($cspan_person_ary[$i - 1])) { $prev_person = mv_is_valid_person($cspan_person_ary[$i - 1]['Spoken_by']) ? $cspan_person_ary[$i - 1]['Spoken_by'] : null; } else { $prev_person = null; } // } if (mv_is_valid_person($cspan_person_ary[$i]['Spoken_by'])) { // print "\tis valid person looking for db sync\n"; // print "\t prev: $prev_person cur: $cur_person next: $next_person\n"; if ($prev_person == null && $next_person == null) { print "error both prev and next are null skiping person\n"; continue; } // check how long they where on screen (also check subquent) $cspan_on_screen_time = npt2seconds($cspan_person_ary[$i]['length']); // print "NOW STARTING AT: $cur_db_inx of " . count($db_person_ary) . "\n"; for ($j = $cur_db_inx; $j < count($db_person_ary); $j++) { // print "searchig db on: " . $db_person_ary[$j]['Spoken_by'] . "!=" . $cspan_person_ary[$i]['Spoken_by'] . " \n"; $prevMatch = $curMatch = $nextMatch = false; if ($cur_db_inx == 0 || $prev_person == null) { // no need to check prev in db_inx $prevMatch = true; // print "(no back check)"; } else { if ($db_person_ary[$j - 1]['Spoken_by'] == $prev_person) { // print "found prev match: $prev_person\n;"; $prevMatch = true; } } if (isset($db_person_ary[$j])) { if (isset($cspan_person_ary[$i])) { if ($db_person_ary[$j]['Spoken_by'] == $cspan_person_ary[$i]['Spoken_by']) { // print "found cur match:". $cspan_person_ary[$i]['Spoken_by']."\n"; $curMatch = true; } } } if ($next_person == null) { // no need to check next in db_inx $nextMatch = true; // print "(no next check)"; } else { if (isset($db_person_ary[$j + 1])) { if ($db_person_ary[$j + 1]['Spoken_by'] == $next_person) { // print "found next match:".$next_person."\n"; $nextMatch = true; } } } // if we have a match set do insert proc: if ($prevMatch && $curMatch && $nextMatch) { // print "FOUND Match on $j\n"; // print "\t prev: $prev_person cur: $cur_person next: $next_person\n"; $cur_db_inx = $j; // add all additional info we can from c-span: // also push forward for all of current (we should always hit the first series of the same person first ) $k = 0; // build insert set: $cur_start_time = $db_person_ary[$j]['start_time']; while ($cur_person == $cspan_person_ary[$i + $k]['Spoken_by']) { // use the last cspan_person for start case $cspan_person_ary[$i + $k]['wiki_start_time'] = $cur_start_time; if (npt2seconds($cspan_person_ary[$i + $k]['length']) > $db_person_ary[$j]['end_time'] - $cur_start_time) { $cspan_person_ary[$i + $k]['wiki_end_time'] = $db_person_ary[$j]['end_time']; // already used up our db_person_ary continue: print "a cspan insert sync " . ' ' . $cspan_person_ary[$i + $k]['wiki_start_time'] . " to " . $cspan_person_ary[$i + $k]['wiki_end_time'] . " of " . $db_person_ary[$j]['end_time'] . " for: " . $cspan_person_ary[$i]['Spoken_by'] . "\n"; break; } else { $cspan_person_ary[$i + $k]['wiki_end_time'] = $cur_start_time + npt2seconds($cspan_person_ary[$i + $k]['length']); // print "add " . npt2seconds($cspan_person_ary[$i+$k]['length']) . "\n"; $cur_start_time += npt2seconds($cspan_person_ary[$i + $k]['length']); } print "p cspan insert sync " . ' ' . $cspan_person_ary[$i + $k]['wiki_start_time'] . " to " . $cspan_person_ary[$i + $k]['wiki_end_time'] . " of " . $db_person_ary[$j]['end_time'] . " for: " . $cspan_person_ary[$i]['Spoken_by'] . "\n"; // print_r($db_person_ary[$j]); // print_r($cspan_person_ary[$i+$k]); $k++; if (!isset($cspan_person_ary[$i + $k])) { break; } } $k--; // extend the last property if within 100 seconds if (abs($cspan_person_ary[$i + $k]['wiki_end_time'] - $db_person_ary[$j]['end_time']) < 100) { $cspan_person_ary[$i + $k]['wiki_end_time'] = $db_person_ary[$j]['end_time']; print "updated cspan insert for: " . $cspan_person_ary[$i]['Spoken_by'] . ' ' . $cspan_person_ary[$i + $k]['wiki_start_time'] . " to " . $cspan_person_ary[$i + $k]['wiki_end_time'] . " of " . $db_person_ary[$j]['end_time'] . "\n"; } $k++; // /die; // move the index to the current: $i = $i + $k; continue; } } } else { // print $cspan_person_ary[$i]['Spoken_by'] . " is not valid person\n"; } } print "Get Additonal C-SPAN Data For \"synced\" Data:\n"; foreach ($cspan_person_ary as $pData) { if (isset($pData['wiki_start_time'])) { // init: $bill_categories = array(); $annotate_body = ''; $body = ''; $bill_key = null; $rawpage = $this->doRequest($this->base_url . $pData['href']); // $rawpage = $this->doRequest('http://www.c-spanarchives.org/congress/?q=node/77531&id=8330447'); preg_match('/<\\/td><th><center>([^<]*)<\\/center><\\/th><td>/U', $rawpage, $title_matches); preg_match('/<table width="400">\\n<tr><td>\\n(.*)<\\/tr><\\/td>/', $rawpage, $page_matches); if (isset($title_matches[1]) && isset($page_matches[1])) { $title = trim($title_matches[1]); $body = $page_matches[1]; // print_r($page_matches); } else { print "error can't find title or body\n"; print "skip..."; continue; } // do debate tag search: preg_match('/<td colspan="2">Debate:\\s*<[^>]*>([^<]*)/U', $rawpage, $debate_matches); if (isset($debate_matches[1])) { $bill_key = trim($debate_matches[1]); print "found debate: tag " . $bill_key . "\n"; // build gov-track-congress-session friendly debate url: if ($this->get_and_process_billid($bill_key, $stream->date_start_time) != null) { $bill_categories[$bill_key] = $bill_key; } } // title fix hack for C-span error motion to procceed // @@todo add in the rest of the motions: if (strpos($title, 'MOTION TO PROCEED') !== false) { $title = str_replace('MOTION TO PROCEED', '', $title); // $annotate_body.="[[Bill Motion:=MOTION TO PROCEED]]\n"; } // fix title case $title = ucwords(strtolower($title)); // don't Cap a Few of the Words: ' $title = str_replace(array(' And', ' Or', ' Of', ' A'), array(' and', ' or', ' of', ' a'), $title); // replace '' with `` $body = str_replace('\'\'', '``', $body); // replace bill names with [[Catgory:: bill name #]] // $bill_pattern = '/(H\.R\.\s[0-9]+)/'; $bill_pattern = '/'; $bill_pattern_ary = array(); $or = ''; foreach ($this->bill_types as $cspanT => $govtrakT) { $cspanT = str_replace('RES', '[\\s]?RES', $cspanT); // sometimes spaces before res in text $cspanT = str_replace('CON', '[\\s]?CON', $cspanT); // sometimes spaces before res in text // replace . with \.[\s]? $bill_pattern .= $or . '(' . str_replace('.', '\\.[\\s]?', $cspanT) . '\\s?[0-9]+)'; $bill_pattern_ary[] = '(' . str_replace('.', '\\.[\\s]?', $cspanT) . '\\s?[0-9]+)'; $or = '|'; } $bill_pattern .= '/i'; // case insensative // $body='bla bla H.R. 3453 test S. 3494 some more text'; // print "pattern:".$bill_pattern . "\n"; preg_match_all($bill_pattern, $body, $bill_matches); // print_r($bill_matches); // die; if (isset($bill_matches[1])) { foreach ($bill_matches as $k => $bill_type_ary) { if ($k != 0) { if (isset($bill_type_ary[0])) { $bill_name = $bill_type_ary[0]; } elseif (isset($bill_type_ary[1])) { $bill_name = $bill_type_ary[1]; } else { continue; } // if the first letter is lower case not likely a bill if (trim($bill_name) == '') { continue; } if (islower(substr($bill_name, 0, 1))) { continue; } // conform white space and case: $bill_name = str_replace(array('S. ', 'Con. ', 'Res. '), array('S.', 'CON.', 'RES. '), $bill_name); // make sure its not a false possitave and load bill data from govTrack: if ($this->get_and_process_billid($bill_name, $stream->date_start_time)) { $bill_categories[$bill_name] = $bill_name; } } } } // add speech by attribute to annotation body: $annotate_body .= 'Speech By: [[Speech by:=' . str_replace('_', ' ', $pData['Spoken_by']) . ']] '; // add speech by attribute to body as well? $body .= "\n\n" . 'Speech By: [[Speech by:=' . str_replace('_', ' ', $pData['Spoken_by']) . ']] '; // add any mentions of bills with linkback to full bill title: $body = preg_replace_callback($bill_pattern_ary, array('self', 'bill_pattern_cp'), $body); // source the doument: $body .= "\n\n" . 'Source: [[Data Source Name:=C-SPAN Congressional Chronicle]] [[Data Source URL:=' . $this->base_url . $pData['href'] . ']]'; $body .= "\n"; // add the title to the top of the page: $body = "==={$title}===\n" . $body; $cspan_title_str = $this->get_aligned_time_title($pData, 'Thomas_en', $stream); if (!$cspan_title_str) { $cspan_title_str = 'Thomas_en:' . $stream->name . '/' . seconds2npt($pData['wiki_start_time']) . '/' . seconds2npt($pData['wiki_end_time']); } $cspanTitle = Title::makeTitle(MV_NS_MVD, ucfirst($cspan_title_str)); // print "do edit ".$cspanTitle->getText()."\n"; do_update_wiki_page($cspanTitle, $body); // protect editing of the offical record (but allow moving for sync) $cspanTitle->loadRestrictions(); global $wgRestrictionTypes; foreach ($wgRestrictionTypes as $action) { // Fixme: this form currently requires individual selections, // but the db allows multiples separated by commas. $mRestrictions[$action] = implode('', $cspanTitle->getRestrictions($action)); } $article = new Article($cspanTitle); $mRestrictions['edit']['sysop'] = true; $expiry = Block::infinity(); $dbw = wfGetDB(DB_MASTER); $dbw->begin(); $ok = $article->updateRestrictions($mRestrictions, wfMsg('mv_source_material'), false, $expiry); if ($ok) { print "updated permisions for " . $cspanTitle->getText() . "\n"; $dbw->commit(); } else { print "failed to update restrictions :(\n"; } // process each bill to the annotation body; $bcat = ''; $bill_lead_in = "\n\nBill "; // print_r($bill_categories); foreach ($bill_categories as $bill) { if (trim($bill) != '') { // use short title for category and long title for semantic link... (highly arbitrary) $annotate_body .= $bill_lead_in . '[[Bill:=' . $this->cur_bill_short_title . ']] '; $bill_lead_in = ' , '; $annotate_body .= "[[Category:{$bill}]] "; } } if (trim($title) != '') { $annotate_body .= "[[Category:{$title}]]\n"; } // see if we can align with an existing speech page: $anno_title_str = $this->get_aligned_time_title($pData, 'Anno_en', $stream); if (!$anno_title_str) { $anno_title_str = 'Anno_en:' . $stream->name . '/' . seconds2npt($pData['wiki_start_time']) . '/' . seconds2npt($pData['wiki_end_time']); } $annoTitle = Title::makeTitle(MV_NS_MVD, ucfirst($anno_title_str)); do_update_wiki_page($annoTitle, $annotate_body); // [Page: S14580] replaced with: [[Category:BillName]] // would be good to link into the official record for "pages" // [[Speech by:=name]] // [[category:=title]] // for documentation: // semantic qualities would be Aruging For:billX or Arguging Agaist billY // these pages are non-editable // maybe put the category info into annotations layer? (since it applies to both?) // do new page mvd:or_ } } // $inx_cspan_person_ary = array_keys($g_row_matches); // $inx_row_person_ary = array_keys($g_person_time_ary); // for($i=0;$i<5;$i++){ // } // find match person1->person2 // average switch time to get offset of stream // use offset to insert all $person_time_array data } }
/** * Blocks the user specified in the parameters for the given expiry, with the * given reason, and with all other settings provided in the params. If the block * succeeds, produces a result containing the details of the block and notice * of success. If it fails, the result will specify the nature of the error. */ public function execute() { global $wgUser; $this->getMain()->requestWriteMode(); $params = $this->extractRequestParams(); if ($params['gettoken']) { $res['blocktoken'] = $wgUser->editToken(); $this->getResult()->addValue(null, $this->getModuleName(), $res); return; } if (is_null($params['user'])) { $this->dieUsageMsg(array('missingparam', 'user')); } if (is_null($params['token'])) { $this->dieUsageMsg(array('missingparam', 'token')); } if (!$wgUser->matchEditToken($params['token'])) { $this->dieUsageMsg(array('sessionfailure')); } if (!$wgUser->isAllowed('block')) { $this->dieUsageMsg(array('cantblock')); } if ($params['hidename'] && !$wgUser->isAllowed('hideuser')) { $this->dieUsageMsg(array('canthide')); } if ($params['noemail'] && !$wgUser->isAllowed('blockemail')) { $this->dieUsageMsg(array('cantblock-email')); } if (wfReadOnly()) { $this->dieUsageMsg(array('readonlytext')); } $form = new IPBlockForm(''); $form->BlockAddress = $params['user']; $form->BlockReason = is_null($params['reason']) ? '' : $params['reason']; $form->BlockReasonList = 'other'; $form->BlockExpiry = $params['expiry'] == 'never' ? 'infinite' : $params['expiry']; $form->BlockOther = ''; $form->BlockAnonOnly = $params['anononly']; $form->BlockCreateAccount = $params['nocreate']; $form->BlockEnableAutoBlock = $params['autoblock']; $form->BlockEmail = $params['noemail']; $form->BlockHideName = $params['hidename']; $dbw = wfGetDb(DB_MASTER); $dbw->begin(); $retval = $form->doBlock($userID, $expiry); if (!empty($retval)) { // We don't care about multiple errors, just report one of them $this->dieUsageMsg($retval); } $dbw->commit(); $res['user'] = $params['user']; $res['userID'] = $userID; $res['expiry'] = $expiry == Block::infinity() ? 'infinite' : $expiry; $res['reason'] = $params['reason']; if ($params['anononly']) { $res['anononly'] = ''; } if ($params['nocreate']) { $res['nocreate'] = ''; } if ($params['autoblock']) { $res['autoblock'] = ''; } if ($params['noemail']) { $res['noemail'] = ''; } if ($params['hidename']) { $res['hidename'] = ''; } $this->getResult()->addValue(null, $this->getModuleName(), $res); }
/** * protect key pages * * @author Lucas 'TOR' Garczewski <*****@*****.**> */ private function protectKeyPages() { global $wgUser, $wgWikiaKeyPages; $wgUser = User::newFromName("CreateWiki script"); if ($wgUser->isAnon()) { $wgUser->addToDatabase(); } if (empty($wgWikiaKeyPages)) { $wgWikiaKeyPages = array('File:Wiki.png', 'File:Favicon.ico'); } /** * define restriction level and duration */ $restrictions["edit"] = 'sysop'; $restrictions["move"] = 'sysop'; $restrictions["create"] = 'sysop'; $titleRestrictions = 'sysop'; $expiry_string = Block::infinity(); $expiry_array = array('edit' => $expiry_string, 'move' => $expiry_string); /** * define reason msg and fetch it */ $reason = wfMsgForContent('autocreatewiki-protect-reason'); $wgUser->addGroup('staff'); foreach ($wgWikiaKeyPages as $pageName) { $title = Title::newFromText($pageName); $article = new Article($title); if ($article->exists()) { $cascade = 0; $ok = $article->updateRestrictions($restrictions, $reason, $cascade, $expiry_array); } else { $wikiPage = WikiPage::factory($title); $ignored_reference = false; // doing this because MW1.19 doUpdateRestrictions() is weird, and has this passed by reference $status = $wikiPage->doUpdateRestrictions(array('create' => $titleRestrictions), array('create' => $expiry_string), $ignored_reference, $reason, $wgUser); $ok = $status->isOK(); } if ($ok) { Wikia::log(__METHOD__, "ok", "Protected key page: {$pageName}"); } else { Wikia::log(__METHOD__, "err", "Failed while trying to protect {$pageName}"); } } $wgUser->removeGroup("staff"); }
function doProtect($limit = array(), $reason = '', &$expiry = '') { global $wgUser, $wgRestrictionTypes, $wgContLang, $wgTitle; $id = $wgTitle->getArticleID(); if (wfReadOnly() || $id == 0) { return false; } if (strlen($expiry) == 0) { $expiry = 'infinite'; } if ($expiry == 'infinite' || $expiry == 'indefinite') { $expiry = Block::infinity(); } else { # Convert GNU-style date, on error returns -1 for PHP <5.1 and false for PHP >=5.1 $expiry = strtotime($expiry); if ($expiry < 0 || $expiry === false) { //invalid expiry, rewrite to infinity $expiry = Block::infinity(); } else { // Fixme: non-qualified absolute times are not in users specified timezone // and there isn't notice about it in the ui $expiry = wfTimestamp(TS_MW, $expiry); } } // Take this opportunity to purge out expired restrictions Title::purgeExpiredRestrictions(); # FIXME: Same limitations as described in ProtectionForm.php (line 37); # we expect a single selection, but the schema allows otherwise. $current = array(); foreach ($wgRestrictionTypes as $action) { $current[$action] = implode('', $wgTitle->getRestrictions($action)); } $current = Article::flattenRestrictions($current); $updated = Article::flattenRestrictions($limit); $changed = $current != $updated; $changed = $changed || $wgTitle->mRestrictionsExpiry != $expiry; $protect = $updated != ''; # If nothing's changed, do nothing if ($changed) { global $wgGroupPermissions; $dbw = wfGetDB(DB_MASTER); $encodedExpiry = Block::encodeExpiry($expiry, $dbw); $expiry_description = ''; if ($encodedExpiry != 'infinity') { $expiry_description = ' (' . wfMsgForContent('protect-expiring', $wgContLang->timeanddate($expiry, false, false)) . ')'; } # Prepare a null revision to be added to the history $modified = $current != '' && $protect; if ($protect) { $comment_type = $modified ? 'modifiedarticleprotection' : 'protectedarticle'; } else { $comment_type = 'unprotectedarticle'; } $comment = $wgContLang->ucfirst(wfMsgForContent($comment_type, $wgTitle->getPrefixedText())); if ($reason) { $comment .= ": {$reason}"; } if ($protect) { $comment .= " [{$updated}]"; } if ($expiry_description && $protect) { $comment .= "{$expiry_description}"; } # Update restrictions table foreach ($limit as $action => $restrictions) { if ($restrictions != '') { $dbw->replace('page_restrictions', array(array('pr_page', 'pr_type')), array('pr_page' => $id, 'pr_type' => $action, 'pr_level' => $restrictions, 'pr_cascade' => 0, 'pr_expiry' => $encodedExpiry), __METHOD__); } else { $dbw->delete('page_restrictions', array('pr_page' => $id, 'pr_type' => $action), __METHOD__); } } # Insert a null revision $nullRevision = Revision::newNullRevision($dbw, $id, $comment, true); $nullRevId = $nullRevision->insertOn($dbw); # Update page record $dbw->update('page', array('page_touched' => $dbw->timestamp(), 'page_restrictions' => '', 'page_latest' => $nullRevId), array('page_id' => $id), 'Article::protect'); # Update the protection log $log = new LogPage('protect'); if ($protect) { $log->addEntry($modified ? 'modify' : 'protect', $wgTitle, trim($reason . " [{$updated}]{$expiry_description}")); } else { $log->addEntry('unprotect', $wgTitle, $reason); } } # End "changed" check return true; }
private static function AuthorProtectExpiry($value) { if ($value == 'infinite' || $value == 'indefinite' || $value == 'infinity' || $value == '') { $time = Block::infinity(); } else { $unix = strtotime($value); if (!$unix || $unix === -1) { return false; } // Fixme: non-qualified absolute times are not in users specified timezone // and there isn't notice about it in the ui $time = wfTimestamp(TS_MW, $unix); } return $time; }
/** * Get the expiry time for a given action, by combining the relevant inputs. * * @return 14-char timestamp or "infinity", or false if the input was invalid */ function getExpiry($action) { if ($this->mExpirySelection[$action] == 'existing') { return $this->mExistingExpiry[$action]; } elseif ($this->mExpirySelection[$action] == 'othertime') { $value = $this->mExpiry[$action]; } else { $value = $this->mExpirySelection[$action]; } if ($value == 'infinite' || $value == 'indefinite' || $value == 'infinity') { $time = Block::infinity(); } else { $unix = strtotime($value); if (!$unix || $unix === -1) { return false; } // Fixme: non-qualified absolute times are not in users specified timezone // and there isn't notice about it in the ui $time = wfTimestamp(TS_MW, $unix); } return $time; }
/** * Decode expiry which has come from the DB */ static function decodeExpiry($expiry, $timestampType = TS_MW) { if ($expiry == '' || $expiry == Block::infinity()) { return Block::infinity(); } else { return wfTimestamp($timestampType, $expiry); } }
function save() { global $wgRequest, $wgUser, $wgOut; if ($this->disabled) { $this->show(); return false; } $token = $wgRequest->getVal('wpEditToken'); if (!$wgUser->matchEditToken($token)) { $this->show(wfMsg('sessionfailure')); return false; } if (strlen($this->mExpiry) == 0) { $this->mExpiry = 'infinite'; } if ($this->mExpiry == 'infinite' || $this->mExpiry == 'indefinite') { $expiry = Block::infinity(); } else { # Convert GNU-style date, on error returns -1 for PHP <5.1 and false for PHP >=5.1 $expiry = strtotime($this->mExpiry); if ($expiry < 0 || $expiry === false) { $this->show(wfMsg('protect_expiry_invalid')); return false; } $expiry = wfTimestamp(TS_MW, $expiry); if ($expiry < wfTimestampNow()) { $this->show(wfMsg('protect_expiry_old')); return false; } } # They shouldn't be able to do this anyway, but just to make sure, ensure that cascading restrictions aren't being applied # to a semi-protected page. global $wgGroupPermissions; $edit_restriction = $this->mRestrictions['edit']; if ($this->mCascade && $edit_restriction != 'protect' && !(isset($wgGroupPermissions[$edit_restriction]['protect']) && $wgGroupPermissions[$edit_restriction]['protect'])) { $this->mCascade = false; } if ($this->mTitle->exists()) { $ok = $this->mArticle->updateRestrictions($this->mRestrictions, $this->mReason, $this->mCascade, $expiry); } else { $ok = $this->mTitle->updateTitleProtection($this->mRestrictions['create'], $this->mReason, $expiry); } if (!$ok) { throw new FatalError("Unknown error at restriction save time."); } if ($wgRequest->getCheck('mwProtectWatch')) { $this->mArticle->doWatch(); } elseif ($this->mTitle->userIsWatching()) { $this->mArticle->doUnwatch(); } return $ok; }
function getQueryInfo() { $conds = $this->mConds; $conds[] = 'page_id = fpc_page_id'; $conds['fpc_override'] = 1; if ($this->autoreview !== null) { $conds['fpc_level'] = $this->autoreview; } $conds['page_namespace'] = $this->namespace; // Be sure not to include expired items if ($this->indef) { $conds['fpc_expiry'] = Block::infinity(); } else { $encCutoff = $this->mDb->addQuotes($this->mDb->timestamp()); $conds[] = "fpc_expiry > {$encCutoff}"; } return array('tables' => array('flaggedpage_config', 'page'), 'fields' => array('page_namespace', 'page_title', 'fpc_override', 'fpc_expiry', 'fpc_page_id', 'fpc_level'), 'conds' => $conds, 'options' => array()); }
/** * Blocks the user specified in the parameters for the given expiry, with the * given reason, and with all other settings provided in the params. If the block * succeeds, produces a result containing the details of the block and notice * of success. If it fails, the result will specify the nature of the error. */ public function execute() { global $wgUser, $wgBlockAllowsUTEdit; $params = $this->extractRequestParams(); if ($params['gettoken']) { $res['blocktoken'] = $wgUser->editToken(); $this->getResult()->addValue(null, $this->getModuleName(), $res); return; } if (is_null($params['user'])) { $this->dieUsageMsg(array('missingparam', 'user')); } if (is_null($params['token'])) { $this->dieUsageMsg(array('missingparam', 'token')); } if (!$wgUser->matchEditToken($params['token'])) { $this->dieUsageMsg(array('sessionfailure')); } if (!$wgUser->isAllowed('block')) { $this->dieUsageMsg(array('cantblock')); } if ($params['hidename'] && !$wgUser->isAllowed('hideuser')) { $this->dieUsageMsg(array('canthide')); } if ($params['noemail'] && !$wgUser->isAllowed('blockemail')) { $this->dieUsageMsg(array('cantblock-email')); } $form = new IPBlockForm(''); $form->BlockAddress = $params['user']; $form->BlockReason = is_null($params['reason']) ? '' : $params['reason']; $form->BlockReasonList = 'other'; $form->BlockExpiry = $params['expiry'] == 'never' ? 'infinite' : $params['expiry']; $form->BlockOther = ''; $form->BlockAnonOnly = $params['anononly']; $form->BlockCreateAccount = $params['nocreate']; $form->BlockEnableAutoblock = $params['autoblock']; $form->BlockEmail = $params['noemail']; $form->BlockHideName = $params['hidename']; $form->BlockAllowUsertalk = $params['allowusertalk'] && $wgBlockAllowsUTEdit; $form->BlockReblock = $params['reblock']; $userID = $expiry = null; $retval = $form->doBlock($userID, $expiry); if (count($retval)) { // We don't care about multiple errors, just report one of them $this->dieUsageMsg($retval); } $res['user'] = $params['user']; $res['userID'] = intval($userID); $res['expiry'] = $expiry == Block::infinity() ? 'infinite' : wfTimestamp(TS_ISO_8601, $expiry); $res['reason'] = $params['reason']; if ($params['anononly']) { $res['anononly'] = ''; } if ($params['nocreate']) { $res['nocreate'] = ''; } if ($params['autoblock']) { $res['autoblock'] = ''; } if ($params['noemail']) { $res['noemail'] = ''; } if ($params['hidename']) { $res['hidename'] = ''; } if ($params['allowusertalk']) { $res['allowusertalk'] = ''; } $this->getResult()->addValue(null, $this->getModuleName(), $res); }
/** * Callback function to output a block */ function formatRow($block) { global $wgUser, $wgLang; wfProfileIn(__METHOD__); static $sk = null, $msg = null; if (is_null($sk)) { $sk = $wgUser->getSkin(); } if (is_null($msg)) { $msg = array(); $keys = array('infiniteblock', 'expiringblock', 'contribslink', 'unblocklink', 'anononlyblock', 'createaccountblock'); foreach ($keys as $key) { $msg[$key] = wfMsgHtml($key); } $msg['blocklistline'] = wfMsg('blocklistline'); $msg['contribslink'] = wfMsg('contribslink'); } # Prepare links to the blocker's user and talk pages $blocker_name = $block->getByName(); $blocker = $sk->MakeLinkObj(Title::makeTitle(NS_USER, $blocker_name), $blocker_name); $blocker .= ' (' . $sk->makeLinkObj(Title::makeTitle(NS_USER_TALK, $blocker_name), $wgLang->getNsText(NS_TALK)) . ')'; # Prepare links to the block target's user and contribs. pages (as applicable, don't do it for autoblocks) if ($block->mAuto) { $target = $block->getRedactedName(); # Hide the IP addresses of auto-blocks; privacy } else { $target = $sk->makeLinkObj(Title::makeTitle(NS_USER, $block->mAddress), $block->mAddress); $target .= ' (' . $sk->makeKnownLinkObj(Title::makeTitle(NS_SPECIAL, 'Contributions'), $msg['contribslink'], 'target=' . urlencode($block->mAddress)) . ')'; } $formattedTime = $wgLang->timeanddate($block->mTimestamp, true); $properties = array(); if ($block->mExpiry === "" || $block->mExpiry === Block::infinity()) { $properties[] = $msg['infiniteblock']; } else { $properties[] = wfMsgReplaceArgs($msg['expiringblock'], array($wgLang->timeanddate($block->mExpiry, true))); } if ($block->mAnonOnly) { $properties[] = $msg['anononlyblock']; } if ($block->mCreateAccount) { $properties[] = $msg['createaccountblock']; } $properties = implode(', ', $properties); $line = wfMsgReplaceArgs($msg['blocklistline'], array($formattedTime, $blocker, $target, $properties)); $s = "<li>{$line}"; if ($wgUser->isAllowed('block')) { $titleObj = Title::makeTitle(NS_SPECIAL, "Ipblocklist"); $s .= ' (' . $sk->makeKnownLinkObj($titleObj, $msg['unblocklink'], 'action=unblock&id=' . urlencode($block->mId)) . ')'; } $s .= $sk->commentBlock($block->mReason); $s .= "</li>\n"; wfProfileOut(__METHOD__); return $s; }
function doSubmit() { global $wgOut, $wgUser, $wgSysopUserBans, $wgSysopRangeBans; $userId = 0; $this->BlockAddress = trim($this->BlockAddress); $rxIP = '\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}'; # Check for invalid specifications if (!preg_match("/^{$rxIP}\$/", $this->BlockAddress)) { if (preg_match("/^({$rxIP})\\/(\\d{1,2})\$/", $this->BlockAddress, $matches)) { if ($wgSysopRangeBans) { if ($matches[2] > 31 || $matches[2] < 16) { $this->showForm(wfMsg('ip_range_invalid')); return; } $this->BlockAddress = Block::normaliseRange($this->BlockAddress); } else { # Range block illegal $this->showForm(wfMsg('range_block_disabled')); return; } } else { # Username block if ($wgSysopUserBans) { $user = User::newFromName($this->BlockAddress); if (!is_null($user) && $user->getID()) { # Use canonical name $this->BlockAddress = $user->getName(); $userId = $user->getID(); } else { $this->showForm(wfMsg('nosuchusershort', htmlspecialchars($this->BlockAddress))); return; } } else { $this->showForm(wfMsg('badipaddress')); return; } } } $expirestr = $this->BlockExpiry; if ($expirestr == 'other') { $expirestr = $this->BlockOther; } if (strlen($expirestr) == 0) { $this->showForm(wfMsg('ipb_expiry_invalid')); return; } if ($expirestr == 'infinite' || $expirestr == 'indefinite') { $expiry = Block::infinity(); } else { # Convert GNU-style date, on error returns -1 for PHP <5.1 and false for PHP >=5.1 $expiry = strtotime($expirestr); if ($expiry < 0 || $expiry === false) { $this->showForm(wfMsg('ipb_expiry_invalid')); return; } $expiry = wfTimestamp(TS_MW, $expiry); } # Create block # Note: for a user block, ipb_address is only for display purposes $block = new Block($this->BlockAddress, $userId, $wgUser->getID(), $this->BlockReason, wfTimestampNow(), 0, $expiry, $this->BlockAnonOnly, $this->BlockCreateAccount); if (wfRunHooks('BlockIp', array(&$block, &$wgUser))) { if (!$block->insert()) { $this->showForm(wfMsg('ipb_already_blocked', htmlspecialchars($this->BlockAddress))); return; } wfRunHooks('BlockIpComplete', array($block, $wgUser)); # Make log entry $log = new LogPage('block'); $log->addEntry('block', Title::makeTitle(NS_USER, $this->BlockAddress), $this->BlockReason, $expirestr); # Report to the user $titleObj = Title::makeTitle(NS_SPECIAL, 'Blockip'); $wgOut->redirect($titleObj->getFullURL('action=success&ip=' . urlencode($this->BlockAddress))); } }
function testActionPermissions() { global $wgUser; $wgUser = $this->user; $this->setUserPerm(array("createpage")); $this->setTitle(NS_MAIN, "test page"); $this->title->mTitleProtection['pt_create_perm'] = ''; $this->title->mTitleProtection['pt_user'] = $this->user->getID(); $this->title->mTitleProtection['pt_expiry'] = Block::infinity(); $this->title->mTitleProtection['pt_reason'] = 'test'; $this->title->mCascadeRestriction = false; $this->assertEquals(array(array('titleprotected', 'Useruser', 'test')), $this->title->getUserPermissionsErrors('create', $this->user)); $this->assertEquals(false, $this->title->userCan('create')); $this->title->mTitleProtection['pt_create_perm'] = 'sysop'; $this->setUserPerm(array('createpage', 'protect')); $this->assertEquals(array(), $this->title->getUserPermissionsErrors('create', $this->user)); $this->assertEquals(true, $this->title->userCan('create')); $this->setUserPerm(array('createpage')); $this->assertEquals(array(array('titleprotected', 'Useruser', 'test')), $this->title->getUserPermissionsErrors('create', $this->user)); $this->assertEquals(false, $this->title->userCan('create')); $this->setTitle(NS_MEDIA, "test page"); $this->setUserPerm(array("move")); $this->assertEquals(false, $this->title->userCan('move')); $this->assertEquals(array(array('immobile-source-namespace', 'Media')), $this->title->getUserPermissionsErrors('move', $this->user)); $this->setTitle(NS_MAIN, "test page"); $this->assertEquals(array(), $this->title->getUserPermissionsErrors('move', $this->user)); $this->assertEquals(true, $this->title->userCan('move')); $this->title->mInterwiki = "no"; $this->assertEquals(array(array('immobile-page')), $this->title->getUserPermissionsErrors('move', $this->user)); $this->assertEquals(false, $this->title->userCan('move')); $this->setTitle(NS_MEDIA, "test page"); $this->assertEquals(false, $this->title->userCan('move-target')); $this->assertEquals(array(array('immobile-target-namespace', 'Media')), $this->title->getUserPermissionsErrors('move-target', $this->user)); $this->setTitle(NS_MAIN, "test page"); $this->assertEquals(array(), $this->title->getUserPermissionsErrors('move-target', $this->user)); $this->assertEquals(true, $this->title->userCan('move-target')); $this->title->mInterwiki = "no"; $this->assertEquals(array(array('immobile-target-page')), $this->title->getUserPermissionsErrors('move-target', $this->user)); $this->assertEquals(false, $this->title->userCan('move-target')); }