]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/OpenID/actions/openidsettings.php
[OpenID] s/sync/synch
[quix0rs-gnu-social.git] / plugins / OpenID / actions / openidsettings.php
index 8849cf670ed540d03ddd9209b1886a0fa38afdc7..ccfda637996e47e05569498c127ab6f1097cbcb0 100644 (file)
@@ -27,7 +27,7 @@
  * @link      http://status.net/
  */
 
-if (!defined('STATUSNET')) {
+if (!defined('GNUSOCIAL')) {
     exit(1);
 }
 
@@ -51,10 +51,10 @@ class OpenidsettingsAction extends SettingsAction
      *
      * @return string Page title
      */
-    function title()
+    public function title()
     {
         // TRANS: Title of OpenID settings page for a user.
-        return _m('TITLE','OpenID settings');
+        return _m('TITLE', 'OpenID settings');
     }
 
     /**
@@ -62,16 +62,16 @@ class OpenidsettingsAction extends SettingsAction
      *
      * @return string Instructions for use
      */
-    function getInstructions()
+    public function getInstructions()
     {
         // TRANS: Form instructions for OpenID settings.
         // TRANS: This message contains Markdown links in the form [description](link).
         return _m('[OpenID](%%doc.openid%%) lets you log into many sites ' .
-                 'with the same user account. '.
-                 'Manage your associated OpenIDs from here.');
+                  'with the same user account. '.
+                  'Manage your associated OpenIDs from here.');
     }
 
