Esempio n. 1
0
 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;
 }
Esempio n. 2
0
 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;
 }
Esempio n. 4
0
 /**
  * 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);
 }