/**
  * @task edit
  */
 public function createNewUser(PhabricatorUser $user, PhabricatorUserEmail $email)
 {
     if ($user->getID()) {
         throw new Exception("User has already been created!");
     }
     if ($email->getID()) {
         throw new Exception("Email has already been created!");
     }
     if (!PhabricatorUser::validateUsername($user->getUsername())) {
         $valid = PhabricatorUser::describeValidUsername();
         throw new Exception("Username is invalid! {$valid}");
     }
     // Always set a new user's email address to primary.
     $email->setIsPrimary(1);
     $this->willAddEmail($email);
     $user->openTransaction();
     try {
         $user->save();
         $email->setUserPHID($user->getPHID());
         $email->save();
     } catch (AphrontQueryDuplicateKeyException $ex) {
         // We might have written the user but failed to write the email; if
         // so, erase the IDs we attached.
         $user->setID(null);
         $user->setPHID(null);
         $user->killTransaction();
         throw $ex;
     }
     $log = PhabricatorUserLog::newLog($this->actor, $user, PhabricatorUserLog::ACTION_CREATE);
     $log->setNewValue($email->getAddress());
     $log->save();
     $user->saveTransaction();
     return $this;
 }
 /**
  * @task edit
  */
 public function createNewUser(PhabricatorUser $user, PhabricatorUserEmail $email, $allow_reassign = false)
 {
     if ($user->getID()) {
         throw new Exception(pht('User has already been created!'));
     }
     $is_reassign = false;
     if ($email->getID()) {
         if ($allow_reassign) {
             if ($email->getIsPrimary()) {
                 throw new Exception(pht('Primary email addresses can not be reassigned.'));
             }
             $is_reassign = true;
         } else {
             throw new Exception(pht('Email has already been created!'));
         }
     }
     if (!PhabricatorUser::validateUsername($user->getUsername())) {
         $valid = PhabricatorUser::describeValidUsername();
         throw new Exception(pht('Username is invalid! %s', $valid));
     }
     // Always set a new user's email address to primary.
     $email->setIsPrimary(1);
     // If the primary address is already verified, also set the verified flag
     // on the user themselves.
     if ($email->getIsVerified()) {
         $user->setIsEmailVerified(1);
     }
     $this->willAddEmail($email);
     $user->openTransaction();
     try {
         $user->save();
         $email->setUserPHID($user->getPHID());
         $email->save();
     } catch (AphrontDuplicateKeyQueryException $ex) {
         // We might have written the user but failed to write the email; if
         // so, erase the IDs we attached.
         $user->setID(null);
         $user->setPHID(null);
         $user->killTransaction();
         throw $ex;
     }
     $log = PhabricatorUserLog::initializeNewLog($this->requireActor(), $user->getPHID(), PhabricatorUserLog::ACTION_CREATE);
     $log->setNewValue($email->getAddress());
     $log->save();
     if ($is_reassign) {
         $log = PhabricatorUserLog::initializeNewLog($this->requireActor(), $user->getPHID(), PhabricatorUserLog::ACTION_EMAIL_REASSIGN);
         $log->setNewValue($email->getAddress());
         $log->save();
     }
     $user->saveTransaction();
     if ($email->getIsVerified()) {
         $this->didVerifyEmail($user, $email);
     }
     return $this;
 }
 /**
  * Build a test user to spec.
  */
 private function buildUser($spec)
 {
     $user = new PhabricatorUser();
     switch ($spec) {
         case 'public':
             break;
         case 'user':
             $user->setPHID(1);
             break;
         case 'admin':
             $user->setPHID(1);
             $user->setIsAdmin(true);
             break;
         default:
             throw new Exception("Unknown user spec '{$spec}'.");
     }
     return $user;
 }