Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/people/xaction/PhabricatorUserUsernameTransaction.php
12256 views
1
<?php
2
3
final class PhabricatorUserUsernameTransaction
4
extends PhabricatorUserTransactionType {
5
6
const TRANSACTIONTYPE = 'user.rename';
7
8
public function generateOldValue($object) {
9
return $object->getUsername();
10
}
11
12
public function generateNewValue($object, $value) {
13
return $value;
14
}
15
16
public function applyInternalEffects($object, $value) {
17
$object->setUsername($value);
18
}
19
20
public function applyExternalEffects($object, $value) {
21
$actor = $this->getActor();
22
$user = $object;
23
24
$old_username = $this->getOldValue();
25
$new_username = $this->getNewValue();
26
27
// The SSH key cache currently includes usernames, so dirty it. See T12554
28
// for discussion.
29
PhabricatorAuthSSHKeyQuery::deleteSSHKeyCache();
30
31
id(new PhabricatorPeopleUsernameMailEngine())
32
->setSender($actor)
33
->setRecipient($object)
34
->setOldUsername($old_username)
35
->setNewUsername($new_username)
36
->sendMail();
37
}
38
39
public function getTitle() {
40
return pht(
41
'%s renamed this user from %s to %s.',
42
$this->renderAuthor(),
43
$this->renderOldValue(),
44
$this->renderNewValue());
45
}
46
47
public function getTitleForFeed() {
48
return pht(
49
'%s renamed %s from %s to %s.',
50
$this->renderAuthor(),
51
$this->renderObject(),
52
$this->renderOldValue(),
53
$this->renderNewValue());
54
}
55
56
public function validateTransactions($object, array $xactions) {
57
$actor = $this->getActor();
58
$errors = array();
59
60
foreach ($xactions as $xaction) {
61
$new = $xaction->getNewValue();
62
$old = $xaction->getOldValue();
63
64
if ($old === $new) {
65
continue;
66
}
67
68
if (!$actor->getIsAdmin()) {
69
$errors[] = $this->newInvalidError(
70
pht('You must be an administrator to rename users.'));
71
}
72
73
if (!strlen($new)) {
74
$errors[] = $this->newInvalidError(
75
pht('New username is required.'),
76
$xaction);
77
} else if (!PhabricatorUser::validateUsername($new)) {
78
$errors[] = $this->newInvalidError(
79
PhabricatorUser::describeValidUsername(),
80
$xaction);
81
}
82
83
$user = id(new PhabricatorPeopleQuery())
84
->setViewer(PhabricatorUser::getOmnipotentUser())
85
->withUsernames(array($new))
86
->executeOne();
87
if ($user) {
88
// See T13446. We may be changing the letter case of a username, which
89
// is a perfectly fine edit.
90
$is_self = ($user->getPHID() === $object->getPHID());
91
if (!$is_self) {
92
$errors[] = $this->newInvalidError(
93
pht(
94
'Another user already has the username "%s".',
95
$new),
96
$xaction);
97
}
98
}
99
100
}
101
102
return $errors;
103
}
104
105
public function getRequiredCapabilities(
106
$object,
107
PhabricatorApplicationTransaction $xaction) {
108
109
// Unlike normal user edits, renames require admin permissions, which
110
// is enforced by validateTransactions().
111
112
return null;
113
}
114
115
public function shouldTryMFA(
116
$object,
117
PhabricatorApplicationTransaction $xaction) {
118
return true;
119
}
120
121
}
122
123