From a89e91da79f1936afdf213867e75d9f8364361ca Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 4 Feb 2015 21:25:14 +0100 Subject: [PATCH] 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. --- actions/apigroupprofileupdate.php | 9 ++----- actions/editgroup.php | 34 ++++++++++++++++----------- actions/profilesettings.php | 39 ++++++++++++++++++------------- lib/default.php | 1 + lib/groupeditform.php | 6 ++++- 5 files changed, 51 insertions(+), 38 deletions(-) diff --git a/actions/apigroupprofileupdate.php b/actions/apigroupprofileupdate.php index 9a4592f423..1a489eeefb 100644 --- a/actions/apigroupprofileupdate.php +++ b/actions/apigroupprofileupdate.php @@ -55,7 +55,7 @@ class ApiGroupProfileUpdateAction extends ApiAuthAction { parent::prepare($args); - $this->nickname = common_canonical_nickname($this->trimmed('nickname')); + $this->nickname = Nickname::normalize($this->trimmed('nickname')); $this->fullname = $this->trimmed('fullname'); $this->homepage = $this->trimmed('homepage'); @@ -106,14 +106,9 @@ class ApiGroupProfileUpdateAction extends ApiAuthAction try { - if (!empty($this->nickname)) { + if (common_config('profile', 'changenick') == true && $this->group->nickname !== $this->nickname) { try { $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) { throw new ApiValidationException($e->getMessage()); } diff --git a/actions/editgroup.php b/actions/editgroup.php index 7b499d00ff..cca00ea6b9 100644 --- a/actions/editgroup.php +++ b/actions/editgroup.php @@ -152,7 +152,7 @@ class EditgroupAction extends GroupAction function showScripts() { parent::showScripts(); - $this->autofocus('newnickname'); + $this->autofocus('fullname'); } function trySave() @@ -165,19 +165,21 @@ class EditgroupAction extends GroupAction if (Event::handle('StartGroupSaveForm', array($this))) { - $nickname = $this->trimmed('newnickname'); - try { - $nickname = Nickname::normalize($nickname, true); - } catch (NicknameTakenException $e) { - // Abort only if the nickname is occupied by _another_ group - if ($e->profile->id != $this->group->profile_id) { + // $nickname will only be set if this changenick value is true. + if (common_config('profile', 'changenick') == true) { + try { + $nickname = Nickname::normalize($this->trimmed('newnickname'), true); + } catch (NicknameTakenException $e) { + // Abort only if the nickname is occupied by _another_ group + if ($e->profile->id != $this->group->profile_id) { + $this->showForm($e->getMessage()); + return; + } + $nickname = Nickname::normalize($this->trimmed('newnickname')); // without in-use check this time + } catch (NicknameException $e) { $this->showForm($e->getMessage()); return; } - $nickname = Nickname::normalize($nickname); // without in-use check this time - } catch (NicknameException $e) { - $this->showForm($e->getMessage()); - return; } $fullname = $this->trimmed('fullname'); @@ -239,12 +241,16 @@ class EditgroupAction extends GroupAction $orig = clone($this->group); - $this->group->nickname = $nickname; + 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->mainpage = common_local_url('showgroup', array('nickname' => $this->group->nickname)); + } $this->group->fullname = $fullname; $this->group->homepage = $homepage; $this->group->description = $description; $this->group->location = $location; - $this->group->mainpage = common_local_url('showgroup', array('nickname' => $nickname)); $this->group->join_policy = $join_policy; $this->group->force_scope = $force_scope; @@ -269,7 +275,7 @@ class EditgroupAction extends GroupAction } 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 { // TRANS: Group edit form success message. $this->showForm(_('Options saved.')); diff --git a/actions/profilesettings.php b/actions/profilesettings.php index 3b71b99755..59a7f6d860 100644 --- a/actions/profilesettings.php +++ b/actions/profilesettings.php @@ -70,7 +70,7 @@ class ProfilesettingsAction extends SettingsAction function showScripts() { parent::showScripts(); - $this->autofocus('nickname'); + $this->autofocus('fullname'); } /** @@ -100,9 +100,11 @@ class ProfilesettingsAction extends SettingsAction $this->elementStart('li'); // TRANS: Field label in form for profile settings. $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. - _('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->elementStart('li'); // TRANS: Field label in form for profile settings. @@ -237,19 +239,21 @@ class ProfilesettingsAction extends SettingsAction if (Event::handle('StartProfileSaveForm', array($this))) { - $nickname = $this->trimmed('nickname'); - try { - $nickname = Nickname::normalize($nickname, true); - } catch (NicknameTakenException $e) { - // Abort only if the nickname is occupied by another local profile - if ($e->profile->id != $this->scoped->id) { + // $nickname will only be set if this changenick value is true. + if (common_config('profile', 'changenick') == true) { + try { + $nickname = Nickname::normalize($this->trimmed('nickname'), true); + } catch (NicknameTakenException $e) { + // Abort only if the nickname is occupied by another local profile + if ($e->profile->id != $this->scoped->id) { + $this->showForm($e->getMessage()); + return; + } + $nickname = Nickname::normalize($this->trimmed('nickname')); // without in-use check this time + } catch (NicknameException $e) { $this->showForm($e->getMessage()); return; } - $nickname = Nickname::normalize($nickname); // without in-use check this time - } catch (NicknameException $e) { - $this->showForm($e->getMessage()); - return; } $fullname = $this->trimmed('fullname'); @@ -353,7 +357,12 @@ class ProfilesettingsAction extends SettingsAction $orig_profile = clone($profile); - $profile->nickname = $nickname; + 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->profileurl = common_profile_url($profile->nickname); + } $profile->fullname = $fullname; $profile->homepage = $homepage; $profile->bio = $bio; @@ -373,8 +382,6 @@ class ProfilesettingsAction extends SettingsAction $profile->location_ns = $loc->location_ns; } - $profile->profileurl = common_profile_url($nickname); - if (common_config('location', 'share') == 'user') { $exists = false; diff --git a/lib/default.php b/lib/default.php index e39c35efd8..6ca61f191b 100644 --- a/lib/default.php +++ b/lib/default.php @@ -126,6 +126,7 @@ $default = 'profile' => array('banned' => array(), 'biolimit' => null, + 'changenick' => false, 'backup' => true, 'restore' => true, 'delete' => false, diff --git a/lib/groupeditform.php b/lib/groupeditform.php index e943dcd19a..9061af2336 100644 --- a/lib/groupeditform.php +++ b/lib/groupeditform.php @@ -147,7 +147,11 @@ class GroupEditForm extends Form $this->out->input('newnickname', _('Nickname'), ($this->out->arg('newnickname')) ? $this->out->arg('newnickname') : $nickname, // 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->elementStart('li'); // TRANS: Field label on group edit form.