display expiry on ACL tokens
This commit is contained in:
@@ -41,6 +41,7 @@ class SimpleStatus(BaseModel):
|
||||
class SimpleItem(BaseModel):
|
||||
id: str
|
||||
name: str
|
||||
expires_at: int | None = None
|
||||
|
||||
|
||||
class DbVersion(BaseModel):
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user