This is an automated email from the ASF dual-hosted git repository. ilgrosso pushed a commit to branch 2_1_X in repository https://gitbox.apache.org/repos/asf/syncope.git
The following commit(s) were added to refs/heads/2_1_X by this push: new a9c2be2 [SYNCOPE-1654] Allowing to search realm by key or full path a9c2be2 is described below commit a9c2be288c0fe0e024d5489d6428f616644665d0 Author: Francesco Chicchiriccò <ilgro...@apache.org> AuthorDate: Mon Nov 29 10:38:45 2021 +0100 [SYNCOPE-1654] Allowing to search realm by key or full path --- .../persistence/jpa/dao/PGJPAJSONAnySearchDAO.java | 13 +++++++++++++ .../core/persistence/jpa/dao/JPAAnySearchDAO.java | 13 +++++++++++++ .../core/persistence/jpa/inner/AnySearchTest.java | 18 ++++++++++++++++++ .../persistence/jpa/dao/ElasticsearchAnySearchDAO.java | 12 ++++++++++++ .../java/org/apache/syncope/fit/core/SearchITCase.java | 12 ++++++++++++ 5 files changed, 68 insertions(+) diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java index 6ef0786..3ecc9c6 100644 --- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java +++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java @@ -29,8 +29,10 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; import org.apache.syncope.common.lib.SyncopeClientException; +import org.apache.syncope.common.lib.SyncopeConstants; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.AttrSchemaType; +import org.apache.syncope.common.rest.api.service.JAXRSService; import org.apache.syncope.core.persistence.api.dao.search.AnyCond; import org.apache.syncope.core.persistence.api.dao.search.AnyTypeCond; import org.apache.syncope.core.persistence.api.dao.search.AssignableCond; @@ -585,6 +587,17 @@ public class PGJPAJSONAnySearchDAO extends JPAAnySearchDAO { final List<Object> parameters, final SearchSupport svs) { + if (JAXRSService.PARAM_REALM.equals(cond.getSchema()) + && !SyncopeConstants.UUID_PATTERN.matcher(cond.getExpression()).matches()) { + + Realm realm = realmDAO.findByFullPath(cond.getExpression()); + if (realm == null) { + LOG.warn("Invalid Realm full path: {}", cond.getExpression()); + return EMPTY_QUERY; + } + cond.setExpression(realm.getKey()); + } + Triple<PlainSchema, PlainAttrValue, AnyCond> checked; try { checked = check(cond, svs.anyTypeKind); diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java index 43911d1..65bf645 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java @@ -33,9 +33,11 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; import org.apache.syncope.common.lib.SyncopeClientException; +import org.apache.syncope.common.lib.SyncopeConstants; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.AttrSchemaType; import org.apache.syncope.common.lib.types.ClientExceptionType; +import org.apache.syncope.common.rest.api.service.JAXRSService; import org.apache.syncope.core.provisioning.api.utils.RealmUtils; import org.apache.syncope.core.persistence.api.dao.search.AttrCond; import org.apache.syncope.core.persistence.api.dao.search.MembershipCond; @@ -1093,6 +1095,17 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO { final List<Object> parameters, final SearchSupport svs) { + if (JAXRSService.PARAM_REALM.equals(cond.getSchema()) + && !SyncopeConstants.UUID_PATTERN.matcher(cond.getExpression()).matches()) { + + Realm realm = realmDAO.findByFullPath(cond.getExpression()); + if (realm == null) { + LOG.warn("Invalid Realm full path: {}", cond.getExpression()); + return EMPTY_QUERY; + } + cond.setExpression(realm.getKey()); + } + Triple<PlainSchema, PlainAttrValue, AnyCond> checked; try { checked = check(cond, svs.anyTypeKind); diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java index 1561154..ad93951 100644 --- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java +++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java @@ -216,6 +216,24 @@ public class AnySearchTest extends AbstractTest { } @Test + public void searchByRealm() { + AnyCond anyCond = new AnyCond(AttrCond.Type.EQ); + anyCond.setSchema("realm"); + anyCond.setExpression("c5b75db1-fce7-470f-b780-3b9934d82a9d"); + + List<User> users = searchDAO.search(SearchCond.getLeaf(anyCond), AnyTypeKind.USER); + assertNotNull(users); + assertEquals(1, users.size()); + assertEquals("rossini", users.get(0).getUsername()); + + anyCond.setExpression("/even"); + users = searchDAO.search(SearchCond.getLeaf(anyCond), AnyTypeKind.USER); + assertNotNull(users); + assertEquals(1, users.size()); + assertEquals("rossini", users.get(0).getUsername()); + } + + @Test public void searchByPageAndSize() { AttrCond fullnameLeafCond = new AttrCond(AttrCond.Type.LIKE); fullnameLeafCond.setSchema("fullname"); diff --git a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java b/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java index a5b2d59..16eb4d4 100644 --- a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java +++ b/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java @@ -36,6 +36,7 @@ import org.apache.syncope.common.lib.SyncopeConstants; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.AttrSchemaType; import org.apache.syncope.common.lib.types.ClientExceptionType; +import org.apache.syncope.common.rest.api.service.JAXRSService; import org.apache.syncope.core.persistence.api.dao.search.AnyCond; import org.apache.syncope.core.persistence.api.dao.search.AnyTypeCond; import org.apache.syncope.core.persistence.api.dao.search.AssignableCond; @@ -527,6 +528,17 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO { } protected QueryBuilder getQueryBuilder(final AnyCond cond, final AnyTypeKind kind) { + if (JAXRSService.PARAM_REALM.equals(cond.getSchema()) + && SyncopeConstants.UUID_PATTERN.matcher(cond.getExpression()).matches()) { + + Realm realm = realmDAO.find(cond.getExpression()); + if (realm == null) { + LOG.warn("Invalid Realm key: {}", cond.getExpression()); + return MATCH_NONE_QUERY_BUILDER; + } + cond.setExpression(realm.getFullPath()); + } + Triple<PlainSchema, PlainAttrValue, AnyCond> checked; try { checked = check(cond, kind); diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java index 7e5ba76..b22bce3 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java @@ -278,6 +278,18 @@ public class SearchITCase extends AbstractITCase { } @Test + public void searchByRealm() { + PagedResult<UserTO> users = userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM). + fiql(SyncopeClient.getUserSearchConditionBuilder().is("realm"). + equalTo("c5b75db1-fce7-470f-b780-3b9934d82a9d").query()).build()); + assertTrue(users.getResult().stream().anyMatch(user -> "rossini".equals(user.getUsername()))); + + users = userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM). + fiql(SyncopeClient.getUserSearchConditionBuilder().is("realm").equalTo("/even").query()).build()); + assertTrue(users.getResult().stream().anyMatch(user -> "rossini".equals(user.getUsername()))); + } + + @Test public void searchByBooleanAnyCond() { PagedResult<GroupTO> groups = groupService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM). fiql(SyncopeClient.getGroupSearchConditionBuilder().is("show").equalTo("true").query()).build());