| 
									
										
										
										
											2008-06-23 18:36:41 -04:00
										 |  |  | <?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'); | 
					
						
							| 
									
										
										
										
											2008-06-23 21:42:41 -04:00
										 |  |  | require_once(INSTALLDIR.'/lib/jabber.php'); | 
					
						
							| 
									
										
										
										
											2008-06-23 18:36:41 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | class ImsettingsAction extends SettingsAction { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function show_top($arr) { | 
					
						
							|  |  |  | 		$msg = $arr[0]; | 
					
						
							|  |  |  | 		$success = $arr[1]; | 
					
						
							|  |  |  | 		if ($msg) { | 
					
						
							|  |  |  | 			$this->message($msg, $success); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			common_element('div', 'instructions', | 
					
						
							|  |  |  | 						   _t('You can send and receive notices through '. | 
					
						
							|  |  |  | 							  'Jabber/GTalk instant messages. Configure '. | 
					
						
							|  |  |  | 							  'your address and settings below.')); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		$this->settings_menu(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function show_form($msg=NULL, $success=false) { | 
					
						
							|  |  |  | 		$user = common_current_user(); | 
					
						
							|  |  |  | 		common_show_header(_t('IM settings'), NULL, array($msg, $success), | 
					
						
							|  |  |  | 						   array($this, 'show_top')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		common_element_start('form', array('method' => 'POST', | 
					
						
							|  |  |  | 										   'id' => 'imsettings', | 
					
						
							|  |  |  | 										   'action' => | 
					
						
							|  |  |  | 										   common_local_url('imsettings'))); | 
					
						
							| 
									
										
										
										
											2008-06-26 14:11:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		common_element('h2', NULL, _t('Address')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ($user->jabber) { | 
					
						
							|  |  |  | 			common_element_start('p'); | 
					
						
							|  |  |  | 			common_element('span', 'address confirmed', $user->jabber); | 
					
						
							|  |  |  | 			common_element('span', 'input_instructions', | 
					
						
							|  |  |  | 			               _t('Current confirmed Jabber/GTalk address.')); | 
					
						
							|  |  |  | 			common_hidden('jabber', $user->jabber); | 
					
						
							|  |  |  | 			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', | 
					
						
							|  |  |  | 			  	             _t('Current confirmed Jabber/GTalk address.')); | 
					
						
							|  |  |  | 				common_hidden('jabber', $confirm->address); | 
					
						
							|  |  |  | 				common_element_end('p'); | 
					
						
							|  |  |  | 				common_submit('cancel', _t('Cancel')); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				common_input('jabber', _t('IM Address'), | 
					
						
							|  |  |  | 						 	($this->arg('jabber')) ? $this->arg('jabber') : NULL, | 
					
						
							|  |  |  | 						 _t('Jabber or GTalk address, like "UserName@example.org"')); | 
					
						
							|  |  |  | 				common_submit('add', 'Add'); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		common_element('h2', NULL, _t('Preferences')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-23 18:36:41 -04:00
										 |  |  | 		common_checkbox('jabbernotify', | 
					
						
							| 
									
										
										
										
											2008-06-26 14:27:05 -04:00
										 |  |  | 		                _t('Send me notices through Jabber/GTalk.'), | 
					
						
							|  |  |  | 		                $user->jabbernotify); | 
					
						
							| 
									
										
										
										
											2008-06-23 18:36:41 -04:00
										 |  |  | 		common_checkbox('updatefrompresence', | 
					
						
							| 
									
										
										
										
											2008-06-26 14:27:05 -04:00
										 |  |  | 		                _t('Post a notice when my Jabber/GTalk status changes.'), | 
					
						
							|  |  |  | 		                $user->updatefrompresence); | 
					
						
							| 
									
										
										
										
											2008-06-26 14:11:44 -04:00
										 |  |  | 		common_submit('save', _t('Save')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-23 18:36:41 -04:00
										 |  |  | 		common_element_end('form'); | 
					
						
							|  |  |  | 		common_show_footer(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-26 14:11:44 -04:00
										 |  |  | 	function get_confirmation() { | 
					
						
							|  |  |  | 		$user = common_current_user(); | 
					
						
							|  |  |  | 		$confirm = new Confirm_address(); | 
					
						
							|  |  |  | 		$confirm->user_id = $user->id; | 
					
						
							|  |  |  | 		$confirm->address_type = 'jabber'; | 
					
						
							|  |  |  | 		if ($confirm->find(TRUE)) { | 
					
						
							|  |  |  | 			return $confirm; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-23 18:36:41 -04:00
										 |  |  | 	function handle_post() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-26 14:11:44 -04:00
										 |  |  | 		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(); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			$this->show_form(_t('Unexpected form submission.')); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function save_preferences() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-23 18:36:41 -04:00
										 |  |  | 		$jabbernotify = $this->boolean('jabbernotify'); | 
					
						
							|  |  |  | 		$updatefrompresence = $this->boolean('updatefrompresence'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$user = common_current_user(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(!is_null($user)); # should already be checked
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$user->query('BEGIN'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$original = clone($user); | 
					
						
							| 
									
										
										
										
											2008-06-26 14:11:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-23 18:36:41 -04:00
										 |  |  | 		$user->jabbernotify = $jabbernotify; | 
					
						
							|  |  |  | 		$user->updatefrompresence = $updatefrompresence; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-26 14:11:44 -04:00
										 |  |  | 		$result = $user->update($original); | 
					
						
							| 
									
										
										
										
											2008-06-23 18:36:41 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if ($result === FALSE) { | 
					
						
							|  |  |  | 			common_log_db_error($user, 'UPDATE', __FILE__); | 
					
						
							|  |  |  | 			common_server_error(_t('Couldnt update user.')); | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-26 14:11:44 -04:00
										 |  |  | 		$user->query('COMMIT'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->show_form(_t('Preferences saved.'), true); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function add_address() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$jabber = $this->trimmed('jabber'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# Some validation
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (!$jabber) { | 
					
						
							|  |  |  | 			$this->show_form(_t('No Jabber ID.')); | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$jabber = jabber_normalize_jid($jabber); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (!$jabber) { | 
					
						
							|  |  |  | 		    $this->show_form(_('Cannot normalize that Jabber ID')); | 
					
						
							|  |  |  | 		    return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (!jabber_valid_base_jid($jabber)) { | 
					
						
							|  |  |  | 		    $this->show_form(_('Not a valid Jabber ID')); | 
					
						
							|  |  |  | 		    return; | 
					
						
							|  |  |  | 		} else if ($user->jabber == $jabber) { | 
					
						
							|  |  |  | 		    $this->show_form(_('That is already your Jabber ID.')); | 
					
						
							|  |  |  | 		    return; | 
					
						
							|  |  |  | 		} else if ($this->jabber_exists($jabber)) { | 
					
						
							|  |  |  | 		    $this->show_form(_('Jabber ID already belongs to another user.')); | 
					
						
							|  |  |  | 		    return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   		$confirm = new Confirm_address(); | 
					
						
							|  |  |  |    		$confirm->address = $jabber; | 
					
						
							|  |  |  |    		$confirm->address_type = 'jabber'; | 
					
						
							|  |  |  |    		$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(_t('Couldnt insert confirmation code.')); | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# XXX: optionally queue for offline sending
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (!jabber_is_subscribed($jabber)) { | 
					
						
							|  |  |  | 			jabber_special_presence('subscribe', $address); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			jabber_confirm_address($confirm->code, | 
					
						
							|  |  |  | 								   $user->nickname, | 
					
						
							|  |  |  | 								   $jabber); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->show_form(_t('A confirmation code was ' . | 
					
						
							|  |  |  | 		                    ' sent to the IM address you added. ' . | 
					
						
							|  |  |  | 		                    ' You must approve ' . jabber_daemon_address() . | 
					
						
							|  |  |  | 		                    ' for sending messages to you.'), | 
					
						
							|  |  |  | 		                    TRUE); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function cancel_confirmation() { | 
					
						
							|  |  |  | 		$jabber = $this->arg('jabber'); | 
					
						
							|  |  |  | 		$confirm = $this->get_confirmation(); | 
					
						
							|  |  |  | 		if (!$confirm) { | 
					
						
							|  |  |  | 			$this->show_form(_t('No pending confirmation to cancel.')); | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if ($confirm->address != $jabber) { | 
					
						
							|  |  |  | 			$this->show_form(_t('That is the wrong IM address.')); | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $result = $confirm->delete(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!$result) { | 
					
						
							|  |  |  | 			common_log_db_error($confirm, 'DELETE', __FILE__); | 
					
						
							|  |  |  |             $this->server_error(_t('Couldn\'t delete email confirmation.')); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->show_form(_t('Confirmation cancelled.'), TRUE); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function remove_address() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$user = common_current_user(); | 
					
						
							|  |  |  | 		$jabber = $this->arg('jabber'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# Maybe an old tab open...?
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-23 21:32:03 -04:00
										 |  |  | 		if ($user->jabber != $jabber) { | 
					
						
							| 
									
										
										
										
											2008-06-26 14:11:44 -04:00
										 |  |  | 		    $this->show_form(_t('That is not your Jabber ID.')); | 
					
						
							|  |  |  | 		    return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$user->query('BEGIN'); | 
					
						
							| 
									
										
										
										
											2008-06-26 14:37:21 -04:00
										 |  |  | 		$original = clone($user); | 
					
						
							| 
									
										
										
										
											2008-06-26 14:11:44 -04:00
										 |  |  | 		$user->jabber = NULL; | 
					
						
							|  |  |  | 		$result = $user->updateKeys($original); | 
					
						
							| 
									
										
										
										
											2008-06-26 14:37:21 -04:00
										 |  |  | 		if (!$result) { | 
					
						
							| 
									
										
										
										
											2008-06-26 14:11:44 -04:00
										 |  |  | 			common_log_db_error($user, 'UPDATE', __FILE__); | 
					
						
							|  |  |  | 			common_server_error(_t('Couldnt update user.')); | 
					
						
							|  |  |  | 			return; | 
					
						
							| 
									
										
										
										
											2008-06-23 18:36:41 -04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		$user->query('COMMIT'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-26 14:11:44 -04:00
										 |  |  | 		# Unsubscribe to the old address
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		jabber_special_presence('unsubscribe', $jabber); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->show_form(_t('The address was removed.'), TRUE); | 
					
						
							| 
									
										
										
										
											2008-06-23 18:36:41 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function jabber_exists($jabber) { | 
					
						
							|  |  |  | 		$user = common_current_user(); | 
					
						
							|  |  |  | 		$other = User::staticGet('jabber', $jabber); | 
					
						
							|  |  |  | 		if (!$other) { | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return $other->id != $user->id; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |