diff --git a/java/com.sap.sse.security.storemerging.test/src/com/sap/sse/security/storemerging/TestSimpleUserAndPreferenceMerge.java b/java/com.sap.sse.security.storemerging.test/src/com/sap/sse/security/storemerging/TestSimpleUserAndPreferenceMerge.java index 911a102600b..074d452fdf5 100755 --- a/java/com.sap.sse.security.storemerging.test/src/com/sap/sse/security/storemerging/TestSimpleUserAndPreferenceMerge.java +++ b/java/com.sap.sse.security.storemerging.test/src/com/sap/sse/security/storemerging/TestSimpleUserAndPreferenceMerge.java @@ -9,7 +9,9 @@ import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.Map; +import java.util.Optional; import java.util.UUID; +import java.util.stream.StreamSupport; import org.bson.Document; import org.junit.After; @@ -26,6 +28,7 @@ import com.sap.sse.security.SecurityService; import com.sap.sse.security.interfaces.AccessControlStore; import com.sap.sse.security.interfaces.UserImpl; import com.sap.sse.security.interfaces.UserStore; +import com.sap.sse.security.shared.RoleDefinition; import com.sap.sse.security.shared.UserGroupManagementException; import com.sap.sse.security.shared.UserManagementException; import com.sap.sse.security.shared.impl.User; @@ -138,8 +141,12 @@ public class TestSimpleUserAndPreferenceMerge { assertNotNull(targetUserStore.getUserByName("YCaT")); assertNotNull(targetUserStore.getUserByName("YCaT-member1")); assertNotNull(targetUserStore.getUserByName("YCaT-member2")); - assertNotNull(targetUserStore.getUserByName("uhl3")); + final User uhl5InTarget = targetUserStore.getUserByName("uhl5"); + assertNotNull(uhl5InTarget); // an equal-named user also exists in source, but with different e-mail + final User uhl3InTargetUserStore = targetUserStore.getUserByName("uhl3"); + assertNotNull(uhl3InTargetUserStore); assertNull(targetUserStore.getUserByName("uhl4")); + assertNull(targetUserStore.getUserGroupByName("test-server")); assertEquals(1, Util.size(targetUserStore.getUserGroupByName("uhl-tenant").getUsers())); assertSame(targetUserStore.getUserByName("uhl"), targetUserStore.getUserGroupByName("uhl-tenant").getUsers().iterator().next()); final AccessControlStore targetAccessControlStore = merger.getTargetAccessControlStore(); @@ -151,10 +158,18 @@ public class TestSimpleUserAndPreferenceMerge { assertNotNull(sourceUserStore.getUserByName("")); assertNotNull(sourceUserStore.getUserByName("uhl")); assertNotNull(sourceUserStore.getUserByName("uhl3")); + assertEquals(targetUserStore.getUserByName("uhl3").getEmail(), sourceUserStore.getUserByName("uhl3").getEmail()); assertNotNull(sourceUserStore.getUserByName("axel.uhl")); assertNotNull(sourceUserStore.getUserByName("uhl4")); + assertNotNull(sourceUserStore.getUserByName("uhl5")); // an equal-named user also exists in target, but with different e-mail + assertTrue(StreamSupport + .stream(sourceUserStore.getUserByName("uhl5").getRoles().spliterator(), /* parallel */ false) + .filter(r -> r.getName().equals("user") && r.getQualifiedForTenant() != null && + r.getQualifiedForTenant().getName().equals("uhl4-tenant")) + .findAny().isPresent()); + assertNotNull(sourceUserStore.getUserGroupByName("test-server")); // check result in target user store: - assertNotNull(targetUserStore.getUserByName("uhl3")); + assertSame(uhl3InTargetUserStore, targetUserStore.getUserByName("uhl3")); // merged, so no new user in this case assertNotNull(targetUserStore.getUserByName("uhl4")); // in particular new user uhl4 is expected to be present now // the uhl-tenant group is expected to have been merged: the uhl4 user is part of that group in source1 assertEquals(3, Util.size(targetUserStore.getUserGroupByName("uhl-tenant").getUsers())); @@ -166,5 +181,21 @@ public class TestSimpleUserAndPreferenceMerge { final User uhl4InTarget = targetUserStore.getUserByName("uhl4"); assertTrue(Util.contains(targetUserStore.getUserGroupByName("uhl-tenant").getUsers(), uhl4InTarget)); assertSame(uhl4InTarget, targetAccessControlStore.getOwnership(uhl4InTarget.getIdentifier()).getAnnotation().getUserOwner()); + final UserGroup testServerGroupInTargetAfterMerge = targetUserStore.getUserGroupByName("test-server"); + assertNotNull(testServerGroupInTargetAfterMerge); + final Map rolesOnTestServerGroup = testServerGroupInTargetAfterMerge.getRoleDefinitionMap(); + final Optional sailingViewerRoleInTarget = StreamSupport.stream(targetUserStore.getRoleDefinitions().spliterator(), /* parallel */ false). + filter(rd->rd.getName().equals("sailing_viewer")).findAny(); + assertTrue(sailingViewerRoleInTarget.isPresent()); + assertTrue(rolesOnTestServerGroup.containsKey(sailingViewerRoleInTarget.get())); + assertTrue(rolesOnTestServerGroup.get(sailingViewerRoleInTarget.get())); + assertSame(uhl5InTarget, targetUserStore.getUserByName("uhl5")); // still the same + // Now ensure that no merge took place, particularly by validating that no "user" role with uhl4-tenant as group + // qualification was merged + assertFalse(StreamSupport + .stream(targetUserStore.getUserByName("uhl5").getRoles().spliterator(), /* parallel */ false) + .filter(r -> r.getName().equals("user") && r.getQualifiedForTenant() != null && + r.getQualifiedForTenant().getName().equals("uhl4-tenant")) + .findAny().isPresent()); } } diff --git a/java/com.sap.sse.security.storemerging.test/src/resources/USERS_source1.json b/java/com.sap.sse.security.storemerging.test/src/resources/USERS_source1.json index bd680fc6d9e..536375236e5 100755 --- a/java/com.sap.sse.security.storemerging.test/src/resources/USERS_source1.json +++ b/java/com.sap.sse.security.storemerging.test/src/resources/USERS_source1.json @@ -4,3 +4,4 @@ {"_id":{"$oid":"5ddfe8ebc0825924ce5d374b"},"NAME":"uhl3","EMAIL":"axel.uhl@sap.com","FULLNAME":null,"COMPANY":null,"LOCALE":null,"EMAIL_VALIDATED":false,"PASSWORD_RESET_SECRET":null,"VALIDATION_SECRET":null,"ACCOUNTS":{"USERNAME_PASSWORD":{"NAME":"uhl3","SALTED_PW":"07vtuiUbOZF3b9DvqnkKPu7jXOhNpOWba90y9R8BFZk=","SALT":{"$binary":"cokHTYjlShneyh8GtPYICA==","$type":"00"}}},"ROLE_IDS":[{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":null,"QUALIFYING_TENANT_NAME":null,"QUALIFYING_USERNAME":"uhl3"},{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":{"$binary":"jUctEl255OAdcqbVAQ39iQ==","$type":"03"},"QUALIFYING_TENANT_NAME":"uhl3-tenant","QUALIFYING_USERNAME":null}],"PERMISSIONS":[],"DEFAULT_TENANT_IDS":[{"DEFAULT_TENANT_SERVER":"unknown server name","DEFAULT_TENANT_GROUP":{"$binary":"jUctEl255OAdcqbVAQ39iQ==","$type":"03"}}]} {"_id":{"$oid":"5ddfe908c0825924ce5d3777"},"NAME":"axel.uhl","EMAIL":"axel.uhl@gmx.de","FULLNAME":null,"COMPANY":null,"LOCALE":null,"EMAIL_VALIDATED":false,"PASSWORD_RESET_SECRET":null,"VALIDATION_SECRET":null,"ACCOUNTS":{"USERNAME_PASSWORD":{"NAME":"axel.uhl","SALTED_PW":"AFsE38rLBLw+5OetCJ0FzzdYCoisKXMdOCo1rfUFcmg=","SALT":{"$binary":"Qlvq6LrLVAIHPqpzmZ1dWw==","$type":"00"}}},"ROLE_IDS":[{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":null,"QUALIFYING_TENANT_NAME":null,"QUALIFYING_USERNAME":"axel.uhl"},{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":{"$binary":"n0gWmJnznMC66i2QrmR2pQ==","$type":"03"},"QUALIFYING_TENANT_NAME":"axel.uhl-tenant","QUALIFYING_USERNAME":null}],"PERMISSIONS":[],"DEFAULT_TENANT_IDS":[{"DEFAULT_TENANT_SERVER":"unknown server name","DEFAULT_TENANT_GROUP":{"$binary":"n0gWmJnznMC66i2QrmR2pQ==","$type":"03"}}]} {"_id":{"$oid":"5ddfe91dc0825924ce5d379f"},"NAME":"uhl4","EMAIL":"uhl@homemp3.dyndns.org","FULLNAME":null,"COMPANY":null,"LOCALE":null,"EMAIL_VALIDATED":false,"PASSWORD_RESET_SECRET":null,"VALIDATION_SECRET":null,"ACCOUNTS":{"USERNAME_PASSWORD":{"NAME":"uhl4","SALTED_PW":"lJDWFQJsS8x6weFXQ14SxiD1Jzp65kKcSelrbUOx5uc=","SALT":{"$binary":"E/mG5VmAqCbeYuOHotskAg==","$type":"00"}}},"ROLE_IDS":[{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":null,"QUALIFYING_TENANT_NAME":null,"QUALIFYING_USERNAME":"uhl4"},{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":{"$binary":"eUpFMrUM/Be80bndlCu9vg==","$type":"03"},"QUALIFYING_TENANT_NAME":"uhl4-tenant","QUALIFYING_USERNAME":null}],"PERMISSIONS":[],"DEFAULT_TENANT_IDS":[{"DEFAULT_TENANT_SERVER":"unknown server name","DEFAULT_TENANT_GROUP":{"$binary":"eUpFMrUM/Be80bndlCu9vg==","$type":"03"}}]} +{"_id":{"$oid":"5ddfe91dc4825924ce5d379f"},"NAME":"uhl5","EMAIL":"uhl5@homemp3.dyndns.org","FULLNAME":null,"COMPANY":null,"LOCALE":null,"EMAIL_VALIDATED":false,"PASSWORD_RESET_SECRET":null,"VALIDATION_SECRET":null,"ACCOUNTS":{"USERNAME_PASSWORD":{"NAME":"uhl5","SALTED_PW":"lJDWFQJsS8x6weFXQ14SxiD1Jzp65kKcSelrbUOx5uc=","SALT":{"$binary":"E/mG5VmAqCbeYuOHotskAg==","$type":"00"}}},"ROLE_IDS":[{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":null,"QUALIFYING_TENANT_NAME":null,"QUALIFYING_USERNAME":"uhl5"},{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":{"$binary":"eUpFMrUM/Be80bndlCu9vg==","$type":"03"},"QUALIFYING_TENANT_NAME":"uhl4-tenant","QUALIFYING_USERNAME":null}],"PERMISSIONS":[],"DEFAULT_TENANT_IDS":[{"DEFAULT_TENANT_SERVER":"unknown server name","DEFAULT_TENANT_GROUP":{"$binary":"eUpFMrUM/Be80bndlCu9vg==","$type":"03"}}]} diff --git a/java/com.sap.sse.security.storemerging.test/src/resources/USERS_target1.json b/java/com.sap.sse.security.storemerging.test/src/resources/USERS_target1.json index 5558a653bb9..51338d72e4d 100755 --- a/java/com.sap.sse.security.storemerging.test/src/resources/USERS_target1.json +++ b/java/com.sap.sse.security.storemerging.test/src/resources/USERS_target1.json @@ -8,3 +8,4 @@ {"_id":{"$oid":"5ddfe666c0825924ce5d2cd5"},"NAME":"YCaT-member1","EMAIL":"ycat-member1@example.com","FULLNAME":null,"COMPANY":null,"LOCALE":null,"EMAIL_VALIDATED":false,"PASSWORD_RESET_SECRET":null,"VALIDATION_SECRET":null,"ACCOUNTS":{"USERNAME_PASSWORD":{"NAME":"YCaT-member1","SALTED_PW":"nlq1XlkGio2EPEfcfGdQAPOpaRwAQqGU9GnKYG6b2VY=","SALT":{"$binary":"NWHtENfQ/S5E3F0zWJeSsQ==","$type":"00"}}},"ROLE_IDS":[{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":null,"QUALIFYING_TENANT_NAME":null,"QUALIFYING_USERNAME":"YCaT-member1"},{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":{"$binary":"t0MJug6uIOVW0enVXk6fuw==","$type":"03"},"QUALIFYING_TENANT_NAME":"YCaT-member1-tenant","QUALIFYING_USERNAME":null}],"PERMISSIONS":[],"DEFAULT_TENANT_IDS":[{"DEFAULT_TENANT_SERVER":"unknown server name","DEFAULT_TENANT_GROUP":{"$binary":"t0MJug6uIOVW0enVXk6fuw==","$type":"03"}}]} {"_id":{"$oid":"5ddfe676c0825924ce5d2cf7"},"NAME":"YCaT-member2","EMAIL":"ycat-member2@example.com","FULLNAME":null,"COMPANY":null,"LOCALE":null,"EMAIL_VALIDATED":false,"PASSWORD_RESET_SECRET":null,"VALIDATION_SECRET":null,"ACCOUNTS":{"USERNAME_PASSWORD":{"NAME":"YCaT-member2","SALTED_PW":"pWVtsXlYaKHS3howWGOraiCm2dhtykUQWBJ2pE9gSb8=","SALT":{"$binary":"RAeoNaY8wQOr9iIN85LHxg==","$type":"00"}}},"ROLE_IDS":[{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":null,"QUALIFYING_TENANT_NAME":null,"QUALIFYING_USERNAME":"YCaT-member2"},{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":{"$binary":"s0SQCOyHewgex4Wc/jPStg==","$type":"03"},"QUALIFYING_TENANT_NAME":"YCaT-member2-tenant","QUALIFYING_USERNAME":null}],"PERMISSIONS":[],"DEFAULT_TENANT_IDS":[{"DEFAULT_TENANT_SERVER":"unknown server name","DEFAULT_TENANT_GROUP":{"$binary":"s0SQCOyHewgex4Wc/jPStg==","$type":"03"}}]} {"_id":{"$oid":"5ddfeb89c0825924ce5d3f80"},"NAME":"uhl3","EMAIL":"axel.uhl@sap.com","FULLNAME":null,"COMPANY":null,"LOCALE":null,"EMAIL_VALIDATED":false,"PASSWORD_RESET_SECRET":null,"VALIDATION_SECRET":null,"ACCOUNTS":{"USERNAME_PASSWORD":{"NAME":"uhl3","SALTED_PW":"nviD3KYsbpot9EnPfaPgUbLiAG2GIvkq24V5Q2IgrO0=","SALT":{"$binary":"sgSYmS82ChmHnRu4L5M8EQ==","$type":"00"}}},"ROLE_IDS":[{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":null,"QUALIFYING_TENANT_NAME":null,"QUALIFYING_USERNAME":"uhl3"},{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":{"$binary":"h0kp50s+ke89MTQhwezkjA==","$type":"03"},"QUALIFYING_TENANT_NAME":"uhl3-tenant","QUALIFYING_USERNAME":null}],"PERMISSIONS":[],"DEFAULT_TENANT_IDS":[{"DEFAULT_TENANT_SERVER":"unknown server name","DEFAULT_TENANT_GROUP":{"$binary":"h0kp50s+ke89MTQhwezkjA==","$type":"03"}}]} +{"_id":{"$oid":"5ddfeb89c0825934ce5d3f80"},"NAME":"uhl5","EMAIL":"axel.uhl@sap.com","FULLNAME":null,"COMPANY":null,"LOCALE":null,"EMAIL_VALIDATED":false,"PASSWORD_RESET_SECRET":null,"VALIDATION_SECRET":null,"ACCOUNTS":{"USERNAME_PASSWORD":{"NAME":"uhl5","SALTED_PW":"nviD3KYsbpot9EnPfaPgUbLiAG2GIvkq24V5Q2IgrO0=","SALT":{"$binary":"sgSYmS82ChmHnRu4L5M8EQ==","$type":"00"}}},"ROLE_IDS":[{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":null,"QUALIFYING_TENANT_NAME":null,"QUALIFYING_USERNAME":"uhl5"},{"ID":{"$binary":"ZEQ9sUhRHa0uTk1uOXzEkA==","$type":"03"},"NAME":"user","QUALIFYING_TENANT_ID":{"$binary":"h0kp50s+ke89MTQhwezkjA==","$type":"03"},"QUALIFYING_TENANT_NAME":"uhl3-tenant","QUALIFYING_USERNAME":null}],"PERMISSIONS":[],"DEFAULT_TENANT_IDS":[{"DEFAULT_TENANT_SERVER":"unknown server name","DEFAULT_TENANT_GROUP":{"$binary":"h0kp50s+ke89MTQhwezkjA==","$type":"03"}}]}