]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Facebook SSO - new settings page
authorZach Copley <zach@status.net>
Tue, 2 Nov 2010 01:41:31 +0000 (01:41 +0000)
committerZach Copley <zach@status.net>
Tue, 2 Nov 2010 01:41:31 +0000 (01:41 +0000)
plugins/FacebookSSO/FacebookSSOPlugin.php
plugins/FacebookSSO/facebooklogin.php
plugins/FacebookSSO/facebooksettings.php [new file with mode: 0644]

index f4790f705648de76d7b04db0f4ce675fbef3e59f..fca0275af04025a31d7cd1f9796136ff84a60ee6 100644 (file)
@@ -32,6 +32,8 @@ if (!defined('STATUSNET')) {
     exit(1);
 }
 
+define("FACEBOOK_SERVICE", 2);
+
 /**
  * Main class for Facebook single-sign-on plugin
  *
@@ -136,7 +138,9 @@ class FacebookSSOPlugin extends Plugin
             include_once $dir . '/extlib/facebook.php';
             return false;
         case 'FacebookloginAction':
+        case 'FacebookregisterAction':
         case 'FacebookadminpanelAction':
+        case 'FacebooksettingsAction':
             include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php';
             return false;
         default:
@@ -165,7 +169,21 @@ class FacebookSSOPlugin extends Plugin
         // Only add these routes if an application has been setup on
         // Facebook for the plugin to use.
         if ($this->hasApplication()) {
-            $m->connect('main/facebooklogin', array('action' => 'facebooklogin'));
+
+            $m->connect(
+                'main/facebooklogin',
+                array('action' => 'facebooklogin')
+            );
+            $m->connect(
+                'main/facebookregister',
+                array('action' => 'facebookregister')
+            );
+
+            $m->connect(
+                'settings/facebook',
+                array('action' => 'facebooksettings')
+            );
+            
         }
 
         return true;
@@ -224,6 +242,30 @@ class FacebookSSOPlugin extends Plugin
         return true;
     }
 
+    /*
+     * Add a tab for managing Facebook Connect settings
+     *
+     * @param Action &action the current action
+     *
+     * @return void
+     */
+    function onEndConnectSettingsNav(&$action)
+    {
+        if ($this->hasApplication()) {
+            $action_name = $action->trimmed('action');
+
+            $action->menuItem(common_local_url('facebooksettings'),
+                              // @todo CHECKME: Should be 'Facebook Connect'?
+                              // TRANS: Menu item tab.
+                              _m('MENU','Facebook'),
+                              // TRANS: Tooltip for menu item "Facebook".
+                              _m('Facebook Connect Settings'),
+                              $action_name === 'facebooksettings');
+        }
+
+        return true;
+    }
+
     /*
      * Is there a Facebook application for the plugin to use?
      */
index 9ea687d5d99c7e7f60c8d1b9065f450c376f1d43..fce481fc037a32913d49523401233f41261053d5 100644 (file)
@@ -39,12 +39,91 @@ class FacebookloginAction extends Action
         parent::handle($args);
 
         if (common_is_real_login()) {
+            
             $this->clientError(_m('Already logged in.'));
+
+        } else {
+
+            $facebook = new Facebook(
+                array(
+                    'appId'  => common_config('facebook', 'appid'),
+                    'secret' => common_config('facebook', 'secret'),
+                    'cookie' => true,
+                )
+            );
+
+            $session = $facebook->getSession();
+            $me      = null;
+
+            if ($session) {
+                try {
+                    $fbuid = $facebook->getUser();
+                    $fbuser  = $facebook->api('/me');
+                } catch (FacebookApiException $e) {
+                    common_log(LOG_ERROR, $e);
+                }
+            }
+
+            if (!empty($fbuser)) {
+                common_debug("Found a valid Facebook user", __FILE__);
+
+                // Check to see if we have a foreign link already
+                $flink = Foreign_link::getByForeignId($fbuid, FACEBOOK_SERVICE);
+
+                if (empty($flink)) {
+
+                    // See if the user would like to register a new local
+                    // account
+                    common_redirect(
+                        common_local_url('facebookregister'),
+                        303
+                    );
+
+                } else {
+
+                    // Log our user in!
+                    $user = $flink->getUser();
+
+                    if (!empty($user)) {
+
+                        common_debug(
+                            sprintf(
+                                'Logged in Facebook user $s as user %d (%s)',
+                                $this->fbuid,
+                                $user->id,
+                                $user->nickname
+                            ),
+                            __FILE__
+                        );
+
+                        common_set_user($user);
+                        common_real_login(true);
+                        $this->goHome($user->nickname);
+                    }
+                }
+
+            }
         }
