Browse Source

Add isExpired for ApiKeyInfo

pull/14074/head
Andrii Landiak 11 months ago
parent
commit
a0496b612f
  1. 20
      application/src/main/java/org/thingsboard/server/controller/ApiKeyController.java
  2. 48
      application/src/test/java/org/thingsboard/server/controller/ApiKeyControllerTest.java
  3. 12
      common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKeyInfo.java

20
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')")

48
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<ApiKeyInfo> 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<ApiKeyInfo> 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<ApiKeyInfo> 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());

12
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<ApiKeyId> 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. " +

Loading…
Cancel
Save