/**
  * Perform validation on the user submitted data
  * and check that we can perform the rename
  * @param array $data
  *
  * @return Status
  */
 function validate(array $data)
 {
     if (!class_exists('RenameuserSQL')) {
         return Status::newFatal('centralauth-rename-notinstalled');
     }
     $oldUser = User::newFromName($data['oldname']);
     if (!$oldUser) {
         return Status::newFatal('centralauth-rename-doesnotexist');
     }
     if ($oldUser->getName() === $this->getUser()->getName()) {
         return Status::newFatal('centralauth-rename-cannotself');
     }
     $newUser = User::newFromName($data['newname']);
     if (!$newUser) {
         return Status::newFatal('centralauth-rename-badusername');
     }
     if (!$this->overrideAntiSpoof && class_exists('CentralAuthSpoofUser')) {
         $spoofUser = new CentralAuthSpoofUser($newUser->getName());
         $conflicts = $this->processAntiSpoofConflicts($oldUser->getName(), $spoofUser->getConflicts());
         if ($conflicts) {
             return Status::newFatal('centralauth-rename-antispoofconflicts2', $this->getLanguage()->commaList($conflicts));
         }
     }
     $validator = new GlobalRenameUserValidator();
     $status = $validator->validate($oldUser, $newUser);
     return $status;
 }
 /**
  * Can be used to cancel user account creation
  *
  * @param $user User
  * @param $message string
  * @return bool true to continue, false to abort user creation
  */
 public static function asAbortNewAccountHook($user, &$message)
 {
     global $wgAntiSpoofAccounts, $wgUser, $wgRequest;
     if (!$wgAntiSpoofAccounts) {
         $mode = 'LOGGING ';
         $active = false;
     } elseif ($wgRequest->getCheck('wpIgnoreAntiSpoof') && $wgUser->isAllowed('override-antispoof')) {
         $mode = 'OVERRIDE ';
         $active = false;
     } else {
         $mode = '';
         $active = true;
     }
     $name = $user->getName();
     $spoof = new CentralAuthSpoofUser($name);
     if ($spoof->isLegal()) {
         $normalized = $spoof->getNormalized();
         $conflicts = $spoof->getConflicts();
         if (empty($conflicts)) {
             wfDebugLog('antispoof', "{$mode}PASS new account '{$name}' [{$normalized}]");
         } else {
             wfDebugLog('antispoof', "{$mode}CONFLICT new account '{$name}' [{$normalized}] spoofs " . implode(',', $conflicts));
             if ($active) {
                 $numConflicts = count($conflicts);
                 $message = wfMessage('antispoof-conflict-top', $name)->numParams($numConflicts)->escaped();
                 $message .= '<ul>';
                 foreach ($conflicts as $simUser) {
                     $message .= '<li>' . wfMessage('antispoof-conflict-item', $simUser)->escaped() . '</li>';
                 }
                 $message .= '</ul>' . wfMessage('antispoof-conflict-bottom')->escaped();
                 return false;
             }
         }
     } else {
         $error = $spoof->getError();
         wfDebugLog('antispoof', "{$mode}ILLEGAL new account '{$name}' {$error}");
         if ($active) {
             $message = wfMessage('antispoof-name-illegal', $name, $error)->escaped();
             return false;
         }
     }
     return true;
 }
 /**
  * Display form for approving/denying request or process form submission.
  *
  * @param GlobalRenameRequest $req Pending request
  */
 protected function doShowProcessForm(GlobalRenameRequest $req)
 {
     $this->commonPreamble('globalrenamequeue-request-title', array($req->getName()));
     $form = HTMLForm::factory('vform', array('rid' => array('default' => $req->getId(), 'name' => 'rid', 'type' => 'hidden'), 'comments' => array('default' => $this->getRequest()->getVal('comments'), 'id' => 'mw-renamequeue-comments', 'label-message' => 'globalrenamequeue-request-comments-label', 'name' => 'comments', 'type' => 'textarea', 'rows' => 5), 'reason' => array('id' => 'mw-renamequeue-reason', 'label-message' => 'globalrenamequeue-request-reason-label', 'name' => 'reason', 'type' => 'text'), 'movepages' => array('id' => 'mw-renamequeue-movepages', 'name' => 'movepages', 'label-message' => 'globalrenamequeue-request-movepages', 'type' => 'check', 'default' => 1), 'suppressredirects' => array('id' => 'mw-renamequeue-suppressredirects', 'name' => 'suppressredirects', 'label-message' => 'globalrenamequeue-request-suppressredirects', 'type' => 'check')), $this->getContext(), 'globalrenamequeue');
     $form->suppressDefaultSubmit();
     $form->addButton('approve', $this->msg('globalrenamequeue-request-approve-text')->text(), 'mw-renamequeue-approve', array('class' => 'mw-ui-constructive mw-ui-flush-right'));
     $form->addButton('deny', $this->msg('globalrenamequeue-request-deny-text')->text(), 'mw-renamequeue-deny', array('class' => 'mw-ui-destructive mw-ui-flush-right'));
     $form->addButton('cancel', $this->msg('globalrenamequeue-request-cancel-text')->text(), 'mw-renamequeue-cancel', array('class' => 'mw-ui-quiet mw-ui-flush-left'));
     $form->setId('mw-globalrenamequeue-request');
     if ($req->userIsGlobal()) {
         $globalUser = new CentralAuthUser($req->getName());
         $homeWiki = $globalUser->getHomeWiki();
         $infoMsgKey = 'globalrenamequeue-request-userinfo-global';
     } else {
         $homeWiki = $req->getWiki();
         $infoMsgKey = 'globalrenamequeue-request-userinfo-local';
     }
     $headerMsg = $this->msg('globalrenamequeue-request-header', WikiMap::getForeignURL($homeWiki, "User:{$req->getName()}"), $req->getName(), $req->getNewName());
     $form->addHeaderText('<span class="plainlinks">' . $headerMsg->parseAsBlock() . '</span>');
     $homeWikiWiki = WikiMap::getWiki($homeWiki);
     $infoMsg = $this->msg($infoMsgKey, $req->getName(), $homeWikiWiki ? $homeWikiWiki->getDisplayName() : $homeWiki, $req->getNewName());
     $form->addHeaderText($infoMsg->parseAsBlock());
     if (class_exists('CentralAuthSpoofUser')) {
         $spoofUser = new CentralAuthSpoofUser($req->getNewName());
         // @todo move this code somewhere else
         $specialGblRename = new SpecialGlobalRenameUser();
         $specialGblRename->setContext($this->getContext());
         $conflicts = $specialGblRename->processAntiSpoofConflicts($req->getName(), $spoofUser->getConflicts());
         if ($conflicts) {
             $form->addHeaderText($this->msg('globalrenamequeue-request-antispoof-conflicts', $this->getLanguage()->commaList($conflicts))->numParams(count($conflicts))->parse());
         }
     }
     // Show a log entry of previous renames under the requesting user's username
     $caTitle = Title::makeTitleSafe(NS_SPECIAL, 'CentralAuth/' . $req->getName());
     $extract = '';
     $extractCount = LogEventsList::showLogExtract($extract, 'gblrename', $caTitle, '', array('showIfEmpty' => false));
     if ($extractCount) {
         $form->addHeaderText(Xml::fieldset($this->msg('globalrenamequeue-request-previous-renames')->numParams($extractCount)->text(), $extract));
     }
     $reason = $req->getReason() ?: $this->msg('globalrenamequeue-request-reason-sul')->parseAsBlock();
     $form->addHeaderText($this->msg('globalrenamequeue-request-reason', $reason)->parseAsBlock());
     $form->setSubmitCallback(array($this, 'onProcessSubmit'));
     $out = $this->getOutput();
     $out->addModuleStyles(array('mediawiki.ui', 'mediawiki.ui.button', 'mediawiki.ui.input', 'ext.centralauth.globalrenamequeue.styles'));
     $out->addModules('ext.centralauth.globalrenamequeue');
     $status = $form->show();
     if ($status instanceof Status && $status->isOk()) {
         $this->getOutput()->redirect($this->getPageTitle(self::PAGE_PROCESS_REQUEST . "/{$req->getId()}/{$status->value}")->getFullURL());
     }
 }