]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
some UI changes to the IM settings
authorEvan Prodromou <evan@controlezvous.ca>
Thu, 26 Jun 2008 18:11:44 +0000 (14:11 -0400)
committerEvan Prodromou <evan@controlezvous.ca>
Thu, 26 Jun 2008 18:11:44 +0000 (14:11 -0400)
darcs-hash:20080626181144-34904-87503e70e6705b06ebb6c19910583f4fba1b22e0.gz

actions/imsettings.php
lib/jabber.php
lib/util.php
xmppdaemon.php

index d8fc8b87cad3e3af0bded3d6210351c04323ebaa..a5e9be307ea5a9cb027a32d4e227329537a1946c 100644 (file)
@@ -47,42 +47,79 @@ class ImsettingsAction extends SettingsAction {
                                                                                   'id' => 'imsettings',
                                                                                   'action' =>
                                                                                   common_local_url('imsettings')));
-               # too much common patterns here... abstractable?
-               common_input('jabber', _t('IM Address'),
-                                        ($this->arg('jabber')) ? $this->arg('jabber') : $user->jabber,
-                                        _t('Jabber or GTalk address, like "UserName@example.org"'));
+
+               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'));
+
                common_checkbox('jabbernotify',
                                _t('Send me notices through Jabber/GTalk.'));
                common_checkbox('updatefrompresence',
                                _t('Post a notice when my Jabber/GTalk status changes.'));
-               common_submit('submit', _t('Save'));
+               common_submit('save', _t('Save'));
+
                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 = 'jabber';