-        
+
         $this->showPage();
     }
 
+    function goHome($nickname)
+    {
+        $url = common_get_returnto();
+        if ($url) {
+            // We don't have to return to it again
+            common_set_returnto(null);
+        } else {
+            $url = common_local_url(
+                'all',
+                array('nickname' => $nickname)
+            );
+        }
+
+        common_redirect($url, 303);
+    }
+
     function getInstructions()
     {
         // TRANS: Instructions.
@@ -69,7 +148,15 @@ class FacebookloginAction extends Action
     function showContent() {
 
         $this->elementStart('fieldset');
-        $this->element('fb:login-button');
+
+        $attrs = array(
+            'show-faces' => 'true',
+            'width'      => '100',
+            'max-rows'   => '2',
+            'perms'      => 'user_location,user_website,offline_access,publish_stream'
+        );
+
+        $this->element('fb:login-button', $attrs);
         $this->elementEnd('fieldset');
     }
 
diff --git a/plugins/FacebookSSO/facebooksettings.php b/plugins/FacebookSSO/facebooksettings.php
new file mode 100644 (file)
index 0000000..e511810
--- /dev/null
@@ -0,0 +1,264 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Settings for Facebook
+ *
+ * PHP version 5
+ *
+ * LICENCE: 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/>.
+ *
+ * @category  Settings
+ * @package   StatusNet
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+/**
+ * Settings for Facebook
+ *
+ * @category Settings
+ * @package  StatusNet
+ * @author   Zach Copley <zach@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://status.net/
+ *
+ * @see      SettingsAction
+ */
+
+class FacebooksettingsAction extends ConnectSettingsAction
+{
+    private $facebook;
+    private $flink;
+    private $user;
+    
+    function prepare($args)
+    {
+        parent::prepare($args);
+
+        $this->facebook = new Facebook(
+            array(
+                'appId'  => common_config('facebook', 'appid'),
+                'secret' => common_config('facebook', 'secret'),
+                'cookie' => true,
+            )
+        );
+
+        $this->user = common_current_user();
+        $this->flink = Foreign_link::getByUserID($this->user->id, FACEBOOK_SERVICE);
+
+        return true;
+    }
+
+    function handlePost($args)
+    {
+        // CSRF protection
+
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->showForm(
+                _m('There was a problem with your session token. Try again, please.')
+            );
+            return;
+        }
+
+        if ($this->arg('save')) {
+            $this->saveSettings();
+        } else if ($this->arg('disconnect')) {
+            $this->disconnect();
+        }
+    }
+
+    function title()
+    {
+        // TRANS: Page title for Facebook settings.
+        return _m('Facebook settings');
+    }
+    
+    /**
+     * Instructions for use
+     *
+     * @return instructions for use
+     */
+
+    function getInstructions()
+    {
+        return _('Facebook settings');
+    }
+
+    function showContent()
+    {
+
+        if (empty($this->flink)) {
+
+            $this->element(
+                'p',
+                'instructions',
+                _m('There is no Facebook user connected to this account.')
+            );
+
+            $attrs = array(
+                'show-faces' => 'true',
+                'perms' => 'user_location,user_website,offline_access,publish_stream'
+            );
+
+            $this->element('fb:login-button', $attrs);
+            
+
+        } else {
+
+            $this->elementStart(
+                'form',
+                array(
+                    'method' => 'post',
+                    'id'     => 'form_settings_facebook',
+                    'class'  => 'form_settings',
+                    'action' => common_local_url('facebooksettings')
+                )
+            );
+
+            $this->hidden('token', common_session_token());
+
+            $this->element('p', 'form_note', _m('Connected Facebook user'));
+
+            $this->elementStart('p', array('class' => 'facebook-user-display'));
+
+            $this->elementStart(
+                'fb:profile-pic',
+                array('uid' => $this->flink->foreign_id,
+                      'size' => 'small',
+                      'linked' => 'true',
+                      'facebook-logo' => 'true')
+            );
+            $this->elementEnd('fb:profile-pic');
+
+            $this->elementStart(
+                'fb:name',
+                array('uid' => $this->flink->foreign_id, 'useyou' => 'false')
+            );
+
+            $this->elementEnd('fb:name');
+
+            $this->elementEnd('p');
+
+            $this->elementStart('ul', 'form_data');
+
+            $this->elementStart('li');
+
+            $this->checkbox(
+                'noticesync',
+                _m('Publish my notices to Facebook.'),
+                ($this->flink) ? ($this->flink->noticesync & FOREIGN_NOTICE_SEND) : true
+            );
+
+            $this->elementEnd('li');
+
+            $this->elementStart('li');
+
+            $this->checkbox(
+                'replysync',
+                _m('Send "@" replies to Facebook.'),
+                ($this->flink) ? ($this->flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : true
+            );
+
+            $this->elementEnd('li');
+
+            $this->elementStart('li');
+
+            // TRANS: Submit button to save synchronisation settings.
+            $this->submit('save', _m('BUTTON','Save'));
+
+            $this->elementEnd('li');
+        
+            $this->elementEnd('ul');
+
+            $this->elementStart('fieldset');
+
+            // TRANS: Legend.
+            $this->element('legend', null, _m('Disconnect my account from Facebook'));
+
+            if (empty($this->user->password)) {
+
+                $this->elementStart('p', array('class' => 'form_guide'));
+                // @todo FIXME: Bad i18n. Patchwork message in three parts.
+                // TRANS: Followed by a link containing text "set a password".
+                $this->text(_m('Disconnecting your Faceboook ' .
+                               'would make it impossible to log in! Please '));
+                $this->element('a',
+                    array('href' => common_local_url('passwordsettings')),
+                        // TRANS: Preceded by "Please " and followed by " first."
+                        _m('set a password'));
+                // TRANS: Preceded by "Please set a password".
+                $this->text(_m(' first.'));
+                $this->elementEnd('p');
+            } else {
+
+                $note = 'Keep your %s account but disconnect from Facebook. ' .
+                    'You\'ll use your %s password to log in.';
+
+                $site = common_config('site', 'name');
+
+                $this->element('p', 'instructions',
+                    sprintf($note, $site, $site));
+
+                // TRANS: Submit button.
+                $this->submit('disconnect', _m('BUTTON','Disconnect'));
+            }
+
+            $this->elementEnd('fieldset');
+
+            $this->elementEnd('form');
+        }
+    }
+
+    function saveSettings()
+    {
+
+        $noticesync = $this->boolean('noticesync');
+        $replysync  = $this->boolean('replysync');
+
+        $original = clone($this->flink);
+        $this->flink->set_flags($noticesync, false, $replysync, false);
+        $result = $this->flink->update($original);
+
+        if ($result === false) {
+            $this->showForm(_m('There was a problem saving your sync preferences.'));
+        } else {
+            // TRANS: Confirmation that synchronisation settings have been saved into the system.
+            $this->showForm(_m('Sync preferences saved.'), true);
+        }
+    }
+
+    function disconnect()
+    {
+        $flink = Foreign_link::getByUserID($this->user->id, FACEBOOK_SERVICE);
+        $result = $flink->delete();
+
+        if ($result === false) {
+            common_log_db_error($user, 'DELETE', __FILE__);
+            $this->serverError(_m('Couldn\'t delete link to Facebook.'));
+            return;
+        }
+
+        $this->showForm(_m('You have disconnected from Facebook.'), true);
+
+    }
+}
+