]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - actions/imsettings.php
Merge branch 'configure-docs' into 'nightly'
[quix0rs-gnu-social.git] / actions / imsettings.php
index eb3f0cfd1543b901bdbf393496646db8ea75e973..40bea10e68b462fa3dc5dffe2709dbfb587e85c3 100644 (file)
  * @link      http://status.net/
  */
 
-if (!defined('STATUSNET') && !defined('LACONICA')) {
-    exit(1);
-}
-
-require_once INSTALLDIR.'/lib/connectsettingsaction.php';
-require_once INSTALLDIR.'/lib/jabber.php';
+if (!defined('GNUSOCIAL')) { exit(1); }
 
 /**
  * Settings for Jabber/XMPP integration
@@ -45,7 +40,8 @@ require_once INSTALLDIR.'/lib/jabber.php';
  *
  * @see      SettingsAction
  */
-class ImsettingsAction extends ConnectSettingsAction
+
+class ImsettingsAction extends SettingsAction
 {
     /**
      * Title of the page
@@ -69,8 +65,8 @@ class ImsettingsAction extends ConnectSettingsAction
         // TRANS: [instant messages] is link text, "(%%doc.im%%)" is the link.
         // TRANS: the order and formatting of link text and link should remain unchanged.
         return _('You can send and receive notices through '.
-                 'Jabber/Google Talk [instant messages](%%doc.im%%). '.
-                 'Configure your address and settings below.');
+                 '[instant messaging](%%doc.im%%). '.
+                 'Configure your addresses and settings below.');
     }
 
     /**
@@ -84,105 +80,124 @@ class ImsettingsAction extends ConnectSettingsAction
      */
     function showContent()
     {
-        if (!common_config('xmpp', 'enabled')) {
+        $transports = array();
+        Event::handle('GetImTransports', array(&$transports));
+        if (! $transports) {
             $this->element('div', array('class' => 'error'),
-                           // TRANS: Message given in the Instant Messaging settings if XMPP is not enabled on the site.
+                           // TRANS: Message given in the IM settings if IM is not enabled on the site.
                            _('IM is not available.'));
             return;
         }
 
         $user = common_current_user();
-        $this->elementStart('form', array('method' => 'post',
-                                          'id' => 'form_settings_im',
-                                          'class' => 'form_settings',
-                                          'action' =>
-                                          common_local_url('imsettings')));
-        $this->elementStart('fieldset', array('id' => 'settings_im_address'));
-        // TRANS: Form legend for Instant Messaging settings form.
-        $this->element('legend', null, _('IM address'));
-        $this->hidden('token', common_session_token());
-
-        if ($user->jabber) {
-            $this->element('p', 'form_confirmed', $user->jabber);
-            // TRANS: Form note in Instant Messaging settings form.
-            $this->element('p', 'form_note',
-                           _('Current confirmed Jabber/Google Talk address.'));
-            $this->hidden('jabber', $user->jabber);
-            // TRANS: Button label to remove a confirmed Instant Messaging address.
-            $this->submit('remove', _m('BUTTON','Remove'));
-        } else {
-            $confirm = $this->getConfirmation();
-            if ($confirm) {
-                $this->element('p', 'form_unconfirmed', $confirm->address);
+
+        $user_im_prefs_by_transport = array();
+        
+        foreach($transports as $transport=>$transport_info)
+        {
+            $this->elementStart('form', array('method' => 'post',
+                                              'id' => 'form_settings_im',
+                                              'class' => 'form_settings',
+                                              'action' =>
+                                              common_local_url('imsettings')));
+            $this->elementStart('fieldset', array('id' => 'settings_im_address'));
+            // TRANS: Form legend for IM settings form.
+            $this->element('legend', null, $transport_info['display']);
+            $this->hidden('token', common_session_token());
+            $this->hidden('transport', $transport);
+
+            if ($user_im_prefs = User_im_prefs::pkeyGet( array('transport' => $transport, 'user_id' => $user->id) )) {
+                $user_im_prefs_by_transport[$transport] = $user_im_prefs;
+                $this->element('p', 'form_confirmed', $user_im_prefs->screenname);
                 $this->element('p', 'form_note',
-                               // TRANS: Form note in Instant Messaging settings form.
-                               // TRANS: %s is the Instant Messaging address set for the site.
-                               sprintf(_('Awaiting confirmation on this address. '.
-                                         'Check your Jabber/Google Talk account for a '.
-                                         'message with further instructions. '.
-                                         '(Did you add %s to your buddy list?)'),
-                                       jabber_daemon_address()));
-                $this->hidden('jabber', $confirm->address);
-                // TRANS: Button label to cancel an Instant Messaging address confirmation procedure.
-                $this->submit('cancel', _m('BUTTON','Cancel'));
+                               // TRANS: Form note in IM settings form. %s is the type of IM address that was confirmed.
+                               sprintf(_('Current confirmed %s address.'),$transport_info['display']));
+                $this->hidden('screenname', $user_im_prefs->screenname);
+                // TRANS: Button label to remove a confirmed IM address.
+                $this->submit('remove', _m('BUTTON','Remove'));
             } else {
-                $this->elementStart('ul', 'form_data');
-                $this->elementStart('li');
-                // TRANS: Field label for Instant Messaging address input in Instant Messaging settings form.
-                $this->input('jabber', _('IM address'),
-                             ($this->arg('jabber')) ? $this->arg('jabber') : null,
-                             // TRANS: IM address input field instructions in Instant Messaging settings form.
-                             // TRANS: %s is the Instant Messaging address set for the site.
-                             // TRANS: Do not translate "example.org". It is one of the domain names reserved for use in examples by
-                             // TRANS: http://www.rfc-editor.org/rfc/rfc2606.txt. Any other domain may be owned by a legitimate
-                             // TRANS: person or organization.
-                             sprintf(_('Jabber or Google Talk address, '.
-                                       'like "UserName@example.org". '.
-                                       'First, make sure to add %s to your '.
-                                       'buddy list in your IM client or on Google Talk.'),
-                                     jabber_daemon_address()));
-                $this->elementEnd('li');
-                $this->elementEnd('ul');
-                // TRANS: Button label for adding an Instant Messaging address in Instant Messaging settings form.
-                $this->submit('add', _m('BUTTON','Add'));
+                try {
+                    $confirm = $this->getConfirmation($transport);
+                    $this->element('p', 'form_unconfirmed', $confirm->address);
+                    // TRANS: Form note in IM settings form.
+                    $this->element('p', 'form_note',
+                                   // TRANS: Form note in IM settings form.
+                                   // TRANS: %s is the IM service name, %2$s is the IM address set.
+                                   sprintf(_('Awaiting confirmation on this address. '.
+                                             'Check your %1$s account for a '.
+                                             'message with further instructions. '.
+                                             '(Did you add %2$s to your buddy list?)'),
+                                             $transport_info['display'],
+                                             $transport_info['daemonScreenname']));
+                    $this->hidden('screenname', $confirm->address);
+                    // TRANS: Button label to cancel an IM address confirmation procedure.
+                    $this->submit('cancel', _m('BUTTON','Cancel'));
+                } catch (NoResultException $e) {
+                    $this->elementStart('ul', 'form_data');
+                    $this->elementStart('li');
+                    // TRANS: Field label for IM address.
+                    $this->input('screenname', _('IM address'),
+                                 ($this->arg('screenname')) ? $this->arg('screenname') : null,
+                                 // TRANS: Field title for IM address. %s is the IM service name.
+                                 sprintf(_('%s screenname.'),
+                                         $transport_info['display']));
+                    $this->elementEnd('li');
+                    $this->elementEnd('ul');
+                    // TRANS: Button label for adding an IM address in IM settings form.
+                    $this->submit('add', _m('BUTTON','Add'));
+                }
+            }
+            $this->elementEnd('fieldset');
+            $this->elementEnd('form');
+        }
+
+        if($user_im_prefs_by_transport)
+        {
+            $this->elementStart('form', array('method' => 'post',
+                                              'id' => 'form_settings_im',
+                                              'class' => 'form_settings',
+                                              'action' =>
+                                              common_local_url('imsettings')));
+            $this->elementStart('fieldset', array('id' => 'settings_im_preferences'));
+            // TRANS: Header for IM preferences form.
+            $this->element('legend', null, _('IM Preferences'));
+            $this->hidden('token', common_session_token());
+            $this->elementStart('table');
+            $this->elementStart('tr');
+            foreach($user_im_prefs_by_transport as $transport=>$user_im_prefs)
+            {
+                $this->element('th', null, $transports[$transport]['display']);
+            }
+            $this->elementEnd('tr');
+            $preferences = array(
+                // TRANS: Checkbox label in IM preferences form.
+                array('name'=>'notify', 'description'=>_('Send me notices')),
+                // TRANS: Checkbox label in IM preferences form.
+                array('name'=>'updatefrompresence', 'description'=>_('Post a notice when my status changes.')),
+                // TRANS: Checkbox label in IM preferences form.
+                array('name'=>'replies', 'description'=>_('Send me replies '.
+                              'from people I\'m not subscribed to.')),
+            );
+            foreach($preferences as $preference)
+            {
+                $this->elementStart('tr');
+                foreach($user_im_prefs_by_transport as $transport=>$user_im_prefs)
+                {
+                    $preference_name = $preference['name'];
+                    $this->elementStart('td');
+                    $this->checkbox($transport . '_' . $preference['name'],
+                                $preference['description'],
+                                $user_im_prefs->$preference_name);
+                    $this->elementEnd('td');
+                }
+                $this->elementEnd('tr');
             }
+            $this->elementEnd('table');
+            // TRANS: Button label to save IM preferences.
+            $this->submit('save', _m('BUTTON','Save'));
+            $this->elementEnd('fieldset');
+            $this->elementEnd('form');
         }
-        $this->elementEnd('fieldset');
-
-        $this->elementStart('fieldset', array('id' => 'settings_im_preferences'));
-        // TRANS: Form legend for Instant Messaging preferences form.
-        $this->element('legend', null, _('IM preferences'));
-        $this->elementStart('ul', 'form_data');
-        $this->elementStart('li');
-        $this->checkbox('jabbernotify',
-                        // TRANS: Checkbox label in Instant Messaging preferences form.
-                        _('Send me notices through Jabber/Google Talk.'),
-                        $user->jabbernotify);
-        $this->elementEnd('li');
-        $this->elementStart('li');
-        $this->checkbox('updatefrompresence',
-                        // TRANS: Checkbox label in Instant Messaging preferences form.
-                        _('Post a notice when my Jabber/Google Talk status changes.'),
-                        $user->updatefrompresence);
-        $this->elementEnd('li');
-        $this->elementStart('li');
-        $this->checkbox('jabberreplies',
-                        // TRANS: Checkbox label in Instant Messaging preferences form.
-                        _('Send me replies through Jabber/Google Talk '.
-                          'from people I\'m not subscribed to.'),
-                        $user->jabberreplies);
-        $this->elementEnd('li');
-        $this->elementStart('li');
-        $this->checkbox('jabbermicroid',
-                        // TRANS: Checkbox label in Instant Messaging preferences form.
-                        _('Publish a MicroID for my Jabber/Google Talk address.'),
-                        $user->jabbermicroid);
-        $this->elementEnd('li');
-        $this->elementEnd('ul');
-        // TRANS: Button label to save Instant Messaging preferences.
-        $this->submit('save', _m('BUTTON','Save'));
-        $this->elementEnd('fieldset');
-        $this->elementEnd('form');
     }
 
     /**
@@ -190,58 +205,37 @@ class ImsettingsAction extends ConnectSettingsAction
      *
      * @return Confirm_address address object for this user
      */
-    function getConfirmation()
+    function getConfirmation($transport)
     {
-        $user = common_current_user();
-
         $confirm = new Confirm_address();
 
-        $confirm->user_id      = $user->id;
-        $confirm->address_type = 'jabber';
+        $confirm->user_id      = $this->scoped->getID();
+        $confirm->address_type = $transport;
 
         if ($confirm->find(true)) {
             return $confirm;
-        } else {
-            return null;
         }
+
+        throw new NoResultException($confirm);
     }
 
-    /**
-     * Handle posts to this form
-     *
-     * Based on the button that was pressed, muxes out to other functions
-     * to do the actual task requested.
-     *
-     * All sub-functions reload the form with a message -- success or failure.
-     *
-     * @return void
-     */
-    function handlePost()
+    protected function doPost()
     {
-        // CSRF protection
-        $token = $this->trimmed('token');
-        if (!$token || $token != common_session_token()) {
-            $this->showForm(_('There was a problem with your session token. '.
-                              'Try again, please.'));
-            return;
-        }
-
         if ($this->arg('save')) {
-            $this->savePreferences();
+            return $this->savePreferences();
         } else if ($this->arg('add')) {
-            $this->addAddress();
+            return $this->addAddress();
         } else if ($this->arg('cancel')) {
-            $this->cancelConfirmation();
+            return $this->cancelConfirmation();
         } else if ($this->arg('remove')) {
-            $this->removeAddress();
-        } else {
-            // TRANS: Message given submitting a form with an unknown action in Instant Messaging settings.
-            $this->showForm(_('Unexpected form submission.'));
+            return $this->removeAddress();
         }
+        // TRANS: Message given submitting a form with an unknown action in Instant Messaging settings.
+        throw new ClientException(_('Unexpected form submission.'));
     }
 
     /**
-     * Save user's Jabber preferences
+     * Save user's XMPP preferences
      *
      * These are the checkboxes at the bottom of the page. They're used to
      * set different settings
@@ -250,87 +244,80 @@ class ImsettingsAction extends ConnectSettingsAction
      */
     function savePreferences()
     {
-        $jabbernotify       = $this->boolean('jabbernotify');
-        $updatefrompresence = $this->boolean('updatefrompresence');
-        $jabberreplies      = $this->boolean('jabberreplies');
-        $jabbermicroid      = $this->boolean('jabbermicroid');
-
-        $user = common_current_user();
-
-        assert(!is_null($user)); // should already be checked
-
-        $user->query('BEGIN');
-
-        $original = clone($user);
-
-        $user->jabbernotify       = $jabbernotify;
-        $user->updatefrompresence = $updatefrompresence;
-        $user->jabberreplies      = $jabberreplies;
-        $user->jabbermicroid      = $jabbermicroid;
-
-        $result = $user->update($original);
-
-        if ($result === false) {
-            common_log_db_error($user, 'UPDATE', __FILE__);
-            // TRANS: Server error thrown on database error updating Instant Messaging preferences.
-            $this->serverError(_('Could not update user.'));
-            return;
+        $user_im_prefs = new User_im_prefs();
+        $user_im_prefs->query('BEGIN');
+        $user_im_prefs->user_id = $this->scoped->getID();
+        if($user_im_prefs->find() && $user_im_prefs->fetch())
+        {
+            $preferences = array('notify', 'updatefrompresence', 'replies');
+            do
+            {
+                $original = clone($user_im_prefs);
+                $new = clone($user_im_prefs);
+                foreach($preferences as $preference)
+                {
+                    $new->$preference = $this->boolean($new->transport . '_' . $preference);
+                }
+                $result = $new->update($original);
+
+                if ($result === false) {
+                    common_log_db_error($user_im_prefs, 'UPDATE', __FILE__);
+                    // TRANS: Server error thrown on database error updating IM preferences.
+                    throw new ServerException(_('Could not update IM preferences.'));
+                }
+            }while($user_im_prefs->fetch());
         }
-
-        $user->query('COMMIT');
-
-        // TRANS: Confirmation message for successful Instant Messaging preferences save.
-        $this->showForm(_('Preferences saved.'), true);
+        $user_im_prefs->query('COMMIT');
+        // TRANS: Confirmation message for successful IM preferences save.
+        return _('Preferences saved.');
     }
 
     /**
      * Sends a confirmation to the address given
      *
      * Stores a confirmation record and sends out a
-     * Jabber message with the confirmation info.
+     * message with the confirmation info.
      *
      * @return void
      */
     function addAddress()
     {
-        $user = common_current_user();
-
-        $jabber = $this->trimmed('jabber');
+        $screenname = $this->trimmed('screenname');
+        $transport = $this->trimmed('transport');
 
         // Some validation
 
-        if (!$jabber) {
-            // TRANS: Message given saving Instant Messaging address without having provided one.
-            $this->showForm(_('No Jabber ID.'));
-            return;
+        if (empty($screenname)) {
+            // TRANS: Message given saving IM address without having provided one.
+            throw new ClientException(_('No screenname.'));
+        }
+
+        if (empty($transport)) {
+            // TRANS: Form validation error when no transport is available setting an IM address.
+            throw new ClientException(_('No transport.'));
         }
 
-        $jabber = jabber_normalize_jid($jabber);
+        Event::handle('NormalizeImScreenname', array($transport, &$screenname));
 
-        if (!$jabber) {
-            // TRANS: Message given saving Instant Messaging address that cannot be normalised.
-            $this->showForm(_('Cannot normalize that Jabber ID.'));
-            return;
+        if (empty($screenname)) {
+            // TRANS: Message given saving IM address that cannot be normalised.
+            throw new ClientException(_('Cannot normalize that screenname.'));
         }
-        if (!jabber_valid_base_jid($jabber, common_config('email', 'domain_check'))) {
-            // TRANS: Message given saving Instant Messaging address that not valid.
-            $this->showForm(_('Not a valid Jabber ID.'));
-            return;
-        } else if ($user->jabber == $jabber) {
-            // TRANS: Message given saving Instant Messaging address that is already set.
-            $this->showForm(_('That is already your Jabber ID.'));
-            return;
-        } else if ($this->jabberExists($jabber)) {
-            // TRANS: Message given saving Instant Messaging address that is already set for another user.
-            $this->showForm(_('Jabber ID already belongs to another user.'));
-            return;
+        $valid = false;
+        Event::handle('ValidateImScreenname', array($transport, $screenname, &$valid));
+        if (!$valid) {
+            // TRANS: Message given saving IM address that not valid.
+            throw new ClientException(_('Not a valid screenname.'));
+        } else if ($this->screennameExists($transport, $screenname)) {
+            // TRANS: Message given saving IM address that is already set for another user.
+            throw new ClientException(_('Screenname already belongs to another user.'));
         }
 
         $confirm = new Confirm_address();
 
-        $confirm->address      = $jabber;
-        $confirm->address_type = 'jabber';
-        $confirm->user_id      = $user->id;
+        $confirm->address      = $screenname;
+        $confirm->address_type = $transport;
+        $confirm->user_id      = $this->scoped->getID();
         $confirm->code         = common_confirmation_code(64);
         $confirm->sent         = common_sql_now();
         $confirm->claimed      = common_sql_now();
@@ -341,22 +328,12 @@ class ImsettingsAction extends ConnectSettingsAction
             common_log_db_error($confirm, 'INSERT', __FILE__);
             // TRANS: Server error thrown on database error adding Instant Messaging confirmation code.
             $this->serverError(_('Could not insert confirmation code.'));
-            return;
         }
 
-        jabber_confirm_address($confirm->code,
-                               $user->nickname,
-                               $jabber);
+        Event::handle('SendImConfirmationCode', array($transport, $screenname, $confirm->code, $this->scoped));
 
-        // TRANS: Message given saving valid Instant Messaging address that is to be confirmed.
-        // TRANS: %s is the Instant Messaging address set for the site.
-        $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());
-
-        $this->showForm($msg, true);
+        // TRANS: Message given saving valid IM address that is to be confirmed.
+        return _('A confirmation code was sent to the IM address you added.');
     }
 
     /**
@@ -368,32 +345,30 @@ class ImsettingsAction extends ConnectSettingsAction
      */
     function cancelConfirmation()
     {
-        $jabber = $this->arg('jabber');
-
-        $confirm = $this->getConfirmation();
-
-        if (!$confirm) {
+        $screenname = $this->trimmed('screenname');
+        $transport = $this->trimmed('transport');
+
+        try {
+            $confirm = $this->getConfirmation($transport);
+            if ($confirm->address != $screenname) {
+                // TRANS: Message given canceling IM address confirmation for the wrong IM address.
+                throw new ClientException(_('That is the wrong IM address.'));
+            }
+        } catch (NoResultException $e) {
             // TRANS: Message given canceling Instant Messaging address confirmation that is not pending.
-            $this->showForm(_('No pending confirmation to cancel.'));
-            return;
-        }
-        if ($confirm->address != $jabber) {
-            // TRANS: Message given canceling Instant Messaging address confirmation for the wrong IM address.
-            $this->showForm(_('That is the wrong IM address.'));
-            return;
+            throw new AlreadyFulfilledException(_('No pending confirmation to cancel.'));
         }
 
         $result = $confirm->delete();
 
-        if (!$result) {
+        if ($result === false) {
             common_log_db_error($confirm, 'DELETE', __FILE__);
-            // TRANS: Server error thrown on database error canceling Instant Messaging address confirmation.
-            $this->serverError(_('Could not delete IM confirmation.'));
-            return;
+            // TRANS: Server error thrown on database error canceling IM address confirmation.
+            throw new ServerException(_('Could not delete confirmation.'));
         }
 
-        // TRANS: Message given after successfully canceling Instant Messaging address confirmation.
-        $this->showForm(_('IM confirmation cancelled.'), true);
+        // TRANS: Message given after successfully canceling IM address confirmation.
+        return _('IM confirmation cancelled.');
     }
 
     /**
@@ -405,60 +380,50 @@ class ImsettingsAction extends ConnectSettingsAction
      */
     function removeAddress()
     {
-        $user = common_current_user();
-
-        $jabber = $this->arg('jabber');
+        $screenname = $this->trimmed('screenname');
+        $transport = $this->trimmed('transport');
 
         // Maybe an old tab open...?
 
-        if ($user->jabber != $jabber) {
-            // TRANS: Message given trying to remove an Instant Messaging address that is not
+        $user_im_prefs = new User_im_prefs();
+        $user_im_prefs->user_id = $this->scoped->getID();
+        $user_im_prefs->transport = $transport;
+        if (!$user_im_prefs->find(true)) {
+            // TRANS: Message given trying to remove an IM address that is not
             // TRANS: registered for the active user.
-            $this->showForm(_('That is not your Jabber ID.'));
-            return;
+            throw new AlreadyFulfilledException(_('There were no preferences stored for this transport.'));
         }
 
-        $user->query('BEGIN');
-
-        $original = clone($user);
-
-        $user->jabber = null;
+        $result = $user_im_prefs->delete();
 
-        $result = $user->updateKeys($original);
-
-        if (!$result) {
-            common_log_db_error($user, 'UPDATE', __FILE__);
-            // TRANS: Server error thrown on database error removing a registered Instant Messaging address.
-            $this->serverError(_('Could not update user.'));
-            return;
+        if ($result === false) {
+            common_log_db_error($user_im_prefs, 'UPDATE', __FILE__);
+            // TRANS: Server error thrown on database error removing a registered IM address.
+            throw new ServerException(_('Could not update user IM preferences.'));
         }
-        $user->query('COMMIT');
 
         // XXX: unsubscribe to the old address
 
         // TRANS: Message given after successfully removing a registered Instant Messaging address.
-        $this->showForm(_('The IM address was removed.'), true);
+        return _('The IM address was removed.');
     }
 
     /**
-     * Does this Jabber ID exist?
+     * Does this screenname exist?
      *
      * Checks if we already have another user with this address.
      *
-     * @param string $jabber Address to check
+     * @param string $transport Transport to check
+     * @param string $screenname Screenname to check
      *
-     * @return boolean whether the Jabber ID exists
+     * @return boolean whether the screenname exists
      */
-    function jabberExists($jabber)
-    {
-        $user = common_current_user();
-
-        $other = User::staticGet('jabber', $jabber);
 
-        if (!$other) {
-            return false;
-        } else {
-            return $other->id != $user->id;
-        }
+    function screennameExists($transport, $screenname)
+    {
+        $user_im_prefs = new User_im_prefs();
+        $user_im_prefs->transport = $transport;
+        $user_im_prefs->screenname = $screenname;
+        return $user_im_prefs->find(true) ? true : false;
     }
 }