+               if ($confirm->find(TRUE)) {
+                       return $confirm;
+               } else {
+                       return NULL;
+               }
+       }
+
        function handle_post() {
 
-               $jabber = $this->trimmed('jabber');
+               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() {
+
                $jabbernotify = $this->boolean('jabbernotify');
                $updatefrompresence = $this->boolean('updatefrompresence');
 
-               # Some validation
-               
-               if ($jabber) {
-                       $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 ($this->jabber_exists($jabber)) {
-                           $this->show_form(_('Jabber ID already belongs to another user.'));
-                           return;
-                       }
-               }
-
                $user = common_current_user();
 
                assert(!is_null($user)); # should already be checked
@@ -90,11 +127,11 @@ class ImsettingsAction extends SettingsAction {
                $user->query('BEGIN');
 
                $original = clone($user);
-               
+
                $user->jabbernotify = $jabbernotify;
                $user->updatefrompresence = $updatefrompresence;
 
-               $result = $user->update($original); # For key columns
+               $result = $user->update($original);
 
                if ($result === FALSE) {
                        common_log_db_error($user, 'UPDATE', __FILE__);
@@ -102,58 +139,120 @@ class ImsettingsAction extends SettingsAction {
                        return;
                }
 
-               $confirmation_sent = false;
-               
+               $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...?
+
                if ($user->jabber != $jabber) {
-                       
-                       if ($jabber) {
-                       $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
-                               
-                               jabber_confirm_address($confirm->code,
-                                                                          $user->nickname,
-                                                                          $jabber);
-                                                                          
-                               if ($result === FALSE) {
-                                       common_log_db_error($confirm, 'INSERT', __FILE__);
-                                       common_server_error(_t('Couldnt insert confirmation code.'));
-                                       return;
-                               }
-                               
-                               $confirmation_sent = false;
-                       } else {
-                               # Clearing the ID is free
-                               $user->jabber = NULL;
-                               $result = $user->updateKeys($original);
-                               if ($result === FALSE) {
-                                       common_log_db_error($user, 'UPDATE', __FILE__);
-                                       common_server_error(_t('Couldnt update user.'));
-                                       return;
-                               }
-                       }
+                   $this->show_form(_t('That is not your Jabber ID.'));
+                   return;
+               }
+
+               $user->query('BEGIN');
+               $user->jabber = NULL;
+               $result = $user->updateKeys($original);
+               if ($result === FALSE) {
+                       common_log_db_error($user, 'UPDATE', __FILE__);
+                       common_server_error(_t('Couldnt update user.'));
+                       return;
                }
-               
                $user->query('COMMIT');
 
-        $msg = ($confirmation_sent) ? 
-                                 _t('Settings saved. A confirmation code was ' .
-                                    ' sent to the IM address you added. ') :
-                                 _t('Settings saved.');
-                                 
-               $this->show_form($msg, TRUE);
+               # Unsubscribe to the old address
+
+               jabber_special_presence('unsubscribe', $jabber);
+
+               $this->show_form(_t('The address was removed.'), TRUE);
        }
 
        function jabber_exists($jabber) {
index 340264cc2cfdc45858520eaefc35d5f6e8e1ca95..6ae3af20832efbc9b66e4e7a219b939637c7a2db 100644 (file)
@@ -81,22 +81,15 @@ function jabber_send_presence($status, $show='available', $to=Null) {
 }
 
 function jabber_confirm_address($code, $nickname, $address) {
-
-       # Fire off a subscription, just in case
-
-       jabber_special_presence('subscribe', $address);
-
-       # Hopefully this goes through if we're not already subscribed
-
        $body = 'User "' . $nickname . '" on ' . common_config('site', 'name') . ' ' .
                        'has said that your Jabber ID belongs to them. ' .
-               'If that\'s true, you can confirm by clicking on this URL: ' .
-               common_local_url('confirmaddress', array('code' => $code)) .
-               ' . (If you cannot click it, copy-and-paste it into the ' .
-               'address bar of your browser). If that user isn\'t you, ' .
-               'or if you didn\'t request this confirmation, just ignore this message.';
+           'If that\'s true, you can confirm by clicking on this URL: ' .
+               common_local_url('confirmaddress', array('code' => $code)) .
+               ' . (If you cannot click it, copy-and-paste it into the ' .
+               'address bar of your browser). If that user isn\'t you, ' .
+               'or if you didn\'t request this confirmation, just ignore this message.';
 
-       jabber_send_message($address, $body);
+               jabber_send_message($address, $body);
 }
 
 function jabber_special_presence($type, $to=NULL, $show=NULL, $status=NULL) {
index 4e318a7702eed4c48e42f56c430d291279c2a4b5..ccaf53123f1ec39fed6834dd61af7a4fe8e6c79b 100644 (file)
@@ -322,6 +322,7 @@ function common_input($id, $label, $value=NULL,$instructions=NULL) {
 function common_checkbox($id, $label, $instructions=NULL, $value='true')
 {
        common_element_start('p');
+       common_element('label', array('for' => $id), $label);
        $attrs = array('name' => $id,
                                   'type' => 'checkbox',
                                   'id' => $id,
@@ -330,7 +331,6 @@ function common_checkbox($id, $label, $instructions=NULL, $value='true')
                $attrs['value'] = htmlspecialchars($value);
        }
        common_element('input', $attrs);
-       common_element('label', array('for' => $id), $label);
        if ($instructions) {
                common_element('span', 'input_instructions', $instructions);
        }
index 1a77c4340af1d5310be1c1eb3cf8b120805c7c2f..3f2b575e4955a11d51ccc02daf54f410f7e2ae27 100755 (executable)
@@ -88,6 +88,22 @@ class XMPPDaemon {
                }
        }
 
+       function get_user($from) {
+               $user = User::staticGet('jabber', jabber_normalize_jid($from));
+               return $user;
+       }
+
+       function get_confirmation($from) {
+               $confirm = new Confirm_address();
+               $confirm->address = $from;
+               $confirm->address_type = 'jabber';
+               if ($confirm->find(TRUE)) {
+                       return $confirm;
+               } else {
+                       return NULL;
+               }
+       }
+
        function handle_message(&$pl) {
                if ($pl['type'] != 'chat') {
                        return;
@@ -95,8 +111,6 @@ class XMPPDaemon {
                if (strlen($pl['body']) == 0) {
                        return;
                }
-               $from = jabber_normalize_jid($pl['from']);
-               $user = User::staticGet('jabber', $from);
                if (!$user) {
                        $this->log(LOG_WARNING, 'Message from unknown user ' . $from);
                        return;
@@ -180,8 +194,31 @@ class XMPPDaemon {
                                   'Accepted subscription from ' . $from);
                                break;
                        case 'subscribed':
-                       case 'unsubscribe':
+                               $confirm = $this->get_confirmation($from);
+                               if ($confirm) {
+                                       $user = User::staticGet($confirm->user_id);
+                                       if ($user) {
+                                               jabber_confirm_address($confirm->code,
+                                                                      $user->nickname,
+                                                                      $confirm->address);
+                                       } else {
+                                               $this->log(LOG_WARNING,
+                                                       'got unexpected subscribed message from ' . $from);
+                                       }
+                               }
                        case 'unsubscribed':
+                               $user = $this->get_user($from);
+                               if ($user) {
+                                       $this->set_notify($user, false);
+                               }
+
+                               $confirm = $this->get_confirmation($from);
+                               if ($confirm) {
+                                       $user = User::staticGet($confirm->user_id);
+                                       if ($user) {
+                                       }
+                               }
+                       case 'unsubscribe':
                                $this->log(LOG_INFO,
                                   'Ignoring  "' . $pl['type'] . '" from ' . $from);
                                break;