We are no longer offering accounts on this server. Consider https://gitlab.freedesktop.org/ as a place to host projects.

emailsettings.php 9.42 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
<?php
/*
 * Laconica - a distributed open-source microblogging tool
 * Copyright (C) 2008, Controlez-Vous, Inc.
 *
 * 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.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * 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/>.
 */

if (!defined('LACONICA')) { exit(1); }

require_once(INSTALLDIR.'/lib/settingsaction.php');

24
class EmailsettingsAction extends SettingsAction {
25 26 27 28 29 30 31 32 33 34 35 36

	function get_instructions() {
		return _('Manage how you get email from %%site.name%%.');
	}

	function show_form($msg=NULL, $success=false) {
		$user = common_current_user();
		$this->form_header(_('Email Settings'), $msg, $success);
		common_element_start('form', array('method' => 'post',
										   'id' => 'emailsettings',
										   'action' =>
										   common_local_url('emailsettings')));
Zach Copley's avatar
Zach Copley committed
37
		common_hidden('token', common_session_token());
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

		common_element('h2', NULL, _('Address'));

		if ($user->email) {
			common_element_start('p');
			common_element('span', 'address confirmed', $user->email);
			common_element('span', 'input_instructions',
			               _('Current confirmed email address.'));
			common_hidden('email', $user->email);
			common_element_end('p');
			common_submit('remove', _('Remove'));
		} else {
			$confirm = $this->get_confirmation();
			if ($confirm) {
				common_element_start('p');
				common_element('span', 'address unconfirmed', $confirm->address);
				common_element('span', 'input_instructions',
							   _('Awaiting confirmation on this address. Check your inbox (and spam box!) for a message with further instructions.'));
				common_hidden('email', $confirm->address);
				common_element_end('p');
				common_submit('cancel', _('Cancel'));
			} else {
				common_input('email', _('Email Address'),
							 ($this->arg('email')) ? $this->arg('email') : NULL,
							 _('Email address, like "UserName@example.org"'));
				common_submit('add', _('Add'));
			}
		}

67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
		if ($user->email) {
			common_element('h2', NULL, _('Incoming email'));
			
			if ($user->incomingemail) {
				common_element_start('p');
				common_element('span', 'address', $user->incomingemail);
				common_element('span', 'input_instructions',
							   _('Send email to this address to post new notices.'));
				common_element_end('p');
				common_submit('removeincoming', _('Remove'));
			}
			
			common_element_start('p');
			common_element('span', 'input_instructions',
						   _('Make a new email address for posting to; cancels the old one.'));
			common_element_end('p');
			common_submit('newincoming', _('New'));
		}
		
86
		common_element('h2', NULL, _('Preferences'));
87

88
		common_checkbox('emailnotifysub',
89 90
		                _('Send me notices of new subscriptions through email.'),
		                $user->emailnotifysub);
Evan Prodromou's avatar
Evan Prodromou committed
91 92 93 94 95 96
		common_checkbox('emailnotifyfav',
		                _('Send me email when someone adds my notice as a favorite.'),
		                $user->emailnotifyfav);
		common_checkbox('emailnotifymsg',
		                _('Send me email when someone sends me a private message.'),
		                $user->emailnotifymsg);
csarven's avatar
csarven committed
97 98 99
		common_checkbox('emailnotifynudge',
		                _('Send me an email when someone nudges me.'),
		                $user->emailnotifnudge);
mikec's avatar
mikec committed
100 101 102 103 104 105 106
		common_checkbox('emailpost',
						_('I want to post notices by email.'),
						$user->emailpost);
		common_checkbox('emailmicroid',
		                _('Publish a MicroID for my email address.'),
		                $user->emailmicroid);

107
		common_submit('save', _('Save'));
108
		
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
		common_element_end('form');
		common_show_footer();
	}

	function get_confirmation() {
		$user = common_current_user();
		$confirm = new Confirm_address();
		$confirm->user_id = $user->id;
		$confirm->address_type = 'email';
		if ($confirm->find(TRUE)) {
			return $confirm;
		} else {
			return NULL;
		}
	}

	function handle_post() {

Zach Copley's avatar
Zach Copley committed
127 128 129 130 131 132 133
		# CSRF protection
		$token = $this->trimmed('token');
		if (!$token || $token != common_session_token()) {
			$this->show_form(_('There was a problem with your session token. Try again, please.'));
			return;
		}

134 135 136 137 138 139 140 141
		if ($this->arg('save')) {
			$this->save_preferences();
		} else if ($this->arg('add')) {
			$this->add_address();
		} else if ($this->arg('cancel')) {
			$this->cancel_confirmation();
		} else if ($this->arg('remove')) {
			$this->remove_address();
142 143 144 145
		} else if ($this->arg('removeincoming')) {
			$this->remove_incoming();
		} else if ($this->arg('newincoming')) {
			$this->new_incoming();
146 147 148 149 150 151 152 153
		} else {
			$this->show_form(_('Unexpected form submission.'));
		}
	}

