Browse Source

Removed AdminSettingsId from ClientParams

pull/3557/head
vzikratyi 6 years ago
parent
commit
65d075035f
  1. 2
      common/data/src/main/java/org/thingsboard/server/common/data/oauth2/OAuth2ClientsDomainParams.java
  2. 103
      dao/src/main/java/org/thingsboard/server/dao/oauth2/OAuth2ServiceImpl.java
  3. 92
      dao/src/test/java/org/thingsboard/server/dao/service/BaseOAuth2ServiceTest.java

2
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<OAuth2ClientRegistration> clientRegistrations;
}

103
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<String> domainNames = oAuth2ClientsParams.getClientsDomainsParams().stream()
.map(OAuth2ClientsDomainParams::getDomainName)
.collect(Collectors.toSet());
processTenantAdminSettings(tenantId, domainNames);
List<AttributeKvEntry> 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<String> domainNames) {
OAuth2ClientsParams existentClientsParams = getTenantOAuth2ClientsParams(tenantId);
Set<String> existentDomainNames = existentClientsParams != null && existentClientsParams.getClientsDomainsParams() != null ?
existentClientsParams.getClientsDomainsParams().stream()
.map(OAuth2ClientsDomainParams::getDomainName)
.collect(Collectors.toSet())
: Collections.emptySet();
Set<String> domainNamesToAdd = domainNames.stream()
.filter(domainName -> !existentDomainNames.contains(domainName))
.collect(Collectors.toSet());
Set<String> 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<String> 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<OAuth2ClientRegistration> 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();
}

92
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<OAuth2ClientsDomainParams> 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<OAuth2ClientsDomainParams> 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();

Loading…
Cancel
Save