Move business logic of email registration to plugin

Moved the main business logic of email registration to the
EmailRegistrationPlugin. That lets us register from a script, from the
emailregister account, or (hopefully) from the signup page.
This commit is contained in:
Evan Prodromou 2011-04-21 10:15:51 -04:00
parent 2e93d5e551
commit 10cffa8afa
3 changed files with 105 additions and 60 deletions

View File

@ -47,6 +47,8 @@ if (!defined('STATUSNET')) {
*/
class EmailRegistrationPlugin extends Plugin
{
const CONFIRMTYPE = 'register';
function onAutoload($cls)
{
$dir = dirname(__FILE__);
@ -98,6 +100,90 @@ class EmailRegistrationPlugin extends Plugin
return true;
}
static function registerEmail($email)
{
$old = User::staticGet('email', $email);
if (!empty($old)) {
// TRANS: Error text when trying to register with an already registered e-mail address.
// TRANS: %s is the URL to recover password at.
throw new ClientException(sprintf(_m('A user with that email address already exists. You can use the '.
'<a href="%s">password recovery</a> tool to recover a missing password.'),
common_local_url('recoverpassword')));
}
$valid = false;
if (Event::handle('StartValidateUserEmail', array(null, $email, &$valid))) {
$valid = Validate::email($email, common_config('email', 'check_domain'));
Event::handle('EndValidateUserEmail', array(null, $email, &$valid));
}
if (!$valid) {
// TRANS: Error text when trying to register with an invalid e-mail address.
throw new ClientException(_m('Not a valid email address.'));
}
$confirm = Confirm_address::getAddress($email, self::CONFIRMTYPE);
if (empty($confirm)) {
$confirm = Confirm_address::saveNew(null, $email, 'register');
}
return $confirm;
}
static function nicknameFromEmail($email)
{
$parts = explode('@', $email);
$nickname = $parts[0];
$nickname = preg_replace('/[^A-Za-z0-9]/', '', $nickname);
$nickname = Nickname::normalize($nickname);
$original = $nickname;
$n = 0;
while (User::staticGet('nickname', $nickname)) {
$n++;
$nickname = $original . $n;
}
return $nickname;
}
static function sendConfirmEmail($confirm)
{
$sitename = common_config('site', 'name');
$recipients = array($confirm->address);
$headers['From'] = mail_notify_from();
$headers['To'] = trim($confirm->address);
// TRANS: Subject for confirmation e-mail.
// TRANS: %s is the StatusNet sitename.
$headers['Subject'] = sprintf(_m('Confirm your registration on %s'), $sitename);
$confirmUrl = common_local_url('register', array('code' => $confirm->code));
// TRANS: Body for confirmation e-mail.
// TRANS: %1$s is the StatusNet sitename, %2$s is the confirmation URL.
$body = sprintf(_m('Someone (probably you) has requested an account on %1$s using this email address.'.
"\n".
'To confirm the address, click the following URL or copy it into the address bar of your browser.'.
"\n".
'%2$s'.
"\n".
'If it was not you, you can safely ignore this message.'),
$sitename,
$confirmUrl);
mail_send($recipients, $headers, $body);
}
function onPluginVersion(&$versions)
{
$versions[] = array('name' => 'EmailRegistration',

View File

@ -201,53 +201,20 @@ class EmailregisterAction extends Action
function registerUser()
{
$old = User::staticGet('email', $this->email);
if (!empty($old)) {
// TRANS: Error text when trying to register with an already registered e-mail address.
// TRANS: %s is the URL to recover password at.
$this->error = sprintf(_m('A user with that email address already exists. You can use the '.
'<a href="%s">password recovery</a> tool to recover a missing password.'),
common_local_url('recoverpassword'));
$this->showRegistrationForm();
return;
}
$valid = false;
try {
if (Event::handle('StartValidateUserEmail', array(null, $this->email, &$valid))) {
$valid = Validate::email($this->email, common_config('email', 'check_domain'));
Event::handle('EndValidateUserEmail', array(null, $this->email, &$valid));
}
if (!$valid) {
// TRANS: Error text when trying to register with an invalid e-mail address.
$this->error = _m('Not a valid email address.');
$this->showRegistrationForm();
return;
}
} catch (ClientException $e) {
$this->error = $e->getMessage();
$confirm = EmailRegistrationPlugin::registerEmail($this->email);
} catch (ClientException $ce) {
$this->error = $ce->getMessage();
$this->showRegistrationForm();
return;
}
$confirm = Confirm_address::getAddress($this->email, self::CONFIRMTYPE);
EmailRegistrationPlugin::sendConfirmEmail($confirm);
if (empty($confirm)) {
$confirm = Confirm_address::saveNew(null, $this->email, 'register');
// TRANS: Confirmation text after initial registration.
// TRANS: %s an e-mail address.
$prompt = sprintf(_m('An email was sent to %s to confirm that address. Check your email inbox for instructions.'),
$this->email);
} else {
// TRANS: Confirmation text after re-requesting an e-mail confirmation code.
// TRANS: %s is an e-mail address.
$prompt = sprintf(_m('The address %s was already registered but not confirmed. The confirmation code was resent.'),
$this->email);
}
$this->sendConfirmEmail($confirm);
$this->complete = $prompt;
@ -411,24 +378,7 @@ class EmailregisterAction extends Action
function nicknameFromEmail($email)
{
$parts = explode('@', $email);
$nickname = $parts[0];
$nickname = preg_replace('/[^A-Za-z0-9]/', '', $nickname);
$nickname = Nickname::normalize($nickname);
$original = $nickname;
$n = 0;
while (User::staticGet('nickname', $nickname)) {
$n++;
$nickname = $original . $n;
}
return $nickname;
return EmailRegistrationPlugin::nicknameFromEmail($email);
}
/**

View File

@ -21,7 +21,11 @@
define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..'));
$helptext = <<<END_OF_REGISTEREMAILUSER_HELP
registeremailuser.php [options] <email>
registeremailuser.php [options] <email address>
Options:
-e --email Send a confirmation message to the email address
register a new user by email address.
END_OF_REGISTEREMAILUSER_HELP;
@ -35,6 +39,11 @@ if (count($args) == 0) {
$email = $args[0];
$confirm = EmailRegistrationPlugin::registerEmail($email);
if (have_option('e', 'email')) {
EmailRegistrationPlugin::sendConfirmEmail($confirm);
}
$confirmUrl = common_local_url('register', array('code' => $confirm->code));
print $confirmUrl."\n";