From 5f1de39fddbb5cc341e91917046fe3f76e93895f Mon Sep 17 00:00:00 2001 From: vzikratyi Date: Wed, 24 Jun 2020 14:59:30 +0300 Subject: [PATCH] Refactored saving system and tenant OAuth2 config --- .../server/dao/oauth2/OAuth2ServiceImpl.java | 179 ++++++++++-------- 1 file changed, 97 insertions(+), 82 deletions(-) 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 2b8e5d88d2..6228f0d8d8 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 @@ -44,9 +44,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Consumer; -import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.Stream; @Slf4j @Service @@ -131,7 +129,7 @@ public class OAuth2ServiceImpl implements OAuth2Service { lock.lock(); try { validateUniqueRegistrationId(oAuth2ClientsParams, TenantId.SYS_TENANT_ID); - AdminSettings clientRegistrationParamsSettings = createSystemOAuth2Settings(oAuth2ClientsParams); + AdminSettings clientRegistrationParamsSettings = createSystemAdminSettings(oAuth2ClientsParams); adminSettingsService.saveAdminSettings(TenantId.SYS_TENANT_ID, clientRegistrationParamsSettings); clientsParams.put(TenantId.SYS_TENANT_ID, oAuth2ClientsParams); } finally { @@ -141,59 +139,50 @@ public class OAuth2ServiceImpl implements OAuth2Service { return getSystemOAuth2ClientsParams(TenantId.SYS_TENANT_ID); } - private void validateUniqueRegistrationId(OAuth2ClientsParams inputOAuth2ClientsParams, TenantId tenantId) { - inputOAuth2ClientsParams.getClientRegistrations().stream() - .map(OAuth2ClientRegistration::getRegistrationId) - .forEach(registrationId -> { - clientsParams.forEach((paramsTenantId, oAuth2ClientsParams) -> { - boolean registrationExists = oAuth2ClientsParams.getClientRegistrations().stream() - .map(OAuth2ClientRegistration::getRegistrationId) - .anyMatch(registrationId::equals); - if (registrationExists && !tenantId.equals(paramsTenantId)) { - log.error("Current registrationId [{}] already registered in the system!", registrationId); - throw new IncorrectParameterException("Current registrationId [" + registrationId + "] already registered in the system!"); - } - }); - }); - } + @Override + public OAuth2ClientsParams saveTenantOAuth2ClientsParams(TenantId tenantId, OAuth2ClientsParams oAuth2ClientsParams) { + // TODO what if tenant saves config for several different domain names, do we need to check it + validate(oAuth2ClientsParams); + // TODO check by registration ID in system - private AdminSettings createSystemOAuth2Settings(OAuth2ClientsParams oAuth2ClientsParams) { - AdminSettings clientRegistrationParamsSettings = new AdminSettings(); - clientRegistrationParamsSettings.setKey(OAUTH2_CLIENT_REGISTRATIONS_PARAMS); - ObjectNode clientRegistrationsNode = mapper.createObjectNode(); + String adminSettingsId = processTenantAdminSettings(tenantId, oAuth2ClientsParams.getDomainName(), oAuth2ClientsParams.getAdminSettingsId()); + oAuth2ClientsParams.setAdminSettingsId(adminSettingsId); - String json; + List attributes = createOAuth2ClientsParamsAttributes(oAuth2ClientsParams); try { - json = mapper.writeValueAsString(oAuth2ClientsParams); - } catch (JsonProcessingException e) { - log.error("Unable to convert OAuth2 Client Registration Params to JSON!", e); - throw new IncorrectParameterException("Unable to convert OAuth2 Client Registration Params to JSON!"); + // TODO ask if I need .get() here + attributesService.save(tenantId, tenantId, DataConstants.SERVER_SCOPE, attributes).get(); + } catch (Exception e) { + log.error("Unable to save OAuth2 Client Registration Params to attributes!", e); + throw new IncorrectParameterException("Unable to save OAuth2 Client Registration Params to attributes!"); } - clientRegistrationsNode.put(SYSTEM_SETTINGS_OAUTH2_VALUE, json); - clientRegistrationParamsSettings.setJsonValue(clientRegistrationsNode); + return getTenantOAuth2ClientsParams(tenantId); + } - return clientRegistrationParamsSettings; + private List createOAuth2ClientsParamsAttributes(OAuth2ClientsParams oAuth2ClientsParams) { + String json = toJson(oAuth2ClientsParams); + List attributes = new ArrayList<>(); + long ts = System.currentTimeMillis(); + attributes.add(new BaseAttributeKvEntry(new StringDataEntry(OAUTH2_CLIENT_REGISTRATIONS_PARAMS, json), ts)); + return attributes; } - @Override - public OAuth2ClientsParams saveTenantOAuth2ClientsParams(TenantId tenantId, OAuth2ClientsParams oAuth2ClientsParams) { - // TODO ask what if tenant saves config for several different domain names, do we need to check it - // TODO check by registration ID in system - validate(oAuth2ClientsParams); - String clientRegistrationsKey = constructClientRegistrationsKey(oAuth2ClientsParams.getDomainName()); - AdminSettings existentAdminSettingsByKey = adminSettingsService.findAdminSettingsByKey(tenantId, clientRegistrationsKey); - if (StringUtils.isEmpty(oAuth2ClientsParams.getAdminSettingsId())) { + 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) { - existentAdminSettingsByKey = saveOAuth2ClientSettings(tenantId, clientRegistrationsKey); - oAuth2ClientsParams.setAdminSettingsId(existentAdminSettingsByKey.getId().getId().toString()); + AdminSettings tenantAdminSettings = createTenantAdminSettings(tenantId, selectedDomainSettingsKey); + existentAdminSettingsByKey = adminSettingsService.saveAdminSettings(tenantId, tenantAdminSettings); + return existentAdminSettingsByKey.getId().getId().toString(); } else { - log.error("Current domain name [{}] already registered in the system!", oAuth2ClientsParams.getDomainName()); - throw new IncorrectParameterException("Current domain name [" + oAuth2ClientsParams.getDomainName() + "] already registered in the system!"); + 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(oAuth2ClientsParams.getAdminSettingsId())) + new AdminSettingsId(UUID.fromString(prevAdminSettingsId)) ); if (existentOAuth2ClientsSettingsById == null) { @@ -201,36 +190,61 @@ public class OAuth2ServiceImpl implements OAuth2Service { throw new IllegalStateException("Admin setting ID is already set in login white labeling object, but doesn't exist in the database"); } - if (!existentOAuth2ClientsSettingsById.getKey().equals(clientRegistrationsKey)) { + if (!existentOAuth2ClientsSettingsById.getKey().equals(selectedDomainSettingsKey)) { if (existentAdminSettingsByKey == null) { - adminSettingsService.deleteAdminSettingsByKey(tenantId, existentOAuth2ClientsSettingsById.getKey()); - AdminSettings newOAuth2ClientsSettings = saveOAuth2ClientSettings(tenantId, clientRegistrationsKey); - oAuth2ClientsParams.setAdminSettingsId(newOAuth2ClientsSettings.getId().getId().toString()); + AdminSettings newOAuth2ClientsSettings = replaceExistentAdminSettings(tenantId, selectedDomainSettingsKey, existentOAuth2ClientsSettingsById.getKey()); + return newOAuth2ClientsSettings.getId().getId().toString(); } else { - log.error("Current domain name [{}] already registered in the system!", oAuth2ClientsParams.getDomainName()); - throw new IncorrectParameterException("Current domain name [" + oAuth2ClientsParams.getDomainName() + "] already registered in the system!"); + 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; } - // TODO refactor - String json; - try { - json = mapper.writeValueAsString(oAuth2ClientsParams); - } catch (JsonProcessingException e) { - log.error("Unable to convert OAuth2 Client Registration Params to JSON!", e); - throw new IncorrectParameterException("Unable to convert OAuth2 Client Registration Params to JSON!"); - } - List attributes = new ArrayList<>(); - long ts = System.currentTimeMillis(); - attributes.add(new BaseAttributeKvEntry(new StringDataEntry(OAUTH2_CLIENT_REGISTRATIONS_PARAMS, json), ts)); - try { - // TODO ask if I need here .get() - attributesService.save(tenantId, tenantId, DataConstants.SERVER_SCOPE, attributes).get(); - } catch (Exception e) { - log.error("Unable to save OAuth2 Client Registration Params to attributes!", e); - throw new IncorrectParameterException("Unable to save OAuth2 Client Registration Params to attributes!"); - } - return getTenantOAuth2ClientsParams(tenantId); + } + + private AdminSettings replaceExistentAdminSettings(TenantId tenantId, String newKey, String oldKey) { + adminSettingsService.deleteAdminSettingsByKey(tenantId, oldKey); + AdminSettings tenantAdminSettings = createTenantAdminSettings(tenantId, newKey); + return adminSettingsService.saveAdminSettings(tenantId, tenantAdminSettings); + } + + private AdminSettings createTenantAdminSettings(TenantId tenantId, String clientRegistrationsKey) { + AdminSettings clientRegistrationParamsSettings = new AdminSettings(); + clientRegistrationParamsSettings.setKey(clientRegistrationsKey); + ObjectNode node = mapper.createObjectNode(); + node.put("entityType", EntityType.TENANT.name()); + node.put("entityId", tenantId.toString()); + clientRegistrationParamsSettings.setJsonValue(node); + return clientRegistrationParamsSettings; + } + + private AdminSettings createSystemAdminSettings(OAuth2ClientsParams oAuth2ClientsParams) { + AdminSettings clientRegistrationParamsSettings = new AdminSettings(); + clientRegistrationParamsSettings.setKey(OAUTH2_CLIENT_REGISTRATIONS_PARAMS); + ObjectNode clientRegistrationsNode = mapper.createObjectNode(); + + String json = toJson(oAuth2ClientsParams); + clientRegistrationsNode.put(SYSTEM_SETTINGS_OAUTH2_VALUE, json); + clientRegistrationParamsSettings.setJsonValue(clientRegistrationsNode); + + return clientRegistrationParamsSettings; + } + + private void validateUniqueRegistrationId(OAuth2ClientsParams inputOAuth2ClientsParams, TenantId tenantId) { + inputOAuth2ClientsParams.getClientRegistrations().stream() + .map(OAuth2ClientRegistration::getRegistrationId) + .forEach(registrationId -> { + clientsParams.forEach((paramsTenantId, oAuth2ClientsParams) -> { + boolean registrationExists = oAuth2ClientsParams.getClientRegistrations().stream() + .map(OAuth2ClientRegistration::getRegistrationId) + .anyMatch(registrationId::equals); + if (registrationExists && !tenantId.equals(paramsTenantId)) { + log.error("Current registrationId [{}] already registered in the system!", registrationId); + throw new IncorrectParameterException("Current registrationId [" + registrationId + "] already registered in the system!"); + } + }); + }); } private void validate(OAuth2ClientsParams oAuth2ClientsParams) { @@ -276,8 +290,8 @@ public class OAuth2ServiceImpl implements OAuth2Service { OAuth2ClientsParams params = getTenantOAuth2ClientsParams(tenantId); if (!StringUtils.isEmpty(params.getDomainName())) { // TODO don't we need to delete from attributes? - String oauth2ClientsParamsKey = constructClientRegistrationsKey(params.getDomainName()); - adminSettingsService.deleteAdminSettingsByKey(tenantId, oauth2ClientsParamsKey); + String settingsKey = constructAdminSettingsDomainKey(params.getDomainName()); + adminSettingsService.deleteAdminSettingsByKey(tenantId, settingsKey); } } @@ -310,17 +324,7 @@ public class OAuth2ServiceImpl implements OAuth2Service { }, MoreExecutors.directExecutor()); } - private AdminSettings saveOAuth2ClientSettings(TenantId tenantId, String clientRegistrationsKey) { - AdminSettings oauth2ClientsSettings = new AdminSettings(); - oauth2ClientsSettings.setKey(clientRegistrationsKey); - ObjectNode node = mapper.createObjectNode(); - node.put("entityType", EntityType.TENANT.name()); - node.put("entityId", tenantId.toString()); - oauth2ClientsSettings.setJsonValue(node); - return adminSettingsService.saveAdminSettings(tenantId, oauth2ClientsSettings); - } - - private String constructClientRegistrationsKey(String domainName) { + private String constructAdminSettingsDomainKey(String domainName) { String clientRegistrationsKey; if (StringUtils.isEmpty(domainName)) { clientRegistrationsKey = OAUTH2_CLIENT_REGISTRATIONS_PARAMS; @@ -347,7 +351,7 @@ public class OAuth2ServiceImpl implements OAuth2Service { } private OAuth2ClientsParams getMergedOAuth2ClientsParams(String domainName) { - AdminSettings oauth2ClientsSettings = adminSettingsService.findAdminSettingsByKey(TenantId.SYS_TENANT_ID, constructClientRegistrationsKey(domainName)); + AdminSettings oauth2ClientsSettings = adminSettingsService.findAdminSettingsByKey(TenantId.SYS_TENANT_ID, constructAdminSettingsDomainKey(domainName)); OAuth2ClientsParams result; if (oauth2ClientsSettings != null) { String strEntityType = oauth2ClientsSettings.getJsonValue().get("entityType").asText(); @@ -367,6 +371,17 @@ public class OAuth2ServiceImpl implements OAuth2Service { return result; } + private String toJson(OAuth2ClientsParams oAuth2ClientsParams) { + String json; + try { + json = mapper.writeValueAsString(oAuth2ClientsParams); + } catch (JsonProcessingException e) { + log.error("Unable to convert OAuth2 Client Registration Params to JSON!", e); + throw new IncorrectParameterException("Unable to convert OAuth2 Client Registration Params to JSON!"); + } + return json; + } + private final Consumer validator = clientRegistration -> { if (StringUtils.isEmpty(clientRegistration.getRegistrationId())) { throw new DataValidationException("Registration ID should be specified!");