2008-07-20 20:30:05 +01: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-07-20 20:31:32 +01:00
require_once ( INSTALLDIR . '/actions/emailsettings.php' );
2008-07-20 20:30:05 +01:00
2008-12-23 19:49:23 +00:00
class SmssettingsAction extends EmailsettingsAction
{
2008-07-20 20:30:05 +01:00
2008-12-23 19:33:23 +00:00
function get_instructions ()
{
2008-12-23 19:19:07 +00:00
return _ ( 'You can receive SMS messages through email from %%site.name%%.' );
}
2008-12-23 19:33:23 +00:00
function show_form ( $msg = null , $success = false )
{
2008-12-23 19:19:07 +00:00
$user = common_current_user ();
$this -> form_header ( _ ( 'SMS Settings' ), $msg , $success );
2009-01-15 22:57:15 +00:00
$this -> elementStart ( 'form' , array ( 'method' => 'post' ,
2008-12-23 19:19:07 +00:00
'id' => 'smssettings' ,
'action' =>
common_local_url ( 'smssettings' )));
2009-01-15 22:57:15 +00:00
$this -> hidden ( 'token' , common_session_token ());
$this -> element ( 'h2' , null , _ ( 'Address' ));
2008-12-23 19:19:07 +00:00
if ( $user -> sms ) {
2009-01-15 22:57:15 +00:00
$this -> elementStart ( 'p' );
2008-12-23 19:19:07 +00:00
$carrier = $user -> getCarrier ();
2009-01-15 22:57:15 +00:00
$this -> element ( 'span' , 'address confirmed' , $user -> sms . ' (' . $carrier -> name . ')' );
$this -> element ( 'span' , 'input_instructions' ,
2008-12-23 19:19:07 +00:00
_ ( 'Current confirmed SMS-enabled phone number.' ));
2009-01-15 22:57:15 +00:00
$this -> hidden ( 'sms' , $user -> sms );
$this -> hidden ( 'carrier' , $user -> carrier );
$this -> elementEnd ( 'p' );
$this -> submit ( 'remove' , _ ( 'Remove' ));
2008-12-23 19:19:07 +00:00
} else {
$confirm = $this -> get_confirmation ();
if ( $confirm ) {
$carrier = Sms_carrier :: staticGet ( $confirm -> address_extra );
2009-01-15 22:57:15 +00:00
$this -> elementStart ( 'p' );
$this -> element ( 'span' , 'address unconfirmed' , $confirm -> address . ' (' . $carrier -> name . ')' );
$this -> element ( 'span' , 'input_instructions' ,
2008-12-23 19:19:07 +00:00
_ ( 'Awaiting confirmation on this phone number.' ));
2009-01-15 22:57:15 +00:00
$this -> hidden ( 'sms' , $confirm -> address );
$this -> hidden ( 'carrier' , $confirm -> address_extra );
$this -> elementEnd ( 'p' );
$this -> submit ( 'cancel' , _ ( 'Cancel' ));
$this -> input ( 'code' , _ ( 'Confirmation code' ), null ,
2008-12-23 19:19:07 +00:00
_ ( 'Enter the code you received on your phone.' ));
2009-01-15 22:57:15 +00:00
$this -> submit ( 'confirm' , _ ( 'Confirm' ));
2008-12-23 19:19:07 +00:00
} else {
2009-01-15 22:57:15 +00:00
$this -> input ( 'sms' , _ ( 'SMS Phone number' ),
2008-12-23 19:21:29 +00:00
( $this -> arg ( 'sms' )) ? $this -> arg ( 'sms' ) : null ,
2008-12-23 19:19:07 +00:00
_ ( 'Phone number, no punctuation or spaces, with area code' ));
$this -> carrier_select ();
2009-01-15 22:57:15 +00:00
$this -> submit ( 'add' , _ ( 'Add' ));
2008-12-23 19:19:07 +00:00
}
}
if ( $user -> sms ) {
2009-01-15 22:57:15 +00:00
$this -> element ( 'h2' , null , _ ( 'Incoming email' ));
2008-12-23 19:19:07 +00:00
if ( $user -> incomingemail ) {
2009-01-15 22:57:15 +00:00
$this -> elementStart ( 'p' );
$this -> element ( 'span' , 'address' , $user -> incomingemail );
$this -> element ( 'span' , 'input_instructions' ,
2008-12-23 19:19:07 +00:00
_ ( 'Send email to this address to post new notices.' ));
2009-01-15 22:57:15 +00:00
$this -> elementEnd ( 'p' );
$this -> submit ( 'removeincoming' , _ ( 'Remove' ));
2008-12-23 19:19:07 +00:00
}
2009-01-15 22:57:15 +00:00
$this -> elementStart ( 'p' );
$this -> element ( 'span' , 'input_instructions' ,
2008-12-23 19:19:07 +00:00
_ ( 'Make a new email address for posting to; cancels the old one.' ));
2009-01-15 22:57:15 +00:00
$this -> elementEnd ( 'p' );
$this -> submit ( 'newincoming' , _ ( 'New' ));
2008-12-23 19:19:07 +00:00
}
2009-01-15 22:57:15 +00:00
$this -> element ( 'h2' , null , _ ( 'Preferences' ));
2008-12-23 19:19:07 +00:00
2009-01-15 22:57:15 +00:00
$this -> checkbox ( 'smsnotify' ,
2008-12-23 19:19:07 +00:00
_ ( 'Send me notices through SMS; I understand I may incur exorbitant charges from my carrier.' ),
$user -> smsnotify );
2009-01-15 22:57:15 +00:00
$this -> submit ( 'save' , _ ( 'Save' ));
2008-12-23 19:19:07 +00:00
2009-01-15 22:57:15 +00:00
$this -> elementEnd ( 'form' );
2008-12-23 19:19:07 +00:00
common_show_footer ();
}
2008-12-23 19:33:23 +00:00
function get_confirmation ()
{
2008-12-23 19:19:07 +00:00
$user = common_current_user ();
$confirm = new Confirm_address ();
$confirm -> user_id = $user -> id ;
$confirm -> address_type = 'sms' ;
2008-12-23 19:44:28 +00:00
if ( $confirm -> find ( true )) {
2008-12-23 19:19:07 +00:00
return $confirm ;
} else {
2008-12-23 19:21:29 +00:00
return null ;
2008-12-23 19:19:07 +00:00
}
}
2008-12-23 19:33:23 +00:00
function handle_post ()
{
2008-12-23 19:19:07 +00:00
# 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 ;
}
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 if ( $this -> arg ( 'removeincoming' )) {
$this -> remove_incoming ();
} else if ( $this -> arg ( 'newincoming' )) {
$this -> new_incoming ();
} else if ( $this -> arg ( 'confirm' )) {
$this -> confirm_code ();
} else {
$this -> show_form ( _ ( 'Unexpected form submission.' ));
}
}
2008-12-23 19:33:23 +00:00
function save_preferences ()
{
2008-12-23 19:19:07 +00:00
$smsnotify = $this -> boolean ( 'smsnotify' );
$user = common_current_user ();
assert ( ! is_null ( $user )); # should already be checked
$user -> query ( 'BEGIN' );
$original = clone ( $user );
$user -> smsnotify = $smsnotify ;
$result = $user -> update ( $original );
2008-12-23 19:44:28 +00:00
if ( $result === false ) {
2008-12-23 19:19:07 +00:00
common_log_db_error ( $user , 'UPDATE' , __FILE__ );
2009-01-15 23:03:38 +00:00
$this -> serverError ( _ ( 'Couldn\'t update user.' ));
2008-12-23 19:19:07 +00:00
return ;
}
$user -> query ( 'COMMIT' );
$this -> show_form ( _ ( 'Preferences saved.' ), true );
}
2008-12-23 19:33:23 +00:00
function add_address ()
{
2008-12-23 19:19:07 +00:00
$user = common_current_user ();
$sms = $this -> trimmed ( 'sms' );
$carrier_id = $this -> trimmed ( 'carrier' );
# Some validation
if ( ! $sms ) {
$this -> show_form ( _ ( 'No phone number.' ));
return ;
}
if ( ! $carrier_id ) {
$this -> show_form ( _ ( 'No carrier selected.' ));
return ;
}
$sms = common_canonical_sms ( $sms );
if ( $user -> sms == $sms ) {
$this -> show_form ( _ ( 'That is already your phone number.' ));
return ;
} else if ( $this -> sms_exists ( $sms )) {
$this -> show_form ( _ ( 'That phone number already belongs to another user.' ));
return ;
}
$confirm = new Confirm_address ();
$confirm -> address = $sms ;
$confirm -> address_extra = $carrier_id ;
$confirm -> address_type = 'sms' ;
$confirm -> user_id = $user -> id ;
$confirm -> code = common_confirmation_code ( 40 );
$result = $confirm -> insert ();
2008-12-23 19:44:28 +00:00
if ( $result === false ) {
2008-12-23 19:19:07 +00:00
common_log_db_error ( $confirm , 'INSERT' , __FILE__ );
2009-01-15 23:03:38 +00:00
$this -> serverError ( _ ( 'Couldn\'t insert confirmation code.' ));
2008-12-23 19:19:07 +00:00
return ;
}
$carrier = Sms_carrier :: staticGet ( $carrier_id );
mail_confirm_sms ( $confirm -> code ,
$user -> nickname ,
$carrier -> toEmailAddress ( $sms ));
$msg = _ ( 'A confirmation code was sent to the phone number you added. Check your inbox (and spam box!) for the code and instructions on how to use it.' );
2008-12-23 19:44:28 +00:00
$this -> show_form ( $msg , true );
2008-12-23 19:19:07 +00:00
}
2008-12-23 19:33:23 +00:00
function cancel_confirmation ()
{
2008-12-23 19:19:07 +00:00
$sms = $this -> trimmed ( 'sms' );
$carrier = $this -> trimmed ( 'carrier' );
$confirm = $this -> get_confirmation ();
if ( ! $confirm ) {
$this -> show_form ( _ ( 'No pending confirmation to cancel.' ));
return ;
}
if ( $confirm -> address != $sms ) {
$this -> show_form ( _ ( 'That is the wrong confirmation number.' ));
return ;
}
2008-07-20 20:30:05 +01:00
$result = $confirm -> delete ();
if ( ! $result ) {
2008-12-23 19:19:07 +00:00
common_log_db_error ( $confirm , 'DELETE' , __FILE__ );
2009-01-15 23:03:38 +00:00
$this -> serverError ( _ ( 'Couldn\'t delete email confirmation.' ));
2008-07-20 20:30:05 +01:00
return ;
}
2008-12-23 19:44:28 +00:00
$this -> show_form ( _ ( 'Confirmation cancelled.' ), true );
2008-12-23 19:19:07 +00:00
}
2008-12-23 19:33:23 +00:00
function remove_address ()
{
2008-12-23 19:19:07 +00:00
$user = common_current_user ();
$sms = $this -> arg ( 'sms' );
$carrier = $this -> arg ( 'carrier' );
# Maybe an old tab open...?
if ( $user -> sms != $sms ) {
$this -> show_form ( _ ( 'That is not your phone number.' ));
return ;
}
$user -> query ( 'BEGIN' );
$original = clone ( $user );
2008-12-23 19:21:29 +00:00
$user -> sms = null ;
$user -> carrier = null ;
$user -> smsemail = null ;
2008-12-23 19:19:07 +00:00
$result = $user -> updateKeys ( $original );
if ( ! $result ) {
common_log_db_error ( $user , 'UPDATE' , __FILE__ );
2009-01-15 23:03:38 +00:00
$this -> serverError ( _ ( 'Couldn\'t update user.' ));
2008-12-23 19:19:07 +00:00
return ;
}
$user -> query ( 'COMMIT' );
2008-12-23 19:44:28 +00:00
$this -> show_form ( _ ( 'The address was removed.' ), true );
2008-12-23 19:19:07 +00:00
}
2008-12-23 19:33:23 +00:00
function sms_exists ( $sms )
{
2008-12-23 19:19:07 +00:00
$user = common_current_user ();
$other = User :: staticGet ( 'sms' , $sms );
if ( ! $other ) {
return false ;
} else {
return $other -> id != $user -> id ;
}
}
2008-12-23 19:33:23 +00:00
function carrier_select ()
{
2008-12-23 19:19:07 +00:00
$carrier = new Sms_carrier ();
$cnt = $carrier -> find ();
2009-01-15 22:57:15 +00:00
$this -> elementStart ( 'p' );
$this -> element ( 'label' , array ( 'for' => 'carrier' ));
$this -> elementStart ( 'select' , array ( 'name' => 'carrier' ,
2008-12-23 19:19:07 +00:00
'id' => 'carrier' ));
2009-01-15 22:57:15 +00:00
$this -> element ( 'option' , array ( 'value' => 0 ),
2008-12-23 19:19:07 +00:00
_ ( 'Select a carrier' ));
while ( $carrier -> fetch ()) {
2009-01-15 22:57:15 +00:00
$this -> element ( 'option' , array ( 'value' => $carrier -> id ),
2008-12-23 19:19:07 +00:00
$carrier -> name );
}
2009-01-15 22:57:15 +00:00
$this -> elementEnd ( 'select' );
$this -> elementEnd ( 'p' );
$this -> element ( 'span' , 'input_instructions' ,
2008-12-23 19:19:07 +00:00
sprintf ( _ ( 'Mobile carrier for your phone. ' .
'If you know a carrier that accepts ' .
'SMS over email but isn\'t listed here, ' .
'send email to let us know at %s.' ),
common_config ( 'site' , 'email' )));
}
2008-12-23 19:33:23 +00:00
function confirm_code ()
{
2008-12-23 19:19:07 +00:00
$code = $this -> trimmed ( 'code' );
if ( ! $code ) {
$this -> show_form ( _ ( 'No code entered' ));
return ;
}
common_redirect ( common_local_url ( 'confirmaddress' ,
array ( 'code' => $code )));
}
2008-07-20 20:30:05 +01:00
}