diff options
Diffstat (limited to 'actions/register.php')
-rw-r--r-- | actions/register.php | 456 |
1 files changed, 342 insertions, 114 deletions
diff --git a/actions/register.php b/actions/register.php index c479816ef..159daaa73 100644 --- a/actions/register.php +++ b/actions/register.php @@ -1,9 +1,12 @@ <?php -/* - * Laconica - a distributed open-source microblogging tool - * Copyright (C) 2008, Controlez-Vous, Inc. +/** + * Laconica, the distributed open-source microblogging tool * - * This program is free software: you can redistribute it and/or modify + * Register a new user account + * + * PHP version 5 + * + * LICENCE: This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. @@ -15,48 +18,116 @@ * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @category Login + * @package Laconica + * @author Evan Prodromou <evan@controlyourself.ca> + * @copyright 2008-2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ */ -if (!defined('LACONICA')) { exit(1); } +if (!defined('LACONICA')) { + exit(1); +} + +/** + * An action for registering a new user account + * + * @category Login + * @package Laconica + * @author Evan Prodromou <evan@controlyourself.ca> + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ class RegisterAction extends Action { + /** + * Has there been an error? + */ + + var $error = null; + + /** + * Have we registered? + */ + + var $registered = false; + + /** + * Title of the page + * + * @return string title + */ + + function title() + { + if ($this->registered) { + return _('Registration successful'); + } else { + return _('Register'); + } + } + + /** + * Handle input, produce output + * + * Switches on request method; either shows the form or handles its input. + * + * Checks if registration is closed and shows an error if so. + * + * @param array $args $_REQUEST data + * + * @return void + */ + function handle($args) { parent::handle($args); if (common_config('site', 'closed')) { - common_user_error(_('Registration not allowed.')); + $this->clientError(_('Registration not allowed.')); } else if (common_logged_in()) { - common_user_error(_('Already logged in.')); + $this->clientError(_('Already logged in.')); } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { - $this->try_register(); + $this->tryRegister(); } else { - $this->show_form(); + $this->showForm(); } } - function try_register() + /** + * Try to register a user + * + * Validates the input and tries to save a new user and profile + * record. On success, shows an instructions page. + * + * @return void + */ + + function tryRegister() { $token = $this->trimmed('token'); if (!$token || $token != common_session_token()) { - $this->show_form(_('There was a problem with your session token. Try again, please.')); + $this->showForm(_('There was a problem with your session token. '. + 'Try again, please.')); return; } $nickname = $this->trimmed('nickname'); - $email = $this->trimmed('email'); + $email = $this->trimmed('email'); $fullname = $this->trimmed('fullname'); $homepage = $this->trimmed('homepage'); - $bio = $this->trimmed('bio'); + $bio = $this->trimmed('bio'); $location = $this->trimmed('location'); - # We don't trim these... whitespace is OK in a password! + // We don't trim these... whitespace is OK in a password! $password = $this->arg('password'); - $confirm = $this->arg('confirm'); + $confirm = $this->arg('confirm'); - # invitation code, if any + // invitation code, if any $code = $this->trimmed('code'); @@ -65,84 +136,109 @@ class RegisterAction extends Action } if (common_config('site', 'inviteonly') && !($code && $invite)) { - $this->client_error(_('Sorry, only invited people can register.')); + $this->clientError(_('Sorry, only invited people can register.')); return; } - # Input scrubbing + // Input scrubbing $nickname = common_canonical_nickname($nickname); - $email = common_canonical_email($email); + $email = common_canonical_email($email); if (!$this->boolean('license')) { - $this->show_form(_('You can\'t register if you don\'t agree to the license.')); + $this->showForm(_('You can\'t register if you don\'t '. + 'agree to the license.')); } else if ($email && !Validate::email($email, true)) { - $this->show_form(_('Not a valid email address.')); + $this->showForm(_('Not a valid email address.')); } else if (!Validate::string($nickname, array('min_length' => 1, 'max_length' => 64, - 'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) { - $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.')); - } else if ($this->nickname_exists($nickname)) { - $this->show_form(_('Nickname already in use. Try another one.')); + 'format' => NICKNAME_FMT))) { + $this->showForm(_('Nickname must have only lowercase letters '. + 'and numbers and no spaces.')); + } else if ($this->nicknameExists($nickname)) { + $this->showForm(_('Nickname already in use. Try another one.')); } else if (!User::allowed_nickname($nickname)) { - $this->show_form(_('Not a valid nickname.')); - } else if ($this->email_exists($email)) { - $this->show_form(_('Email address already exists.')); + $this->showForm(_('Not a valid nickname.')); + } else if ($this->emailExists($email)) { + $this->showForm(_('Email address already exists.')); } else if (!is_null($homepage) && (strlen($homepage) > 0) && - !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) { - $this->show_form(_('Homepage is not a valid URL.')); + !Validate::uri($homepage, + array('allowed_schemes' => + array('http', 'https')))) { + $this->showForm(_('Homepage is not a valid URL.')); return; } else if (!is_null($fullname) && strlen($fullname) > 255) { - $this->show_form(_('Full name is too long (max 255 chars).')); + $this->showForm(_('Full name is too long (max 255 chars).')); return; } else if (!is_null($bio) && strlen($bio) > 140) { - $this->show_form(_('Bio is too long (max 140 chars).')); + $this->showForm(_('Bio is too long (max 140 chars).')); return; } else if (!is_null($location) && strlen($location) > 255) { - $this->show_form(_('Location is too long (max 255 chars).')); + $this->showForm(_('Location is too long (max 255 chars).')); return; } else if (strlen($password) < 6) { - $this->show_form(_('Password must be 6 or more characters.')); + $this->showForm(_('Password must be 6 or more characters.')); return; } else if ($password != $confirm) { - $this->show_form(_('Passwords don\'t match.')); - } else if ($user = User::register(array('nickname' => $nickname, 'password' => $password, 'email' => $email, - 'fullname' => $fullname, 'homepage' => $homepage, 'bio' => $bio, - 'location' => $location, 'code' => $code))) { + $this->showForm(_('Passwords don\'t match.')); + } else if ($user = User::register(array('nickname' => $nickname, + 'password' => $password, + 'email' => $email, + 'fullname' => $fullname, + 'homepage' => $homepage, + 'bio' => $bio, + 'location' => $location, + 'code' => $code))) { if (!$user) { - $this->show_form(_('Invalid username or password.')); + $this->showForm(_('Invalid username or password.')); return; } - # success! + // success! if (!common_set_user($user)) { - common_server_error(_('Error setting user.')); + $this->serverError(_('Error setting user.')); return; } - # this is a real login + // this is a real login common_real_login(true); if ($this->boolean('rememberme')) { common_debug('Adding rememberme cookie for ' . $nickname); common_rememberme($user); } - # Re-init language env in case it changed (not yet, but soon) + // Re-init language env in case it changed (not yet, but soon) common_init_language(); - $this->show_success(); + $this->showSuccess(); } else { - $this->show_form(_('Invalid username or password.')); + $this->showForm(_('Invalid username or password.')); } } - # checks if *CANONICAL* nickname exists + /** + * Does the given nickname already exist? + * + * Checks a canonical nickname against the database. + * + * @param string $nickname nickname to check + * + * @return boolean true if the nickname already exists + */ - function nickname_exists($nickname) + function nicknameExists($nickname) { $user = User::staticGet('nickname', $nickname); return ($user !== false); } - # checks if *CANONICAL* email exists + /** + * Does the given email address already exist? + * + * Checks a canonical email address against the database. + * + * @param string $email email address to check + * + * @return boolean true if the address already exists + */ - function email_exists($email) + function emailExists($email) { $email = common_canonical_email($email); if (!$email || strlen($email) == 0) { @@ -152,26 +248,78 @@ class RegisterAction extends Action return ($user !== false); } - function show_top($error=null) + /** + * Instructions or a notice for the page + * + * Shows the error, if any, or instructions for registration. + * + * @return void + */ + + function showPageNotice() { - if ($error) { - common_element('p', 'error', $error); + if ($this->registered) { + return; + } else if ($this->error) { + $this->element('p', 'error', $this->error); } else { - $instr = common_markup_to_html(_('With this form you can create a new account. ' . - 'You can then post notices and link up to friends and colleagues. '. - '(Have an [OpenID](http://openid.net/)? ' . - 'Try our [OpenID registration](%%action.openidlogin%%)!)')); - - common_element_start('div', 'instructions'); - common_raw($instr); - common_element_end('div'); + $instr = + common_markup_to_html(_('With this form you can create '. + ' a new account. ' . + 'You can then post notices and '. + 'link up to friends and colleagues. '. + '(Have an [OpenID](http://openid.net/)? ' . + 'Try our [OpenID registration]'. + '(%%action.openidlogin%%)!)')); + + $this->elementStart('div', 'instructions'); + $this->raw($instr); + $this->elementEnd('div'); } } - function show_form($error=null) + /** + * Wrapper for showing a page + * + * Stores an error and shows the page + * + * @param string $error Error, if any + * + * @return void + */ + + function showForm($error=null) + { + $this->error = $error; + $this->showPage(); + } + + /** + * Show the page content + * + * Either shows the registration form or, if registration was successful, + * instructions for using the site. + * + * @return void + */ + + function showContent() { - global $config; + if ($this->registered) { + $this->showSuccessContent(); + } else { + $this->showFormContent(); + } + } + + /** + * Show the registration form + * + * @return void + */ + function showFormContent() + { $code = $this->trimmed('code'); if ($code) { @@ -179,90 +327,170 @@ class RegisterAction extends Action } if (common_config('site', 'inviteonly') && !($code && $invite)) { - $this->client_error(_('Sorry, only invited people can register.')); + $this->clientError(_('Sorry, only invited people can register.')); return; } - common_show_header(_('Register'), null, $error, array($this, 'show_top')); - common_element_start('form', array('method' => 'post', - 'id' => 'login', - 'action' => common_local_url('register'))); - - common_hidden('token', common_session_token()); + $this->elementStart('form', array('method' => 'post', + 'id' => 'form_register', + 'class' => 'form_settings', + 'action' => common_local_url('register'))); + $this->elementStart('fieldset'); + $this->element('legend', null, 'Account settings'); + $this->hidden('token', common_session_token()); if ($code) { - common_hidden('code', $code); + $this->hidden('code', $code); } - common_input('nickname', _('Nickname'), $this->trimmed('nickname'), - _('1-64 lowercase letters or numbers, no punctuation or spaces. Required.')); - common_password('password', _('Password'), + $this->elementStart('ul', 'form_data'); + $this->elementStart('li'); + $this->input('nickname', _('Nickname'), $this->trimmed('nickname'), + _('1-64 lowercase letters or numbers, '. + 'no punctuation or spaces. Required.')); + $this->elementEnd('li'); + $this->elementStart('li'); + $this->password('password', _('Password'), _('6 or more characters. Required.')); - common_password('confirm', _('Confirm'), + $this->elementEnd('li'); + $this->elementStart('li'); + $this->password('confirm', _('Confirm'), _('Same as password above. Required.')); + $this->elementEnd('li'); + $this->elementStart('li'); if ($invite && $invite->address_type == 'email') { - common_input('email', _('Email'), $invite->address, - _('Used only for updates, announcements, and password recovery')); + $this->input('email', _('Email'), $invite->address, + _('Used only for updates, announcements, '. + 'and password recovery')); } else { - common_input('email', _('Email'), $this->trimmed('email'), - _('Used only for updates, announcements, and password recovery')); + $this->input('email', _('Email'), $this->trimmed('email'), + _('Used only for updates, announcements, '. + 'and password recovery')); } - common_input('fullname', _('Full name'), + $this->elementEnd('li'); + $this->elementStart('li'); + $this->input('fullname', _('Full name'), $this->trimmed('fullname'), - _('Longer name, preferably your "real" name')); - common_input('homepage', _('Homepage'), + _('Longer name, preferably your "real" name')); + $this->elementEnd('li'); + $this->elementStart('li'); + $this->input('homepage', _('Homepage'), $this->trimmed('homepage'), - _('URL of your homepage, blog, or profile on another site')); - common_textarea('bio', _('Bio'), + _('URL of your homepage, blog, '. + 'or profile on another site')); + $this->elementEnd('li'); + $this->elementStart('li'); + $this->textarea('bio', _('Bio'), $this->trimmed('bio'), - _('Describe yourself and your interests in 140 chars')); - common_input('location', _('Location'), + _('Describe yourself and your '. + 'interests in 140 chars')); + $this->elementEnd('li'); + $this->elementStart('li'); + $this->input('location', _('Location'), $this->trimmed('location'), - _('Where you are, like "City, State (or Region), Country"')); - common_checkbox('rememberme', _('Remember me'), + _('Where you are, like "City, '. + 'State (or Region), Country"')); + $this->elementEnd('li'); + $this->elementStart('li', array('id' => 'settings_rememberme')); + $this->checkbox('rememberme', _('Remember me'), $this->boolean('rememberme'), - _('Automatically login in the future; not for shared computers!')); - common_element_start('p'); + _('Automatically login in the future; '. + 'not for shared computers!')); + $this->elementEnd('li'); $attrs = array('type' => 'checkbox', 'id' => 'license', + 'class' => 'checkbox', 'name' => 'license', 'value' => 'true'); if ($this->boolean('license')) { $attrs['checked'] = 'checked'; } - common_element('input', $attrs); - common_text(_('My text and files are available under ')); - common_element('a', array('href' => $config['license']['url']), + $this->elementStart('li'); + $this->element('input', $attrs); + $this->text(_('My text and files are available under ')); + $this->element('a', array('href' => common_config('license', 'url')), $config['license']['title']); - common_text(_(' except this private data: password, email address, IM address, phone number.')); - common_element_end('p'); - common_submit('submit', _('Register')); - common_element_end('form'); - common_show_footer(); + $this->text(_(' except this private data: password, '. + 'email address, IM address, phone number.')); + $this->elementEnd('li'); + $this->elementEnd('ul'); + $this->submit('submit', _('Register')); + $this->elementEnd('fieldset'); + $this->elementEnd('form'); } - function show_success() + /** + * Show some information about registering for the site + * + * Save the registration flag, run showPage + * + * @return void + */ + + function showSuccess() + { + $this->registered = true; + $this->showPage(); + } + + /** + * Show some information about registering for the site + * + * Gives some information and options for new registrees. + * + * @return void + */ + + function showSuccessContent() { $nickname = $this->arg('nickname'); - common_show_header(_('Registration successful')); - common_element_start('div', 'success'); - $instr = sprintf(_('Congratulations, %s! And welcome to %%%%site.name%%%%. From here, you may want to...'. "\n\n" . - '* Go to [your profile](%s) and post your first message.' . "\n" . - '* Add a [Jabber/GTalk address](%%%%action.imsettings%%%%) so you can send notices through instant messages.' . "\n" . - '* [Search for people](%%%%action.peoplesearch%%%%) that you may know or that share your interests. ' . "\n" . - '* Update your [profile settings](%%%%action.profilesettings%%%%) to tell others more about you. ' . "\n" . - '* Read over the [online docs](%%%%doc.help%%%%) for features you may have missed. ' . "\n\n" . - 'Thanks for signing up and we hope you enjoy using this service.'), - $nickname, common_local_url('showstream', array('nickname' => $nickname))); - common_raw(common_markup_to_html($instr)); + + $profileurl = common_local_url('showstream', + array('nickname' => $nickname)); + + $this->elementStart('div', 'success'); + $instr = sprintf(_('Congratulations, %s! And welcome to %%%%site.name%%%%. '. + 'From here, you may want to...'. "\n\n" . + '* Go to [your profile](%s) '. + 'and post your first message.' . "\n" . + '* Add a [Jabber/GTalk address]'. + '(%%%%action.imsettings%%%%) '. + 'so you can send notices '. + 'through instant messages.' . "\n" . + '* [Search for people](%%%%action.peoplesearch%%%%) '. + 'that you may know or '. + 'that share your interests. ' . "\n" . + '* Update your [profile settings]'. + '(%%%%action.profilesettings%%%%)'. + ' to tell others more about you. ' . "\n" . + '* Read over the [online docs](%%%%doc.help%%%%)'. + ' for features you may have missed. ' . "\n\n" . + 'Thanks for signing up and we hope '. + 'you enjoy using this service.'), + $nickname, $profileurl); + + $this->raw(common_markup_to_html($instr)); + $have_email = $this->trimmed('email'); if ($have_email) { - $emailinstr = _('(You should receive a message by email momentarily, with ' . - 'instructions on how to confirm your email address.)'); - common_raw(common_markup_to_html($emailinstr)); + $emailinstr = _('(You should receive a message by email '. + 'momentarily, with ' . + 'instructions on how to confirm '. + 'your email address.)'); + $this->raw(common_markup_to_html($emailinstr)); } - common_element_end('div'); - common_show_footer(); + $this->elementEnd('div'); } + /** + * Show the login group nav menu + * + * @return void + */ + + function showLocalNav() + { + $nav = new LoginGroupNav($this); + $nav->show(); + } } |