diff --git a/application/src/main/java/org/thingsboard/server/controller/ApiKeyController.java b/application/src/main/java/org/thingsboard/server/controller/ApiKeyController.java index 8b20c0beed..d9df135811 100644 --- a/application/src/main/java/org/thingsboard/server/controller/ApiKeyController.java +++ b/application/src/main/java/org/thingsboard/server/controller/ApiKeyController.java @@ -136,26 +136,6 @@ public class ApiKeyController extends BaseController { return apiKeyService.saveApiKey(apiKey.getTenantId(), apiKey); } - - @ApiOperation(value = "Check if API key is expired (isApiKeyExpired)", - notes = "Returns true if the API key is expired, false otherwise. " + - "Referencing a non-existing ApiKey Id will cause a 'Not Found' error." + - AVAILABLE_FOR_ANY_AUTHORIZED_USER) - @PreAuthorize("hasAnyAuthority('SYS_ADMIN','TENANT_ADMIN', 'CUSTOMER_USER')") - @GetMapping(value = "/apiKey/{id}/expired") - public boolean isApiKeyExpired( - @Parameter(description = API_KEY_ID_PARAM_DESCRIPTION, required = true) - @PathVariable UUID id) throws ThingsboardException { - ApiKeyId apiKeyId = new ApiKeyId(id); - ApiKey apiKey = checkApiKeyId(apiKeyId, Operation.READ); - - if (apiKey.getExpirationTime() > 0) { - return System.currentTimeMillis() > apiKey.getExpirationTime(); - } - - return false; - } - @ApiOperation(value = "Delete API key by ID (deleteApiKey)", notes = "Deletes the API key. Referencing non-existing ApiKey Id will cause an error." + AVAILABLE_FOR_ANY_AUTHORIZED_USER) @PreAuthorize("hasAnyAuthority('SYS_ADMIN','TENANT_ADMIN', 'CUSTOMER_USER')") diff --git a/application/src/test/java/org/thingsboard/server/controller/ApiKeyControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/ApiKeyControllerTest.java index 0350b9acf4..167839e7f3 100644 --- a/application/src/test/java/org/thingsboard/server/controller/ApiKeyControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/ApiKeyControllerTest.java @@ -119,54 +119,6 @@ public class ApiKeyControllerTest extends AbstractControllerTest { doDelete("/api/apiKey/" + savedApiKey.getId()).andExpect(status().isOk()); } - @Test - public void testIsApiKeyExpired() throws Exception { - doGet("/api/apiKey/" + UUID.randomUUID() + "/expired").andExpect(status().isNotFound()); - - ApiKeyInfo apiKeyInfo = constructApiKeyInfo("Test API key description", true); - doPost("/api/apiKey", apiKeyInfo, ApiKey.class); - - PageData pageData = doGetTypedWithPageLink("/api/apiKeys/" + tenantAdminUserId + "?", new TypeReference<>() {}, new PageLink(10, 0)); - Assert.assertEquals(1, pageData.getData().size()); - ApiKeyInfo savedApiKeyNoExpiration = pageData.getData().get(0); - - Boolean isExpiredNoExpiration = doGet("/api/apiKey/" + savedApiKeyNoExpiration.getId().getId() + "/expired", Boolean.class); - Assert.assertNotNull(isExpiredNoExpiration); - Assert.assertFalse(isExpiredNoExpiration); - - doDelete("/api/apiKey/" + savedApiKeyNoExpiration.getId()).andExpect(status().isOk()); - - ApiKeyInfo apiKeyInfoFutureExpiration = constructApiKeyInfo("Test API key future expiration", true); - long futureExpirationTime = System.currentTimeMillis() + 3600000; - apiKeyInfoFutureExpiration.setExpirationTime(futureExpirationTime); - doPost("/api/apiKey", apiKeyInfoFutureExpiration, ApiKey.class); - - PageData pageData2 = doGetTypedWithPageLink("/api/apiKeys/" + tenantAdminUserId + "?", new TypeReference<>() {}, new PageLink(10, 0)); - Assert.assertEquals(1, pageData2.getData().size()); - ApiKeyInfo savedApiKeyFuture = pageData2.getData().get(0); - - Boolean isExpiredFuture = doGet("/api/apiKey/" + savedApiKeyFuture.getId().getId() + "/expired", Boolean.class); - Assert.assertNotNull(isExpiredFuture); - Assert.assertFalse(isExpiredFuture); - - doDelete("/api/apiKey/" + savedApiKeyFuture.getId()).andExpect(status().isOk()); - - ApiKeyInfo apiKeyInfoPastExpiration = constructApiKeyInfo("Test API key past expiration", true); - long pastExpirationTime = System.currentTimeMillis() - 3600000; - apiKeyInfoPastExpiration.setExpirationTime(pastExpirationTime); - doPost("/api/apiKey", apiKeyInfoPastExpiration, ApiKey.class); - - PageData pageData3 = doGetTypedWithPageLink("/api/apiKeys/" + tenantAdminUserId + "?", new TypeReference<>() {}, new PageLink(10, 0)); - Assert.assertEquals(1, pageData3.getData().size()); - ApiKeyInfo savedApiKeyPast = pageData3.getData().get(0); - - Boolean isExpiredPast = doGet("/api/apiKey/" + savedApiKeyPast.getId().getId() + "/expired", Boolean.class); - Assert.assertNotNull(isExpiredPast); - Assert.assertTrue(isExpiredPast); - - doDelete("/api/apiKey/" + savedApiKeyPast.getId()).andExpect(status().isOk()); - } - @Test public void testDeleteApiKey() throws Exception { doDelete("/api/apiKey/" + UUID.randomUUID()).andExpect(status().isNotFound()); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKeyInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKeyInfo.java index 3bfb53ca0f..aea83e5dca 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKeyInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKeyInfo.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.common.data.pat; +import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -53,6 +54,17 @@ public class ApiKeyInfo extends BaseData implements HasTenantId { @Schema(description = "Enabled/disabled api key.", example = "true") private boolean enabled; + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + @Schema(description = "Indicates if the api key is expired based on current time. Returns false if expirationTime is 0 (no expiry).", + example = "false", + accessMode = Schema.AccessMode.READ_ONLY) + public boolean isExpired() { + if (expirationTime == 0) { + return false; + } + return System.currentTimeMillis() > expirationTime; + } + @Schema(description = "JSON object with the Api Key Id. " + "Specify this field to update the Api Key. " + "Referencing non-existing Api Key Id will cause error. " +