Allow users to see issued tokens and revoke them all in one

This commit is contained in:
Johannes Zellner
2016-06-08 12:56:48 +02:00
parent 401c0e1b44
commit 4c4ae08b44
3 changed files with 80 additions and 3 deletions

View File

@@ -140,5 +140,28 @@
</div>
</div>
<br/>
<div class="section-header">
<div class="text-left">
<h3>Sessions</h3>
</div>
</div>
<div class="card">
<div class="grid-item-top">
<div class="row">
<div class="col-xs-12">
<p>You are logged {{ activeTokenCount }} times into applications, including this session.</p>
<hr/>
<h4>Active Applications:</h4>
<p ng-repeat="client in activeClients"><b>{{ client.name }} ({{client.activeTokens.length}} times)</b></p>
<hr/>
<button class="btn btn-outline btn-xs btn-danger pull-right" ng-click="revokeTokens()">Revoke access to all</button>
</div>
</div>
</div>
</div>
<!-- Offset the footer -->
<br/><br/>

View File

@@ -4,6 +4,10 @@ angular.module('Application').controller('AccountController', ['$scope', 'Client
$scope.user = Client.getUserInfo();
$scope.config = Client.getConfig();
$scope.activeTokens = 0;
$scope.activeClients = [];
$scope.webadminClient = {};
$scope.passwordchange = {
busy: false,
error: {},
@@ -160,6 +164,58 @@ angular.module('Application').controller('AccountController', ['$scope', 'Client
});
};
// poor man's async
function asyncForEach(items, handler, callback) {
var cur = 0;
(function iterator() {
handler(items[cur], function () {
if (cur >= items.length-1) return callback();
++cur;
iterator();
});
})();
}
function revokeTokenByClient(client, callback) {
Client.delTokensByClientId(client.id, function (error) {
if (error) console.error(error);
callback();
});
}
$scope.revokeTokens = function () {
asyncForEach($scope.activeClients, revokeTokenByClient, function () {
console.log('done');
});
};
function refreshClientTokens(client, callback) {
Client.getTokensByClientId(client.id, function (error, result) {
if (error) console.error(error);
client.activeTokens = result || [];
callback();
});
}
Client.onReady(function () {
Client.getOAuthClients(function (error, activeClients) {
if (error) return console.error(error);
asyncForEach(activeClients, refreshClientTokens, function () {
activeClients = activeClients.filter(function (c) { return c.activeTokens.length > 0; });
$scope.activeTokenCount = activeClients.reduce(function (prev, cur) { return prev + cur.activeTokens.length; }, 0);
$scope.activeClients = activeClients.filter(function (c) { return c.id !== 'cid-sdk' && c.id !== 'cid-webadmin'; });
$scope.webadminClient = activeClients.filter(function (c) { return c.id === 'cid-webadmin'; })[0];
});
});
});
// setup all the dialog focus handling
['passwordChangeModal', 'emailChangeModal', 'displayNameChangeModal'].forEach(function (id) {
$('#' + id).on('shown.bs.modal', function () {

View File

@@ -144,9 +144,7 @@ angular.module('Application').controller('TokensController', ['$scope', 'Client'
Client.getOAuthClients(function (error, activeClients) {
if (error) return console.error(error);
$scope.activeClients = activeClients;
$scope.activeClients.forEach(refreshClientTokens);
activeClients.forEach(refreshClientTokens);
$scope.activeClients = activeClients.filter(function (c) { return c.id !== 'cid-sdk'; });
$scope.apiClient = activeClients.filter(function (c) { return c.id === 'cid-sdk'; })[0];