aboutsummaryrefslogtreecommitdiff
path: root/client/js/views/user_tokens_view.js
diff options
context:
space:
mode:
authorReAnzu2018-02-25 04:44:02 -0600
committerrr-2018-03-25 22:23:29 +0200
commit2a69f0193f9e5aa451e0dbcb8c89070f3e49ffa5 (patch)
treebda640614ae711e8fef0e0463f118f85ef83ac0e /client/js/views/user_tokens_view.js
parente35e70992736340bff3995ca6f425baf2f431e2f (diff)
server/auth: add token authentication
* Users are only authenticated against their password on login, and to retrieve a token * Passwords are wiped from the GUI frontend and cookies after login and token retrieval * Tokens are revoked at the end of the session/logout * If the user chooses the "remember me" option, the token is stored in the cookie * Tokens correctly delete themselves on logout * Tokens can expire at user-specified date * Tokens have their last usage time * Tokens can have user defined descriptions * Users can manage login tokens in their account settings
Diffstat (limited to 'client/js/views/user_tokens_view.js')
-rw-r--r--client/js/views/user_tokens_view.js134
1 files changed, 134 insertions, 0 deletions
diff --git a/client/js/views/user_tokens_view.js b/client/js/views/user_tokens_view.js
new file mode 100644
index 0000000..f6c8480
--- /dev/null
+++ b/client/js/views/user_tokens_view.js
@@ -0,0 +1,134 @@
+'use strict';
+
+const events = require('../events.js');
+const views = require('../util/views.js');
+
+const template = views.getTemplate('user-tokens');
+
+class UserTokenView extends events.EventTarget {
+ constructor(ctx) {
+ super();
+
+ this._user = ctx.user;
+ this._tokens = ctx.tokens;
+ this._hostNode = ctx.hostNode;
+ this._tokenFormNodes = [];
+ views.replaceContent(this._hostNode, template(ctx));
+ views.decorateValidator(this._formNode);
+
+ this._formNode.addEventListener('submit', e => this._evtSubmit(e));
+
+ this._decorateTokenForms();
+ this._decorateTokenNoteChangeLinks();
+ }
+
+ _decorateTokenForms() {
+ this._tokenFormNodes = [];
+ for (let i = 0; i < this._tokens.length; i++) {
+ let formNode = this._hostNode.querySelector(
+ '.token[data-token-id=\"' + i + '\"]');
+ formNode.addEventListener('submit', e => this._evtDelete(e));
+ this._tokenFormNodes.push(formNode);
+ }
+ }
+
+ _decorateTokenNoteChangeLinks() {
+ for (let i = 0; i < this._tokens.length; i++) {
+ let linkNode = this._hostNode.querySelector(
+ '.token-change-note[data-token-id=\"' + i + '\"]');
+ linkNode.addEventListener(
+ 'click', e => this._evtChangeNoteClick(e));
+ }
+ }
+
+ clearMessages() {
+ views.clearMessages(this._hostNode);
+ }
+
+ showSuccess(message) {
+ views.showSuccess(this._hostNode, message);
+ }
+
+ showError(message) {
+ views.showError(this._hostNode, message);
+ }
+
+ enableForm() {
+ views.enableForm(this._formNode);
+ for (let formNode of this._tokenFormNodes) {
+ views.enableForm(formNode);
+ }
+ }
+
+ disableForm() {
+ views.disableForm(this._formNode);
+ for (let formNode of this._tokenFormNodes) {
+ views.disableForm(formNode);
+ }
+ }
+
+ _evtDelete(e) {
+ e.preventDefault();
+ const userToken = this._tokens[parseInt(
+ e.target.getAttribute('data-token-id'))];
+ this.dispatchEvent(new CustomEvent('delete', {
+ detail: {
+ user: this._user,
+ userToken: userToken,
+ },
+ }));
+ }
+
+ _evtSubmit(e) {
+ e.preventDefault();
+ this.dispatchEvent(new CustomEvent('submit', {
+ detail: {
+ user: this._user,
+
+ note: this._userTokenNoteInputNode ?
+ this._userTokenNoteInputNode.value :
+ undefined,
+
+ expirationTime:
+ (this._userTokenExpirationTimeInputNode
+ && this._userTokenExpirationTimeInputNode.value) ?
+ new Date(this._userTokenExpirationTimeInputNode.value)
+ .toISOString() :
+ undefined,
+ },
+ }));
+ }
+
+ _evtChangeNoteClick(e) {
+ e.preventDefault();
+ const userToken = this._tokens[
+ parseInt(e.target.getAttribute('data-token-id'))];
+ const text = window.prompt(
+ 'Please enter the new name:',
+ userToken.note !== null ? userToken.note : undefined);
+ if (!text) {
+ return;
+ }
+ this.dispatchEvent(new CustomEvent('update', {
+ detail: {
+ user: this._user,
+ userToken: userToken,
+ note: text ? text : undefined,
+ },
+ }));
+ }
+
+ get _formNode() {
+ return this._hostNode.querySelector('#create-token-form');
+ }
+
+ get _userTokenNoteInputNode() {
+ return this._formNode.querySelector('.note input');
+ }
+
+ get _userTokenExpirationTimeInputNode() {
+ return this._formNode.querySelector('.expirationTime input');
+ }
+}
+
+module.exports = UserTokenView;

© 2015 - 2026 Jakob L. Kreuze