-    function showScripts()
+    public function showScripts()
     {
         parent::showScripts();
         $this->autofocus('openid_url');
@@ -84,83 +84,97 @@ class OpenidsettingsAction extends SettingsAction
      *
      * @return void
      */
-    function showContent()
+    public function showContent()
     {
-        $user = common_current_user();
-
         if (!common_config('openid', 'trusted_provider')) {
-            $this->elementStart('form', array('method' => 'post',
-                                              'id' => 'form_settings_openid_add',
-                                              'class' => 'form_settings',
-                                              'action' =>
-                                              common_local_url('openidsettings')));
-            $this->elementStart('fieldset', array('id' => 'settings_openid_add'));
+            $this->elementStart('form', ['method' => 'post',
+                                         'id' => 'form_settings_openid_add',
+                                         'class' => 'form_settings',
+                                         'action' =>
+                                         common_local_url('openidsettings')]);
+            $this->elementStart('fieldset', ['id' => 'settings_openid_add']);
     
             // TRANS: Fieldset legend.
-            $this->element('legend', null, _m('LEGEND','Add OpenID'));
+            $this->element('legend', null, _m('LEGEND', 'Add OpenID'));
             $this->hidden('token', common_session_token());
             $this->elementStart('ul', 'form_data');
             $this->elementStart('li');
             // TRANS: Field label.
             $this->input('openid_url', _m('OpenID URL'), null,
-                        // TRANS: Form guide.
-                        _m('An OpenID URL which identifies you.'), null, true,
-                        array('placeholder'=>'https://example.com/you'));
+                         // TRANS: Form guide.
+                         _m('An OpenID URL which identifies you.'),
+                         null, true,
+                         ['placeholder'=>'https://example.com/you']);
+            $this->elementEnd('li');
+            $this->elementStart('li');
+            // TRANS: Field label.
+            $this->checkbox('openid-synch', _m('Synchronize Account'), false,
+                            // TRANS: Form guide.
+                            _m('Synchronize GNU social profile with this OpenID identity.'));
             $this->elementEnd('li');
             $this->elementEnd('ul');
             // TRANS: Button text for adding an OpenID URL.
-            $this->submit('settings_openid_add_action-submit', _m('BUTTON','Add'), 'submit', 'add');
+            $this->submit('settings_openid_add_action-submit', _m('BUTTON', 'Add'), 'submit', 'add');
             $this->elementEnd('fieldset');
             $this->elementEnd('form');
         }
         $oid = new User_openid();
 
-        $oid->user_id = $user->id;
+        $oid->user_id = $this->scoped->getID();
 
         $cnt = $oid->find();
 
         if ($cnt > 0) {
             // TRANS: Header on OpenID settings page.
-            $this->element('h2', null, _m('HEADER','Remove OpenID'));
-
-            if ($cnt == 1 && !$user->password) {
-
+            $this->element('h2', null, _m('HEADER', 'OpenID Actions'));
+            
+            if ($cnt == 1 && !$this->scoped->hasPassword()) {
                 $this->element('p', 'form_guide',
                                // TRANS: Form guide.
-                               _m('Removing your only OpenID '.
-                                 'would make it impossible to log in! ' .
-                                 'If you need to remove it, '.
-                                 'add another OpenID first.'));
+                               _m('You can\'t remove your main OpenID account ' .
+                                  'without either adding a password to your ' .
+                                  'GNU social account or another OpenID account. ' .
+                                  'You can synchronize your profile with your ' .
+                                  'OpenID by clicking the button labeled "Synchronize".'));
 
                 if ($oid->fetch()) {
-                    $this->elementStart('p');
-                    $this->element('a', array('href' => $oid->canonical),
-                                   $oid->display);
-                    $this->elementEnd('p');
+                    $this->elementStart('form', ['method' => 'POST',
+                                                 'id' => 'form_settings_openid_actions' . $idx,
+                                                 'class' => 'form_settings',
+                                                 'action' => common_local_url('openidsettings')]);
+                    $this->elementStart('fieldset');
+                    $this->hidden('token', common_session_token());
+                    $this->element('a', ['href' => $oid->canonical], $oid->display);
+                    $this->hidden("openid_url", $oid->canonical);
+                    // TRANS: Button text to synchronize OpenID with the GS profile.
+                    $this->submit("synch", _m('BUTTON', 'Synchronize'), 'submit synch');
+                    $this->elementEnd('fieldset');
+                    $this->elementEnd('form');
                 }
-
             } else {
-
                 $this->element('p', 'form_guide',
                                // TRANS: Form guide.
-                               _m('You can remove an OpenID from your account '.
-                                 'by clicking the button marked "Remove".'));
+                               _m('You can remove an OpenID from your account ' .
+                                  'by clicking the button labeled "Remove". ' .
+                                  'You can synchronize your profile with an OpenID ' .
+                                  'by clicking the button labeled "Synchronize".'));
                 $idx = 0;
 
                 while ($oid->fetch()) {
-                    $this->elementStart('form',
-                                        array('method' => 'POST',
-                                              'id' => 'form_settings_openid_delete' . $idx,
-                                              'class' => 'form_settings',
-                                              'action' =>
-                                              common_local_url('openidsettings')));
+                    $this->elementStart('form', ['method' => 'POST',
+                                                 'id' => 'form_settings_openid_actions' . $idx,
+                                                 'class' => 'form_settings',
+                                                 'action' => common_local_url('openidsettings')]);
                     $this->elementStart('fieldset');
                     $this->hidden('token', common_session_token());
-                    $this->element('a', array('href' => $oid->canonical),
-                                   $oid->display);
+                    $this->element('a', ['href' => $oid->canonical], $oid->display);
                     $this->hidden("openid_url{$idx}", $oid->canonical, 'openid_url');
+                    $this->elementStart('span', ['class' => 'element_actions']);
+                    // TRANS: Button text to sync an OpenID with the GS profile.
+                    $this->submit("synch{$idx}", _m('BUTTON', 'Synchronize'), 'submit', 'synch');
                     // TRANS: Button text to remove an OpenID.
-                    $this->submit("remove{$idx}", _m('BUTTON','Remove'), 'submit remove', 'remove');
+                    $this->submit("remove{$idx}", _m('BUTTON', 'Remove'), 'submit', 'remove');
+                    $this->elementEnd('span');
                     $this->elementEnd('fieldset');
                     $this->elementEnd('form');
                     $idx++;
@@ -168,49 +182,51 @@ class OpenidsettingsAction extends SettingsAction
             }
         }
 
-        $this->elementStart('form', array('method' => 'post',
-                                          'id' => 'form_settings_openid_trustroots',
-                                          'class' => 'form_settings',
-                                          'action' =>
-                                          common_local_url('openidsettings')));
-        $this->elementStart('fieldset', array('id' => 'settings_openid_trustroots'));
+        $this->elementStart('form', ['method' => 'post',
+                                     'id' => 'form_settings_openid_trustroots',
+                                     'class' => 'form_settings',
+                                     'action' =>
+                                     common_local_url('openidsettings')]);
+        $this->elementStart('fieldset', ['id' => 'settings_openid_trustroots']);
         // TRANS: Fieldset legend.
         $this->element('legend', null, _m('OpenID Trusted Sites'));
         $this->hidden('token', common_session_token());
         $this->element('p', 'form_guide',
                        // TRANS: Form guide.
                        _m('The following sites are allowed to access your ' .
-                       'identity and log you in. You can remove a site from ' .
-                       'this list to deny it access to your OpenID.'));
+                          'identity and log you in. You can remove a site from ' .
+                          'this list to deny it access to your OpenID.'));
         $this->elementStart('ul', 'form_data');
         $user_openid_trustroot = new User_openid_trustroot();
