EmailSettingsAction adapted to FormAction

TODO: EmailSettingsForm as a separate class would be good!
This commit is contained in:
Mikael Nordfeldth 2015-07-16 19:42:37 +02:00
parent fd2efbc6f8
commit 647171e089
1 changed files with 63 additions and 110 deletions

View File

@ -28,11 +28,7 @@
* @link http://status.net/ * @link http://status.net/
*/ */
if (!defined('STATUSNET') && !defined('LACONICA')) { if (!defined('GNUSOCIAL')) { exit(1); }
exit(1);
}
/** /**
* Settings for email * Settings for email
@ -112,8 +108,8 @@ class EmailsettingsAction extends SettingsAction
// TRANS: Button label to remove a confirmed e-mail address. // TRANS: Button label to remove a confirmed e-mail address.
$this->submit('remove', _m('BUTTON','Remove')); $this->submit('remove', _m('BUTTON','Remove'));
} else { } else {
$confirm = $this->getConfirmation(); try {
if ($confirm) { $confirm = $this->getConfirmation();
$this->element('p', array('id' => 'form_unconfirmed'), $confirm->address); $this->element('p', array('id' => 'form_unconfirmed'), $confirm->address);
$this->element('p', array('class' => 'form_note'), $this->element('p', array('class' => 'form_note'),
// TRANS: Form note in e-mail settings form. // TRANS: Form note in e-mail settings form.
@ -123,12 +119,12 @@ class EmailsettingsAction extends SettingsAction
$this->hidden('email', $confirm->address); $this->hidden('email', $confirm->address);
// TRANS: Button label to cancel an e-mail address confirmation procedure. // TRANS: Button label to cancel an e-mail address confirmation procedure.
$this->submit('cancel', _m('BUTTON','Cancel')); $this->submit('cancel', _m('BUTTON','Cancel'));
} else { } catch (NoResultException $e) {
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
$this->elementStart('li'); $this->elementStart('li');
// TRANS: Field label for e-mail address input in e-mail settings form. // TRANS: Field label for e-mail address input in e-mail settings form.
$this->input('email', _('Email address'), $this->input('email', _('Email address'),
($this->arg('email')) ? $this->arg('email') : null, $this->trimmed('email') ?: null,
// TRANS: Instructions for e-mail address input form. Do not translate // TRANS: Instructions for e-mail address input form. Do not translate
// TRANS: "example.org". It is one of the domain names reserved for // TRANS: "example.org". It is one of the domain names reserved for
// TRANS: use in examples by http://www.rfc-editor.org/rfc/rfc2606.txt. // TRANS: use in examples by http://www.rfc-editor.org/rfc/rfc2606.txt.
@ -248,56 +244,36 @@ class EmailsettingsAction extends SettingsAction
*/ */
function getConfirmation() function getConfirmation()
{ {
$user = common_current_user();
$confirm = new Confirm_address(); $confirm = new Confirm_address();
$confirm->user_id = $user->id; $confirm->user_id = $this->scoped->getID();
$confirm->address_type = 'email'; $confirm->address_type = 'email';
if ($confirm->find(true)) { if ($confirm->find(true)) {
return $confirm; return $confirm;
} else {
return null;
} }
throw new NoResultException($confirm);
} }
/** protected function doPost()
* Handle posts
*
* Since there are a lot of different options on the page, we
* figure out what we're supposed to do based on which button was
* pushed
*
* @return void
*/
function handlePost()
{ {
// CSRF protection if ($this->arg('save')) {
$token = $this->trimmed('token'); return $this->savePreferences();
if (!$token || $token != common_session_token()) { } else if ($this->arg('add')) {
// TRANS: Client error displayed when the session token does not match or is not given. return $this->addAddress();
$this->show_form(_('There was a problem with your session token. '. } else if ($this->arg('cancel')) {
'Try again, please.')); return $this->cancelConfirmation();
return; } else if ($this->arg('remove')) {
return $this->removeAddress();
} else if ($this->arg('removeincoming')) {
return $this->removeIncoming();
} else if ($this->arg('newincoming')) {
return $this->newIncoming();
} }
if ($this->arg('save')) { // TRANS: Message given submitting a form with an unknown action in e-mail settings.
$this->savePreferences(); throw new ClientException(_('Unexpected form submission.'));
} else if ($this->arg('add')) {
$this->addAddress();
} else if ($this->arg('cancel')) {
$this->cancelConfirmation();
} else if ($this->arg('remove')) {
$this->removeAddress();
} else if ($this->arg('removeincoming')) {
$this->removeIncoming();
} else if ($this->arg('newincoming')) {
$this->newIncoming();
} else {
// TRANS: Message given submitting a form with an unknown action in e-mail settings.
$this->showForm(_('Unexpected form submission.'));
}
} }
/** /**
@ -307,8 +283,6 @@ class EmailsettingsAction extends SettingsAction
*/ */
function savePreferences() function savePreferences()
{ {
$user = $this->scoped->getUser();
if (Event::handle('StartEmailSaveForm', array($this, $this->scoped))) { if (Event::handle('StartEmailSaveForm', array($this, $this->scoped))) {
$emailnotifysub = $this->booleanintstring('emailnotifysub'); $emailnotifysub = $this->booleanintstring('emailnotifysub');
$emailnotifymsg = $this->booleanintstring('emailnotifymsg'); $emailnotifymsg = $this->booleanintstring('emailnotifymsg');
@ -316,8 +290,8 @@ class EmailsettingsAction extends SettingsAction
$emailnotifyattn = $this->booleanintstring('emailnotifyattn'); $emailnotifyattn = $this->booleanintstring('emailnotifyattn');
$emailpost = $this->booleanintstring('emailpost'); $emailpost = $this->booleanintstring('emailpost');
$user = $this->scoped->getUser();
$user->query('BEGIN'); $user->query('BEGIN');
$original = clone($user); $original = clone($user);
$user->emailnotifysub = $emailnotifysub; $user->emailnotifysub = $emailnotifysub;
@ -332,16 +306,15 @@ class EmailsettingsAction extends SettingsAction
common_log_db_error($user, 'UPDATE', __FILE__); common_log_db_error($user, 'UPDATE', __FILE__);
$user->query('ROLLBACK'); $user->query('ROLLBACK');
// TRANS: Server error thrown on database error updating e-mail preferences. // TRANS: Server error thrown on database error updating e-mail preferences.
$this->serverError(_('Could not update user.')); throw new ServerException(_('Could not update user.'));
} }
$user->query('COMMIT'); $user->query('COMMIT');
Event::handle('EndEmailSaveForm', array($this, $this->scoped)); Event::handle('EndEmailSaveForm', array($this, $this->scoped));
// TRANS: Confirmation message for successful e-mail preferences save.
$this->showForm(_('Email preferences saved.'), true);
} }
// TRANS: Confirmation message for successful e-mail preferences save.
return _('Email preferences saved.');
} }
/** /**
@ -351,38 +324,32 @@ class EmailsettingsAction extends SettingsAction
*/ */
function addAddress() function addAddress()
{ {
$user = common_current_user(); $user = $this->scoped->getUser();
$email = $this->trimmed('email'); $email = $this->trimmed('email');
// Some validation // Some validation
if (!$email) { if (empty($email)) {
// TRANS: Message given saving e-mail address without having provided one. // TRANS: Message given saving e-mail address without having provided one.
$this->showForm(_('No email address.')); throw new ClientException(_('No email address.'));
return;
} }
$email = common_canonical_email($email); $email = common_canonical_email($email);
if (!$email) { if (empty($email)) {
// TRANS: Message given saving e-mail address that cannot be normalised. // TRANS: Message given saving e-mail address that cannot be normalised.
$this->showForm(_('Cannot normalize that email address.')); throw new ClientException(_('Cannot normalize that email address.'));
return;
} }
if (!Validate::email($email, common_config('email', 'check_domain'))) { if (!Validate::email($email, common_config('email', 'check_domain'))) {
// TRANS: Message given saving e-mail address that not valid. // TRANS: Message given saving e-mail address that not valid.
$this->showForm(_('Not a valid email address.')); throw new ClientException(_('Not a valid email address.'));
return;
} else if ($user->email == $email) { } else if ($user->email == $email) {
// TRANS: Message given saving e-mail address that is already set. // TRANS: Message given saving e-mail address that is already set.
$this->showForm(_('That is already your email address.')); throw new ClientException(_('That is already your email address.'));
return;
} else if ($this->emailExists($email)) { } else if ($this->emailExists($email)) {
// TRANS: Message given saving e-mail address that is already set for another user. // TRANS: Message given saving e-mail address that is already set for another user.
$this->showForm(_('That email address already belongs '. throw new ClientException(_('That email address already belongs to another user.'));
'to another user.'));
return;
} }
if (Event::handle('StartAddEmailAddress', array($user, $email))) { if (Event::handle('StartAddEmailAddress', array($user, $email))) {
@ -391,7 +358,7 @@ class EmailsettingsAction extends SettingsAction
$confirm->address = $email; $confirm->address = $email;
$confirm->address_type = 'email'; $confirm->address_type = 'email';
$confirm->user_id = $user->id; $confirm->user_id = $user->getID();
$confirm->code = common_confirmation_code(64); $confirm->code = common_confirmation_code(64);
$result = $confirm->insert(); $result = $confirm->insert();
@ -399,21 +366,19 @@ class EmailsettingsAction extends SettingsAction
if ($result === false) { if ($result === false) {
common_log_db_error($confirm, 'INSERT', __FILE__); common_log_db_error($confirm, 'INSERT', __FILE__);
// TRANS: Server error thrown on database error adding e-mail confirmation code. // TRANS: Server error thrown on database error adding e-mail confirmation code.
$this->serverError(_('Could not insert confirmation code.')); throw new ServerException(_('Could not insert confirmation code.'));
} }
common_debug('Sending confirmation address for user '.$user->id.' to email '.$email); common_debug('Sending confirmation address for user '.$user->getID().' to email '.$email);
mail_confirm_address($user, $confirm->code, $user->nickname, $email); mail_confirm_address($user, $confirm->code, $user->getNickname(), $email);
Event::handle('EndAddEmailAddress', array($user, $email)); Event::handle('EndAddEmailAddress', array($user, $email));
} }
// TRANS: Message given saving valid e-mail address that is to be confirmed. // TRANS: Message given saving valid e-mail address that is to be confirmed.
$msg = _('A confirmation code was sent to the email address you added. '. return _('A confirmation code was sent to the email address you added. '.
'Check your inbox (and spam box!) for the code and instructions '. 'Check your inbox (and spam box!) for the code and instructions '.
'on how to use it.'); 'on how to use it.');
$this->showForm($msg, true);
} }
/** /**
@ -423,31 +388,29 @@ class EmailsettingsAction extends SettingsAction
*/ */
function cancelConfirmation() function cancelConfirmation()
{ {
$email = $this->arg('email'); $email = $this->trimmed('email');
$confirm = $this->getConfirmation(); try {
$confirm = $this->getConfirmation();
if (!$confirm) { if ($confirm->address !== $email) {
// TRANS: Message given canceling e-mail address confirmation for the wrong e-mail address.
throw new ClientException(_('That is the wrong email address.'));
}
} catch (NoResultException $e) {
// TRANS: Message given canceling e-mail address confirmation that is not pending. // TRANS: Message given canceling e-mail address confirmation that is not pending.
$this->showForm(_('No pending confirmation to cancel.')); throw new AlreadyFulfilledException(_('No pending confirmation to cancel.'));
return;
}
if ($confirm->address != $email) {
// TRANS: Message given canceling e-mail address confirmation for the wrong e-mail address.
$this->showForm(_('That is the wrong email address.'));
return;
} }
$result = $confirm->delete(); $result = $confirm->delete();
if (!$result) { if ($result === false) {
common_log_db_error($confirm, 'DELETE', __FILE__); common_log_db_error($confirm, 'DELETE', __FILE__);
// TRANS: Server error thrown on database error canceling e-mail address confirmation. // TRANS: Server error thrown on database error canceling e-mail address confirmation.
$this->serverError(_('Could not delete email confirmation.')); throw new ServerException(_('Could not delete email confirmation.'));
} }
// TRANS: Message given after successfully canceling e-mail address confirmation. // TRANS: Message given after successfully canceling e-mail address confirmation.
$this->showForm(_('Email confirmation cancelled.'), true); return _('Email confirmation cancelled.');
} }
/** /**
@ -459,26 +422,22 @@ class EmailsettingsAction extends SettingsAction
{ {
$user = common_current_user(); $user = common_current_user();
$email = $this->arg('email'); $email = $this->trimmed('email');
// Maybe an old tab open...? // Maybe an old tab open...?
if ($user->email !== $email) {
if ($user->email != $email) {
// TRANS: Message given trying to remove an e-mail address that is not // TRANS: Message given trying to remove an e-mail address that is not
// TRANS: registered for the active user. // TRANS: registered for the active user.
$this->showForm(_('That is not your email address.')); throw new ClientException(_('That is not your email address.'));
return;
} }
$original = clone($user); $original = clone($user);
$user->email = null; $user->email = null;
// Throws exception on failure. Also performs it within a transaction. // Throws exception on failure. Also performs it within a transaction.
$user->updateWithKeys($original); $user->updateWithKeys($original);
// TRANS: Message given after successfully removing a registered e-mail address. // TRANS: Message given after successfully removing a registered e-mail address.
$this->showForm(_('The email address was removed.'), true); return _('The email address was removed.');
} }
/** /**
@ -490,22 +449,19 @@ class EmailsettingsAction extends SettingsAction
{ {
$user = common_current_user(); $user = common_current_user();
if (!$user->incomingemail) { if (empty($user->incomingemail)) {
// TRANS: Form validation error displayed when trying to remove an incoming e-mail address while no address has been set. // TRANS: Form validation error displayed when trying to remove an incoming e-mail address while no address has been set.
$this->showForm(_('No incoming email address.')); throw new AlreadyFulfilledException(_('No incoming email address.'));
return;
} }
$orig = clone($user); $orig = clone($user);
$user->incomingemail = null; $user->incomingemail = null;
$user->emailpost = 0; $user->emailpost = 0;
// Throws exception on failure. Also performs it within a transaction. // Throws exception on failure. Also performs it within a transaction.
$user->updateWithKeys($orig); $user->updateWithKeys($orig);
// TRANS: Message given after successfully removing an incoming e-mail address. // TRANS: Message given after successfully removing an incoming e-mail address.
$this->showForm(_('Incoming email address removed.'), true); return _('Incoming email address removed.');
} }
/** /**
@ -516,17 +472,14 @@ class EmailsettingsAction extends SettingsAction
function newIncoming() function newIncoming()
{ {
$user = common_current_user(); $user = common_current_user();
$orig = clone($user); $orig = clone($user);
$user->incomingemail = mail_new_incoming_address(); $user->incomingemail = mail_new_incoming_address();
$user->emailpost = 1; $user->emailpost = 1;
// Throws exception on failure. Also performs it within a transaction. // Throws exception on failure. Also performs it within a transaction.
$user->updateWithKeys($orig); $user->updateWithKeys($orig);
// TRANS: Message given after successfully adding an incoming e-mail address. // TRANS: Message given after successfully adding an incoming e-mail address.
$this->showForm(_('New incoming email address added.'), true); return _('New incoming email address added.');
} }
/** /**
@ -545,10 +498,10 @@ class EmailsettingsAction extends SettingsAction
$other = User::getKV('email', $email); $other = User::getKV('email', $email);
if (!$other) { if (!$other instanceof User) {
return false; return false;
} else {
return $other->id != $user->id;
} }
return $other->id != $user->id;
} }
} }