X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=actions%2Fprofilesettings.php;h=7d3143d4b186507483af83288750c910a220d45e;hb=fd2efbc6f81aba67ff3776712af65b1a8fa73d06;hp=259b54bd0311ea801e719762c0fc99da8adc7172;hpb=880b1b666eeaedee2c9570142b2d0cd56f1d96f1;p=quix0rs-gnu-social.git diff --git a/actions/profilesettings.php b/actions/profilesettings.php index 259b54bd03..7d3143d4b1 100644 --- a/actions/profilesettings.php +++ b/actions/profilesettings.php @@ -29,11 +29,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -require_once INSTALLDIR.'/lib/accountsettingsaction.php'; +if (!defined('GNUSOCIAL')) { exit(1); } /** * Change profile settings @@ -46,7 +42,7 @@ require_once INSTALLDIR.'/lib/accountsettingsaction.php'; * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class ProfilesettingsAction extends AccountSettingsAction +class ProfilesettingsAction extends SettingsAction { /** * Title of the page @@ -74,7 +70,7 @@ class ProfilesettingsAction extends AccountSettingsAction function showScripts() { parent::showScripts(); - $this->autofocus('nickname'); + $this->autofocus('fullname'); } /** @@ -86,8 +82,8 @@ class ProfilesettingsAction extends AccountSettingsAction */ function showContent() { - $user = common_current_user(); - $profile = $user->getProfile(); + $profile = $this->scoped; + $user = $this->scoped->getUser(); $this->elementStart('form', array('method' => 'post', 'id' => 'form_settings_profile', @@ -104,9 +100,13 @@ class ProfilesettingsAction extends AccountSettingsAction $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', 'placeholder' => null) + : array('placeholder' => null)); $this->elementEnd('li'); $this->elementStart('li'); // TRANS: Field label in form for profile settings. @@ -126,15 +126,15 @@ class ProfilesettingsAction extends AccountSettingsAction // TRANS: Tooltip for field label in form for profile settings. Plural // TRANS: is decided by the number of characters available for the // TRANS: biography (%d). - $bioInstr = sprintf(_m('Describe yourself and your interests in %d character', - 'Describe yourself and your interests in %d characters', + $bioInstr = sprintf(_m('Describe yourself and your interests in %d character.', + 'Describe yourself and your interests in %d characters.', $maxBio), $maxBio); } else { // TRANS: Tooltip for field label in form for profile settings. - $bioInstr = _('Describe yourself and your interests'); + $bioInstr = _('Describe yourself and your interests.'); } - // TRANS: Text area label in form for profile settings where users can provide. + // TRANS: Text area label in form for profile settings where users can provide // TRANS: their biography. $this->textarea('bio', _('Bio'), ($this->arg('bio')) ? $this->arg('bio') : $profile->bio, @@ -145,14 +145,14 @@ class ProfilesettingsAction extends AccountSettingsAction $this->input('location', _('Location'), ($this->arg('location')) ? $this->arg('location') : $profile->location, // TRANS: Tooltip for field label in form for profile settings. - _('Where you are, like "City, State (or Region), Country"')); + _('Where you are, like "City, State (or Region), Country".')); $this->elementEnd('li'); if (common_config('location', 'share') == 'user') { $this->elementStart('li'); // TRANS: Checkbox label in form for profile settings. $this->checkbox('sharelocation', _('Share my current location when posting notices'), ($this->arg('sharelocation')) ? - $this->arg('sharelocation') : $user->shareLocation()); + $this->arg('sharelocation') : $this->scoped->shareLocation()); $this->elementEnd('li'); } Event::handle('EndProfileFormData', array($this)); @@ -187,11 +187,31 @@ class ProfilesettingsAction extends AccountSettingsAction $this->checkbox('autosubscribe', // TRANS: Checkbox label in form for profile settings. _('Automatically subscribe to whoever '. - 'subscribes to me (best for non-humans).'), + 'subscribes to me (best for non-humans)'), ($this->arg('autosubscribe')) ? $this->boolean('autosubscribe') : $user->autosubscribe); $this->elementEnd('li'); + $this->elementStart('li'); + $this->dropdown('subscribe_policy', + // TRANS: Dropdown field label on profile settings, for what policies to apply when someone else tries to subscribe to your updates. + _('Subscription policy'), + // TRANS: Dropdown field option for following policy. + array(User::SUBSCRIBE_POLICY_OPEN => _('Let anyone follow me'), + // TRANS: Dropdown field option for following policy. + User::SUBSCRIBE_POLICY_MODERATE => _('Ask me first')), + // TRANS: Dropdown field title on group edit form. + _('Whether other users need your permission to follow your updates.'), + false, + (empty($user->subscribe_policy)) ? User::SUBSCRIBE_POLICY_OPEN : $user->subscribe_policy); + $this->elementEnd('li'); } + $this->elementStart('li'); + $this->checkbox('private_stream', + // TRANS: Checkbox label in profile settings. + _('Make updates visible only to my followers'), + ($this->arg('private_stream')) ? + $this->boolean('private_stream') : $user->private_stream); + $this->elementEnd('li'); $this->elementEnd('ul'); // TRANS: Button to save input in profile settings. $this->submit('save', _m('BUTTON','Save')); @@ -221,29 +241,37 @@ class ProfilesettingsAction extends AccountSettingsAction if (Event::handle('StartProfileSaveForm', array($this))) { - try { - $nickname = Nickname::normalize($this->trimmed('nickname')); - } catch (NicknameException $e) { - $this->showForm($e->getMessage()); - return; + // $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; + } } $fullname = $this->trimmed('fullname'); $homepage = $this->trimmed('homepage'); $bio = $this->trimmed('bio'); $location = $this->trimmed('location'); - $autosubscribe = $this->boolean('autosubscribe'); + $autosubscribe = $this->booleanintstring('autosubscribe'); + $subscribe_policy = $this->trimmed('subscribe_policy'); + $private_stream = $this->booleanintstring('private_stream'); $language = $this->trimmed('language'); $timezone = $this->trimmed('timezone'); $tagstring = $this->trimmed('tags'); // Some validation - if (!User::allowed_nickname($nickname)) { - // TRANS: Validation error in form for profile settings. - $this->showForm(_('Not a valid nickname.')); - return; - } else if (!is_null($homepage) && (strlen($homepage) > 0) && - !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) { + if (!is_null($homepage) && (strlen($homepage) > 0) && + !common_valid_http_url($homepage)) { // TRANS: Validation error in form for profile settings. $this->showForm(_('Homepage is not a valid URL.')); return; @@ -268,92 +296,75 @@ class ProfilesettingsAction extends AccountSettingsAction // TRANS: Validation error in form for profile settings. $this->showForm(_('Timezone not selected.')); return; - } else if ($this->nicknameExists($nickname)) { - // TRANS: Validation error in form for profile settings. - $this->showForm(_('Nickname already in use. Try another one.')); - return; } else if (!is_null($language) && strlen($language) > 50) { // TRANS: Validation error in form for profile settings. $this->showForm(_('Language is too long (maximum 50 characters).')); return; } - if ($tagstring) { - $tags = array_map('common_canonical_tag', preg_split('/[\s,]+/', $tagstring)); - } else { - $tags = array(); - } + $tags = array(); + $tag_priv = array(); + if (is_string($tagstring) && strlen($tagstring) > 0) { - foreach ($tags as $tag) { - if (!common_valid_profile_tag($tag)) { - // TRANS: Validation error in form for profile settings. - // TRANS: %s is an invalid tag. - $this->showForm(sprintf(_('Invalid tag: "%s".'), $tag)); - return; + $tags = preg_split('/[\s,]+/', $tagstring); + + foreach ($tags as &$tag) { + $private = @$tag[0] === '.'; + + $tag = common_canonical_tag($tag); + if (!common_valid_profile_tag($tag)) { + // TRANS: Validation error in form for profile settings. + // TRANS: %s is an invalid tag. + $this->showForm(sprintf(_('Invalid tag: "%s".'), $tag)); + return; + } + + $tag_priv[$tag] = $private; } } $user = common_current_user(); - $user->query('BEGIN'); - if ($user->nickname != $nickname || - $user->language != $language || - $user->timezone != $timezone) { - - common_debug('Updating user nickname from ' . $user->nickname . ' to ' . $nickname, - __FILE__); - common_debug('Updating user language from ' . $user->language . ' to ' . $language, - __FILE__); - common_debug('Updating user timezone from ' . $user->timezone . ' to ' . $timezone, - __FILE__); - - $original = clone($user); - - $user->nickname = $nickname; - $user->language = $language; - $user->timezone = $timezone; - - $result = $user->updateKeys($original); - - if ($result === false) { - common_log_db_error($user, 'UPDATE', __FILE__); - // TRANS: Server error thrown when user profile settings could not be updated. - $this->serverError(_('Could not update user.')); - return; - } else { - // Re-initialize language environment if it changed - common_init_language(); - // Clear the site owner, in case nickname changed - if ($user->hasRole(Profile_role::OWNER)) { - User::blow('user:site_owner'); - } - } - } + // $user->nickname is updated through Profile->update(); // XXX: XOR - if ($user->autosubscribe ^ $autosubscribe) { + if (($user->autosubscribe ^ $autosubscribe) + || ($user->private_stream ^ $private_stream) + || $user->timezone != $timezone + || $user->language != $language + || $user->subscribe_policy != $subscribe_policy) { $original = clone($user); - $user->autosubscribe = $autosubscribe; + $user->autosubscribe = $autosubscribe; + $user->language = $language; + $user->private_stream = $private_stream; + $user->subscribe_policy = $subscribe_policy; + $user->timezone = $timezone; $result = $user->update($original); - if ($result === false) { common_log_db_error($user, 'UPDATE', __FILE__); // TRANS: Server error thrown when user profile settings could not be updated to // TRANS: automatically subscribe to any subscriber. - $this->serverError(_('Could not update user for autosubscribe.')); - return; + $this->serverError(_('Could not update user for autosubscribe or subscribe_policy.')); } + + // Re-initialize language environment if it changed + common_init_language(); } $profile = $user->getProfile(); $orig_profile = clone($profile); - $profile->nickname = $user->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,13 +384,11 @@ class ProfilesettingsAction extends AccountSettingsAction $profile->location_ns = $loc->location_ns; } - $profile->profileurl = common_profile_url($nickname); - if (common_config('location', 'share') == 'user') { $exists = false; - $prefs = User_location_prefs::staticGet('user_id', $user->id); + $prefs = User_location_prefs::getKV('user_id', $user->id); if (empty($prefs)) { $prefs = new User_location_prefs(); @@ -391,7 +400,7 @@ class ProfilesettingsAction extends AccountSettingsAction $orig = clone($prefs); } - $prefs->share_location = $this->boolean('sharelocation'); + $prefs->share_location = $this->booleanintstring('sharelocation'); if ($exists) { $result = $prefs->update($orig); @@ -403,7 +412,6 @@ class ProfilesettingsAction extends AccountSettingsAction common_log_db_error($prefs, ($exists) ? 'UPDATE' : 'INSERT', __FILE__); // TRANS: Server error thrown when user profile location preference settings could not be updated. $this->serverError(_('Could not save location prefs.')); - return; } } @@ -416,21 +424,18 @@ class ProfilesettingsAction extends AccountSettingsAction common_log_db_error($profile, 'UPDATE', __FILE__); // TRANS: Server error thrown when user profile settings could not be saved. $this->serverError(_('Could not save profile.')); - return; } // Set the user tags - $result = $user->setSelfTags($tags); + $result = $user->setSelfTags($tags, $tag_priv); if (!$result) { // TRANS: Server error thrown when user profile settings tags could not be saved. $this->serverError(_('Could not save tags.')); - return; } $user->query('COMMIT'); Event::handle('EndProfileSaveForm', array($this)); - common_broadcast_profile($profile); // TRANS: Confirmation shown when user profile settings are saved. $this->showForm(_('Settings saved.'), true); @@ -438,17 +443,6 @@ class ProfilesettingsAction extends AccountSettingsAction } } - function nicknameExists($nickname) - { - $user = common_current_user(); - $other = User::staticGet('nickname', $nickname); - if (!$other) { - return false; - } else { - return $other->id != $user->id; - } - } - function showAside() { $user = common_current_user();