3 * StatusNet, the distributed open-source microblogging tool
9 * LICENCE: This program is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU Affero General Public License as published by
11 * the Free Software Foundation, either version 3 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Affero General Public License for more details.
19 * You should have received a copy of the GNU Affero General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
24 * @author Evan Prodromou <evan@status.net>
25 * @author Zach Copley <zach@status.net>
26 * @copyright 2008-2009 StatusNet, Inc.
27 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
28 * @link http://status.net/
31 if (!defined('STATUSNET') && !defined('LACONICA')) {
35 require_once INSTALLDIR.'/lib/accountsettingsaction.php';
42 * @author Evan Prodromou <evan@status.net>
43 * @author Zach Copley <zach@status.net>
44 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
45 * @link http://status.net/
49 class EmailsettingsAction extends AccountSettingsAction
54 * @return string Title of the page
58 // TRANS: Title for e-mail settings.
59 return _('Email settings');
63 * Instructions for use
65 * @return instructions for use
67 function getInstructions()
69 // XXX: For consistency of parameters in messages, this should be a
70 // regular parameters, replaced with sprintf().
71 // TRANS: E-mail settings page instructions.
72 // TRANS: %%site.name%% is the name of the site.
73 return _('Manage how you get email from %%site.name%%.');
76 function showScripts()
78 parent::showScripts();
79 $this->script('emailsettings.js');
80 $this->autofocus('email');
84 * Content area of the page
86 * Shows a form for adding and removing email addresses and setting
91 function showContent()
93 $user = common_current_user();
95 $this->elementStart('form', array('method' => 'post',
96 'id' => 'form_settings_email',
97 'class' => 'form_settings',
99 common_local_url('emailsettings')));
100 $this->elementStart('fieldset');
101 $this->elementStart('fieldset', array('id' => 'settings_email_address'));
102 // TRANS: Form legend for e-mail settings form.
103 $this->element('legend', null, _('Email address'));
104 $this->hidden('token', common_session_token());
107 $this->element('p', array('id' => 'form_confirmed'), $user->email);
108 // TRANS: Form note in e-mail settings form.
109 $this->element('p', array('class' => 'form_note'), _('Current confirmed email address.'));
110 $this->hidden('email', $user->email);
111 // TRANS: Button label to remove a confirmed e-mail address.
112 $this->submit('remove', _m('BUTTON','Remove'));
114 $confirm = $this->getConfirmation();
116 $this->element('p', array('id' => 'form_unconfirmed'), $confirm->address);
117 $this->element('p', array('class' => 'form_note'),
118 // TRANS: Form note in e-mail settings form.
119 _('Awaiting confirmation on this address. '.
120 'Check your inbox (and spam box!) for a message '.
121 'with further instructions.'));
122 $this->hidden('email', $confirm->address);
123 // TRANS: Button label to cancel an e-mail address confirmation procedure.
124 $this->submit('cancel', _m('BUTTON','Cancel'));
126 $this->elementStart('ul', 'form_data');
127 $this->elementStart('li');
128 // TRANS: Field label for e-mail address input in e-mail settings form.
129 $this->input('email', _('Email address'),
130 ($this->arg('email')) ? $this->arg('email') : null,
131 // TRANS: Instructions for e-mail address input form. Do not translate
132 // TRANS: "example.org". It is one of the domain names reserved for
133 // TRANS: use in examples by http://www.rfc-editor.org/rfc/rfc2606.txt.
134 // TRANS: Any other domain may be owned by a legitimate person or
135 // TRANS: organization.
136 _('Email address, like "UserName@example.org"'));
137 $this->elementEnd('li');
138 $this->elementEnd('ul');
139 // TRANS: Button label for adding an e-mail address in e-mail settings form.
140 $this->submit('add', _m('BUTTON','Add'));
143 $this->elementEnd('fieldset');
145 if (common_config('emailpost', 'enabled') && $user->email) {
146 $this->elementStart('fieldset', array('id' => 'settings_email_incoming'));
147 // TRANS: Form legend for incoming e-mail settings form.
148 $this->element('legend', null, _('Incoming email'));
150 $this->elementStart('ul', 'form_data');
151 $this->elementStart('li');
152 $this->checkbox('emailpost',
153 // TRANS: Checkbox label in e-mail preferences form.
154 _('I want to post notices by email.'),
156 $this->elementEnd('li');
157 $this->elementEnd('ul');
159 // Our stylesheets make the form_data list items all floats, which
160 // creates lots of problems with trying to wrap divs around things.
161 // This should force a break before the next section, which needs
162 // to be separate so we can disable the things in it when the
164 $this->elementStart('div', array('style' => 'clear: both'));
165 $this->elementEnd('div');
167 $this->elementStart('div', array('id' => 'emailincoming'));
169 if ($user->incomingemail) {
170 $this->elementStart('p');
171 $this->element('span', 'address', $user->incomingemail);
172 // @todo XXX: Looks a little awkward in the UI.
173 // Something like "xxxx@identi.ca Send email ..". Needs improvement.
174 $this->element('span', 'input_instructions',
175 // TRANS: Form instructions for incoming e-mail form in e-mail settings.
176 _('Send email to this address to post new notices.'));
177 $this->elementEnd('p');
178 // TRANS: Button label for removing a set sender e-mail address to post notices from.
179 $this->submit('removeincoming', _m('BUTTON','Remove'));
182 $this->elementStart('p');
183 if ($user->incomingemail) {
184 // TRANS: Instructions for incoming e-mail address input form, when an address has already been assigned.
185 $msg = _('Make a new email address for posting to; '.
186 'cancels the old one.');
188 // TRANS: Instructions for incoming e-mail address input form.
189 $msg = _('To send notices via email, we need to create a unique email address for you on this server:');
191 $this->element('span', 'input_instructions', $msg);
192 $this->elementEnd('p');
194 // TRANS: Button label for adding an e-mail address to send notices from.
195 $this->submit('newincoming', _m('BUTTON','New'));
197 $this->elementEnd('div'); // div#emailincoming
199 $this->elementEnd('fieldset');
202 $this->elementStart('fieldset', array('id' => 'settings_email_preferences'));
203 // TRANS: Form legend for e-mail preferences form.
204 $this->element('legend', null, _('Email preferences'));
206 $this->elementStart('ul', 'form_data');
208 if (Event::handle('StartEmailFormData', array($this))) {
209 $this->elementStart('li');
210 $this->checkbox('emailnotifysub',
211 // TRANS: Checkbox label in e-mail preferences form.
212 _('Send me notices of new subscriptions through email.'),
213 $user->emailnotifysub);
214 $this->elementEnd('li');
215 $this->elementStart('li');
216 $this->checkbox('emailnotifyfav',
217 // TRANS: Checkbox label in e-mail preferences form.
218 _('Send me email when someone '.
219 'adds my notice as a favorite.'),
220 $user->emailnotifyfav);
221 $this->elementEnd('li');
222 $this->elementStart('li');
223 $this->checkbox('emailnotifymsg',
224 // TRANS: Checkbox label in e-mail preferences form.
225 _('Send me email when someone sends me a private message.'),
226 $user->emailnotifymsg);
227 $this->elementEnd('li');
228 $this->elementStart('li');
229 $this->checkbox('emailnotifyattn',
230 // TRANS: Checkbox label in e-mail preferences form.
231 _('Send me email when someone sends me an "@-reply".'),
232 $user->emailnotifyattn);
233 $this->elementEnd('li');
234 $this->elementStart('li');
235 $this->checkbox('emailnotifynudge',
236 // TRANS: Checkbox label in e-mail preferences form.
237 _('Allow friends to nudge me and send me an email.'),
238 $user->emailnotifynudge);
239 $this->elementEnd('li');
240 $this->elementStart('li');
241 $this->checkbox('emailmicroid',
242 // TRANS: Checkbox label in e-mail preferences form.
243 _('Publish a MicroID for my email address.'),
244 $user->emailmicroid);
245 $this->elementEnd('li');
246 Event::handle('EndEmailFormData', array($this));
248 $this->elementEnd('ul');
249 // TRANS: Button label to save e-mail preferences.
250 $this->submit('save', _m('BUTTON','Save'));
251 $this->elementEnd('fieldset');
252 $this->elementEnd('fieldset');
253 $this->elementEnd('form');
257 * Gets any existing email address confirmations we're waiting for
259 * @return Confirm_address Email address confirmation for user, or null
261 function getConfirmation()
263 $user = common_current_user();
265 $confirm = new Confirm_address();
267 $confirm->user_id = $user->id;
268 $confirm->address_type = 'email';
270 if ($confirm->find(true)) {
280 * Since there are a lot of different options on the page, we
281 * figure out what we're supposed to do based on which button was
286 function handlePost()
289 $token = $this->trimmed('token');
290 if (!$token || $token != common_session_token()) {
291 $this->show_form(_('There was a problem with your session token. '.
292 'Try again, please.'));
296 if ($this->arg('save')) {
297 $this->savePreferences();
298 } else if ($this->arg('add')) {
300 } else if ($this->arg('cancel')) {
301 $this->cancelConfirmation();
302 } else if ($this->arg('remove')) {
303 $this->removeAddress();
304 } else if ($this->arg('removeincoming')) {
305 $this->removeIncoming();
306 } else if ($this->arg('newincoming')) {
307 $this->newIncoming();
309 // TRANS: Message given submitting a form with an unknown action in e-mail settings.
310 $this->showForm(_('Unexpected form submission.'));
315 * Save email preferences
319 function savePreferences()
321 $user = common_current_user();
323 if (Event::handle('StartEmailSaveForm', array($this, &$user))) {
325 $emailnotifysub = $this->boolean('emailnotifysub');
326 $emailnotifyfav = $this->boolean('emailnotifyfav');
327 $emailnotifymsg = $this->boolean('emailnotifymsg');
328 $emailnotifynudge = $this->boolean('emailnotifynudge');
329 $emailnotifyattn = $this->boolean('emailnotifyattn');
330 $emailmicroid = $this->boolean('emailmicroid');
331 $emailpost = $this->boolean('emailpost');
333 assert(!is_null($user)); // should already be checked
335 $user->query('BEGIN');
337 $original = clone($user);
339 $user->emailnotifysub = $emailnotifysub;
340 $user->emailnotifyfav = $emailnotifyfav;
341 $user->emailnotifymsg = $emailnotifymsg;
342 $user->emailnotifynudge = $emailnotifynudge;
343 $user->emailnotifyattn = $emailnotifyattn;
344 $user->emailmicroid = $emailmicroid;
345 $user->emailpost = $emailpost;
347 $result = $user->update($original);
349 if ($result === false) {
350 common_log_db_error($user, 'UPDATE', __FILE__);
351 // TRANS: Server error thrown on database error updating e-mail preferences.
352 $this->serverError(_('Could not update user.'));
356 $user->query('COMMIT');
358 Event::handle('EndEmailSaveForm', array($this));
360 // TRANS: Confirmation message for successful e-mail preferences save.
361 $this->showForm(_('Email preferences saved.'), true);
366 * Add the address passed in by the user
370 function addAddress()
372 $user = common_current_user();
374 $email = $this->trimmed('email');
379 // TRANS: Message given saving e-mail address without having provided one.
380 $this->showForm(_('No email address.'));
384 $email = common_canonical_email($email);
387 // TRANS: Message given saving e-mail address that cannot be normalised.
388 $this->showForm(_('Cannot normalize that email address.'));
391 if (!Validate::email($email, common_config('email', 'check_domain'))) {
392 // TRANS: Message given saving e-mail address that not valid.
393 $this->showForm(_('Not a valid email address.'));
395 } else if ($user->email == $email) {
396 // TRANS: Message given saving e-mail address that is already set.
397 $this->showForm(_('That is already your email address.'));
399 } else if ($this->emailExists($email)) {
400 // TRANS: Message given saving e-mail address that is already set for another user.
401 $this->showForm(_('That email address already belongs '.
402 'to another user.'));
406 $confirm = new Confirm_address();
408 $confirm->address = $email;
409 $confirm->address_type = 'email';
410 $confirm->user_id = $user->id;
411 $confirm->code = common_confirmation_code(64);
413 $result = $confirm->insert();
415 if ($result === false) {
416 common_log_db_error($confirm, 'INSERT', __FILE__);
417 // TRANS: Server error thrown on database error adding e-mail confirmation code.
418 $this->serverError(_('Could not insert confirmation code.'));
422 mail_confirm_address($user, $confirm->code, $user->nickname, $email);
424 // TRANS: Message given saving valid e-mail address that is to be confirmed.
425 $msg = _('A confirmation code was sent to the email address you added. '.
426 'Check your inbox (and spam box!) for the code and instructions '.
427 'on how to use it.');
429 $this->showForm($msg, true);
433 * Handle a request to cancel email confirmation
437 function cancelConfirmation()
439 $email = $this->arg('email');
441 $confirm = $this->getConfirmation();
444 // TRANS: Message given canceling e-mail address confirmation that is not pending.
445 $this->showForm(_('No pending confirmation to cancel.'));
448 if ($confirm->address != $email) {
449 // TRANS: Message given canceling e-mail address confirmation for the wrong e-mail address.
450 $this->showForm(_('That is the wrong email address.'));
454 $result = $confirm->delete();
457 common_log_db_error($confirm, 'DELETE', __FILE__);
458 // TRANS: Server error thrown on database error canceling e-mail address confirmation.
459 $this->serverError(_('Could not delete email confirmation.'));
463 // TRANS: Message given after successfully canceling e-mail address confirmation.
464 $this->showForm(_('Email confirmation cancelled.'), true);
468 * Handle a request to remove an address from the user's account
472 function removeAddress()
474 $user = common_current_user();
476 $email = $this->arg('email');
478 // Maybe an old tab open...?
480 if ($user->email != $email) {
481 // TRANS: Message given trying to remove an e-mail address that is not
482 // TRANS: registered for the active user.
483 $this->showForm(_('That is not your email address.'));
487 $user->query('BEGIN');
489 $original = clone($user);
493 $result = $user->updateKeys($original);
496 common_log_db_error($user, 'UPDATE', __FILE__);
497 // TRANS: Server error thrown on database error removing a registered e-mail address.
498 $this->serverError(_('Could not update user.'));
501 $user->query('COMMIT');
503 // TRANS: Message given after successfully removing a registered e-mail address.
504 $this->showForm(_('The email address was removed.'), true);
508 * Handle a request to remove an incoming email address
512 function removeIncoming()
514 $user = common_current_user();
516 if (!$user->incomingemail) {
517 // TRANS: Form validation error displayed when trying to remove an incoming e-mail address while no address has been set.
518 $this->showForm(_('No incoming email address.'));
522 $orig = clone($user);
524 $user->incomingemail = null;
525 $user->emailpost = 0;
527 if (!$user->updateKeys($orig)) {
528 common_log_db_error($user, 'UPDATE', __FILE__);
529 // TRANS: Server error thrown on database error removing incoming e-mail address.
530 $this->serverError(_('Could not update user record.'));
533 // TRANS: Message given after successfully removing an incoming e-mail address.
534 $this->showForm(_('Incoming email address removed.'), true);
538 * Generate a new incoming email address
542 function newIncoming()
544 $user = common_current_user();
546 $orig = clone($user);
548 $user->incomingemail = mail_new_incoming_address();
549 $user->emailpost = 1;
551 if (!$user->updateKeys($orig)) {
552 common_log_db_error($user, 'UPDATE', __FILE__);
553 // TRANS: Server error thrown on database error adding incoming e-mail address.
554 $this->serverError(_('Could not update user record.'));
557 // TRANS: Message given after successfully adding an incoming e-mail address.
558 $this->showForm(_('New incoming email address added.'), true);
562 * Does another user already have this email address?
564 * Email addresses are unique for users.
566 * @param string $email Address to check
568 * @return boolean Whether the email already exists.
571 function emailExists($email)
573 $user = common_current_user();
575 $other = User::staticGet('email', $email);
580 return $other->id != $user->id;