	function save_preferences() {

		$emailnotifysub = $this->boolean('emailnotifysub');
Evan Prodromou's avatar
Evan Prodromou committed
154 155
		$emailnotifyfav = $this->boolean('emailnotifyfav');
		$emailnotifymsg = $this->boolean('emailnotifymsg');
csarven's avatar
csarven committed
156
		$emailnotifynudge = $this->boolean('emailnotifynudge');
mikec's avatar
mikec committed
157 158
		$emailmicroid = $this->boolean('emailmicroid');
		$emailpost = $this->boolean('emailpost');
159

160 161 162 163 164 165 166 167 168
		$user = common_current_user();

		assert(!is_null($user)); # should already be checked

		$user->query('BEGIN');

		$original = clone($user);

		$user->emailnotifysub = $emailnotifysub;
Evan Prodromou's avatar
Evan Prodromou committed
169 170
		$user->emailnotifyfav = $emailnotifyfav;
		$user->emailnotifymsg = $emailnotifymsg;
csarven's avatar
csarven committed
171
		$user->emailnotifynudge = $emailnotifynudge;
mikec's avatar
mikec committed
172 173
		$user->emailmicroid = $emailmicroid;
		$user->emailpost = $emailpost;
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

		$result = $user->update($original);

		if ($result === FALSE) {
			common_log_db_error($user, 'UPDATE', __FILE__);
			common_server_error(_('Couldn\'t update user.'));
			return;
		}

		$user->query('COMMIT');

		$this->show_form(_('Preferences saved.'), true);
	}

	function add_address() {

		$user = common_current_user();

		$email = $this->trimmed('email');

		# Some validation

		if (!$email) {
			$this->show_form(_('No email address.'));
			return;
		}

201
		$email = common_canonical_email($email);
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231

		if (!$email) {
		    $this->show_form(_('Cannot normalize that email address'));
		    return;
		}
		if (!Validate::email($email, true)) {
		    $this->show_form(_('Not a valid email address'));
		    return;
		} else if ($user->email == $email) {
		    $this->show_form(_('That is already your email address.'));
		    return;
		} else if ($this->email_exists($email)) {
		    $this->show_form(_('That email address already belongs to another user.'));
		    return;
		}

  		$confirm = new Confirm_address();
   		$confirm->address = $email;
   		$confirm->address_type = 'email';
   		$confirm->user_id = $user->id;
   		$confirm->code = common_confirmation_code(64);

		$result = $confirm->insert();

		if ($result === FALSE) {
			common_log_db_error($confirm, 'INSERT', __FILE__);
			common_server_error(_('Couldn\'t insert confirmation code.'));
			return;
		}

Evan Prodromou's avatar
Evan Prodromou committed
232 233 234 235
		mail_confirm_address($confirm->code,
							 $user->nickname,
							 $email);

236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
		$msg = _('A confirmation code was sent to the email address you added. Check your inbox (and spam box!) for the code and instructions on how to use it.');

		$this->show_form($msg, TRUE);
	}

	function cancel_confirmation() {
		$email = $this->arg('email');
		$confirm = $this->get_confirmation();
		if (!$confirm) {
			$this->show_form(_('No pending confirmation to cancel.'));
			return;
		}
		if ($confirm->address != $email) {
			$this->show_form(_('That is the wrong IM address.'));
			return;
		}

        $result = $confirm->delete();

        if (!$result) {
			common_log_db_error($confirm, 'DELETE', __FILE__);
            $this->server_error(_('Couldn\'t delete email confirmation.'));
            return;
        }

        $this->show_form(_('Confirmation cancelled.'), TRUE);
	}

	function remove_address() {

		$user = common_current_user();
		$email = $this->arg('email');

		# Maybe an old tab open...?

		if ($user->email != $email) {
		    $this->show_form(_('That is not your email address.'));
		    return;
		}

		$user->query('BEGIN');
		$original = clone($user);
		$user->email = NULL;
		$result = $user->updateKeys($original);
		if (!$result) {
			common_log_db_error($user, 'UPDATE', __FILE__);
			common_server_error(_('Couldn\'t update user.'));
			return;
		}
		$user->query('COMMIT');

		$this->show_form(_('The address was removed.'), TRUE);
	}

290 291 292 293 294 295 296 297 298 299
	function remove_incoming() {
		$user = common_current_user();
		
		if (!$user->incomingemail) {
			$this->show_form(_('No incoming email address.'));
			return;
		}
		
		$orig = clone($user);
		$user->incomingemail = NULL;
Evan Prodromou's avatar
Evan Prodromou committed
300 301

		if (!$user->updateKeys($orig)) {
302 303 304 305 306 307 308 309 310 311 312 313 314
			common_log_db_error($user, 'UPDATE', __FILE__);
			$this->server_error(_("Couldn't update user record."));
		}
		
		$this->show_form(_('Incoming email address removed.'), TRUE);
	}

	function new_incoming() {
		$user = common_current_user();
		
		$orig = clone($user);
		$user->incomingemail = mail_new_incoming_address();
		
Evan Prodromou's avatar
Evan Prodromou committed
315
		if (!$user->updateKeys($orig)) {
316 317 318 319 320 321 322
			common_log_db_error($user, 'UPDATE', __FILE__);
			$this->server_error(_("Couldn't update user record."));
		}

		$this->show_form(_('New incoming email address added.'), TRUE);
	}
	
323 324 325 326 327 328 329 330 331 332
	function email_exists($email) {
		$user = common_current_user();
		$other = User::staticGet('email', $email);
		if (!$other) {
			return false;
		} else {
			return $other->id != $user->id;
		}
	}
}