public function actionBlockAccountGroup($groupId) { wfProfileIn(__METHOD__); if (!$this->wg->User->isAllowed('phalanx')) { $this->displayRestrictionError($this->user); $this->skipRendering(); wfProfileOut(__METHOD__); return false; } if (!class_exists('Phalanx')) { // TODO display some error $this->skipRendering(); wfProfileOut(__METHOD__); return false; } $data = array('text' => $groupId, 'exact' => false, 'case' => false, 'regex' => false, 'timestamp' => wfTimestampNow(), 'expire' => null, 'author_id' => $this->wg->User->getId(), 'reason' => 'cookie-based block via AccountCreationTracker', 'lang' => 'all', 'type' => Phalanx::TYPE_COOKIE); $status = PhalanxHelper::save($data); wfProfileOut(__METHOD__); return $status; }
public static function onEditPhalanxBlock(&$data) { wfProfileIn(__METHOD__); unset($data['id']); $data['id'] = PhalanxHelper::save($data, false); wfProfileOut(__METHOD__); return true; }
/** * Do the whole dirty job of renaming user * * @return bool True if the process succeded */ private function doRun() { global $wgMemc, $wgAuth; $this->addLog("User rename global task start." . (!empty($this->mFakeUserId) ? ' Process is being repeated.' : null)); $this->addLog("Renaming user {$this->mOldUsername} (ID {$this->mUserId}) to {$this->mNewUsername}"); $hookName = 'RenameUser::Abort'; $this->addLog("Broadcasting hook: {$hookName}"); // Give other affected extensions a chance to validate or abort if (!wfRunHooks($hookName, array($this->mUserId, $this->mOldUsername, $this->mNewUsername, &$this->mErrors))) { $this->addLog("Aborting procedure as requested by hook."); $this->addError(wfMsgForContent('userrenametool-error-extension-abort')); wfProfileOut(__METHOD__); return false; } //enumerate IDs for wikis the user has been active in $this->addLog("Searching for user activity on wikis."); $wikiIDs = RenameUserHelper::lookupRegisteredUserActivity($this->mUserId); $this->addLog("Found " . count($wikiIDs) . " wikis: " . implode(', ', $wikiIDs)); $hookName = 'UserRename::BeforeAccountRename'; $this->addLog("Broadcasting hook: {$hookName}"); wfRunHooks($hookName, array($this->mUserId, $this->mOldUsername, $this->mNewUsername)); //rename the user account across clusters $clusters = WikiFactory::getClusters(); foreach ($clusters as $clusterName) { if (!$this->renameAccount($clusterName)) { $this->addLog("Renaming user account on cluster {$clusterName} resulted in a failure."); //if main shared DB, rename operation failed and not repeating then something's wrong dude... if ($clusterName === RenameUserHelper::CLUSTER_DEFAULT && empty($this->mFakeUserId)) { $this->addLog("Cluster {$clusterName} is the main shared DB, aborting."); $this->addError(wfMsgForContent('userrenametool-error-cannot-rename-account')); wfProfileOut(__METHOD__); return false; } } } $this->invalidateUser($this->mNewUsername); /*if not repeating the process create a new account storing the old username and some extra information in the realname field this avoids creating new accounts with the old name and let's resume/repeat the process in case is needed*/ $this->addLog("Creating fake user account"); $fakeUser = null; if (empty($this->mFakeUserId)) { //IMPORTANT: thi extension is meant to be enabled only on community central $fakeUser = User::createNew($this->mOldUsername); $fakeUser->setOption('renameData', self::RENAME_TAG . '=' . $this->mNewUsername . ';' . self::PROCESS_TAG . '=' . '1'); $fakeUser->saveToCache(); $this->mFakeUserId = $fakeUser->getId(); $this->addLog("Created fake user account with ID {$this->mFakeUserId} and renameData '{$fakeUser->getOption('renameData', '')}'"); } else { $fakeUser = User::newFromId($this->mFakeUserId); $this->addLog("Fake user account already exists: {$this->mFakeUserId}"); } $this->invalidateUser($this->mOldUsername); //Block the user from logging in before logging him out $this->addLog("Creating a Phalanx block for the user."); if (empty($this->mPhalanxBlockId)) { $this->mPhalanxBlockId = PhalanxHelper::save(array('text' => $this->mNewUsername, 'exact' => 1, 'case' => 1, 'regex' => 0, 'timestamp' => wfTimestampNow(), 'expire' => null, 'author_id' => $this->mRequestorId, 'reason' => 'User rename process requested', 'lang' => null, 'type' => Phalanx::TYPE_USER), false); if (!$this->mPhalanxBlockId) { $this->addLog("Creation of the block failed."); $this->addError(wfMsgForContent('userrenametool-error-cannot-create-block')); wfProfileOut(__METHOD__); return false; } else { $fakeUser->setOption('renameData', $fakeUser->getOption('renameData', '') . ';' . self::PHALANX_BLOCK_TAG . '=' . $this->mPhalanxBlockId); $fakeUser->saveSettings(); $this->addLog("Block created with ID {$this->mPhalanxBlockId}."); } } else { $this->addLog("Block with ID {$this->mPhalanxBlockId} already exists."); } $hookName = 'UserRename::AfterAccountRename'; $this->addLog("Broadcasting hook: {$hookName}"); wfRunHooks($hookName, array($this->mUserId, $this->mOldUsername, $this->mNewUsername)); //process global tables $this->addLog("Initializing update of global shared DB's."); $this->updateGlobal(); // create a new task for the Task Manager to handle all the global tables $this->addLog("Setting up a task for processing global DB"); $task = new UserRenameGlobalTask(); $task->createTask(array('rename_user_id' => $this->mUserId, 'rename_old_name' => $this->mOldUsername, 'rename_new_name' => $this->mNewUsername, 'tasks' => self::$mStatsDefaults), TASK_QUEUED); $this->addLog("Task created with ID " . $task->getID()); $this->addLog("Setting up a task for processing local DB's"); //create a new task for the Task Manager to handle all the local tables per each wiki $task = new UserRenameLocalTask(); $task->createTask(array('city_ids' => $wikiIDs, 'requestor_id' => $this->mRequestorId, 'requestor_name' => $this->mRequestorName, 'rename_user_id' => $this->mUserId, 'rename_old_name' => $this->mOldUsername, 'rename_new_name' => $this->mNewUsername, 'rename_fake_user_id' => $this->mFakeUserId, 'phalanx_block_id' => $this->mPhalanxBlockId, 'reason' => $this->mReason, 'global_task_id' => $this->mGlobalTask->getID()), TASK_QUEUED); $this->addLog("Task created with ID " . $task->getID()); $this->addLog("User rename global task end."); wfProfileOut(__METHOD__); return true; }
/** * AJAX creation/update */ public static function setBlock() { global $wgRequest, $wgUser; wfProfileOut(__METHOD__); $id = $wgRequest->getVal('id', false); // only set for update $filter = $wgRequest->getText('wpPhalanxFilter'); $filterbulk = $wgRequest->getText('wpPhalanxFilterBulk'); $regex = $wgRequest->getCheck('wpPhalanxFormatRegex') ? 1 : 0; $exact = $wgRequest->getCheck('wpPhalanxFormatExact') ? 1 : 0; $case = $wgRequest->getCheck('wpPhalanxFormatCase') ? 1 : 0; $expiry = $wgRequest->getText('wpPhalanxExpire'); $types = $wgRequest->getArray('wpPhalanxType'); $reason = $wgRequest->getText('wpPhalanxReason'); $lang = $wgRequest->getVal('wpPhalanxLanguages', null); $typemask = 0; foreach ($types as $type) { $typemask |= $type; } //validation if (empty($filter) && empty($filterbulk) || empty($typemask)) { wfProfileOut(__METHOD__); return array('error' => true, 'text' => wfMsg('phalanx-block-failure')); } if ($lang == 'all') { $lang = null; } if ($expiry != 'infinite') { $expire = strtotime($expiry); if ($expire < 0 || $expire === false) { wfProfileOut(__METHOD__); return false; } $expire = wfTimestamp(TS_MW, $expire); } else { $expire = null; } $data = array('text' => $filter, 'exact' => $exact, 'case' => $case, 'regex' => $regex, 'timestamp' => wfTimestampNow(), 'expire' => $expire, 'author_id' => $wgUser->getId(), 'reason' => $reason, 'lang' => $lang, 'type' => $typemask); if (empty($filterbulk)) { //single mode if (!$id) { $status = PhalanxHelper::save($data); $reason = $status ? wfMsg('phalanx-block-success') : wfMsg('phalanx-block-failure'); } else { $data['id'] = $id; $status = PhalanxHelper::update($data); $reason = $status ? wfMsg('phalanx-modify-success') : wfMsg('phalanx-block-failure'); } } else { // non-empty bulk field $bulkdata = explode("\n", $filterbulk); if (count($bulkdata)) { $reasons = array('s' => 0, 'f' => 0); foreach ($bulkdata as $bulkrow) { $bulkrow = trim($bulkrow); $data['text'] = $bulkrow; $bstatus = PhalanxHelper::save($data); if ($bstatus) { $reasons['s']++; } else { $reasons['f']++; } } $status = true; $reason = "[" . $reasons['s'] . "] success and [" . $reasons['f'] . "] fails"; } else { $status = false; $reason = "nothing to block"; } } wfProfileOut(__METHOD__); return array('error' => !$status, 'text' => $reason); }