display expiry on ACL tokens

This commit is contained in:
Tiago Vasconcelos
2026-07-14 16:12:08 +01:00
parent 43900dd6da
commit abe1e2fb27
5 changed files with 50 additions and 4 deletions
+1
View File
@@ -41,6 +41,7 @@ class SimpleStatus(BaseModel):
class SimpleItem(BaseModel):
id: str
name: str
expires_at: int | None = None
class DbVersion(BaseModel):
+4 -1
View File
@@ -295,7 +295,10 @@ async def api_create_user_api_token(
account.username, api_token_id, data.expiration_time_minutes
)
acl.token_id_list.append(SimpleItem(id=api_token_id, name=data.token_name))
expires_at = int(time()) + data.expiration_time_minutes * 60
acl.token_id_list.append(
SimpleItem(id=api_token_id, name=data.token_name, expires_at=expires_at)
)
await update_user_access_control_list(acls)
return ApiTokenResponse(id=api_token_id, api_token=api_token)
+5
View File
@@ -217,6 +217,11 @@ window.PageAccount = {
computed: {
isUserTouched() {
return !_.isEqual(this.g.user, this.untouchedUser)
},
selectedApiToken() {
return this.selectedApiAcl.token_id_list.find(
token => token.id === this.apiAcl.selectedTokenId
)
}
},
methods: {
+33
View File
@@ -889,6 +889,39 @@
></q-btn>
</div>
</div>
<div
v-if="selectedApiToken"
class="row items-center q-mb-md q-gutter-sm"
>
<span v-text="$t('expiry') + ':'"></span>
<span
v-text="
selectedApiToken.expires_at
? utils.formatTimestamp(
selectedApiToken.expires_at
)
: 'Unknown'
"
></span>
<span v-text="$t('status') + ':'"></span>
<q-badge
:color="
selectedApiToken.expires_at &&
selectedApiToken.expires_at * 1000 > Date.now()
? 'positive'
: selectedApiToken.expires_at
? 'negative'
: 'grey'
"
:label="
selectedApiToken.expires_at
? selectedApiToken.expires_at * 1000 > Date.now()
? 'Active'
: 'Expired'
: 'Unknown'
"
></q-badge>
</div>
<div v-if="apiAcl.apiToken" class="row q-mb-md">
<div class="col-12">
<q-badge>
+7 -3
View File
@@ -1745,10 +1745,14 @@ async def test_api_create_user_api_token_success(
), "Expiration time should be 60 minutes from now."
token_id = payload["api_token_id"]
assert any(
token_id in [token.id for token in acl.token_id_list]
stored_token = next(
token
for acl in acls.access_control_list
), "API token should be part of at least one ACL."
for token in acl.token_id_list
if token.id == token_id
)
assert stored_token.expires_at is not None
assert abs(stored_token.expires_at - expiration_time) <= 1
@pytest.mark.anyio