Skip to content

[SYNCOPE-1812] Instructions about configuring MariaDB for case-sensitive queries #148

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 45 commits into
base: 3_0_X
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
99c5aa5
[SYNCOPE-1805] Upgrading Spring Framework and Security to latest vers…
ilgrosso Feb 19, 2024
8fae108
Upgrading OpenSearch and PostgreSQL, MariaDB, MS SQL JDBC drivers
ilgrosso Feb 21, 2024
746efbd
Adjusting OpenSearch Docker image conf for IT
ilgrosso Feb 21, 2024
8da6bc3
Upgrading Flowable
ilgrosso Feb 22, 2024
994acf8
Upgrading Elasticsearch, OpenSearch and exec-maven-plugin
ilgrosso Feb 23, 2024
255820f
Upgrading java-uuid-generator and modernizer-maven-plugin, requiring …
ilgrosso Feb 26, 2024
4a71a5f
Upgrading stCarolas/setup-maven for GH actions workflows
ilgrosso Feb 26, 2024
3a33e31
[SYNCOPE-1807] Propagate status changes coming from SCIM extension (#…
SamuelGaro Feb 26, 2024
ef8ca35
Upgrading Woodstox
ilgrosso Feb 27, 2024
94c778b
Bump org.webjars:swagger-ui from 5.10.3 to 5.11.8 (#634)
dependabot[bot] Feb 28, 2024
bd0b9d8
[SYNCOPE-1808] fix location for group in ResourceTypes SCIMv2 service…
SamuelGaro Mar 1, 2024
f4f4d0f
Upgrading Groovy
ilgrosso Mar 4, 2024
32d7190
Bump io.github.git-commit-id:git-commit-id-maven-plugin (#638)
dependabot[bot] Mar 5, 2024
f847c58
Ensure to initialize the Audit table for additional domains
ilgrosso Mar 5, 2024
6af89e6
Fixing Elasticsearch and OpenSearch ILIKE / IEQ for values with under…
ilgrosso Mar 5, 2024
b67cfff
[SYNCOPE-1806] Fixing all dynamic memberships refresh: Realms, Groups…
ilgrosso Mar 6, 2024
1926165
[SYNCOPE-1806] Fixing tests
ilgrosso Mar 6, 2024
55e7ed9
[SYNCOPE-1809] Remove uidOnCreate attribute on delete propagation (#640)
andrea-patricelli Mar 6, 2024
c5c1b12
New Swagger UI version does not render some schemas (as ConnInstanceT…
ilgrosso Mar 9, 2024
f5b13ff
Fixing deprecations
ilgrosso Mar 9, 2024
abc5286
Upgrading asciidoctorj-pdf
ilgrosso Mar 11, 2024
6407127
Upgrading git-commit-id-maven-plugin maven-assembly-plugin maven-gpg-…
ilgrosso Mar 11, 2024
6f3ed67
Upgrading CXF and Swagger UI
ilgrosso Mar 13, 2024
17efc18
[SYNCOPE-1786] Allowing domain selection for Keymaster API via Swagge…
ilgrosso Mar 13, 2024
2b4ee37
Upgrading OpenSearch and sonar-maven-plugin
ilgrosso Mar 14, 2024
0e98ff9
Upgrading Groovy, PDFBox and PostgreSQL JDBC driver
ilgrosso Mar 15, 2024
b9c5651
Upgrading asciidoctorj-pdf
ilgrosso Mar 18, 2024
19481b8
Upgrading Tomcat
ilgrosso Mar 18, 2024
6628b41
Upgrading maven-gpg-plugin
ilgrosso Mar 18, 2024
a114881
Upgrading Swagger UI and maven-compiler-plugin
ilgrosso Mar 19, 2024
106926c
Upgrading Wicket
ilgrosso Mar 19, 2024
ad106f7
Upgrading Spring framework and Security
ilgrosso Mar 19, 2024
cf6617b
Upgrading Swagger JAX-RS, git-commit-id-maven-plugin and maven-assemb…
ilgrosso Mar 20, 2024
43f4828
Upgrading WicketStuff
ilgrosso Mar 21, 2024
43f2f48
Upgrading cyclonedx-maven-plugin
ilgrosso Mar 24, 2024
d32c569
Upgrading Elasticsearch, Swagger UI and maven-gpg-plugin
ilgrosso Mar 27, 2024
f55f7ff
[SYNCOPE-1811] MFA bypass properties (#665)
mdisabatino Mar 27, 2024
34e8647
Ensure CXF WebClient to use async conduit (#664)
andrea-patricelli Mar 28, 2024
660c4e3
Upgrading woodstox-core
ilgrosso Mar 28, 2024
47d3623
Upgrading Okta
ilgrosso Mar 29, 2024
116a4f3
Upgrading Swagger UI
ilgrosso Mar 31, 2024
1dfa25b
Upgrading Elasticsearch, Opensearch, Tika and jacoco-maven-plugin
ilgrosso Apr 3, 2024
404c44b
[SYNCOPE-1812] use COLLATE operator for case-sensitive queries with M…
SamuelGaro Apr 4, 2024
15244d3
add in documentation how to enable case-sensitive query using MariaDB
SamuelGaro Apr 4, 2024
abb74d6
Refinement
ilgrosso Apr 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
[SYNCOPE-1806] Fixing all dynamic memberships refresh: Realms, Groups…
… and Roles
  • Loading branch information
ilgrosso committed Mar 6, 2024
commit b67cfff546ffdf3233460789e3343410161d77b3
Original file line number Diff line number Diff line change
Expand Up @@ -172,10 +172,11 @@ public void refreshDynMemberships(final Any<?> any) {
boolean matches = anyMatchDAO.matches(
any, SearchCondConverter.convert(searchCondVisitor, memb.getFIQLCond()));

Query find = entityManager().createNativeQuery(
"SELECT dynRealm_id FROM " + DYNMEMB_TABLE + " WHERE any_id=?");
find.setParameter(1, any.getKey());
boolean existing = !find.getResultList().isEmpty();
Query query = entityManager().createNativeQuery(
"SELECT COUNT(dynRealm_id) FROM " + DYNMEMB_TABLE + " WHERE any_id=? AND dynRealm_id=?");
query.setParameter(1, any.getKey());
query.setParameter(2, dynRealm.getKey());
boolean existing = ((Number) query.getSingleResult()).longValue() > 0;

if (matches && !existing) {
Query insert = entityManager().
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,8 @@ public Group saveAndRefreshDynMemberships(final Group group) {
AnyTypeKind.USER);

matching.forEach(user -> {
Query insert = entityManager().createNativeQuery("INSERT INTO " + UDYNMEMB_TABLE + " VALUES(?, ?)");
Query insert = entityManager().createNativeQuery(
"INSERT INTO " + UDYNMEMB_TABLE + " VALUES(?, ?)");
insert.setParameter(1, user.getKey());
insert.setParameter(2, merged.getKey());
insert.executeUpdate();
Expand Down Expand Up @@ -440,7 +441,7 @@ public boolean existsUMembership(final String userKey, final String groupKey) {
@SuppressWarnings("unchecked")
public List<String> findAMembers(final String groupKey) {
Query query = entityManager().createNativeQuery(
"SELECT anyObject_id FROM " + JPAAMembership.TABLE + " WHERE group_id=?");
"SELECT DISTINCT anyObject_id FROM " + JPAAMembership.TABLE + " WHERE group_id=?");
query.setParameter(1, groupKey);

List<String> result = new ArrayList<>();
Expand All @@ -456,7 +457,7 @@ public List<String> findAMembers(final String groupKey) {
@SuppressWarnings("unchecked")
public List<String> findUMembers(final String groupKey) {
Query query = entityManager().createNativeQuery(
"SELECT user_id FROM " + JPAUMembership.TABLE + " WHERE group_id=?");
"SELECT DISTINCT user_id FROM " + JPAUMembership.TABLE + " WHERE group_id=?");
query.setParameter(1, groupKey);

List<String> result = new ArrayList<>();
Expand All @@ -474,7 +475,7 @@ public List<String> findADynMembers(final Group group) {

group.getADynMemberships().forEach(memb -> {
Query query = entityManager().createNativeQuery(
"SELECT any_id FROM " + ADYNMEMB_TABLE + " WHERE group_id=? AND anyType_id=?");
"SELECT DISTINCT any_id FROM " + ADYNMEMB_TABLE + " WHERE group_id=? AND anyType_id=?");
query.setParameter(1, group.getKey());
query.setParameter(2, memb.getAnyType().getKey());

Expand All @@ -491,7 +492,7 @@ public List<String> findADynMembers(final Group group) {
@Override
public int countAMembers(final String groupKey) {
Query query = entityManager().createNativeQuery(
"SELECT COUNT(anyObject_id) FROM " + JPAAMembership.TABLE + " WHERE group_id=?");
"SELECT COUNT(DISTINCT anyObject_id) FROM " + JPAAMembership.TABLE + " WHERE group_id=?");
query.setParameter(1, groupKey);

return ((Number) query.getSingleResult()).intValue();
Expand All @@ -500,7 +501,7 @@ public int countAMembers(final String groupKey) {
@Override
public int countUMembers(final String groupKey) {
Query query = entityManager().createNativeQuery(
"SELECT COUNT(user_id) FROM " + JPAUMembership.TABLE + " WHERE group_id=?");
"SELECT COUNT(DISTINCT user_id) FROM " + JPAUMembership.TABLE + " WHERE group_id=?");
query.setParameter(1, groupKey);

return ((Number) query.getSingleResult()).intValue();
Expand All @@ -509,7 +510,7 @@ public int countUMembers(final String groupKey) {
@Override
public int countADynMembers(final Group group) {
Query query = entityManager().createNativeQuery(
"SELECT COUNT(any_id) FROM " + ADYNMEMB_TABLE + " WHERE group_id=?");
"SELECT COUNT(DISTINCT any_id) FROM " + ADYNMEMB_TABLE + " WHERE group_id=?");
query.setParameter(1, group.getKey());

return ((Number) query.getSingleResult()).intValue();
Expand All @@ -522,7 +523,7 @@ public int countUDynMembers(final Group group) {
}

Query query = entityManager().createNativeQuery(
"SELECT COUNT(any_id) FROM " + UDYNMEMB_TABLE + " WHERE group_id=?");
"SELECT COUNT(DISTINCT any_id) FROM " + UDYNMEMB_TABLE + " WHERE group_id=?");
query.setParameter(1, group.getKey());

return ((Number) query.getSingleResult()).intValue();
Expand Down Expand Up @@ -554,11 +555,11 @@ public Pair<Set<String>, Set<String>> refreshDynMemberships(final AnyObject anyO
after.add(memb.getGroup().getKey());
}

Query find = entityManager().createNativeQuery(
"SELECT any_id FROM " + ADYNMEMB_TABLE + " WHERE group_id=? AND any_id=?");
find.setParameter(1, memb.getGroup().getKey());
find.setParameter(2, anyObject.getKey());
boolean existing = !find.getResultList().isEmpty();
Query query = entityManager().createNativeQuery(
"SELECT COUNT(group_id) FROM " + ADYNMEMB_TABLE + " WHERE group_id=? AND any_id=?");
query.setParameter(1, memb.getGroup().getKey());
query.setParameter(2, anyObject.getKey());
boolean existing = ((Number) query.getSingleResult()).longValue() > 0;
if (existing) {
before.add(memb.getGroup().getKey());
}
Expand Down Expand Up @@ -612,7 +613,7 @@ public List<String> findUDynMembers(final Group group) {
}

Query query = entityManager().createNativeQuery(
"SELECT any_id FROM " + UDYNMEMB_TABLE + " WHERE group_id=?");
"SELECT DISTINCT any_id FROM " + UDYNMEMB_TABLE + " WHERE group_id=?");
query.setParameter(1, group.getKey());

List<String> result = new ArrayList<>();
Expand Down Expand Up @@ -649,11 +650,11 @@ public Pair<Set<String>, Set<String>> refreshDynMemberships(final User user) {
after.add(memb.getGroup().getKey());
}

Query find = entityManager().createNativeQuery(
"SELECT any_id FROM " + UDYNMEMB_TABLE + " WHERE group_id=? AND any_id=?");
find.setParameter(1, memb.getGroup().getKey());
find.setParameter(2, user.getKey());
boolean existing = !find.getResultList().isEmpty();
Query query = entityManager().createNativeQuery(
"SELECT COUNT(group_id) FROM " + UDYNMEMB_TABLE + " WHERE group_id=? AND any_id=?");
query.setParameter(1, memb.getGroup().getKey());
query.setParameter(2, user.getKey());
boolean existing = ((Number) query.getSingleResult()).longValue() > 0;
if (existing) {
before.add(memb.getGroup().getKey());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,8 @@ public List<String> findDynMembers(final Role role) {
return List.of();
}

Query query = entityManager().createNativeQuery("SELECT any_id FROM " + DYNMEMB_TABLE + " WHERE role_id=?");
Query query = entityManager().createNativeQuery(
"SELECT DISTINCT any_id FROM " + DYNMEMB_TABLE + " WHERE role_id=?");
query.setParameter(1, role.getKey());

List<String> result = new ArrayList<>();
Expand Down Expand Up @@ -202,9 +203,10 @@ public void refreshDynMemberships(final User user) {
user, SearchCondConverter.convert(searchCondVisitor, role.getDynMembership().getFIQLCond()));

Query find = entityManager().createNativeQuery(
"SELECT any_id FROM " + DYNMEMB_TABLE + " WHERE role_id=?");
find.setParameter(1, role.getKey());
boolean existing = !find.getResultList().isEmpty();
"SELECT COUNT(role_id) FROM " + DYNMEMB_TABLE + " WHERE any_id=? AND role_id=?");
find.setParameter(1, user.getKey());
find.setParameter(2, role.getKey());
boolean existing = ((Number) find.getSingleResult()).longValue() > 0;

if (matches && !existing) {
Query insert = entityManager().createNativeQuery(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,20 @@
*/
package org.apache.syncope.core.persistence.jpa.outer;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;

import java.util.List;
import org.apache.syncope.common.lib.types.AnyTypeKind;
import org.apache.syncope.core.persistence.api.attrvalue.validation.PlainAttrValidationManager;
import org.apache.syncope.core.persistence.api.dao.AnyMatchDAO;
import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
import org.apache.syncope.core.persistence.api.dao.DynRealmDAO;
import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
import org.apache.syncope.core.persistence.api.dao.UserDAO;
import org.apache.syncope.core.persistence.api.dao.search.DynRealmCond;
import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
Expand Down Expand Up @@ -58,6 +61,12 @@ public class DynRealmTest extends AbstractTest {
@Autowired
private UserDAO userDAO;

@Autowired
private PlainSchemaDAO plainSchemaDAO;

@Autowired
private PlainAttrValidationManager plainAttrValidationManager;

@Test
public void misc() {
DynRealm dynRealm = entityFactory.newEntity(DynRealm.class);
Expand Down Expand Up @@ -96,4 +105,66 @@ public void misc() {

assertTrue(userDAO.findDynRealms(user.getKey()).contains(actual.getKey()));
}

@Test
public void issueSYNCOPE1806() {
// 1. create two dyn realms with same condition
DynRealm realm1 = entityFactory.newEntity(DynRealm.class);
realm1.setKey("realm1");

DynRealmMembership memb1 = entityFactory.newEntity(DynRealmMembership.class);
memb1.setDynRealm(realm1);
memb1.setAnyType(anyTypeDAO.findUser());
memb1.setFIQLCond("cool==true");

realm1.add(memb1);
memb1.setDynRealm(realm1);

realm1 = dynRealmDAO.saveAndRefreshDynMemberships(realm1);

DynRealm realm2 = entityFactory.newEntity(DynRealm.class);
realm2.setKey("realm2");

DynRealmMembership memb2 = entityFactory.newEntity(DynRealmMembership.class);
memb2.setDynRealm(realm2);
memb2.setAnyType(anyTypeDAO.findUser());
memb2.setFIQLCond("cool==true");

realm2.add(memb2);
memb2.setDynRealm(realm2);

realm2 = dynRealmDAO.saveAndRefreshDynMemberships(realm2);

entityManager().flush();

// 2. verify that dynamic members are the same
DynRealmCond dynRealmCond1 = new DynRealmCond();
dynRealmCond1.setDynRealm(realm1.getKey());
List<User> matching1 = searchDAO.search(SearchCond.getLeaf(dynRealmCond1), AnyTypeKind.USER);

DynRealmCond dynRealmCond2 = new DynRealmCond();
dynRealmCond2.setDynRealm(realm2.getKey());
List<User> matching2 = searchDAO.search(SearchCond.getLeaf(dynRealmCond2), AnyTypeKind.USER);

assertEquals(matching1, matching2);
assertEquals(1, matching1.size());
assertTrue(matching1.stream().anyMatch(u -> "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(u.getKey())));

// 3. update an user to let them become part of both dyn realms
anyUtilsFactory.getInstance(AnyTypeKind.USER).addAttr(
plainAttrValidationManager,
"823074dc-d280-436d-a7dd-07399fae48ec",
plainSchemaDAO.find("cool"),
"true");

entityManager().flush();

// 4. verify that dynamic members are still the same
matching1 = searchDAO.search(SearchCond.getLeaf(dynRealmCond1), AnyTypeKind.USER);
matching2 = searchDAO.search(SearchCond.getLeaf(dynRealmCond2), AnyTypeKind.USER);
assertEquals(matching1, matching2);
assertEquals(2, matching1.size());
assertTrue(matching1.stream().anyMatch(u -> "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(u.getKey())));
assertTrue(matching1.stream().anyMatch(u -> "823074dc-d280-436d-a7dd-07399fae48ec".equals(u.getKey())));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@
import javax.ws.rs.core.Response;
import org.apache.commons.io.IOUtils;
import org.apache.syncope.client.lib.SyncopeClient;
import org.apache.syncope.common.lib.Attr;
import org.apache.syncope.common.lib.SyncopeClientException;
import org.apache.syncope.common.lib.SyncopeConstants;
import org.apache.syncope.common.lib.request.AttrPatch;
import org.apache.syncope.common.lib.request.GroupCR;
import org.apache.syncope.common.lib.request.GroupUR;
Expand Down Expand Up @@ -244,74 +244,63 @@ private static ArrayNode fetchDynRealmsFromElasticsearch(final String userKey) t
}

@Test
public void issueSYNCOPE1480() throws Exception {
String ctype = getUUIDString();

DynRealmTO dynRealm = null;
public void issueSYNCOPE1806() {
DynRealmTO realm1 = null;
DynRealmTO realm2 = null;
try {
// 1. create new dyn realm matching a very specific attribute value
dynRealm = new DynRealmTO();
dynRealm.setKey("name" + getUUIDString());
dynRealm.getDynMembershipConds().put(AnyTypeKind.USER.name(), "ctype==" + ctype);
DYN_REALM_SERVICE.create(dynRealm);

Response response = DYN_REALM_SERVICE.create(dynRealm);
dynRealm = getObject(response.getLocation(), DynRealmService.class, DynRealmTO.class);
assertNotNull(dynRealm);

// 2. no dyn realm members
PagedResult<UserTO> matching = USER_SERVICE.search(new AnyQuery.Builder().realm("/").fiql(
SyncopeClient.getUserSearchConditionBuilder().inDynRealms(dynRealm.getKey()).query()).build());
assertEquals(0, matching.getSize());

// 3. create user with that attribute value
UserCR userCR = UserITCase.getUniqueSample("[email protected]");
userCR.getPlainAttr("ctype").get().getValues().set(0, ctype);
UserTO user = createUser(userCR).getEntity();
assertNotNull(user.getKey());

// 4a. check that Elasticsearch index was updated correctly
if (IS_EXT_SEARCH_ENABLED) {
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
// ignore
}

ArrayNode dynRealms = fetchDynRealmsFromElasticsearch(user.getKey());
assertEquals(1, dynRealms.size());
assertEquals(dynRealm.getKey(), dynRealms.get(0).asText());
}

// 4b. now there is 1 realm member
matching = USER_SERVICE.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).fiql(
SyncopeClient.getUserSearchConditionBuilder().inDynRealms(dynRealm.getKey()).query()).build());
assertEquals(1, matching.getSize());

// 5. change dyn realm condition
dynRealm.getDynMembershipConds().put(AnyTypeKind.USER.name(), "ctype==ANY");
DYN_REALM_SERVICE.update(dynRealm);

// 6a. check that Elasticsearch index was updated correctly
if (IS_EXT_SEARCH_ENABLED) {
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
// ignore
}

ArrayNode dynRealms = fetchDynRealmsFromElasticsearch(user.getKey());
assertTrue(dynRealms.isEmpty());
}

// 6b. no more dyn realm members
matching = USER_SERVICE.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).fiql(
SyncopeClient.getUserSearchConditionBuilder().inDynRealms(dynRealm.getKey()).query()).build());
assertEquals(0, matching.getSize());
// 1. create two dyn realms with same condition
realm1 = new DynRealmTO();
realm1.setKey("realm1");
realm1.getDynMembershipConds().put(AnyTypeKind.USER.name(), "cool==true");
realm1 = getObject(DYN_REALM_SERVICE.create(realm1).getLocation(), DynRealmService.class, DynRealmTO.class);
assertNotNull(realm1);

realm2 = new DynRealmTO();
realm2.setKey("realm2");
realm2.getDynMembershipConds().put(AnyTypeKind.USER.name(), "cool==true");
realm2 = getObject(DYN_REALM_SERVICE.create(realm2).getLocation(), DynRealmService.class, DynRealmTO.class);
assertNotNull(realm2);

// 2. verify that dynamic members are the same
PagedResult<UserTO> matching1 = USER_SERVICE.search(new AnyQuery.Builder().realm("/").fiql(
SyncopeClient.getUserSearchConditionBuilder().inDynRealms(realm1.getKey()).query()).build());
PagedResult<UserTO> matching2 = USER_SERVICE.search(new AnyQuery.Builder().realm("/").fiql(
SyncopeClient.getUserSearchConditionBuilder().inDynRealms(realm2.getKey()).query()).build());

assertEquals(matching1, matching2);
assertEquals(1, matching1.getResult().size());
assertTrue(matching1.getResult().stream().
anyMatch(u -> "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(u.getKey())));

// 3. update an user to let them become part of both dyn realms
UserUR userUR = new UserUR();
userUR.setKey("823074dc-d280-436d-a7dd-07399fae48ec");
userUR.getPlainAttrs().add(new AttrPatch.Builder(new Attr.Builder("cool").value("true").build()).build());
updateUser(userUR);

// 4. verify that dynamic members are still the same
matching1 = USER_SERVICE.search(new AnyQuery.Builder().realm("/").fiql(
SyncopeClient.getUserSearchConditionBuilder().inDynRealms(realm1.getKey()).query()).build());
matching2 = USER_SERVICE.search(new AnyQuery.Builder().realm("/").fiql(
SyncopeClient.getUserSearchConditionBuilder().inDynRealms(realm2.getKey()).query()).build());
assertEquals(matching1, matching2);
assertEquals(2, matching1.getResult().size());
assertTrue(matching1.getResult().stream().
anyMatch(u -> "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(u.getKey())));
assertTrue(matching1.getResult().stream().
anyMatch(u -> "823074dc-d280-436d-a7dd-07399fae48ec".equals(u.getKey())));
} finally {
if (dynRealm != null) {
DYN_REALM_SERVICE.delete(dynRealm.getKey());
if (realm1 != null) {
DYN_REALM_SERVICE.delete(realm1.getKey());
}
if (realm2 != null) {
DYN_REALM_SERVICE.delete(realm2.getKey());
}
UserUR userUR = new UserUR();
userUR.setKey("823074dc-d280-436d-a7dd-07399fae48ec");
userUR.getPlainAttrs().add(new AttrPatch.Builder(new Attr.Builder("cool").build()).
operation(PatchOperation.DELETE).build());
updateUser(userUR);
}
}
}
Loading