From 10cffa8afa0c60e92d011b2641775582eee4aecc Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 21 Apr 2011 10:15:51 -0400 Subject: [PATCH] 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. --- .../EmailRegistrationPlugin.php | 86 +++++++++++++++++++ plugins/EmailRegistration/emailregister.php | 68 ++------------- .../scripts/registeremailuser.php | 11 ++- 3 files changed, 105 insertions(+), 60 deletions(-) diff --git a/plugins/EmailRegistration/EmailRegistrationPlugin.php b/plugins/EmailRegistration/EmailRegistrationPlugin.php index 7cbb8a85f3..548702514a 100644 --- a/plugins/EmailRegistration/EmailRegistrationPlugin.php +++ b/plugins/EmailRegistration/EmailRegistrationPlugin.php @@ -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 '. + 'password recovery 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', diff --git a/plugins/EmailRegistration/emailregister.php b/plugins/EmailRegistration/emailregister.php index 4bda1d9ced..3afac7d1f5 100644 --- a/plugins/EmailRegistration/emailregister.php +++ b/plugins/EmailRegistration/emailregister.php @@ -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 '. - 'password recovery 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); + // 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); $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); } /** diff --git a/plugins/EmailRegistration/scripts/registeremailuser.php b/plugins/EmailRegistration/scripts/registeremailuser.php index 1807fd7f9a..a8c942d3dd 100644 --- a/plugins/EmailRegistration/scripts/registeremailuser.php +++ b/plugins/EmailRegistration/scripts/registeremailuser.php @@ -21,7 +21,11 @@ define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..')); $helptext = << +registeremailuser.php [options] + +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";