From 11199d347b258500f46215e46d52146e6a014222 Mon Sep 17 00:00:00 2001 From: Andrii Landiak Date: Tue, 14 Oct 2025 12:05:12 +0300 Subject: [PATCH] Small refactoring --- .../server/controller/ApiKeyController.java | 2 +- .../auth/pat/ApiKeyAuthenticationProvider.java | 2 +- .../controller/ApiKeyControllerTest.java | 2 +- .../pat/ApiKeyAuthenticationProviderTest.java | 18 +++++++++--------- .../server/dao/pat/ApiKeyService.java | 2 +- .../server/common/data/pat/ApiKey.java | 12 ++++++------ .../server/dao/model/ModelConstants.java | 2 +- .../server/dao/model/sql/ApiKeyEntity.java | 10 +++++----- .../thingsboard/server/dao/pat/ApiKeyDao.java | 4 +--- .../server/dao/pat/ApiKeyServiceImpl.java | 10 +++++----- .../server/dao/sql/pat/ApiKeyRepository.java | 2 +- .../server/dao/sql/pat/JpaApiKeyDao.java | 4 ++-- .../server/dao/tenant/TenantServiceImpl.java | 2 +- .../main/resources/sql/schema-entities-idx.sql | 2 +- dao/src/main/resources/sql/schema-entities.sql | 2 +- .../server/dao/service/ApiKeyServiceTest.java | 12 ++++++------ 16 files changed, 43 insertions(+), 45 deletions(-) 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 deb0628988..e93a4cc14a 100644 --- a/application/src/main/java/org/thingsboard/server/controller/ApiKeyController.java +++ b/application/src/main/java/org/thingsboard/server/controller/ApiKeyController.java @@ -74,7 +74,7 @@ public class ApiKeyController extends BaseController { apiKeyInfo.setTenantId(securityUser.getTenantId()); checkEntity(apiKeyInfo.getId(), apiKeyInfo, Resource.API_KEY); ApiKey savedApiKey = checkNotNull(apiKeyService.saveApiKey(securityUser.getTenantId(), apiKeyInfo)); - savedApiKey.setHash(toUserApiKey(savedApiKey.getHash())); + savedApiKey.setValue(toUserApiKey(savedApiKey.getValue())); return savedApiKey; } diff --git a/application/src/main/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationProvider.java b/application/src/main/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationProvider.java index e0702d7440..68a676ef18 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationProvider.java +++ b/application/src/main/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationProvider.java @@ -59,7 +59,7 @@ public class ApiKeyAuthenticationProvider implements org.springframework.securit if (StringUtils.isEmpty(key)) { throw new BadCredentialsException("Empty API key"); } - ApiKey apiKey = apiKeyService.findApiKeyByHash(key); + ApiKey apiKey = apiKeyService.findApiKeyByValue(key); if (apiKey == null) { throw new BadCredentialsException("User not found for the provided API key"); } 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 8b9e7cae8c..d71d73b6df 100644 --- a/application/src/test/java/org/thingsboard/server/controller/ApiKeyControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/ApiKeyControllerTest.java @@ -42,7 +42,7 @@ public class ApiKeyControllerTest extends AbstractControllerTest { public void testSaveApiKey() throws Exception { ApiKeyInfo apiKeyInfo = constructApiKeyInfo("New API key description", true); - String apiKeyStr = doPost("/api/apiKey", apiKeyInfo, ApiKey.class).getHash(); + String apiKeyStr = doPost("/api/apiKey", apiKeyInfo, ApiKey.class).getValue(); Assert.assertTrue(apiKeyStr.startsWith(API_KEY_HEADER_PREFIX)); PageData pageData = doGetTypedWithPageLink("/api/apiKeys/" + tenantAdminUserId + "?", new TypeReference<>() {}, new PageLink(10, 0)); diff --git a/application/src/test/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationProviderTest.java b/application/src/test/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationProviderTest.java index cbea0f71e5..00fac8866a 100644 --- a/application/src/test/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationProviderTest.java +++ b/application/src/test/java/org/thingsboard/server/service/security/auth/pat/ApiKeyAuthenticationProviderTest.java @@ -83,14 +83,14 @@ public class ApiKeyAuthenticationProviderTest { apiKey.setId(new ApiKeyId(UUID.randomUUID())); apiKey.setTenantId(tenantId); apiKey.setUserId(userId); - apiKey.setHash(TEST_API_KEY); + apiKey.setValue(TEST_API_KEY); apiKey.setEnabled(true); apiKey.setExpirationTime(0); } @Test public void testSuccessfulAuthentication() { - when(apiKeyService.findApiKeyByHash(TEST_API_KEY)).thenReturn(apiKey); + when(apiKeyService.findApiKeyByValue(TEST_API_KEY)).thenReturn(apiKey); when(userService.findUserById(tenantId, userId)).thenReturn(user); when(userService.findUserCredentialsByUserId(tenantId, userId)).thenReturn(userCredentials); @@ -117,7 +117,7 @@ public class ApiKeyAuthenticationProviderTest { @Test(expected = BadCredentialsException.class) public void testNonExistentApiKey() { - when(apiKeyService.findApiKeyByHash(TEST_API_KEY)).thenReturn(null); + when(apiKeyService.findApiKeyByValue(TEST_API_KEY)).thenReturn(null); ApiKeyAuthenticationToken token = new ApiKeyAuthenticationToken(new RawApiKeyToken(TEST_API_KEY)); provider.authenticate(token); @@ -126,7 +126,7 @@ public class ApiKeyAuthenticationProviderTest { @Test(expected = DisabledException.class) public void testDisabledApiKey() { apiKey.setEnabled(false); - when(apiKeyService.findApiKeyByHash(TEST_API_KEY)).thenReturn(apiKey); + when(apiKeyService.findApiKeyByValue(TEST_API_KEY)).thenReturn(apiKey); ApiKeyAuthenticationToken token = new ApiKeyAuthenticationToken(new RawApiKeyToken(TEST_API_KEY)); provider.authenticate(token); @@ -135,7 +135,7 @@ public class ApiKeyAuthenticationProviderTest { @Test(expected = CredentialsExpiredException.class) public void testExpiredApiKey() { apiKey.setExpirationTime(System.currentTimeMillis() - 10000); // Expired 10 seconds ago - when(apiKeyService.findApiKeyByHash(TEST_API_KEY)).thenReturn(apiKey); + when(apiKeyService.findApiKeyByValue(TEST_API_KEY)).thenReturn(apiKey); ApiKeyAuthenticationToken token = new ApiKeyAuthenticationToken(new RawApiKeyToken(TEST_API_KEY)); provider.authenticate(token); @@ -143,7 +143,7 @@ public class ApiKeyAuthenticationProviderTest { @Test(expected = UsernameNotFoundException.class) public void testNonExistentUser() { - when(apiKeyService.findApiKeyByHash(TEST_API_KEY)).thenReturn(apiKey); + when(apiKeyService.findApiKeyByValue(TEST_API_KEY)).thenReturn(apiKey); when(userService.findUserById(tenantId, userId)).thenReturn(null); ApiKeyAuthenticationToken token = new ApiKeyAuthenticationToken(new RawApiKeyToken(TEST_API_KEY)); @@ -152,7 +152,7 @@ public class ApiKeyAuthenticationProviderTest { @Test(expected = UsernameNotFoundException.class) public void testNonExistentUserCredentials() { - when(apiKeyService.findApiKeyByHash(TEST_API_KEY)).thenReturn(apiKey); + when(apiKeyService.findApiKeyByValue(TEST_API_KEY)).thenReturn(apiKey); when(userService.findUserById(tenantId, userId)).thenReturn(user); when(userService.findUserCredentialsByUserId(tenantId, userId)).thenReturn(null); ApiKeyAuthenticationToken token = new ApiKeyAuthenticationToken(new RawApiKeyToken(TEST_API_KEY)); @@ -163,7 +163,7 @@ public class ApiKeyAuthenticationProviderTest { @Test(expected = DisabledException.class) public void testDisabledUser() { userCredentials.setEnabled(false); - when(apiKeyService.findApiKeyByHash(TEST_API_KEY)).thenReturn(apiKey); + when(apiKeyService.findApiKeyByValue(TEST_API_KEY)).thenReturn(apiKey); when(userService.findUserById(tenantId, userId)).thenReturn(user); when(userService.findUserCredentialsByUserId(tenantId, userId)).thenReturn(userCredentials); ApiKeyAuthenticationToken token = new ApiKeyAuthenticationToken(new RawApiKeyToken(TEST_API_KEY)); @@ -174,7 +174,7 @@ public class ApiKeyAuthenticationProviderTest { @Test(expected = InsufficientAuthenticationException.class) public void testUserWithoutAuthority() { user.setAuthority(null); - when(apiKeyService.findApiKeyByHash(TEST_API_KEY)).thenReturn(apiKey); + when(apiKeyService.findApiKeyByValue(TEST_API_KEY)).thenReturn(apiKey); when(userService.findUserById(tenantId, userId)).thenReturn(user); when(userService.findUserCredentialsByUserId(tenantId, userId)).thenReturn(userCredentials); ApiKeyAuthenticationToken token = new ApiKeyAuthenticationToken(new RawApiKeyToken(TEST_API_KEY)); diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/pat/ApiKeyService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/pat/ApiKeyService.java index 375dce2cd8..2fb67d2052 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/pat/ApiKeyService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/pat/ApiKeyService.java @@ -32,7 +32,7 @@ public interface ApiKeyService extends EntityDaoService { void deleteByUserId(TenantId tenantId, UserId userId); - ApiKey findApiKeyByHash(String hash); + ApiKey findApiKeyByValue(String value); ApiKey findApiKeyById(TenantId tenantId, ApiKeyId apiKeyId); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKey.java b/common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKey.java index 82d88f1ae7..81753322ba 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKey.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/pat/ApiKey.java @@ -32,8 +32,8 @@ public class ApiKey extends ApiKeyInfo { private static final long serialVersionUID = -2313196723950490263L; @NoXss - @Schema(description = "Api key hash value", requiredMode = Schema.RequiredMode.REQUIRED) - private String hash; + @Schema(description = "Api key value", requiredMode = Schema.RequiredMode.REQUIRED) + private String value; public ApiKey() { super(); @@ -45,17 +45,17 @@ public class ApiKey extends ApiKeyInfo { public ApiKey(ApiKey apiKey) { super(apiKey); - this.hash = apiKey.getHash(); + this.value = apiKey.getValue(); } public ApiKey(ApiKeyInfo apiKeyInfo) { super(apiKeyInfo); - this.hash = null; + this.value = null; } - public ApiKey(ApiKeyInfo apiKeyInfo, String hash) { + public ApiKey(ApiKeyInfo apiKeyInfo, String value) { super(apiKeyInfo); - this.hash = hash; + this.value = value; } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java index 6cc51e93c1..a5534b743c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java @@ -766,7 +766,7 @@ public class ModelConstants { public static final String API_KEY_TABLE_NAME = "api_key"; public static final String API_KEY_TENANT_ID_COLUMN_NAME = TENANT_ID_COLUMN; public static final String API_KEY_USER_ID_COLUMN_NAME = USER_ID_PROPERTY; - public static final String API_KEY_HASH_COLUMN_NAME = "hash"; + public static final String API_KEY_VALUE_COLUMN_NAME = "value"; public static final String API_KEY_EXPIRATION_TIME_COLUMN_NAME = "expiration_time"; public static final String API_KEY_ENABLED_COLUMN_NAME = "enabled"; public static final String API_KEY_DESCRIPTION_COLUMN_NAME = "description"; diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ApiKeyEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ApiKeyEntity.java index 30126ac699..0942b0b5af 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ApiKeyEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ApiKeyEntity.java @@ -22,8 +22,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import org.thingsboard.server.common.data.pat.ApiKey; -import static org.thingsboard.server.dao.model.ModelConstants.API_KEY_HASH_COLUMN_NAME; import static org.thingsboard.server.dao.model.ModelConstants.API_KEY_TABLE_NAME; +import static org.thingsboard.server.dao.model.ModelConstants.API_KEY_VALUE_COLUMN_NAME; @Data @EqualsAndHashCode(callSuper = true) @@ -31,8 +31,8 @@ import static org.thingsboard.server.dao.model.ModelConstants.API_KEY_TABLE_NAME @Table(name = API_KEY_TABLE_NAME) public class ApiKeyEntity extends AbstractApiKeyInfoEntity { - @Column(name = API_KEY_HASH_COLUMN_NAME) - private String hash; + @Column(name = API_KEY_VALUE_COLUMN_NAME) + private String value; public ApiKeyEntity() { super(); @@ -40,12 +40,12 @@ public class ApiKeyEntity extends AbstractApiKeyInfoEntity { public ApiKeyEntity(ApiKey apiKey) { super(apiKey); - this.hash = apiKey.getHash(); + this.value = apiKey.getValue(); } @Override public ApiKey toData() { - return new ApiKey(super.toApiKeyInfo(), hash); + return new ApiKey(super.toApiKeyInfo(), value); } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyDao.java b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyDao.java index 5d0156a772..73c57b2840 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyDao.java @@ -20,11 +20,9 @@ import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.pat.ApiKey; import org.thingsboard.server.dao.Dao; -import java.util.Set; - public interface ApiKeyDao extends Dao { - ApiKey findByHash(String hash); + ApiKey findByValue(String value); void deleteByTenantId(TenantId tenantId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyServiceImpl.java index 2c2649cd99..cf4d4209af 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/pat/ApiKeyServiceImpl.java @@ -59,9 +59,9 @@ public class ApiKeyServiceImpl extends AbstractEntityService implements ApiKeySe var old = apiKeyValidator.validate(apiKey, ApiKeyInfo::getTenantId); if (old == null) { String hash = generateApiKeySecret(); - apiKey.setHash(hash); + apiKey.setValue(hash); } else { - apiKey.setHash(old.getHash()); + apiKey.setValue(old.getValue()); } return apiKeyDao.save(tenantId, apiKey); } catch (Exception e) { @@ -124,9 +124,9 @@ public class ApiKeyServiceImpl extends AbstractEntityService implements ApiKeySe } @Override - public ApiKey findApiKeyByHash(String hash) { - log.trace("Executing findApiKeyByHash [{}]", hash); - return apiKeyDao.findByHash(hash); + public ApiKey findApiKeyByValue(String value) { + log.trace("Executing findApiKeyByValue [{}]", value); + return apiKeyDao.findByValue(value); } private static String generateApiKeySecret() { diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/pat/ApiKeyRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/pat/ApiKeyRepository.java index 564ec29ec8..2c797db7c1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/pat/ApiKeyRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/pat/ApiKeyRepository.java @@ -26,7 +26,7 @@ import java.util.UUID; public interface ApiKeyRepository extends JpaRepository { - ApiKeyEntity findByHash(String hash); + ApiKeyEntity findByValue(String value); @Transactional @Modifying diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/pat/JpaApiKeyDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/pat/JpaApiKeyDao.java index 177f19b528..f539170798 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/pat/JpaApiKeyDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/pat/JpaApiKeyDao.java @@ -41,8 +41,8 @@ public class JpaApiKeyDao extends JpaAbstractDao implement private ApiKeyRepository apiKeyRepository; @Override - public ApiKey findByHash(String hash) { - return DaoUtil.getData(apiKeyRepository.findByHash(hash)); + public ApiKey findByValue(String value) { + return DaoUtil.getData(apiKeyRepository.findByValue(value)); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java index b7ba7126b6..0df7c36527 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java @@ -179,7 +179,7 @@ public class TenantServiceImpl extends AbstractCachedEntityService