bug4006: added tests for default creation group merging

This commit is contained in:
Axel Uhl
2020-01-29 16:08:39 +01:00
parent 7cc3b71fff
commit 438d69e689
3 changed files with 40 additions and 4 deletions
@@ -3,6 +3,7 @@ package com.sap.sse.security.storemerging;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
@@ -29,7 +30,11 @@ public class TestACLMerge extends AbstractStoreMergeTest {
/**
* Validates that an ACL for an object for which the target has an ACL is merged correctly: groups for which no
* action permissions have been specified in the target are added; action permission sets for groups for which the
* target already has permissions are merged
* target already has permissions are merged<p>
*
* As a "drive-by," this test also validates that a default creation group for a server for which the
* target already has one set for a user is not overwritten, and that default creation group settings
* are added if the target user has no default creation group set yet for that server name.
*/
@Test
public void testACLMerge() throws UserGroupManagementException, UserManagementException {
@@ -38,6 +43,10 @@ public class TestACLMerge extends AbstractStoreMergeTest {
// *********** assertions against unmodified target ***********
final User targetUserWithACL = targetUserStore.getUserByName(NAME_OF_USER_TO_BE_DROPPED);
assertNotNull(targetUserWithACL);
final UserGroup targetUserWithACLTenant = targetUserStore.getUserGroupByName(NAME_OF_USER_TO_BE_DROPPED+SecurityService.TENANT_SUFFIX);
assertNotNull(targetUserWithACLTenant);
assertSame(targetUserWithACLTenant, targetUserWithACL.getDefaultTenant("unknown server name"));
assertNull(targetUserWithACL.getDefaultTenant("ARCHIVE"));
assertNull(targetUserStore.getUserGroupByName(NAME_OF_NEW_GROUP_WITH_NEW_ACTIONS));
final User targetAdmin = targetUserStore.getUserByName("admin");
final UserGroup targetAdminTenant = targetUserStore.getUserGroupByName("admin"+SecurityService.TENANT_SUFFIX);
@@ -55,10 +64,15 @@ public class TestACLMerge extends AbstractStoreMergeTest {
// *********** assertions against unmodified source ***********
final User sourceUserWithACL = sourceUserStore.getUserByName(NAME_OF_USER_TO_BE_DROPPED);
assertNotNull(sourceUserWithACL);
final UserGroup sourceUserWithACLTenant = sourceUserStore.getUserGroupByName(NAME_OF_USER_TO_BE_DROPPED+SecurityService.TENANT_SUFFIX);
assertNotNull(sourceUserWithACLTenant);
assertNotNull(sourceUserStore.getUserGroupByName(NAME_OF_NEW_GROUP_WITH_NEW_ACTIONS));
final User sourceAdmin = sourceUserStore.getUserByName("admin");
final UserGroup sourceAdminTenant = sourceUserStore.getUserGroupByName("admin"+SecurityService.TENANT_SUFFIX);
assertNotNull(sourceAdmin);
assertNotNull(sourceAdminTenant);
assertSame(sourceAdminTenant, sourceUserWithACL.getDefaultTenant("unknown server name"));
assertSame(sourceUserWithACLTenant, sourceUserWithACL.getDefaultTenant("ARCHIVE"));
final UserGroup sourceNewGroup = sourceUserStore.getUserGroupByName(NAME_OF_NEW_GROUP_WITH_NEW_ACTIONS);
assertNotNull(sourceNewGroup);
final AccessControlList sourceUserWithAclACL = sourceAccessControlStore.getAccessControlList(sourceUserWithACL.getIdentifier()).getAnnotation();
@@ -89,5 +103,9 @@ public class TestACLMerge extends AbstractStoreMergeTest {
assertTrue(newTargetUserWithAclACL.getActionsByUserGroup().get(targetAdminTenant).contains("CHANGE_ACL"));
assertTrue(newTargetUserWithAclACL.getActionsByUserGroup().get(targetNewGroup).contains("CHANGE_OWNERSHIP"));
assertTrue(newTargetUserWithAclACL.getActionsByUserGroup().get(targetNewGroup).contains("!FORCE_OVERWRITE_PASSWORD"));
// validate that default creation group/tenant is not touched in target for existing "unknown server name"
// and merged for new "ARCHIVE" record:
assertSame(targetUserWithACLTenant, newTargetUserWithACL.getDefaultTenant("unknown server name"));
assertSame(targetUserWithACLTenant, newTargetUserWithACL.getDefaultTenant("ARCHIVE"));
}
}
@@ -1,3 +1,3 @@
{"_id":{"$oid":"5e3196259d7cdfdd30a81fb0"},"NAME":"admin","EMAIL":"nobody@sapsailing.com","FULLNAME":null,"COMPANY":null,"LOCALE":"en","EMAIL_VALIDATED":false,"PASSWORD_RESET_SECRET":null,"VALIDATION_SECRET":"Omyf/8d2j36jN4V6KBlCO2GxKq1/ZC76wSHnMs55+U4=","ACCOUNTS":{"USERNAME_PASSWORD":{"NAME":"admin","SALTED_PW":"lGt9bnQoIXITrDdv9IO8WYO9ZnFM0CwpzLd6K8OrdJI=","SALT":{"$binary":"gwlPkqRshCMVCDrJ4kE8qA==","$type":"00"}}},"ROLE_IDS":[{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":{"$binary":"cUDL4JN1mQEn0NYku63Dng==","$type":"03"},"QUALIFYING_TENANT_NAME":"admin-tenant","QUALIFYING_USERNAME":null},{"ID":{"$binary":"XkMF1NHjd9x6/fZFcs6Zhg==","$type":"03"},"NAME":"admin","QUALIFYING_TENANT_ID":null,"QUALIFYING_TENANT_NAME":null,"QUALIFYING_USERNAME":null},{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":null,"QUALIFYING_TENANT_NAME":null,"QUALIFYING_USERNAME":"admin"},{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":{"$binary":"jUzROKBkqLugyJzLa2FKhw==","$type":"03"},"QUALIFYING_TENANT_NAME":"newGroup","QUALIFYING_USERNAME":null}],"PERMISSIONS":[],"DEFAULT_TENANT_IDS":[{"DEFAULT_TENANT_SERVER":"unknown server name","DEFAULT_TENANT_GROUP":{"$binary":"rkQlapLPQzXRwNwE/gZdtQ==","$type":"03"}}]}
{"_id":{"$oid":"5e3196259d7cdfdd30a81fd7"},"NAME":"\u003call\u003e","EMAIL":null,"FULLNAME":null,"COMPANY":null,"LOCALE":null,"EMAIL_VALIDATED":false,"PASSWORD_RESET_SECRET":null,"VALIDATION_SECRET":null,"ACCOUNTS":{},"ROLE_IDS":[],"PERMISSIONS":["USER:CREATE"],"DEFAULT_TENANT_IDS":[]}
{"_id":{"$oid":"5e3196809d7cdfdd30a82201"},"NAME":"userWithACL","EMAIL":"userWithACL@example.com","FULLNAME":null,"COMPANY":null,"LOCALE":null,"EMAIL_VALIDATED":false,"PASSWORD_RESET_SECRET":null,"VALIDATION_SECRET":null,"ACCOUNTS":{"USERNAME_PASSWORD":{"NAME":"userWithACL","SALTED_PW":"VNuGTOeNC/Z+Z95VZYgZ8X+iL/tnkbbRUmvSUWXr/Ao=","SALT":{"$binary":"ThN1R1jcCinrgV00gAzZng==","$type":"00"}}},"ROLE_IDS":[{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":{"$binary":"OE4uv4rXnLE+D6VqDYJfqA==","$type":"03"},"QUALIFYING_TENANT_NAME":"userWithACL-tenant","QUALIFYING_USERNAME":null},{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":null,"QUALIFYING_TENANT_NAME":null,"QUALIFYING_USERNAME":"userWithACL"}],"PERMISSIONS":[],"DEFAULT_TENANT_IDS":[{"DEFAULT_TENANT_SERVER":"unknown server name","DEFAULT_TENANT_GROUP":{"$binary":"OE4uv4rXnLE+D6VqDYJfqA==","$type":"03"}}]}
{"_id":{"$oid":"5e3196809d7cdfdd30a82201"},"NAME":"userWithACL","EMAIL":"userWithACL@example.com","FULLNAME":null,"COMPANY":null,"LOCALE":null,"EMAIL_VALIDATED":false,"PASSWORD_RESET_SECRET":null,"VALIDATION_SECRET":null,"ACCOUNTS":{"USERNAME_PASSWORD":{"NAME":"userWithACL","SALTED_PW":"VNuGTOeNC/Z+Z95VZYgZ8X+iL/tnkbbRUmvSUWXr/Ao=","SALT":{"$binary":"ThN1R1jcCinrgV00gAzZng==","$type":"00"}}},"ROLE_IDS":[{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":{"$binary":"OE4uv4rXnLE+D6VqDYJfqA==","$type":"03"},"QUALIFYING_TENANT_NAME":"userWithACL-tenant","QUALIFYING_USERNAME":null},{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":null,"QUALIFYING_TENANT_NAME":null,"QUALIFYING_USERNAME":"userWithACL"}],"PERMISSIONS":[],"DEFAULT_TENANT_IDS":[{"DEFAULT_TENANT_SERVER":"unknown server name","DEFAULT_TENANT_GROUP":{"$binary":"cUDL4JN1mQEn0NYku63Dng==","$type":"03"}},{"DEFAULT_TENANT_SERVER":"ARCHIVE","DEFAULT_TENANT_GROUP":{"$binary":"OE4uv4rXnLE+D6VqDYJfqA==","$type":"03"}}]}
@@ -343,7 +343,7 @@ public class SecurityStoreMerger {
// places the existing user into the target user store
targetUserStore.addUser(targetUser);
} else {
mergeSecondUserIntoFirst(targetUser, sourceUser);
mergeSecondUserIntoFirst(targetUser, sourceUser, userGroupMap);
}
} // else drop
}
@@ -371,7 +371,7 @@ public class SecurityStoreMerger {
}
}
private void mergeSecondUserIntoFirst(User targetUser, User sourceUser) throws UserManagementException {
private void mergeSecondUserIntoFirst(User targetUser, User sourceUser, Map<UserGroup, UserGroup> userGroupMap) throws UserManagementException {
assert Util.equalsWithNull(targetUser.getEmail(), sourceUser.getEmail());
for (final Role role : sourceUser.getRoles()) {
if (role.getQualifiedForTenant() == null && role.getQualifiedForUser() == null) {
@@ -413,11 +413,29 @@ public class SecurityStoreMerger {
updated = copyNonNullValue(sourceUser.getCompany(), targetUser.getCompany(), targetUser::setCompany);
updated = copyNonNullValue(sourceUser.getFullName(), targetUser.getFullName(), targetUser::setFullName);
updated = copyNonNullValue(sourceUser.getLocale(), targetUser.getLocale(), targetUser::setLocale);
updated = mergeDefaultCreationGroups(targetUser, sourceUser, userGroupMap) || updated;
if (updated) {
targetUserStore.updateUser(targetUser);
}
}
private boolean mergeDefaultCreationGroups(User targetUser, User sourceUser, Map<UserGroup, UserGroup> userGroupMap) {
boolean updated = false;
for (final Entry<String, UserGroup> e : sourceUser.getDefaultTenantMap().entrySet()) {
if (targetUser.getDefaultTenant(e.getKey()) == null) {
final UserGroup mappedDefaultCreationGroup = userGroupMap.get(e.getValue());
if (mappedDefaultCreationGroup != null) {
targetUser.setDefaultTenant(mappedDefaultCreationGroup, e.getKey());
updated = true;
} else {
logger.warning("Default creation group "+e.getValue().getName()+" for user "+targetUser.getName()+
" on server "+e.getKey()+" not merged because that groups was dropped.");
}
}
}
return updated;
}
/**
* If the {@code sourceValue} is a non-{@code null} value, and {@code targetValue} is a {@code null}
* value, the {@code setterOnTargetUser} is used to copy the {@code sourceValue} to the target user.