diff options
author | Christoph Wurst <christoph@owncloud.com> | 2016-05-18 12:03:22 +0200 |
---|---|---|
committer | Christoph Wurst <christoph@owncloud.com> | 2016-05-23 09:11:12 +0200 |
commit | 12431aa3997154aaea4eec11c2dd65f9e5dbe179 (patch) | |
tree | 8395c270b144401f53e5ed048f94a28002410e3d /settings | |
parent | 357d342467b9200f190376a2bd224fa7b803b45a (diff) | |
download | nextcloud-server-12431aa3997154aaea4eec11c2dd65f9e5dbe179.tar.gz nextcloud-server-12431aa3997154aaea4eec11c2dd65f9e5dbe179.zip |
list user's auth tokens on the personal settings page
Diffstat (limited to 'settings')
-rw-r--r-- | settings/Application.php | 16 | ||||
-rw-r--r-- | settings/Controller/AuthSettingsController.php | 71 | ||||
-rw-r--r-- | settings/css/settings.css | 15 | ||||
-rw-r--r-- | settings/js/authtoken.js | 33 | ||||
-rw-r--r-- | settings/js/authtoken_collection.js | 36 | ||||
-rw-r--r-- | settings/js/authtoken_view.js | 93 | ||||
-rw-r--r-- | settings/js/personal.js | 7 | ||||
-rw-r--r-- | settings/personal.php | 5 | ||||
-rw-r--r-- | settings/routes.php | 3 | ||||
-rw-r--r-- | settings/templates/personal.php | 30 |
10 files changed, 305 insertions, 4 deletions
diff --git a/settings/Application.php b/settings/Application.php index 5b84d028abf..7069fc9c35d 100644 --- a/settings/Application.php +++ b/settings/Application.php @@ -29,7 +29,9 @@ namespace OC\Settings; use OC\Files\View; +use OC\Server; use OC\Settings\Controller\AppSettingsController; +use OC\Settings\Controller\AuthSettingsController; use OC\Settings\Controller\CertificateController; use OC\Settings\Controller\CheckSetupController; use OC\Settings\Controller\EncryptionController; @@ -39,10 +41,9 @@ use OC\Settings\Controller\MailSettingsController; use OC\Settings\Controller\SecuritySettingsController; use OC\Settings\Controller\UsersController; use OC\Settings\Middleware\SubadminMiddleware; -use \OCP\AppFramework\App; +use OCP\AppFramework\App; use OCP\IContainer; -use \OCP\Util; -use OC\Server; +use OCP\Util; /** * @package OC\Settings @@ -97,6 +98,15 @@ class Application extends App { $c->query('OcsClient') ); }); + $container->registerService('AuthSettingsController', function(IContainer $c) { + return new AuthSettingsController( + $c->query('AppName'), + $c->query('Request'), + $c->query('ServerContainer')->query('OC\Authentication\Token\IProvider'), + $c->query('UserManager'), + $c->query('UserId') + ); + }); $container->registerService('SecuritySettingsController', function(IContainer $c) { return new SecuritySettingsController( $c->query('AppName'), diff --git a/settings/Controller/AuthSettingsController.php b/settings/Controller/AuthSettingsController.php new file mode 100644 index 00000000000..1d874193d36 --- /dev/null +++ b/settings/Controller/AuthSettingsController.php @@ -0,0 +1,71 @@ +<?php + +/** + * @author Christoph Wurst <christoph@owncloud.com> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OC\Settings\Controller; + +use OC\Authentication\Token\IProvider; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\JSONResponse; +use OCP\IRequest; +use OCP\IUserManager; + +class AuthSettingsController extends Controller { + + /** @var IProvider */ + private $tokenProvider; + + /** + * @var IUserManager + */ + private $userManager; + + /** @var string */ + private $uid; + + /** + * @param string $appName + * @param IRequest $request + * @param IProvider $tokenProvider + * @param IUserManager $userManager + * @param string $uid + */ + public function __construct($appName, IRequest $request, IProvider $tokenProvider, IUserManager $userManager, $uid) { + parent::__construct($appName, $request); + $this->tokenProvider = $tokenProvider; + $this->userManager = $userManager; + $this->uid = $uid; + } + + /** + * @NoAdminRequired + * + * @return JSONResponse + */ + public function index() { + $user = $this->userManager->get($this->uid); + if (is_null($user)) { + return []; + } + return $this->tokenProvider->getTokenByUser($user); + } + +} diff --git a/settings/css/settings.css b/settings/css/settings.css index edc4939d2d8..be61265935e 100644 --- a/settings/css/settings.css +++ b/settings/css/settings.css @@ -100,6 +100,21 @@ input#identity { table.nostyle label { margin-right: 2em; } table.nostyle td { padding: 0.2em 0; } +#sessions, +#devices { + min-height: 180px; +} +#sessions table, +#devices table { + width: 100%; + min-height: 150px; + padding-top: 25px; +} +#sessions table th, +#devices table th { + font-weight: 800; +} + /* USERS */ #newgroup-init a span { margin-left: 20px; } #newgroup-init a span:before { diff --git a/settings/js/authtoken.js b/settings/js/authtoken.js new file mode 100644 index 00000000000..215192d7163 --- /dev/null +++ b/settings/js/authtoken.js @@ -0,0 +1,33 @@ +/* global Backbone */ + +/** + * @author Christoph Wurst <christoph@owncloud.com> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +(function(OC, Backbone) { + 'use strict'; + + OC.Settings = OC.Settings || {}; + + var AuthToken = Backbone.Model.extend({ + }); + + OC.Settings.AuthToken = AuthToken; + +})(OC, Backbone); diff --git a/settings/js/authtoken_collection.js b/settings/js/authtoken_collection.js new file mode 100644 index 00000000000..dd964356d06 --- /dev/null +++ b/settings/js/authtoken_collection.js @@ -0,0 +1,36 @@ +/* global Backbone */ + +/** + * @author Christoph Wurst <christoph@owncloud.com> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +(function(OC, Backbone) { + 'use strict'; + + OC.Settings = OC.Settings || {}; + + var AuthTokenCollection = Backbone.Collection.extend({ + model: OC.Settings.AuthToken, + tokenType: null, + url: OC.generateUrl('/settings/personal/authtokens'), + }); + + OC.Settings.AuthTokenCollection = AuthTokenCollection; + +})(OC, Backbone); diff --git a/settings/js/authtoken_view.js b/settings/js/authtoken_view.js new file mode 100644 index 00000000000..0ca16821233 --- /dev/null +++ b/settings/js/authtoken_view.js @@ -0,0 +1,93 @@ +/* global Backbone, Handlebars */ + +/** + * @author Christoph Wurst <christoph@owncloud.com> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +(function(OC, _, Backbone, $, Handlebars) { + 'use strict'; + + OC.Settings = OC.Settings || {}; + + var TEMPLATE_TOKEN = + '<tr>' + + '<td>{{name}}</td>' + + '<td>{{lastActivity}}</td>' + + '<tr>'; + + var SubView = Backbone.View.extend({ + collection: null, + type: 0, + template: Handlebars.compile(TEMPLATE_TOKEN), + initialize: function(options) { + this.type = options.type; + this.collection = options.collection; + }, + render: function() { + var _this = this; + + var list = this.$el.find('.token-list'); + var tokens = this.collection.filter(function(token) { + return parseInt(token.get('type')) === _this.type; + }); + list.removeClass('icon-loading'); + list.html(''); + + tokens.forEach(function(token) { + var html = _this.template(token.toJSON()); + list.append(html); + }); + }, + }); + + var AuthTokenView = Backbone.View.extend({ + collection: null, + views + : [], + initialize: function(options) { + this.collection = options.collection; + + var tokenTypes = [0, 1]; + var _this = this; + _.each(tokenTypes, function(type) { + _this.views.push(new SubView({ + el: type === 0 ? '#sessions' : '#devices', + type: type, + collection: _this.collection + })); + }); + }, + render: function() { + _.each(this.views, function(view) { + view.render(); + }); + }, + reload: function() { + var loadingTokens = this.collection.fetch(); + + var _this = this; + $.when(loadingTokens).done(function() { + _this.render(); + }); + } + }); + + OC.Settings.AuthTokenView = AuthTokenView; + +})(OC, _, Backbone, $, Handlebars); diff --git a/settings/js/personal.js b/settings/js/personal.js index 09f63f3f6af..aea2400e999 100644 --- a/settings/js/personal.js +++ b/settings/js/personal.js @@ -361,6 +361,13 @@ $(document).ready(function () { if (oc_config.enable_avatars) { $('#avatar .avatardiv').avatar(OC.currentUser, 145); } + + // Show token views + var collection = new OC.Settings.AuthTokenCollection(); + var view = new OC.Settings.AuthTokenView({ + collection: collection + }); + view.reload(); }); if (!OC.Encryption) { diff --git a/settings/personal.php b/settings/personal.php index 6c2fccbec9b..3b283fb2d38 100644 --- a/settings/personal.php +++ b/settings/personal.php @@ -42,6 +42,9 @@ $config = \OC::$server->getConfig(); $urlGenerator = \OC::$server->getURLGenerator(); // Highlight navigation entry +OC_Util::addScript('settings', 'authtoken'); +OC_Util::addScript('settings', 'authtoken_collection'); +OC_Util::addScript('settings', 'authtoken_view'); OC_Util::addScript( 'settings', 'personal' ); OC_Util::addScript('settings', 'certificates'); OC_Util::addStyle( 'settings', 'settings' ); @@ -171,6 +174,8 @@ $tmpl->assign('groups', $groups2); // add hardcoded forms from the template $formsAndMore = []; $formsAndMore[]= ['anchor' => 'avatar', 'section-name' => $l->t('Personal info')]; +$formsAndMore[]= ['anchor' => 'sessions', 'section-name' => $l->t('Sessions')]; +$formsAndMore[]= ['anchor' => 'devices', 'section-name' => $l->t('Devices')]; $formsAndMore[]= ['anchor' => 'clientsbox', 'section-name' => $l->t('Sync clients')]; $forms=OC_App::getForms('personal'); diff --git a/settings/routes.php b/settings/routes.php index 90e1d1e442b..5c356e01734 100644 --- a/settings/routes.php +++ b/settings/routes.php @@ -36,7 +36,8 @@ $application = new Application(); $application->registerRoutes($this, [ 'resources' => [ 'groups' => ['url' => '/settings/users/groups'], - 'users' => ['url' => '/settings/users/users'] + 'users' => ['url' => '/settings/users/users'], + 'AuthSettings' => ['url' => '/settings/personal/authtokens'], ], 'routes' => [ ['name' => 'MailSettings#setMailSettings', 'url' => '/settings/admin/mailsettings', 'verb' => 'POST'], diff --git a/settings/templates/personal.php b/settings/templates/personal.php index 29bf240e7e3..a7e86b50a59 100644 --- a/settings/templates/personal.php +++ b/settings/templates/personal.php @@ -139,6 +139,36 @@ if($_['passwordChangeSupported']) { } ?> +<div id="sessions" class="section"> + <h2><?php p($l->t('Sessions'));?></h2> + <?php p($l->t('These are the web browsers currently logged in to your ownCloud.'));?> + <table> + <thead> + <tr> + <th>Browser</th> + <th>Most recent activity</th> + </tr> + </thead> + <tbody class="token-list icon-loading"> + </tbody> + </table> +</div> + +<div id="devices" class="section"> + <h2><?php p($l->t('Devices'));?></h2> + <?php p($l->t("You've linked these devices."));?> + <table> + <thead> + <tr> + <th>Name</th> + <th>Most recent activity</th> + </tr> + </thead> + <tbody class="token-list icon-loading"> + </tbody> + </table> +</div> + <form id="language" class="section"> <h2> <label for="languageinput"><?php p($l->t('Language'));?></label> |