-        $user_openid_trustroot->user_id=$user->id;
-        if($user_openid_trustroot->find()) {
-            while($user_openid_trustroot->fetch()) {
+        $user_openid_trustroot->user_id = $this->scoped->getID();
+        if ($user_openid_trustroot->find()) {
+            while ($user_openid_trustroot->fetch()) {
                 $this->elementStart('li');
-                $this->element('input', array('name' => 'openid_trustroot[]',
-                                              'type' => 'checkbox',
-                                              'class' => 'checkbox',
-                                              'value' => $user_openid_trustroot->trustroot,
-                                              'id' => 'openid_trustroot_' . crc32($user_openid_trustroot->trustroot)));
-                $this->element('label', array('class'=>'checkbox', 'for' => 'openid_trustroot_' . crc32($user_openid_trustroot->trustroot)),
+                $this->element('input', ['name' => 'openid_trustroot[]',
+                                         'type' => 'checkbox',
+                                         'class' => 'checkbox',
+                                         'value' => $user_openid_trustroot->trustroot,
+                                         'id' => 'openid_trustroot_' . crc32($user_openid_trustroot->trustroot)]);
+                $this->element('label',
+                               ['class'=>'checkbox',
+                                'for' => 'openid_trustroot_' . crc32($user_openid_trustroot->trustroot)],
                                $user_openid_trustroot->trustroot);
                 $this->elementEnd('li');
             }
         }
         $this->elementEnd('ul');
         // TRANS: Button text to remove an OpenID trustroot.
-        $this->submit('settings_openid_trustroots_action-submit', _m('BUTTON','Remove'), 'submit', 'remove_trustroots');
+        $this->submit('settings_openid_trustroots_action-submit', _m('BUTTON', 'Remove'), 'submit', 'remove_trustroots');
         $this->elementEnd('fieldset');
         
-        $prefs = User_openid_prefs::getKV('user_id', $user->id);
+        $prefs = User_openid_prefs::getKV('user_id', $this->scoped->getID());
 
         $this->elementStart('fieldset');
-        $this->element('legend', null, _m('LEGEND','Preferences'));
+        $this->element('legend', null, _m('LEGEND', 'Preferences'));
         $this->elementStart('ul', 'form_data');
         $this->checkbox('hide_profile_link', "Hide OpenID links from my profile", !empty($prefs) && $prefs->hide_profile_link);
         // TRANS: Button text to save OpenID prefs
-        $this->submit('settings_openid_prefs_save', _m('BUTTON','Save'), 'submit', 'save_prefs');
+        $this->submit('settings_openid_prefs_save', _m('BUTTON', 'Save'), 'submit', 'save_prefs');
         $this->elementEnd('ul');
         $this->elementEnd('fieldset');
 
@@ -224,38 +240,35 @@ class OpenidsettingsAction extends SettingsAction
      *
      * @return void
      */
-    function handlePost()
+    protected function doPost()
     {
-        // CSRF protection
-        $token = $this->trimmed('token');
-        if (!$token || $token != common_session_token()) {
-            // TRANS: Client error displayed when the session token does not match or is not given.
-            $this->showForm(_m('There was a problem with your session token. '.
-                              'Try again, please.'));
-            return;
-        }
-
         if ($this->arg('add')) {
             if (common_config('openid', 'trusted_provider')) {
                 // TRANS: Form validation error if no OpenID providers can be added.
-                $this->showForm(_m('Cannot add new providers.'));
+                throw new ServerException(_m('Cannot add new providers.'));
             } else {
-                $result = oid_authenticate($this->trimmed('openid_url'),
-                                           'finishaddopenid');
+                common_ensure_session();
+                $_SESSION['openid_synch'] = $this->boolean('openid-synch');
+                
+                $result = oid_authenticate($this->trimmed('openid_url'), 'finishaddopenid');
                 if (is_string($result)) { // error message
-                    $this->showForm($result);
+                    unset($_SESSION['openid-synch']);
+                    throw new ServerException($result);
                 }
+                return _('Added new provider.');
             }
-        } else if ($this->arg('remove')) {
-            $this->removeOpenid();
-        } else if($this->arg('remove_trustroots')) {
-            $this->removeTrustroots();
-        } else if($this->arg('save_prefs')) {
-            $this->savePrefs();
-        } else {
-            // TRANS: Unexpected form validation error.
-            $this->showForm(_m('Something weird happened.'));
+        } elseif ($this->arg('remove')) {
+            return $this->removeOpenid();
+        } elseif ($this->arg('synch')) {
+            return $this->synchOpenid();
+        } elseif ($this->arg('remove_trustroots')) {
+            return $this->removeTrustroots();
+        } elseif ($this->arg('save_prefs')) {
+            return $this->savePrefs();
         }
+
+        // TRANS: Unexpected form validation error.
+        throw new ServerException(_m('No known action for POST.'));
     }
 
     /**
@@ -266,28 +279,23 @@ class OpenidsettingsAction extends SettingsAction
      *
      * @return void
      */
-    function removeTrustroots()
+    public function removeTrustroots()
     {
-        $user = common_current_user();
-        $trustroots = $this->arg('openid_trustroot');
-        if($trustroots) {
-            foreach($trustroots as $trustroot) {
-                $user_openid_trustroot = User_openid_trustroot::pkeyGet(
-                                                array('user_id'=>$user->id, 'trustroot'=>$trustroot));
-                if($user_openid_trustroot) {
-                    $user_openid_trustroot->delete();
-                } else {
-                    // TRANS: Form validation error when trying to remove a non-existing trustroot.
-                    $this->showForm(_m('No such OpenID trustroot.'));
-                    return;
-                }
+        $trustroots = $this->arg('openid_trustroot', []);
+        foreach ($trustroots as $trustroot) {
+            $user_openid_trustroot = User_openid_trustroot::pkeyGet(
+                ['user_id'=>$this->scoped->getID(), 'trustroot'=>$trustroot]
+            );
+            if ($user_openid_trustroot) {
+                $user_openid_trustroot->delete();
+            } else {
+                // TRANS: Form validation error when trying to remove a non-existing trustroot.
+                throw new ClientException(_m('No such OpenID trustroot.'));
             }
-            // TRANS: Success message after removing trustroots.
-            $this->showForm(_m('Trustroots removed.'), true);
-        } else {
-            $this->showForm();
         }
-        return;
+
+        // TRANS: Success message after removing trustroots.
+        return _m('Trustroots removed.');
     }
 
     /**
@@ -298,27 +306,41 @@ class OpenidsettingsAction extends SettingsAction
      *
      * @return void
      */
-    function removeOpenid()
+    public function removeOpenid()
     {
-        $openid_url = $this->trimmed('openid_url');
+        $oid = User_openid::getKV('canonical', $this->trimmed('openid_url'));
 
-        $oid = User_openid::getKV('canonical', $openid_url);
-
-        if (!$oid) {
+        if (!$oid instanceof User_openid) {
             // TRANS: Form validation error for a non-existing OpenID.
-            $this->showForm(_m('No such OpenID.'));
-            return;
+            throw new ClientException(_m('No such OpenID.'));
         }
-        $cur = common_current_user();
-        if (!$cur || $oid->user_id != $cur->id) {
+        if ($this->scoped->getID() != $oid->user_id) {
             // TRANS: Form validation error if OpenID is connected to another user.
-            $this->showForm(_m('That OpenID does not belong to you.'));
-            return;
+            throw new ClientException(_m('That OpenID does not belong to you.'));
         }
         $oid->delete();
         // TRANS: Success message after removing an OpenID.
-        $this->showForm(_m('OpenID removed.'), true);
-        return;
+        return _m('OpenID removed.');
+    }
+
+    /**
+     * Handles a request to synch an OpenID to the user's profile
+     *
+     * @return void
+     */
+    public function synchOpenid()
+    {
+        $oid = User_openid::getKV('canonical', $this->trimmed('openid_url'));
+
+        if (!$oid instanceof User_openid) {
+            throw new ClientException(_m('No such OpenID.'));
+        }
+        
+        $result = oid_authenticate($this->trimmed('openid_url'), 'finishsynchopenid');
+        if (is_string($result)) { // error message
+            throw new ServerException($result);
+        }
+        return _m('Synchronized OpenID.');
     }
 
     /**
@@ -329,34 +351,27 @@ class OpenidsettingsAction extends SettingsAction
      *
      * @return void
      */
-    function savePrefs()
+    public function savePrefs()
     {
-        $cur = common_current_user();
-
-        if (empty($cur)) {
-            throw new ClientException(_("Not logged in."));
-        }
-
         $orig  = null;
-        $prefs = User_openid_prefs::getKV('user_id', $cur->id);
+        $prefs = User_openid_prefs::getKV('user_id', $this->scoped->getID());
 
-        if (empty($prefs)) {
+        if (!$prefs instanceof User_openid_prefs) {
             $prefs          = new User_openid_prefs();
-            $prefs->user_id = $cur->id;
+            $prefs->user_id = $this->scoped->getID();
             $prefs->created = common_sql_now();
         } else {
             $orig = clone($prefs);
         }
 
-        $prefs->hide_profile_link = $this->boolean('hide_profile_link');
+        $prefs->hide_profile_link = $this->booleanintstring('hide_profile_link');
 
-        if (empty($orig)) {
-            $prefs->insert();
-        } else {
+        if ($orig instanceof User_openid_prefs) {
             $prefs->update($orig);
+        } else {
+            $prefs->insert();
         }
 
-        $this->showForm(_m('OpenID preferences saved.'), true);
-        return;
+        return _m('OpenID preferences saved.');
     }
 }