2008-06-24 07:36:41 +09: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-24 10:42:41 +09:00
require_once ( INSTALLDIR . '/lib/jabber.php' );
2008-06-24 07:36:41 +09:00
class ImsettingsAction extends SettingsAction {
2008-07-01 02:03:42 +09:00
function get_instructions () {
2008-07-13 13:46:08 +09:00
return _ ( 'You can send and receive notices through Jabber/GTalk [instant messages](%%doc.im%%). Configure your address and settings below.' );
2008-06-24 07:36:41 +09:00
}
function show_form ( $msg = NULL , $success = false ) {
$user = common_current_user ();
2008-07-08 18:45:31 +09:00
$this -> form_header ( _ ( 'IM Settings' ), $msg , $success );
2008-07-02 22:15:07 +09:00
common_element_start ( 'form' , array ( 'method' => 'post' ,
2008-06-24 07:36:41 +09:00
'id' => 'imsettings' ,
'action' =>
common_local_url ( 'imsettings' )));
2008-06-27 03:11:44 +09:00
2008-07-08 18:45:31 +09:00
common_element ( 'h2' , NULL , _ ( 'Address' ));
2008-06-27 03:11:44 +09:00
if ( $user -> jabber ) {
common_element_start ( 'p' );
common_element ( 'span' , 'address confirmed' , $user -> jabber );
common_element ( 'span' , 'input_instructions' ,
2008-07-08 18:45:31 +09:00
_ ( 'Current confirmed Jabber/GTalk address.' ));
2008-06-27 03:11:44 +09:00
common_hidden ( 'jabber' , $user -> jabber );
common_element_end ( 'p' );
2008-07-08 18:45:31 +09:00
common_submit ( 'remove' , _ ( 'Remove' ));
2008-06-27 03:11:44 +09:00
} else {
$confirm = $this -> get_confirmation ();
if ( $confirm ) {
common_element_start ( 'p' );
common_element ( 'span' , 'address unconfirmed' , $confirm -> address );
common_element ( 'span' , 'input_instructions' ,
2008-07-14 06:56:01 +09:00
sprintf ( _ ( 'Awaiting confirmation on this address. Check your Jabber/GTalk account for a message with further instructions. (Did you add %s to your buddy list?)' ,
2008-07-13 13:46:08 +09:00
jabber_daemon_address ())));
2008-06-27 03:11:44 +09:00
common_hidden ( 'jabber' , $confirm -> address );
common_element_end ( 'p' );
2008-07-08 18:45:31 +09:00
common_submit ( 'cancel' , _ ( 'Cancel' ));
2008-06-27 03:11:44 +09:00
} else {
2008-07-08 18:45:31 +09:00
common_input ( 'jabber' , _ ( 'IM Address' ),
2008-06-27 03:11:44 +09:00
( $this -> arg ( 'jabber' )) ? $this -> arg ( 'jabber' ) : NULL ,
2008-07-13 13:46:08 +09:00
sprintf ( _ ( 'Jabber or GTalk address, like "UserName@example.org". First, make sure to add %s to your buddy list in your IM client or on GTalk.' ), jabber_daemon_address ()));
2008-07-08 18:45:31 +09:00
common_submit ( 'add' , _ ( 'Add' ));
2008-06-27 03:11:44 +09:00
}
}
2008-07-08 18:45:31 +09:00
common_element ( 'h2' , NULL , _ ( 'Preferences' ));
2008-06-27 03:11:44 +09:00
2008-06-24 07:36:41 +09:00
common_checkbox ( 'jabbernotify' ,
2008-07-08 18:45:31 +09:00
_ ( 'Send me notices through Jabber/GTalk.' ),
2008-06-27 03:27:05 +09:00
$user -> jabbernotify );
2008-06-24 07:36:41 +09:00
common_checkbox ( 'updatefrompresence' ,
2008-07-08 18:45:31 +09:00
_ ( 'Post a notice when my Jabber/GTalk status changes.' ),
2008-06-27 03:27:05 +09:00
$user -> updatefrompresence );
2008-07-08 18:45:31 +09:00
common_submit ( 'save' , _ ( 'Save' ));
2008-06-27 03:11:44 +09:00
2008-06-24 07:36:41 +09:00
common_element_end ( 'form' );
common_show_footer ();
}
2008-06-27 03:11:44 +09: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-24 07:36:41 +09:00
function handle_post () {
2008-06-27 03:11:44 +09: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 {
2008-07-08 18:45:31 +09:00
$this -> show_form ( _ ( 'Unexpected form submission.' ));
2008-06-27 03:11:44 +09:00
}
}
function save_preferences () {
2008-06-24 07:36:41 +09: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-27 03:11:44 +09:00
2008-06-24 07:36:41 +09:00
$user -> jabbernotify = $jabbernotify ;
$user -> updatefrompresence = $updatefrompresence ;
2008-06-27 03:11:44 +09:00
$result = $user -> update ( $original );
2008-06-24 07:36:41 +09:00
if ( $result === FALSE ) {
common_log_db_error ( $user , 'UPDATE' , __FILE__ );
2008-07-13 14:37:48 +09:00
common_server_error ( _ ( 'Couldn\'t update user.' ));
2008-06-24 07:36:41 +09:00
return ;
}
2008-06-27 03:11:44 +09:00
$user -> query ( 'COMMIT' );
2008-07-08 18:45:31 +09:00
$this -> show_form ( _ ( 'Preferences saved.' ), true );
2008-06-27 03:11:44 +09:00
}
function add_address () {
2008-06-27 03:48:11 +09:00
$user = common_current_user ();
2008-06-27 03:11:44 +09:00
$jabber = $this -> trimmed ( 'jabber' );
# Some validation
if ( ! $jabber ) {
2008-07-08 18:45:31 +09:00
$this -> show_form ( _ ( 'No Jabber ID.' ));
2008-06-27 03:11:44 +09:00
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__ );
2008-07-13 14:37:48 +09:00
common_server_error ( _ ( 'Couldn\'t insert confirmation code.' ));
2008-06-27 03:11:44 +09:00
return ;
}
2008-07-06 12:57:07 +09:00
if ( ! common_config ( 'queue' , 'enabled' )) {
jabber_confirm_address ( $confirm -> code ,
$user -> nickname ,
$jabber );
}
2008-07-08 18:51:13 +09:00
2008-07-13 13:46:08 +09:00
$msg = sprintf ( _ ( 'A confirmation code was sent to the IM address you added. You must approve %s for sending messages to you.' ), jabber_daemon_address ());
2008-06-27 03:11:44 +09:00
2008-06-27 05:31:03 +09:00
$this -> show_form ( $msg , TRUE );
2008-06-27 03:11:44 +09:00
}
function cancel_confirmation () {
$jabber = $this -> arg ( 'jabber' );
$confirm = $this -> get_confirmation ();
if ( ! $confirm ) {
2008-07-08 18:45:31 +09:00
$this -> show_form ( _ ( 'No pending confirmation to cancel.' ));
2008-06-27 03:11:44 +09:00
return ;
}
if ( $confirm -> address != $jabber ) {
2008-07-08 18:45:31 +09:00
$this -> show_form ( _ ( 'That is the wrong IM address.' ));
2008-06-27 03:11:44 +09:00
return ;
}
$result = $confirm -> delete ();
if ( ! $result ) {
common_log_db_error ( $confirm , 'DELETE' , __FILE__ );
2008-07-08 18:45:31 +09:00
$this -> server_error ( _ ( 'Couldn\'t delete email confirmation.' ));
2008-06-27 03:11:44 +09:00
return ;
}
2008-07-08 18:45:31 +09:00
$this -> show_form ( _ ( 'Confirmation cancelled.' ), TRUE );
2008-06-27 03:11:44 +09:00
}
function remove_address () {
$user = common_current_user ();
$jabber = $this -> arg ( 'jabber' );
# Maybe an old tab open...?
2008-06-24 10:32:03 +09:00
if ( $user -> jabber != $jabber ) {
2008-07-08 18:45:31 +09:00
$this -> show_form ( _ ( 'That is not your Jabber ID.' ));
2008-06-27 03:11:44 +09:00
return ;
}
$user -> query ( 'BEGIN' );
2008-06-27 03:37:21 +09:00
$original = clone ( $user );
2008-06-27 03:11:44 +09:00
$user -> jabber = NULL ;
$result = $user -> updateKeys ( $original );
2008-06-27 03:37:21 +09:00
if ( ! $result ) {
2008-06-27 03:11:44 +09:00
common_log_db_error ( $user , 'UPDATE' , __FILE__ );
2008-07-13 14:37:48 +09:00
common_server_error ( _ ( 'Couldn\'t update user.' ));
2008-06-27 03:11:44 +09:00
return ;
2008-06-24 07:36:41 +09:00
}
$user -> query ( 'COMMIT' );
2008-07-06 12:57:07 +09:00
# XXX: unsubscribe to the old address
2008-06-27 03:11:44 +09:00
2008-07-08 18:45:31 +09:00
$this -> show_form ( _ ( 'The address was removed.' ), TRUE );
2008-06-24 07:36:41 +09:00
}
function jabber_exists ( $jabber ) {
$user = common_current_user ();
$other = User :: staticGet ( 'jabber' , $jabber );
if ( ! $other ) {
return false ;
} else {
return $other -> id != $user -> id ;
}
}
}