diff --git a/client/html/user_tokens.tpl b/client/html/user_tokens.tpl
index a433d55c..cd5901ce 100644
--- a/client/html/user_tokens.tpl
+++ b/client/html/user_tokens.tpl
@@ -22,6 +22,11 @@
Expires:
<%= new Date(token.expirationTime).toLocaleDateString() %>
+ <% } else { %>
+
+
Expires:
+
No Expiration
+
<% } %>
diff --git a/client/js/api.js b/client/js/api.js
index 411cbb1d..efb4c4b0 100644
--- a/client/js/api.js
+++ b/client/js/api.js
@@ -16,7 +16,7 @@ class Api extends events.EventTarget {
this.user = null;
this.userName = null;
this.userPassword = null;
- this.userToken = null;
+ this.token = null;
this.cache = {};
this.allRanks = [
'anonymous',
@@ -98,7 +98,7 @@ class Api extends events.EventTarget {
this.cache = {};
return new Promise((resolve, reject) => {
this.userName = userName;
- this.userToken = token;
+ this.token = token;
this.get('/user/' + userName + '?bump-login=true')
.then(response => {
const options = {};
@@ -135,7 +135,7 @@ class Api extends events.EventTarget {
{'user': userName, 'token': response.token},
options);
this.userName = userName;
- this.userToken = response.token;
+ this.token = response.token;
this.userPassword = null;
}, error => {
reject(error);
@@ -183,7 +183,7 @@ class Api extends events.EventTarget {
logout() {
let self = this;
- this.deleteToken(this.userName, this.userToken)
+ this.deleteToken(this.userName, this.token)
.then(response => {
self._logout();
}, error => {
@@ -195,7 +195,7 @@ class Api extends events.EventTarget {
this.user = null;
this.userName = null;
this.userPassword = null;
- this.userToken = null;
+ this.token = null;
this.dispatchEvent(new CustomEvent('logout'));
}
@@ -333,10 +333,10 @@ class Api extends events.EventTarget {
}
try {
- if (this.userName && this.userToken) {
+ if (this.userName && this.token) {
req.auth = null;
req.set('Authorization', 'Token '
- + new Buffer(this.userName + ":" + this.userToken).toString('base64'))
+ + new Buffer(this.userName + ":" + this.token).toString('base64'))
} else if (this.userName && this.userPassword) {
req.auth(
this.userName,
diff --git a/client/js/controllers/user_controller.js b/client/js/controllers/user_controller.js
index a66f4f93..786fb729 100644
--- a/client/js/controllers/user_controller.js
+++ b/client/js/controllers/user_controller.js
@@ -216,14 +216,18 @@ class UserController {
_evtDeleteToken(e) {
this._view.clearMessages();
this._view.disableForm();
- e.detail.userToken.delete(e.detail.user.name)
- .then(() => {
- const ctx = router.show(uri.formatClientLink('user', e.detail.user.name, 'list-tokens'));
- ctx.controller.showSuccess('Token ' + e.detail.userToken.token + ' deleted.');
- }, error => {
- this._view.showError(error.message);
- this._view.enableForm();
- });
+ if (e.detail.userToken.token === api.token) {
+ router.show(uri.formatClientLink('logout'));
+ } else {
+ e.detail.userToken.delete(e.detail.user.name)
+ .then(() => {
+ const ctx = router.show(uri.formatClientLink('user', e.detail.user.name, 'list-tokens'));
+ ctx.controller.showSuccess('Token ' + e.detail.userToken.token + ' deleted.');
+ }, error => {
+ this._view.showError(error.message);
+ this._view.enableForm();
+ });
+ }
}
}
diff --git a/server/szurubooru/func/auth.py b/server/szurubooru/func/auth.py
index 606d13f5..7de12bfb 100644
--- a/server/szurubooru/func/auth.py
+++ b/server/szurubooru/func/auth.py
@@ -86,7 +86,8 @@ def is_valid_token(user_token: model.UserToken) -> bool:
Token must be enabled and if it has an expiration, it must be
greater than now.
'''
- assert user_token
+ if user_token is None:
+ return False
if not user_token.enabled:
return False
if (user_token.expiration_time is not None
diff --git a/server/szurubooru/tests/func/test_auth.py b/server/szurubooru/tests/func/test_auth.py
index bf22c8d2..6dc79bb5 100644
--- a/server/szurubooru/tests/func/test_auth.py
+++ b/server/szurubooru/tests/func/test_auth.py
@@ -1,5 +1,5 @@
-import pytest
from datetime import datetime, timedelta
+import pytest
from szurubooru.func import auth