From 65d075035f19ec65f700e5b27530dec362281f85 Mon Sep 17 00:00:00 2001 From: vzikratyi Date: Tue, 7 Jul 2020 15:07:20 +0300 Subject: [PATCH] Removed AdminSettingsId from ClientParams --- .../oauth2/OAuth2ClientsDomainParams.java | 2 - .../server/dao/oauth2/OAuth2ServiceImpl.java | 103 +++++++----------- .../dao/service/BaseOAuth2ServiceTest.java | 92 ++++++++++++++-- 3 files changed, 123 insertions(+), 74 deletions(-) diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/oauth2/OAuth2ClientsDomainParams.java b/common/data/src/main/java/org/thingsboard/server/common/data/oauth2/OAuth2ClientsDomainParams.java index d9dc07d8ea..3ebfa783c2 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/oauth2/OAuth2ClientsDomainParams.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/oauth2/OAuth2ClientsDomainParams.java @@ -27,7 +27,5 @@ import java.util.List; @AllArgsConstructor public class OAuth2ClientsDomainParams { private String domainName; - private String adminSettingsId; - private List clientRegistrations; } \ No newline at end of file diff --git a/dao/src/main/java/org/thingsboard/server/dao/oauth2/OAuth2ServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/oauth2/OAuth2ServiceImpl.java index 5ce6256816..8857e6ceb9 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/oauth2/OAuth2ServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/oauth2/OAuth2ServiceImpl.java @@ -133,9 +133,6 @@ public class OAuth2ServiceImpl implements OAuth2Service { @Override public OAuth2ClientsParams saveTenantOAuth2ClientsParams(TenantId tenantId, OAuth2ClientsParams oAuth2ClientsParams) { - if (oAuth2ClientsParams.getClientsDomainsParams().size() != 1) { - throw new DataValidationException("Tenant can configure OAuth2 only for one domain!"); - } validate(oAuth2ClientsParams); validateRegistrationIdUniqueness(oAuth2ClientsParams, tenantId); @@ -143,9 +140,10 @@ public class OAuth2ServiceImpl implements OAuth2Service { try { validateRegistrationIdUniqueness(oAuth2ClientsParams, tenantId); - OAuth2ClientsDomainParams oAuth2ClientsDomainParams = oAuth2ClientsParams.getClientsDomainsParams().get(0); - String adminSettingsId = processTenantAdminSettings(tenantId, oAuth2ClientsDomainParams.getDomainName(), oAuth2ClientsDomainParams.getAdminSettingsId()); - oAuth2ClientsDomainParams.setAdminSettingsId(adminSettingsId); + Set domainNames = oAuth2ClientsParams.getClientsDomainsParams().stream() + .map(OAuth2ClientsDomainParams::getDomainName) + .collect(Collectors.toSet()); + processTenantAdminSettings(tenantId, domainNames); List attributes = createOAuth2ClientsParamsAttributes(oAuth2ClientsParams); try { @@ -170,46 +168,40 @@ public class OAuth2ServiceImpl implements OAuth2Service { return attributes; } - private String processTenantAdminSettings(TenantId tenantId, String domainName, String prevAdminSettingsId) { - String selectedDomainSettingsKey = constructAdminSettingsDomainKey(domainName); - AdminSettings existentAdminSettingsByKey = adminSettingsService.findAdminSettingsByKey(tenantId, selectedDomainSettingsKey); - if (StringUtils.isEmpty(prevAdminSettingsId)) { - if (existentAdminSettingsByKey == null) { - AdminSettings tenantAdminSettings = createTenantAdminSettings(tenantId, selectedDomainSettingsKey); - existentAdminSettingsByKey = adminSettingsService.saveAdminSettings(tenantId, tenantAdminSettings); - return existentAdminSettingsByKey.getId().getId().toString(); - } else { + private void processTenantAdminSettings(TenantId tenantId, Set domainNames) { + OAuth2ClientsParams existentClientsParams = getTenantOAuth2ClientsParams(tenantId); + + Set existentDomainNames = existentClientsParams != null && existentClientsParams.getClientsDomainsParams() != null ? + existentClientsParams.getClientsDomainsParams().stream() + .map(OAuth2ClientsDomainParams::getDomainName) + .collect(Collectors.toSet()) + : Collections.emptySet(); + + Set domainNamesToAdd = domainNames.stream() + .filter(domainName -> !existentDomainNames.contains(domainName)) + .collect(Collectors.toSet()); + Set domainNamesToDelete = existentDomainNames.stream() + .filter(domainName -> !domainNames.contains(domainName)) + .collect(Collectors.toSet()); + + domainNamesToAdd.forEach(domainName -> { + String domainSettingsKey = constructAdminSettingsDomainKey(domainName); + if (adminSettingsService.findAdminSettingsByKey(tenantId, domainSettingsKey) != null) { log.error("Current domain name [{}] already registered in the system!", domainName); throw new IncorrectParameterException("Current domain name [" + domainName + "] already registered in the system!"); } - } else { - AdminSettings existentOAuth2ClientsSettingsById = adminSettingsService.findAdminSettingsById( - tenantId, - new AdminSettingsId(UUID.fromString(prevAdminSettingsId)) - ); - - if (existentOAuth2ClientsSettingsById == null) { - log.error("Admin setting ID is already set in OAuth2 Client Params object, but doesn't exist in the database"); - throw new IllegalStateException("Admin setting ID is already set in OAuth2 Client Params object, but doesn't exist in the database"); - } + }); - if (!existentOAuth2ClientsSettingsById.getKey().equals(selectedDomainSettingsKey)) { - if (existentAdminSettingsByKey == null) { - AdminSettings newOAuth2ClientsSettings = replaceExistentAdminSettings(tenantId, selectedDomainSettingsKey, existentOAuth2ClientsSettingsById.getKey()); - return newOAuth2ClientsSettings.getId().getId().toString(); - } else { - log.error("Current domain name [{}] already registered in the system!", domainName); - throw new IncorrectParameterException("Current domain name [" + domainName + "] already registered in the system!"); - } - } - return prevAdminSettingsId; - } - } + domainNamesToAdd.forEach(domainName -> { + String domainSettingsKey = constructAdminSettingsDomainKey(domainName); + AdminSettings tenantAdminSettings = createTenantAdminSettings(tenantId, domainSettingsKey); + adminSettingsService.saveAdminSettings(tenantId, tenantAdminSettings); + }); - private AdminSettings replaceExistentAdminSettings(TenantId tenantId, String newKey, String oldKey) { - adminSettingsService.deleteAdminSettingsByKey(tenantId, oldKey); - AdminSettings tenantAdminSettings = createTenantAdminSettings(tenantId, newKey); - return adminSettingsService.saveAdminSettings(tenantId, tenantAdminSettings); + domainNamesToDelete.forEach(domainName -> { + String domainSettingsKey = constructAdminSettingsDomainKey(domainName); + adminSettingsService.deleteAdminSettingsByKey(tenantId, domainSettingsKey); + }); } private AdminSettings createTenantAdminSettings(TenantId tenantId, String clientRegistrationsKey) { @@ -258,7 +250,6 @@ public class OAuth2ServiceImpl implements OAuth2Service { private void validate(OAuth2ClientsParams oAuth2ClientsParams) { validateDomainNames(oAuth2ClientsParams); - validateAdminSettingsIds(oAuth2ClientsParams); toClientRegistrationStream(oAuth2ClientsParams) .forEach(validator); @@ -282,19 +273,6 @@ public class OAuth2ServiceImpl implements OAuth2Service { } } - private void validateAdminSettingsIds(OAuth2ClientsParams oAuth2ClientsParams) { - List adminSettingsIds = oAuth2ClientsParams.getClientsDomainsParams().stream() - .map(OAuth2ClientsDomainParams::getAdminSettingsId) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - - boolean duplicateAdminSettingsIds = adminSettingsIds.stream() - .anyMatch(adminSettingsId -> Collections.frequency(adminSettingsIds, adminSettingsId) > 1); - if (duplicateAdminSettingsIds) { - throw new DataValidationException("All admin settings ids should be unique!"); - } - } - @Override public OAuth2ClientsParams getSystemOAuth2ClientsParams() { AdminSettings oauth2ClientsParamsSettings = adminSettingsService.findAdminSettingsByKey(TenantId.SYS_TENANT_ID, OAUTH2_CLIENT_REGISTRATIONS_PARAMS); @@ -353,9 +331,10 @@ public class OAuth2ServiceImpl implements OAuth2Service { public void deleteTenantOAuth2ClientsParams(TenantId tenantId) { OAuth2ClientsParams params = getTenantOAuth2ClientsParams(tenantId); if (params == null || params.getClientsDomainsParams() == null) return; - OAuth2ClientsDomainParams domainParams = params.getClientsDomainsParams().get(0); - String settingsKey = constructAdminSettingsDomainKey(domainParams.getDomainName()); - adminSettingsService.deleteAdminSettingsByKey(tenantId, settingsKey); + params.getClientsDomainsParams().forEach(domainParams -> { + String settingsKey = constructAdminSettingsDomainKey(domainParams.getDomainName()); + adminSettingsService.deleteAdminSettingsByKey(tenantId, settingsKey); + }); attributesService.removeAll(tenantId, tenantId, DataConstants.SERVER_SCOPE, Collections.singletonList(OAUTH2_CLIENT_REGISTRATIONS_PARAMS)); } @@ -448,22 +427,18 @@ public class OAuth2ServiceImpl implements OAuth2Service { return result; } - private OAuth2ClientsDomainParams mergeDomainParams(OAuth2ClientsDomainParams sourceParams, OAuth2ClientsDomainParams newParams){ + private OAuth2ClientsDomainParams mergeDomainParams(OAuth2ClientsDomainParams sourceParams, OAuth2ClientsDomainParams newParams) { if (newParams == null) return sourceParams; OAuth2ClientsDomainParams.OAuth2ClientsDomainParamsBuilder mergedParamsBuilder = sourceParams.toBuilder(); - if (newParams.getClientRegistrations() != null){ + if (newParams.getClientRegistrations() != null) { List mergedClientRegistrations = sourceParams.getClientRegistrations() != null ? sourceParams.getClientRegistrations() : new ArrayList<>(); mergedClientRegistrations.addAll(newParams.getClientRegistrations()); mergedParamsBuilder.clientRegistrations(mergedClientRegistrations); } - if (newParams.getAdminSettingsId() != null){ - mergedParamsBuilder.adminSettingsId(newParams.getAdminSettingsId()); - } - return mergedParamsBuilder.build(); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseOAuth2ServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseOAuth2ServiceTest.java index b5e8280eee..94b58fb5ce 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseOAuth2ServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseOAuth2ServiceTest.java @@ -114,11 +114,6 @@ public class BaseOAuth2ServiceTest extends AbstractServiceTest { oAuth2Service.saveTenantOAuth2ClientsParams(tenantId, clientsParamsWithDuplicateRegistrationIds()); } - @Test(expected = DataValidationException.class) - public void testSaveTenantParamsWithMultipleDomains() { - oAuth2Service.saveTenantOAuth2ClientsParams(tenantId, validClientsParamsWithMultipleDomains()); - } - @Test public void testSaveSystemParams() { OAuth2ClientsParams clientsParams = validClientsParams(); @@ -130,7 +125,7 @@ public class BaseOAuth2ServiceTest extends AbstractServiceTest { @Test public void testSaveSystemParamsWithMultipleDomains() { - OAuth2ClientsParams clientsParams = validClientsParamsWithMultipleDomains(); + OAuth2ClientsParams clientsParams = validClientsParamsWithThreeDomains(); OAuth2ClientsParams savedClientParams = oAuth2Service.saveSystemOAuth2ClientsParams(clientsParams); Assert.assertNotNull(adminSettingsService.findAdminSettingsByKey(TenantId.SYS_TENANT_ID, OAuth2Utils.OAUTH2_CLIENT_REGISTRATIONS_PARAMS)); @@ -163,11 +158,81 @@ public class BaseOAuth2ServiceTest extends AbstractServiceTest { Assert.assertNotNull(savedClientParams); OAuth2ClientsDomainParams savedDomainParams = savedClientParams.getClientsDomainsParams().get(0); - Assert.assertNotNull(savedDomainParams.getAdminSettingsId()); Assert.assertEquals(domainParams.getDomainName(), savedDomainParams.getDomainName()); Assert.assertEquals(domainParams.getClientRegistrations(), savedDomainParams.getClientRegistrations()); } + @Test + public void testSaveTenantMultipleParams() { + OAuth2ClientsParams clientsParams = validClientsParamsWithThreeDomains(); + + clientsParams.getClientsDomainsParams().forEach(oAuth2ClientsDomainParams -> { + String domainName = oAuth2ClientsDomainParams.getDomainName(); + String domainKey = OAuth2Utils.constructAdminSettingsDomainKey(domainName); + Assert.assertNull(adminSettingsService.findAdminSettingsByKey(tenantId, domainKey)); + }); + + OAuth2ClientsParams savedClientParams = oAuth2Service.saveTenantOAuth2ClientsParams(tenantId, clientsParams); + Assert.assertNotNull(savedClientParams); + + clientsParams.getClientsDomainsParams().forEach(oAuth2ClientsDomainParams -> { + String domainName = oAuth2ClientsDomainParams.getDomainName(); + String domainKey = OAuth2Utils.constructAdminSettingsDomainKey(domainName); + Assert.assertNotNull(adminSettingsService.findAdminSettingsByKey(tenantId, domainKey)); + }); + + Assert.assertEquals(clientsParams, savedClientParams); + } + + @Test + public void testRewriteSameDomainTenantParams() { + OAuth2ClientsParams clientsParams = validClientsParamsWithThreeDomains(); + oAuth2Service.saveTenantOAuth2ClientsParams(tenantId, clientsParams); + + List clientsDomainsParams = clientsParams.getClientsDomainsParams(); + OAuth2ClientsParams updatedClientsParams = validClientsParamsWithThreeDomains(); + String sameDomainName = clientsDomainsParams.get(0).getDomainName(); + updatedClientsParams.getClientsDomainsParams().get(0).setDomainName(sameDomainName); + OAuth2ClientsParams rewrittenClientParams = oAuth2Service.saveTenantOAuth2ClientsParams(tenantId, updatedClientsParams); + Assert.assertEquals(updatedClientsParams, rewrittenClientParams); + + clientsParams.getClientsDomainsParams().forEach(oAuth2ClientsDomainParams -> { + String domainName = oAuth2ClientsDomainParams.getDomainName(); + String domainKey = OAuth2Utils.constructAdminSettingsDomainKey(domainName); + if (domainName.equals(sameDomainName)) { + Assert.assertNotNull(adminSettingsService.findAdminSettingsByKey(tenantId, domainKey)); + } else { + Assert.assertNull(adminSettingsService.findAdminSettingsByKey(tenantId, domainKey)); + } + }); + updatedClientsParams.getClientsDomainsParams().forEach(oAuth2ClientsDomainParams -> { + String domainName = oAuth2ClientsDomainParams.getDomainName(); + String domainKey = OAuth2Utils.constructAdminSettingsDomainKey(domainName); + Assert.assertNotNull(adminSettingsService.findAdminSettingsByKey(tenantId, domainKey)); + }); + } + + @Test + public void testAddDeleteTenantDomainParams() { + OAuth2ClientsParams clientsParams = validClientsParamsWithThreeDomains(); + oAuth2Service.saveTenantOAuth2ClientsParams(tenantId, clientsParams); + + List clientsDomainsParams = clientsParams.getClientsDomainsParams(); + OAuth2ClientsParams updatedClientsParams = validClientsParamsWithThreeDomains(); + for (int i = 0; i < updatedClientsParams.getClientsDomainsParams().size(); i++) { + String domainName = clientsDomainsParams.get(i).getDomainName(); + updatedClientsParams.getClientsDomainsParams().get(i).setDomainName(domainName); + } + OAuth2ClientsParams rewrittenClientParams = oAuth2Service.saveTenantOAuth2ClientsParams(tenantId, updatedClientsParams); + Assert.assertEquals(updatedClientsParams, rewrittenClientParams); + + clientsParams.getClientsDomainsParams().forEach(oAuth2ClientsDomainParams -> { + String domainName = oAuth2ClientsDomainParams.getDomainName(); + String domainKey = OAuth2Utils.constructAdminSettingsDomainKey(domainName); + Assert.assertNotNull(adminSettingsService.findAdminSettingsByKey(tenantId, domainKey)); + }); + } + @Test public void testFindTenantParams() { OAuth2ClientsParams clientsParams = validClientsParams(); @@ -288,6 +353,9 @@ public class BaseOAuth2ServiceTest extends AbstractServiceTest { oAuth2Service.saveSystemOAuth2ClientsParams(sysAdminClientsParams); Assert.assertNotNull(oAuth2Service.getSystemOAuth2ClientsParams().getClientsDomainsParams()); + + oAuth2Service.deleteSystemOAuth2ClientsParams(); + Assert.assertNull(adminSettingsService.findAdminSettingsByKey(TenantId.SYS_TENANT_ID, OAuth2Utils.OAUTH2_CLIENT_REGISTRATIONS_PARAMS)); } @Test @@ -299,6 +367,14 @@ public class BaseOAuth2ServiceTest extends AbstractServiceTest { oAuth2Service.saveTenantOAuth2ClientsParams(tenantId, tenantClientsParams); Assert.assertNotNull(oAuth2Service.getTenantOAuth2ClientsParams(tenantId).getClientsDomainsParams()); + + oAuth2Service.deleteTenantOAuth2ClientsParams(tenantId); + Assert.assertNull(oAuth2Service.getTenantOAuth2ClientsParams(tenantId).getClientsDomainsParams()); + tenantClientsParams.getClientsDomainsParams().forEach(oAuth2ClientsDomainParams -> { + String domainName = oAuth2ClientsDomainParams.getDomainName(); + String domainKey = OAuth2Utils.constructAdminSettingsDomainKey(domainName); + Assert.assertNull(adminSettingsService.findAdminSettingsByKey(tenantId, domainKey)); + }); } @@ -331,7 +407,7 @@ public class BaseOAuth2ServiceTest extends AbstractServiceTest { .build(); } - private OAuth2ClientsParams validClientsParamsWithMultipleDomains() { + private OAuth2ClientsParams validClientsParamsWithThreeDomains() { OAuth2ClientRegistration first = validClientRegistration(); OAuth2ClientRegistration second = validClientRegistration(); OAuth2ClientRegistration third = validClientRegistration();