This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git
The following commit(s) were added to refs/heads/master by this push:
new 236cf8c123 [SYNCOPE-1790] Fix regexp match with pgjsonb (#554)
236cf8c123 is described below
commit 236cf8c12386bef51c754cadf6aedd23d9ac427b
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Sat Nov 18 08:14:09 2023 +0100
[SYNCOPE-1790] Fix regexp match with pgjsonb (#554)
---
.../persistence/jpa/dao/PGJPAJSONAnySearchDAO.java | 5 +-
.../core/persistence/jpa/outer/AnySearchTest.java | 41 ++++++++++++++++
.../apache/syncope/fit/core/PullTaskITCase.java | 2 +
.../org/apache/syncope/fit/core/SearchITCase.java | 57 +++++++++++++++++-----
pom.xml | 2 +-
5 files changed, 94 insertions(+), 13 deletions(-)
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 53bbd1d31c..4d3950add7 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
@@ -219,8 +219,11 @@ public class PGJPAJSONAnySearchDAO extends JPAAnySearchDAO
{
case EQ:
query.append("jsonb_path_exists(").append(schema.getKey()).append(", '$[*] ? ").
append("(@.").append(key);
+
if (StringUtils.containsAny(value, POSTGRESQL_REGEX_CHARS)
|| lower) {
- query.append(" like_regex
\"").append(escapeForLikeRegex(value).replace("'", "''")).append('"');
+ query.append(" like_regex \"^").
+ append(escapeForLikeRegex(value).replace("'",
"''")).
+ append("$\"");
} else {
query.append(" == ").append(escapeIfString(value,
isStr));
}
diff --git
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
index 67fd767e93..3be78d4059 100644
---
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
+++
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
@@ -49,6 +49,7 @@ import
org.apache.syncope.core.persistence.api.entity.group.GPlainAttr;
import org.apache.syncope.core.persistence.api.entity.group.Group;
import org.apache.syncope.core.persistence.api.entity.user.DynRoleMembership;
import org.apache.syncope.core.persistence.api.entity.user.UMembership;
+import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
import org.apache.syncope.core.persistence.api.entity.user.User;
import org.apache.syncope.core.persistence.jpa.AbstractTest;
import org.apache.syncope.core.provisioning.api.utils.RealmUtils;
@@ -238,4 +239,44 @@ public class AnySearchTest extends AbstractTest {
assertEquals(1, matching.size());
assertEquals(group.getKey(), matching.get(0).getKey());
}
+
+ @Test
+ public void issueSYNCOPE1790() {
+ // 0. search by email
+ AttrCond emailCond = new AttrCond(AttrCond.Type.EQ);
+ emailCond.setSchema("email");
+ emailCond.setExpression("[email protected]");
+
+ SearchCond cond = SearchCond.getLeaf(emailCond);
+ assertTrue(cond.isValid());
+
+ List<User> users = searchDAO.search(cond, AnyTypeKind.USER);
+ assertNotNull(users);
+ assertEquals(1, users.size());
+ assertEquals("verdi", users.get(0).getUsername());
+
+ // 1. set rossini's email address for conditions as per SYNCOPE-1790
+ User rossini = userDAO.findByUsername("rossini");
+ assertNotNull(rossini);
+
+ UPlainAttr mail = entityFactory.newEntity(UPlainAttr.class);
+ mail.setOwner(rossini);
+ mail.setSchema(plainSchemaDAO.find("email"));
+ mail.add(validator, "[email protected]",
anyUtilsFactory.getInstance(AnyTypeKind.USER));
+ rossini.add(mail);
+
+ userDAO.save(rossini);
+ entityManager().flush();
+
+ rossini = userDAO.findByUsername("rossini");
+ assertEquals(
+ "[email protected]",
+ rossini.getPlainAttr("email").map(a ->
a.getValuesAsStrings().get(0)).orElseThrow());
+
+ // 2. search again
+ users = searchDAO.search(cond, AnyTypeKind.USER);
+ assertNotNull(users);
+ assertEquals(1, users.size());
+ assertEquals("verdi", users.get(0).getUsername());
+ }
}
diff --git
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
index 33ded0fa4a..7ac05e0423 100644
---
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
+++
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
@@ -1116,6 +1116,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
@Test
public void issueSYNCOPE258() throws IOException {
+ assumeFalse(IS_EXT_SEARCH_ENABLED);
+
// -----------------------------
// Add a custom correlation rule
// -----------------------------
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 e0139c5906..345fa41b82 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
@@ -893,25 +893,60 @@ public class SearchITCase extends AbstractITCase {
}
// Search by username
- PagedResult<UserTO> users = USER_SERVICE.search(new
AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM)
-
.fiql(SyncopeClient.getUserSearchConditionBuilder().is("username").equalTo("syncope1779_*")
- .and().is("firstname").equalTo("syncope1779_*")
- .and().is("userId").equalTo("syncope1779_*").query())
- .build());
+ PagedResult<UserTO> users = USER_SERVICE.search(new
AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+
fiql(SyncopeClient.getUserSearchConditionBuilder().is("username").equalTo("syncope1779_*").
+ and().is("firstname").equalTo("syncope1779_*").
+ and().is("userId").equalTo("syncope1779_*").query()).
+ build());
assertEquals(1, users.getResult().size());
assertEquals(userWithUnderscore.getKey(),
users.getResult().get(0).getKey());
// Search also by attribute
- users = USER_SERVICE.search(new
AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM)
-
.fiql(SyncopeClient.getUserSearchConditionBuilder().is("email").equalTo("syncope1779_*").query())
- .build());
+ users = USER_SERVICE.search(new
AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+
fiql(SyncopeClient.getUserSearchConditionBuilder().is("email").equalTo("syncope1779_*").query()).
+ build());
assertEquals(1, users.getResult().size());
assertEquals(userWithUnderscore.getKey(),
users.getResult().get(0).getKey());
// search for both
- users = USER_SERVICE.search(new
AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM)
-
.fiql(SyncopeClient.getUserSearchConditionBuilder().is("email").equalTo("syncope1779*").query())
- .build());
+ users = USER_SERVICE.search(new
AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+
fiql(SyncopeClient.getUserSearchConditionBuilder().is("email").equalTo("syncope1779*").query()).
+ build());
assertEquals(2, users.getResult().size());
users.getResult().forEach(u -> USER_SERVICE.delete(u.getKey()));
}
+
+ @Test
+ public void issueSYNCOPE1790() {
+ // 0. search by email [email protected]
+ PagedResult<UserTO> users = USER_SERVICE.search(new
AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+
fiql(SyncopeClient.getUserSearchConditionBuilder().is("email").equalTo("[email protected]").query()).
+ build());
+ int before = users.getTotalCount();
+ assertTrue(before > 0);
+ assertFalse(users.getResult().isEmpty());
+ assertTrue(users.getResult().stream().
+ allMatch(u ->
"[email protected]".equals(u.getPlainAttr("email").orElseThrow().getValues().get(0))));
+
+ // 1. create user with similar email
+ UserTO user =
createUser(UserITCase.getSample("[email protected]")).getEntity();
+ assertNotNull(user);
+
+ // 2. search again
+ if (IS_EXT_SEARCH_ENABLED) {
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException ex) {
+ // ignore
+ }
+ }
+
+ users = USER_SERVICE.search(new
AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+
fiql(SyncopeClient.getUserSearchConditionBuilder().is("email").equalTo("[email protected]").query()).
+ build());
+ assertEquals(before, users.getTotalCount());
+ assertFalse(users.getResult().isEmpty());
+ assertTrue(users.getResult().stream().
+ allMatch(u ->
"[email protected]".equals(u.getPlainAttr("email").orElseThrow().getValues().get(0))));
+ assertTrue(users.getResult().stream().noneMatch(u ->
user.getKey().equals(u.getKey())));
+ }
}
diff --git a/pom.xml b/pom.xml
index 077226cd18..59d541906c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1634,7 +1634,7 @@ under the License.
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
- <version>3.1.0</version>
+ <version>3.1.1</version>
</plugin>
<plugin>