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());

Reply via email to