By default, don't allow nick changes for profiles

This goes for both users and groups, since they share nickname namespace.

If you want to enable nickname changes, just add this to your config:

   $config['profile']['changenick'] = true;

This commit should cover all changes in our usual web forms as well as through
the API.
This commit is contained in:
Mikael Nordfeldth 2015-02-04 21:25:14 +01:00
parent 5155854339
commit a89e91da79
5 changed files with 51 additions and 38 deletions

View File

@ -55,7 +55,7 @@ class ApiGroupProfileUpdateAction extends ApiAuthAction
{ {
parent::prepare($args); parent::prepare($args);
$this->nickname = common_canonical_nickname($this->trimmed('nickname')); $this->nickname = Nickname::normalize($this->trimmed('nickname'));
$this->fullname = $this->trimmed('fullname'); $this->fullname = $this->trimmed('fullname');
$this->homepage = $this->trimmed('homepage'); $this->homepage = $this->trimmed('homepage');
@ -106,14 +106,9 @@ class ApiGroupProfileUpdateAction extends ApiAuthAction
try { try {
if (!empty($this->nickname)) { if (common_config('profile', 'changenick') == true && $this->group->nickname !== $this->nickname) {
try { try {
$this->group->nickname = Nickname::normalize($this->nickname, true); $this->group->nickname = Nickname::normalize($this->nickname, true);
} catch (NicknameTakenException $e) {
// Abort only if the nickname is occupied by _another_ local group
if ($e->profile->id != $this->group->id) {
throw new ApiValidationException($e->getMessage());
}
} catch (NicknameException $e) { } catch (NicknameException $e) {
throw new ApiValidationException($e->getMessage()); throw new ApiValidationException($e->getMessage());
} }

View File

@ -152,7 +152,7 @@ class EditgroupAction extends GroupAction
function showScripts() function showScripts()
{ {
parent::showScripts(); parent::showScripts();
$this->autofocus('newnickname'); $this->autofocus('fullname');
} }
function trySave() function trySave()
@ -165,20 +165,22 @@ class EditgroupAction extends GroupAction
if (Event::handle('StartGroupSaveForm', array($this))) { if (Event::handle('StartGroupSaveForm', array($this))) {
$nickname = $this->trimmed('newnickname'); // $nickname will only be set if this changenick value is true.
if (common_config('profile', 'changenick') == true) {
try { try {
$nickname = Nickname::normalize($nickname, true); $nickname = Nickname::normalize($this->trimmed('newnickname'), true);
} catch (NicknameTakenException $e) { } catch (NicknameTakenException $e) {
// Abort only if the nickname is occupied by _another_ group // Abort only if the nickname is occupied by _another_ group
if ($e->profile->id != $this->group->profile_id) { if ($e->profile->id != $this->group->profile_id) {
$this->showForm($e->getMessage()); $this->showForm($e->getMessage());
return; return;
} }
$nickname = Nickname::normalize($nickname); // without in-use check this time $nickname = Nickname::normalize($this->trimmed('newnickname')); // without in-use check this time
} catch (NicknameException $e) { } catch (NicknameException $e) {
$this->showForm($e->getMessage()); $this->showForm($e->getMessage());
return; return;
} }
}
$fullname = $this->trimmed('fullname'); $fullname = $this->trimmed('fullname');
$homepage = $this->trimmed('homepage'); $homepage = $this->trimmed('homepage');
@ -239,12 +241,16 @@ class EditgroupAction extends GroupAction
$orig = clone($this->group); $orig = clone($this->group);
if (common_config('profile', 'changenick') == true && $this->group->nickname !== $nickname) {
assert(Nickname::normalize($nickname)===$nickname);
common_debug("Changing group nickname from '{$profile->nickname}' to '{$nickname}'.");
$this->group->nickname = $nickname; $this->group->nickname = $nickname;
$this->group->mainpage = common_local_url('showgroup', array('nickname' => $this->group->nickname));
}
$this->group->fullname = $fullname; $this->group->fullname = $fullname;
$this->group->homepage = $homepage; $this->group->homepage = $homepage;
$this->group->description = $description; $this->group->description = $description;
$this->group->location = $location; $this->group->location = $location;
$this->group->mainpage = common_local_url('showgroup', array('nickname' => $nickname));
$this->group->join_policy = $join_policy; $this->group->join_policy = $join_policy;
$this->group->force_scope = $force_scope; $this->group->force_scope = $force_scope;
@ -269,7 +275,7 @@ class EditgroupAction extends GroupAction
} }
if ($this->group->nickname != $orig->nickname) { if ($this->group->nickname != $orig->nickname) {
common_redirect(common_local_url('editgroup', array('nickname' => $nickname)), 303); common_redirect(common_local_url('editgroup', array('nickname' => $this->group->nickname)), 303);
} else { } else {
// TRANS: Group edit form success message. // TRANS: Group edit form success message.
$this->showForm(_('Options saved.')); $this->showForm(_('Options saved.'));

View File

@ -70,7 +70,7 @@ class ProfilesettingsAction extends SettingsAction
function showScripts() function showScripts()
{ {
parent::showScripts(); parent::showScripts();
$this->autofocus('nickname'); $this->autofocus('fullname');
} }
/** /**
@ -100,9 +100,11 @@ class ProfilesettingsAction extends SettingsAction
$this->elementStart('li'); $this->elementStart('li');
// TRANS: Field label in form for profile settings. // TRANS: Field label in form for profile settings.
$this->input('nickname', _('Nickname'), $this->input('nickname', _('Nickname'),
($this->arg('nickname')) ? $this->arg('nickname') : $profile->nickname, $this->arg('nickname') ?: $profile->nickname,
// TRANS: Tooltip for field label in form for profile settings. // TRANS: Tooltip for field label in form for profile settings.
_('1-64 lowercase letters or numbers, no punctuation or spaces.')); _('1-64 lowercase letters or numbers, no punctuation or spaces.'),
null, false, // "name" (will be set to id), then "required"
!common_config('profile', 'changenick') ? array('disabled'=>'disabled') : array());
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
// TRANS: Field label in form for profile settings. // TRANS: Field label in form for profile settings.
@ -237,20 +239,22 @@ class ProfilesettingsAction extends SettingsAction
if (Event::handle('StartProfileSaveForm', array($this))) { if (Event::handle('StartProfileSaveForm', array($this))) {
$nickname = $this->trimmed('nickname'); // $nickname will only be set if this changenick value is true.
if (common_config('profile', 'changenick') == true) {
try { try {
$nickname = Nickname::normalize($nickname, true); $nickname = Nickname::normalize($this->trimmed('nickname'), true);
} catch (NicknameTakenException $e) { } catch (NicknameTakenException $e) {
// Abort only if the nickname is occupied by another local profile // Abort only if the nickname is occupied by another local profile
if ($e->profile->id != $this->scoped->id) { if ($e->profile->id != $this->scoped->id) {
$this->showForm($e->getMessage()); $this->showForm($e->getMessage());
return; return;
} }
$nickname = Nickname::normalize($nickname); // without in-use check this time $nickname = Nickname::normalize($this->trimmed('nickname')); // without in-use check this time
} catch (NicknameException $e) { } catch (NicknameException $e) {
$this->showForm($e->getMessage()); $this->showForm($e->getMessage());
return; return;
} }
}
$fullname = $this->trimmed('fullname'); $fullname = $this->trimmed('fullname');
$homepage = $this->trimmed('homepage'); $homepage = $this->trimmed('homepage');
@ -353,7 +357,12 @@ class ProfilesettingsAction extends SettingsAction
$orig_profile = clone($profile); $orig_profile = clone($profile);
if (common_config('profile', 'changenick') == true && $profile->nickname !== $nickname) {
assert(Nickname::normalize($nickname)===$nickname);
common_debug("Changing user nickname from '{$profile->nickname}' to '{$nickname}'.");
$profile->nickname = $nickname; $profile->nickname = $nickname;
$profile->profileurl = common_profile_url($profile->nickname);
}
$profile->fullname = $fullname; $profile->fullname = $fullname;
$profile->homepage = $homepage; $profile->homepage = $homepage;
$profile->bio = $bio; $profile->bio = $bio;
@ -373,8 +382,6 @@ class ProfilesettingsAction extends SettingsAction
$profile->location_ns = $loc->location_ns; $profile->location_ns = $loc->location_ns;
} }
$profile->profileurl = common_profile_url($nickname);
if (common_config('location', 'share') == 'user') { if (common_config('location', 'share') == 'user') {
$exists = false; $exists = false;

View File

@ -126,6 +126,7 @@ $default =
'profile' => 'profile' =>
array('banned' => array(), array('banned' => array(),
'biolimit' => null, 'biolimit' => null,
'changenick' => false,
'backup' => true, 'backup' => true,
'restore' => true, 'restore' => true,
'delete' => false, 'delete' => false,

View File

@ -147,7 +147,11 @@ class GroupEditForm extends Form
$this->out->input('newnickname', _('Nickname'), $this->out->input('newnickname', _('Nickname'),
($this->out->arg('newnickname')) ? $this->out->arg('newnickname') : $nickname, ($this->out->arg('newnickname')) ? $this->out->arg('newnickname') : $nickname,
// TRANS: Field title on group edit form. // TRANS: Field title on group edit form.
_('1-64 lowercase letters or numbers, no punctuation or spaces.')); _('1-64 lowercase letters or numbers, no punctuation or spaces.'),
null, false,
$this->group instanceof User_group && !common_config('profile', 'changenick')
? array('disabled'=>'disabled') // can't change nickname
: array()); // either we can change nickname, or we're creating a new group.
$this->out->elementEnd('li'); $this->out->elementEnd('li');
$this->out->elementStart('li'); $this->out->elementStart('li');
// TRANS: Field label on group edit form. // TRANS: Field label on group edit form.