/** * Synchronize content common to both external users and external groups: * - properties * - auto-group membership * * @param external The external identity * @param authorizable The corresponding repository user/group * @param config The sync configuration * @throws RepositoryException If an error occurs. */ private void syncExternalIdentity(@NotNull ExternalIdentity external, @NotNull Authorizable authorizable, @NotNull DefaultSyncConfig.Authorizable config) throws RepositoryException { syncProperties(external, authorizable, config.getPropertyMapping()); applyMembership(authorizable, config.getAutoMembership()); }
@Test public void testSyncPropertiesEmptyMap() throws Exception { ExternalUser externalUser = idp.getUser(TestIdentityProvider.ID_SECOND_USER); Authorizable a = syncCtx.createUser(externalUser); syncCtx.syncProperties(externalUser, a, ImmutableMap.<String, String>of()); for (String propName : externalUser.getProperties().keySet()) { assertFalse(a.hasProperty(propName)); } }
@Test public void testSyncPropertiesMappingDQuoteName() throws Exception { ExternalUser externalUser = idp.getUser(TestIdentityProvider.ID_SECOND_USER); sync(externalUser); Authorizable a = userManager.getAuthorizable(externalUser.getId()); // mapping to '"' (i.e. name size = 1) which doesn't qualify as constant // -> same behavior expected as with 'testSyncPropertiesMappingRemovesExisting' Map<String, String> mapping = new HashMap<>(); Map<String, ?> extProps = externalUser.getProperties(); for (String propName : extProps.keySet()) { mapping.put(propName, "\""); } syncCtx.syncProperties(externalUser, a, mapping); for (String propName : extProps.keySet()) { assertFalse(a.hasProperty(propName)); } }
@Test public void testSyncPropertiesMappingNameStartsWithDQuote() throws Exception { ExternalUser externalUser = idp.getUser(TestIdentityProvider.ID_SECOND_USER); sync(externalUser); Authorizable a = userManager.getAuthorizable(externalUser.getId()); // mapping to '"any', which doesn't qualify as constant // -> same behavior expected as with 'testSyncPropertiesMappingRemovesExisting' Map<String, String> mapping = new HashMap<>(); Map<String, ?> extProps = externalUser.getProperties(); for (String propName : extProps.keySet()) { mapping.put(propName, "\"any"); } syncCtx.syncProperties(externalUser, a, mapping); for (String propName : extProps.keySet()) { assertFalse(a.hasProperty(propName)); } }
@Test public void testSyncPropertiesMappingRemovesExisting() throws Exception { ExternalUser externalUser = idp.getUser(TestIdentityProvider.ID_SECOND_USER); sync(externalUser); Authorizable a = userManager.getAuthorizable(externalUser.getId()); // create mapping that doesn't match to names in the external-properties // -> previously synced properties must be removed Map<String, String> mapping = new HashMap<>(); Map<String, ?> extProps = externalUser.getProperties(); for (String propName : extProps.keySet()) { mapping.put(propName, "any"); } syncCtx.syncProperties(externalUser, a, mapping); for (String propName : extProps.keySet()) { assertFalse(a.hasProperty(propName)); } }
@Test public void testSyncPropertiesEmptyMapExistingProps() throws Exception { ExternalUser externalUser = idp.getUser(TestIdentityProvider.ID_SECOND_USER); Authorizable a = syncCtx.createUser(externalUser); Value anyValue = valueFactory.createValue("any"); Map<String, ?> extProps = externalUser.getProperties(); for (String propName : extProps.keySet()) { a.setProperty(propName, anyValue); } syncCtx.syncProperties(externalUser, a, ImmutableMap.<String, String>of()); for (String propName : extProps.keySet()) { assertTrue(a.hasProperty(propName)); assertEquals(anyValue, a.getProperty(propName)[0]); } }
@Test public void testSyncPropertiesMappingConstants() throws Exception { ExternalUser externalUser = idp.getUser(TestIdentityProvider.ID_SECOND_USER); sync(externalUser); Authorizable a = userManager.getAuthorizable(externalUser.getId()); // create mapping that doesn't match to names in the external-properties // -> previously synced properties must be removed Map<String, String> mapping = new HashMap<>(); Map<String, ?> extProps = externalUser.getProperties(); for (String propName : extProps.keySet()) { mapping.put(propName, "\"any\""); } syncCtx.syncProperties(externalUser, a, mapping); Value anyValue = valueFactory.createValue("any"); for (String propName : extProps.keySet()) { assertTrue(a.hasProperty(propName)); assertEquals(anyValue, a.getProperty(propName)[0]); } }
@Test public void testSyncProperties() throws Exception { ExternalUser externalUser = idp.getUser(TestIdentityProvider.ID_SECOND_USER); Authorizable a = syncCtx.createUser(externalUser); // create exact mapping Map<String, String> mapping = new HashMap<>(); Map<String, ?> extProps = externalUser.getProperties(); for (String propName : extProps.keySet()) { mapping.put(propName, propName); } syncCtx.syncProperties(externalUser, a, mapping); for (String propName : extProps.keySet()) { assertTrue(a.hasProperty(propName)); Object obj = extProps.get(propName); Value[] vs = a.getProperty(propName); if (vs.length == 1) { assertEquals(syncCtx.createValue(obj), a.getProperty(propName)[0]); } else { Value[] expected = (obj instanceof Collection) ? syncCtx.createValues((Collection) obj) : syncCtx.createValues(Arrays.asList((Object[]) obj)); assertArrayEquals(expected, a.getProperty(propName)); } } }
@Test public void testSyncPropertiesRemapped() throws Exception { ExternalUser externalUser = idp.getUser(TestIdentityProvider.ID_SECOND_USER); Authorizable a = syncCtx.createUser(externalUser); // create exact mapping Map<String, String> mapping = new HashMap<>(); Map<String, ?> extProps = externalUser.getProperties(); for (String propName : extProps.keySet()) { mapping.put("a/"+propName, propName); } syncCtx.syncProperties(externalUser, a, mapping); for (String propName : extProps.keySet()) { String relPath = "a/" + propName; assertTrue(a.hasProperty(relPath)); Object obj = extProps.get(propName); Value[] vs = a.getProperty(relPath); if (vs.length == 1) { assertEquals(syncCtx.createValue(obj), a.getProperty(relPath)[0]); } else { Value[] expected = (obj instanceof Collection) ? syncCtx.createValues((Collection) obj) : syncCtx.createValues(Arrays.asList((Object[]) obj)); assertArrayEquals(expected, a.getProperty(relPath)); } } }