aboutsummaryrefslogtreecommitdiffstats
path: root/settings
diff options
context:
space:
mode:
authorChristoph Wurst <christoph@owncloud.com>2016-05-18 12:03:22 +0200
committerChristoph Wurst <christoph@owncloud.com>2016-05-23 09:11:12 +0200
commit12431aa3997154aaea4eec11c2dd65f9e5dbe179 (patch)
tree8395c270b144401f53e5ed048f94a28002410e3d /settings
parent357d342467b9200f190376a2bd224fa7b803b45a (diff)
downloadnextcloud-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.php16
-rw-r--r--settings/Controller/AuthSettingsController.php71
-rw-r--r--settings/css/settings.css15
-rw-r--r--settings/js/authtoken.js33
-rw-r--r--settings/js/authtoken_collection.js36
-rw-r--r--settings/js/authtoken_view.js93
-rw-r--r--settings/js/personal.js7
-rw-r--r--settings/personal.php5
-rw-r--r--settings/routes.php3
-rw-r--r--settings/templates/personal.php30
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>