Path: blob/master/src/applications/people/xaction/PhabricatorUserUsernameTransaction.php
12256 views
<?php12final class PhabricatorUserUsernameTransaction3extends PhabricatorUserTransactionType {45const TRANSACTIONTYPE = 'user.rename';67public function generateOldValue($object) {8return $object->getUsername();9}1011public function generateNewValue($object, $value) {12return $value;13}1415public function applyInternalEffects($object, $value) {16$object->setUsername($value);17}1819public function applyExternalEffects($object, $value) {20$actor = $this->getActor();21$user = $object;2223$old_username = $this->getOldValue();24$new_username = $this->getNewValue();2526// The SSH key cache currently includes usernames, so dirty it. See T1255427// for discussion.28PhabricatorAuthSSHKeyQuery::deleteSSHKeyCache();2930id(new PhabricatorPeopleUsernameMailEngine())31->setSender($actor)32->setRecipient($object)33->setOldUsername($old_username)34->setNewUsername($new_username)35->sendMail();36}3738public function getTitle() {39return pht(40'%s renamed this user from %s to %s.',41$this->renderAuthor(),42$this->renderOldValue(),43$this->renderNewValue());44}4546public function getTitleForFeed() {47return pht(48'%s renamed %s from %s to %s.',49$this->renderAuthor(),50$this->renderObject(),51$this->renderOldValue(),52$this->renderNewValue());53}5455public function validateTransactions($object, array $xactions) {56$actor = $this->getActor();57$errors = array();5859foreach ($xactions as $xaction) {60$new = $xaction->getNewValue();61$old = $xaction->getOldValue();6263if ($old === $new) {64continue;65}6667if (!$actor->getIsAdmin()) {68$errors[] = $this->newInvalidError(69pht('You must be an administrator to rename users.'));70}7172if (!strlen($new)) {73$errors[] = $this->newInvalidError(74pht('New username is required.'),75$xaction);76} else if (!PhabricatorUser::validateUsername($new)) {77$errors[] = $this->newInvalidError(78PhabricatorUser::describeValidUsername(),79$xaction);80}8182$user = id(new PhabricatorPeopleQuery())83->setViewer(PhabricatorUser::getOmnipotentUser())84->withUsernames(array($new))85->executeOne();86if ($user) {87// See T13446. We may be changing the letter case of a username, which88// is a perfectly fine edit.89$is_self = ($user->getPHID() === $object->getPHID());90if (!$is_self) {91$errors[] = $this->newInvalidError(92pht(93'Another user already has the username "%s".',94$new),95$xaction);96}97}9899}100101return $errors;102}103104public function getRequiredCapabilities(105$object,106PhabricatorApplicationTransaction $xaction) {107108// Unlike normal user edits, renames require admin permissions, which109// is enforced by validateTransactions().110111return null;112}113114public function shouldTryMFA(115$object,116PhabricatorApplicationTransaction $xaction) {117return true;118}119120}121122123