/**
  * @covers CentralAuthUser::newUnattached
  */
 public function testNewUnattached()
 {
     $ca = CentralAuthUser::newUnattached('FooBar');
     $this->assertInstanceOf('CentralAuthUser', $ca);
     $this->assertEquals('FooBar', $ca->getName());
     $this->assertFalse($ca->isAttached());
 }
 /**
  * @covers CentralAuthUser::getAuthToken
  * @covers CentralAuthUser::resetAuthToken
  */
 public function testGetAuthToken()
 {
     $caUserUnattached = CentralAuthUser::newUnattached('UnattachedUser', false);
     $token = $caUserUnattached->getAuthToken();
     $this->assertEquals(32, strlen($token));
     $this->assertSame(0, preg_match('/[^a-f0-9]/', $token));
 }
 public function provideAbortLogin()
 {
     $user = User::newFromName('GlobalUser');
     $lockedUser = User::newFromName('GlobalLockedUser');
     // We can fake out CentralAuthUser::getInstance() by adding centralAuthObj
     $noUser = User::newFromName('NoUser');
     $noUser->centralAuthObj = CentralAuthUser::newUnattached('NoUser');
     return array(array($user, true, 'Attached user can login'), array($noUser, true, 'Unattached user can login'), array($lockedUser, false, 'Locked User cannot login'));
 }
 /**
  * @param $row
  */
 function setCurrent($row)
 {
     parent::setCurrent($row);
     if ($row !== false) {
         if (isset($this->globalData[$row->user_name])) {
             $caRow = $this->globalData[$row->user_name];
             // Like taken from GlobalRenameUserStatus::getNames
             $renameUser = array();
             if ($caRow->ru_oldname) {
                 $renameUser = array($caRow->ru_oldname, $caRow->ru_newname);
             }
             $this->current->centralAuthObj = CentralAuthUser::newFromRow($caRow, $renameUser);
         } else {
             $this->current->centralAuthObj = CentralAuthUser::newUnattached($row->user_name);
         }
     }
 }
 function process($username)
 {
     $central = new CentralAuthUser($username);
     if (!$central->exists()) {
         $this->output("ERROR: [{$username}] Central account does not exist. So how'd we find it?\n");
         return;
     }
     try {
         $unattached = $central->queryUnattached();
     } catch (Exception $e) {
         // This might happen due to localnames inconsistencies (bug 67350)
         $this->output("ERROR: [{$username}] Fetching unattached accounts failed.\n");
         return;
     }
     foreach ($unattached as $wiki => $local) {
         if ($local['email'] === '' && $local['password'] === '') {
             $this->output("SKIP: [{$username}] Account on {$wiki} has no password or email\n");
             return;
         }
     }
     if ($this->fix) {
         $reason = wfMessage('centralauth-delete-empty-account')->inContentLanguage()->text();
         $status = $central->adminDelete($reason);
         if (!$status->isGood()) {
             $msg = $status->errors[0]['message'];
             if ($msg instanceof Message) {
                 $msg = $msg->getKey();
             }
             $this->output("ERROR: [{$username}] Delete failed ({$msg})\n");
             return;
         }
         $this->output("DELETE: [{$username}] Deleted\n");
     } else {
         $this->output("DELETE: [{$username}] Would delete\n");
     }
     if (count($unattached) !== 0 && $this->migrate) {
         if ($this->fix) {
             $central = CentralAuthUser::newUnattached($username, true);
             if ($central->storeAndMigrate(array(), !$this->suppressRC, $this->safe)) {
                 $unattachedAfter = count($central->queryUnattached());
                 $this->output("MIGRATE: [{$username}] Success; {$unattachedAfter} left unattached\n");
             } else {
                 $this->output("MIGRATE: [{$username}] Fail\n");
             }
         } else {
             $this->output("MIGRATE: [{$username}] Would attempt\n");
         }
     }
 }