]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Allow developers to delete OAuth applications
authorZach Copley <zach@status.net>
Tue, 2 Feb 2010 06:26:03 +0000 (06:26 +0000)
committerZach Copley <zach@status.net>
Tue, 2 Feb 2010 08:50:18 +0000 (08:50 +0000)
actions/deleteapplication.php [new file with mode: 0644]
actions/showapplication.php
classes/Consumer.php
classes/Oauth_application.php
lib/router.php

diff --git a/actions/deleteapplication.php b/actions/deleteapplication.php
new file mode 100644 (file)
index 0000000..17526e1
--- /dev/null
@@ -0,0 +1,176 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Action class to delete an OAuth application
+ *
+ * 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  Action
+ * @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') && !defined('LACONICA')) {
+    exit(1);
+}
+
+/**
+ * Delete an OAuth appliction
+ *
+ * @category Action
+ * @package  StatusNet
+ * @author   Zach Copley <zach@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link     http://status.net/
+ */
+
+class DeleteapplicationAction extends Action
+{
+    var $app = null;
+
+    /**
+     * Take arguments for running
+     *
+     * @param array $args $_REQUEST args
+     *
+     * @return boolean success flag
+     */
+
+    function prepare($args)
+    {
+        if (!parent::prepare($args)) {
+            return false;
+        }
+
+        if (!common_logged_in()) {
+            $this->clientError(_('You must be logged in to delete an application.'));
+            return false;
+        }
+
+        $id        = (int)$this->arg('id');
+        $this->app = Oauth_application::staticGet('id', $id);
+
+        if (empty($this->app)) {
+            $this->clientError(_('Application not found.'));
+            return false;
+        }
+
+        $cur = common_current_user();
+
+        if ($cur->id != $this->app->owner) {
+            $this->clientError(_('You are not the owner of this application.'), 401);
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Handle request
+     *
+     * Shows a page with list of favorite notices
+     *
+     * @param array $args $_REQUEST args; handled in prepare()
+     *
+     * @return void
+     */
+
+    function handle($args)
+    {
+        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+
+            // CSRF protection
+            $token = $this->trimmed('token');
+            if (!$token || $token != common_session_token()) {
+                $this->clientError(_('There was a problem with your session token.'));
+                return;
+            }
+
+            if ($this->arg('no')) {
+                common_redirect(common_local_url('showapplication',
+                                                 array('id' => $this->app->id)), 303);
+            } elseif ($this->arg('yes')) {
+                $this->handlePost();
+                common_redirect(common_local_url('oauthappssettings'), 303);
+            } else {
+                $this->showPage();
+            }
+        }
+    }
+
+    function showContent() {
+        $this->areYouSureForm();
+    }
+
+    function title() {
+        return _('Delete application');
+    }
+
+    function showNoticeForm() {
+        // nop
+    }
+
+    /**
+     * Confirm with user.
+     *
+     * Shows a confirmation form.
+     *
+     * @return void
+     */
+    function areYouSureForm()
+    {
+        $id = $this->app->id;
+        $this->elementStart('form', array('id' => 'deleteapplication-' . $id,
+                                          'method' => 'post',
+                                          'class' => 'form_settings form_entity_block',
+                                          'action' => common_local_url('deleteapplication',
+                                                                       array('id' => $this->app->id))));
+        $this->elementStart('fieldset');
+        $this->hidden('token', common_session_token());
+        $this->element('legend', _('Delete application'));
+        $this->element('p', null,
+                       _('Are you sure you want to delete this application? '.
+                         'This will clear all data about the application from the '.
+                         'database, including all existing user connections.'));
+        $this->submit('form_action-no',
+                      _('No'),
+                      'submit form_action-primary',
+                      'no',
+                      _("Do not delete this application"));
+        $this->submit('form_action-yes',
+                      _('Yes'),
+                      'submit form_action-secondary',
+                      'yes', _('Delete this application'));
+        $this->elementEnd('fieldset');
+        $this->elementEnd('form');
+    }
+
+    /**
+     * Actually delete the app
+     *
+     * @return void
+     */
+
+    function handlePost()
+    {
+        $this->app->delete();
+    }
+}
+
index 090e11882ebe49c6f0b59cc4f3f097dc6990a9f3..020d62480ad6566c234dad97e2868ef526642235 100644 (file)
@@ -222,18 +222,33 @@ class ShowApplicationAction extends OwnerDesignAction
 
         $this->elementStart('li', 'entity_reset_keysecret');
         $this->elementStart('form', array(
-            'id' => 'forma_reset_key',
+            'id' => 'form_reset_key',
             'class' => 'form_reset_key',
             'method' => 'POST',
             'action' => common_local_url('showapplication',
                                          array('id' => $this->application->id))));
-
         $this->elementStart('fieldset');
         $this->hidden('token', common_session_token());
         $this->submit('reset', _('Reset key & secret'));
         $this->elementEnd('fieldset');
         $this->elementEnd('form');
         $this->elementEnd('li');
+
+        $this->elementStart('li', 'entity_delete');
+        $this->elementStart('form', array(
+                                          'id' => 'form_delete_application',
+                                          'class' => 'form_delete_application',
+                                          'method' => 'POST',
+                                          'action' => common_local_url('deleteapplication',
+                                                                       array('id' => $this->application->id))));
+
+        $this->elementStart('fieldset');
+        $this->hidden('token', common_session_token());
+        $this->submit('delete', _('Delete'));
+        $this->elementEnd('fieldset');
+        $this->elementEnd('form');
+        $this->elementEnd('li');
+
         $this->elementEnd('ul');
         $this->elementEnd('div');
 
index ad64a8491be38f16378a6a9be918da1c6ae7d0ef..ce399f2783f7e965b59ecc85effe0078f696193c 100644 (file)
@@ -36,4 +36,34 @@ class Consumer extends Memcached_DataObject
         return $cons;
     }
 
+    /**
+     * Delete a Consumer and related tokens and nonces
+     *
+     * XXX: Should this happen in an OAuthDataStore instead?
+     *
+     */
+    function delete()
+    {
+        // XXX: Is there any reason NOT to do this kind of cleanup?
+
+        $this->_deleteTokens();
+        $this->_deleteNonces();
+
+        parent::delete();
+    }
+
+    function _deleteTokens()
+    {
+        $token = new Token();
+        $token->consumer_key = $this->consumer_key;
+        $token->delete();
+    }
+
+    function _deleteNonces()
+    {
+        $nonce = new Nonce();
+        $nonce->consumer_key = $this->consumer_key;
+        $nonce->delete();
+    }
+
 }
index a6b5390872136308d663d0e8c806c26b2496b12a..748b6422006b4175311a7fade7f7d5aed3ca4f8f 100644 (file)
@@ -137,4 +137,21 @@ class Oauth_application extends Memcached_DataObject
         }
     }
 
+    function delete()
+    {
+        $this->_deleteAppUsers();
+
+        $consumer = $this->getConsumer();
+        $consumer->delete();
+
+        parent::delete();
+    }
+
+    function _deleteAppUsers()
+    {
+        $oauser = new Oauth_application_user();
+        $oauser->application_id = $this->id;
+        $oauser->delete();
+    }
+
 }
index b046b240c951147de3556df514d554add0bd9fcb..987d0152e462e266a8ddc40d169e66882a990c79 100644 (file)
@@ -152,6 +152,10 @@ class Router
                 array('action' => 'editapplication'),
                 array('id' => '[0-9]+')
             );
+            $m->connect('settings/oauthapps/delete/:id',
+                array('action' => 'deleteapplication'),
+                array('id' => '[0-9]+')
+            );
 
             // search