display expiry on ACL tokens
This commit is contained in:
@@ -41,6 +41,7 @@ class SimpleStatus(BaseModel):
|
|||||||
class SimpleItem(BaseModel):
|
class SimpleItem(BaseModel):
|
||||||
id: str
|
id: str
|
||||||
name: str
|
name: str
|
||||||
|
expires_at: int | None = None
|
||||||
|
|
||||||
|
|
||||||
class DbVersion(BaseModel):
|
class DbVersion(BaseModel):
|
||||||
|
|||||||
@@ -295,7 +295,10 @@ async def api_create_user_api_token(
|
|||||||
account.username, api_token_id, data.expiration_time_minutes
|
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)
|
await update_user_access_control_list(acls)
|
||||||
return ApiTokenResponse(id=api_token_id, api_token=api_token)
|
return ApiTokenResponse(id=api_token_id, api_token=api_token)
|
||||||
|
|
||||||
|
|||||||
@@ -217,6 +217,11 @@ window.PageAccount = {
|
|||||||
computed: {
|
computed: {
|
||||||
isUserTouched() {
|
isUserTouched() {
|
||||||
return !_.isEqual(this.g.user, this.untouchedUser)
|
return !_.isEqual(this.g.user, this.untouchedUser)
|
||||||
|
},
|
||||||
|
selectedApiToken() {
|
||||||
|
return this.selectedApiAcl.token_id_list.find(
|
||||||
|
token => token.id === this.apiAcl.selectedTokenId
|
||||||
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|||||||
@@ -889,6 +889,39 @@
|
|||||||
></q-btn>
|
></q-btn>
|
||||||
</div>
|
</div>
|
||||||
</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 v-if="apiAcl.apiToken" class="row q-mb-md">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<q-badge>
|
<q-badge>
|
||||||
|
|||||||
@@ -1745,10 +1745,14 @@ async def test_api_create_user_api_token_success(
|
|||||||
), "Expiration time should be 60 minutes from now."
|
), "Expiration time should be 60 minutes from now."
|
||||||
|
|
||||||
token_id = payload["api_token_id"]
|
token_id = payload["api_token_id"]
|
||||||
assert any(
|
stored_token = next(
|
||||||
token_id in [token.id for token in acl.token_id_list]
|
token
|
||||||
for acl in acls.access_control_list
|
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
|
@pytest.mark.anyio
|
||||||
|
|||||||
Reference in New Issue
Block a user