]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Started work on interface for displaying connected OAuth apps
authorZach Copley <zach@status.net>
Fri, 13 Nov 2009 03:42:18 +0000 (19:42 -0800)
committerZach Copley <zach@status.net>
Thu, 14 Jan 2010 02:41:04 +0000 (02:41 +0000)
actions/applicationsettings.php [new file with mode: 0644]
actions/oauthclients.php [new file with mode: 0644]
classes/Profile.php
lib/applicationlist.php [new file with mode: 0644]
lib/connectsettingsaction.php
lib/router.php

diff --git a/actions/applicationsettings.php b/actions/applicationsettings.php
new file mode 100644 (file)
index 0000000..16c571f
--- /dev/null
@@ -0,0 +1,135 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * List a user's OAuth connected applications
+ *
+ * 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 2008-2009 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') && !defined('LACONICA')) {
+    exit(1);
+}
+
+require_once INSTALLDIR . '/lib/connectsettingsaction.php';
+require_once INSTALLDIR . '/lib/applicationlist.php';
+
+/**
+ * Show connected OAuth applications
+ *
+ * @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 ApplicationSettingsAction extends ConnectSettingsAction
+{
+    /**
+     * Title of the page
+     *
+     * @return string Title of the page
+     */
+
+    function title()
+    {
+        return _('Connected Applications');
+    }
+
+    /**
+     * Instructions for use
+     *
+     * @return instructions for use
+     */
+
+    function getInstructions()
+    {
+        return _('You have allowed the following applications to access you account.');
+    }
+
+    /**
+     * Content area of the page
+     *
+     * @return void
+     */
+
+    function showContent()
+    {
+        $user    = common_current_user();
+        $profile = $user->getProfile();
+
+        $offset = ($this->page - 1) * APPS_PER_PAGE;
+        $limit  =  APPS_PER_PAGE + 1;
+
+        $application = $profile->getApplications($offset, $limit);
+
+        if ($application) {
+            $al = new ApplicationList($application, $this->user, $this);
+            $cnt = $al->show();
+            if (0 == $cnt) {
+                $this->showEmptyListMessage();
+            }
+        }
+
+        $this->pagination($this->page > 1, $cnt > APPS_PER_PAGE,
+                          $this->page, 'applicationsettings',
+                          array('nickname' => $this->user->nickname));
+    }
+
+    /**
+     * 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()
+    {
+        // 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;
+        }
+
+    }
+
+    function showEmptyListMessage()
+    {
+        $message = sprintf(_('You have not authorized any applications to use your account.'));
+
+        $this->elementStart('div', 'guide');
+        $this->raw(common_markup_to_html($message));
+        $this->elementEnd('div');
+    }
+
+}
diff --git a/actions/oauthclients.php b/actions/oauthclients.php
new file mode 100644 (file)
index 0000000..9a29e15
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * List the OAuth applications that a user has registered with this instance
+ *
+ * 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 2008-2009 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') && !defined('LACONICA')) {
+    exit(1);
+}
+
+require_once INSTALLDIR . '/lib/connectsettingsaction.php';
+
+/**
+ * Show a user's registered OAuth applications
+ *
+ * @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 OauthClientsAction extends ConnectSettingsAction
+{
+    /**
+     * Title of the page
+     *
+     * @return string Title of the page
+     */
+
+    function title()
+    {
+        return _('Applications using %%site_name%%');
+    }
+
+    /**
+     * Instructions for use
+     *
+     * @return instructions for use
+     */
+
+    function getInstructions()
+    {
+        return _('Applications you have registered');
+    }
+
+    /**
+     * Content area of the page
+     *
+     * @return void
+     */
+
+    function showContent()
+    {
+        $user = common_current_user();
+
+    }
+
+    /**
+     * 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()
+    {
+        // 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;
+        }
+
+    }
+
+}
index 25d908dbf93c22c1a24fb41cbd5a204d2478e825..687215b11b64a838a98a24e88c5b6c5abd3cc5dd 100644 (file)
@@ -352,6 +352,29 @@ class Profile extends Memcached_DataObject
         return $profile;
     }
 
+    function getApplications($offset = 0, $limit = null)
+    {
+        $qry =
+          'SELECT oauth_application_user.* ' .
+          'FROM oauth_application_user ' .
+          'WHERE profile_id = %d ' .
+          'ORDER BY created DESC ';
+
+        if ($offset > 0) {
+            if (common_config('db','type') == 'pgsql') {
+                $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+            } else {
+                $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+            }
+        }
+
+        $application = new Oauth_application();
+
+        $cnt = $application->query(sprintf($qry, $this->id));
+
+        return $application;
+    }
+
     function subscriptionCount()
     {
         $c = common_memcache();
diff --git a/lib/applicationlist.php b/lib/applicationlist.php
new file mode 100644 (file)
index 0000000..fed784b
--- /dev/null
@@ -0,0 +1,111 @@
+<?php
+
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Widget to show a list of OAuth applications
+ *
+ * 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  Public
+ * @package   StatusNet
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2008-2009 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') && !defined('LACONICA')) {
+    exit(1);
+}
+
+require_once INSTALLDIR . '/lib/widget.php';
+
+define('APPS_PER_PAGE', 20);
+
+/**
+ * Widget to show a list of OAuth applications
+ *
+ * @category Public
+ * @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/
+ */
+
+class ApplicationList extends Widget
+{
+    /** Current application, application query */
+    var $application = null;
+    
+    /** Owner of this list */
+    var $owner = null;
+    
+    /** Action object using us. */
+    var $action = null;
+
+    function __construct($application, $owner=null, $action=null)
+    {
+        parent::__construct($action);
+
+        $this->application = $application;
+        $this->owner       = $owner;
+        $this->action      = $action;
+    }
+
+    function show()
+    {
+        $this->out->elementStart('ul', 'applications xoxo');
+
+        $cnt = 0;
+
+        while ($this->application->fetch()) {
+            $cnt++;
+            if($cnt > APPS_PER_PAGE) {
+                break;
+            }
+            $this->showapplication();
+        }
+
+        $this->out->elementEnd('ul');
+
+        return $cnt;
+    }
+
+    function showApplication()
+    {
+        $this->out->elementStart('li', array('class' => 'application',
+                                             'id' => 'oauthclient-' . $this->application->id));
+
+        $user = common_current_user();
+
+       $this->out->raw($this->application->name);
+       
+       $this->out->elementEnd('li');
+    }
+
+    /* Override this in subclasses. */
+
+    function showOwnerControls()
+    {
+        return;
+    }
+
+    function highlight($text)
+    {
+        return htmlspecialchars($text);
+    }
+}
index e5fb8727ba1dc4e89ead2563215cea53fc77319c..4b5059540d07b267c0c89d78f5800338a16df910 100644 (file)
@@ -116,6 +116,9 @@ class ConnectSettingsNav extends Widget
                         _('Updates by SMS'));
             }
 
+           $menu['applicationsettings'] = array(_('Applications'),
+                                                _('OAuth connected applications'));
+
             foreach ($menu as $menuaction => $menudesc) {
                 $this->action->menuItem(common_local_url($menuaction),
                         $menudesc[0],
@@ -131,4 +134,3 @@ class ConnectSettingsNav extends Widget
 
 }
 
-
index 6b87ed27f61bbabe099a19380ff3c840ae8143b2..9b2aa025ef1ce123779d656efd3ae426085ece3c 100644 (file)
@@ -140,11 +140,13 @@ class Router
 
             // settings
 
-            foreach (array('profile', 'avatar', 'password', 'im',
+            foreach (array('profile', 'avatar', 'password', 'im', 'application',
                            'email', 'sms', 'userdesign', 'other') as $s) {
                 $m->connect('settings/'.$s, array('action' => $s.'settings'));
             }
 
+           $m->connect('settings/oauthclients', array('action' => 'oauthclients'));
+
             // search
 
             foreach (array('group', 'people', 'notice') as $s) {