This is an automated email from the ASF dual-hosted git repository.
andreapatricelli pushed a commit to branch 3_0_X
in repository https://gitbox.apache.org/repos/asf/syncope.git
The following commit(s) were added to refs/heads/3_0_X by this push:
new 130b7e0193 [SYNCOPE-1826] ensuring to correctly handle plus in fiql
and make search with four digits work (#804)
130b7e0193 is described below
commit 130b7e019338dc6b8bd4294ebe5eca4be5fcce25
Author: Andrea Patricelli <[email protected]>
AuthorDate: Tue Aug 6 14:20:32 2024 +0200
[SYNCOPE-1826] ensuring to correctly handle plus in fiql and make search
with four digits work (#804)
* [SYNCOPE-1826] ensuring to correctly handle plus in fiql and make search
with four digits work
---
.../persistence/api/search/SearchCondVisitor.java | 13 +-----
.../api/search/SearchCondConverterTest.java | 20 +++++++++
.../src/test/resources/domains/MasterContent.xml | 3 +-
.../src/test/resources/domains/MasterContent.xml | 2 +-
.../org/apache/syncope/fit/core/SearchITCase.java | 50 +++++++++++++++++++++-
5 files changed, 74 insertions(+), 14 deletions(-)
diff --git
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/SearchCondVisitor.java
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/SearchCondVisitor.java
index 99cda3251b..23435afd0f 100644
---
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/SearchCondVisitor.java
+++
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/SearchCondVisitor.java
@@ -23,7 +23,6 @@ import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
-import java.util.regex.Pattern;
import org.apache.cxf.jaxrs.ext.search.ConditionType;
import org.apache.cxf.jaxrs.ext.search.SearchBean;
import org.apache.cxf.jaxrs.ext.search.SearchCondition;
@@ -52,8 +51,6 @@ import
org.apache.syncope.core.persistence.api.dao.search.SearchCond;
*/
public class SearchCondVisitor extends
AbstractSearchConditionVisitor<SearchBean, SearchCond> {
- protected static final Pattern TIMEZONE = Pattern.compile(".* [0-9]{4}$");
-
protected static final ThreadLocal<String> REALM = new ThreadLocal<>();
protected static final ThreadLocal<SearchCond> SEARCH_COND = new
ThreadLocal<>();
@@ -75,18 +72,12 @@ public class SearchCondVisitor extends
AbstractSearchConditionVisitor<SearchBean
}
protected static String getValue(final SearchCondition<SearchBean> sc) {
- String value = SearchUtils.toSqlWildcardString(
- URLDecoder.decode(sc.getStatement().getValue().toString(),
StandardCharsets.UTF_8), false);
+ String value =
SearchUtils.toSqlWildcardString(URLDecoder.decode(sc.getStatement().getValue().toString()
+ .replace("+", "%2B"), StandardCharsets.UTF_8), false);
if (value.indexOf('%') == -1) {
value = value.replaceAll("\\\\_", "_");
}
- if (TIMEZONE.matcher(value).matches()) {
- char[] valueAsArray = value.toCharArray();
- valueAsArray[valueAsArray.length - 5] = '+';
- value = new String(valueAsArray);
- }
-
return value;
}
diff --git
a/core/persistence-api/src/test/java/org/apache/syncope/core/persistence/api/search/SearchCondConverterTest.java
b/core/persistence-api/src/test/java/org/apache/syncope/core/persistence/api/search/SearchCondConverterTest.java
index c6e31c2294..b3815b798b 100644
---
a/core/persistence-api/src/test/java/org/apache/syncope/core/persistence/api/search/SearchCondConverterTest.java
+++
b/core/persistence-api/src/test/java/org/apache/syncope/core/persistence/api/search/SearchCondConverterTest.java
@@ -351,4 +351,24 @@ public class SearchCondConverterTest {
assertEquals(leaf, SearchCondConverter.convert(VISITOR, fiql));
}
+
+ @Test
+ public void issueSYNCOPE1826() {
+ String fiql = new
UserFiqlSearchConditionBuilder().is("username").equalToIgnoreCase("sh test app
0722").query();
+ assertEquals("username=~sh test app 0722", fiql);
+
+ AnyCond anyCond = new AnyCond(AttrCond.Type.IEQ);
+ anyCond.setSchema("username");
+ anyCond.setExpression("sh test app 0722");
+
+ assertEquals(SearchCond.getLeaf(anyCond),
SearchCondConverter.convert(VISITOR, fiql));
+
+ fiql = "lastLoginDate==2016-03-02T15:21:22%2B0300";
+
+ AnyCond lastLoginDateCond = new AnyCond(AttrCond.Type.EQ);
+ lastLoginDateCond.setSchema("lastLoginDate");
+ lastLoginDateCond.setExpression("2016-03-02T15:21:22+0300");
+
+ assertEquals(SearchCond.getLeaf(lastLoginDateCond),
SearchCondConverter.convert(VISITOR, fiql));
+ }
}
diff --git
a/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
b/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
index 2822226a91..467f903395 100644
--- a/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
@@ -330,7 +330,8 @@ under the License.
password="5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8"
cipherAlgorithm="SHA1"
realm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
username="bellini" creator="admin" lastModifier="admin"
- creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20
11:00:00" suspended="0"
+ creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20
11:00:00"
+ lastLoginDate="2016-03-03 15:21:22" suspended="0"
plainAttrs='[{"values":[{"stringValue":"Vincenzo"}],"schema":"firstname"},{"values":[{"stringValue":"Bellini"}],"schema":"surname"},{"values":[{"dateValue":"2009-06-24T00:00:00+02:00"}],"schema":"loginDate"},{"values":[{"booleanValue":true}],"schema":"cool"},{"values":[{"stringValue":"M"}],"schema":"gender"},{"uniqueValue":{"stringValue":"Vincenzo
Bellini"},"schema":"fullname"},{"uniqueValue":{"stringValue":"[email protected]"},"schema":"userId"}]'/>
<SyncopeUser_SyncopeRole user_id="c9b2dec2-00a7-4855-97c0-d854842b4b24"
role_id="User reviewer"/>
<SyncopeUser_SyncopeRole user_id="c9b2dec2-00a7-4855-97c0-d854842b4b24"
role_id="User manager"/>
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index a07561d663..e02c31bf83 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -197,7 +197,7 @@ under the License.
password="5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8"
cipherAlgorithm="SHA1"
realm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
username="bellini" creator="admin" lastModifier="admin"
- creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20
11:00:00" suspended="0"/>
+ creationDate="2010-10-20 11:00:00" lastLoginDate="2016-03-03
15:21:22" lastChangeDate="2010-10-20 11:00:00" suspended="0"/>
<SyncopeUser_SyncopeRole user_id="c9b2dec2-00a7-4855-97c0-d854842b4b24"
role_id="User reviewer"/>
<SyncopeUser_SyncopeRole user_id="c9b2dec2-00a7-4855-97c0-d854842b4b24"
role_id="User manager"/>
<SyncopeUser mustChangePassword="0"
id="823074dc-d280-436d-a7dd-07399fae48ec" status="active"
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 9c228393b0..492b01f00e 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
@@ -350,7 +350,7 @@ public class SearchITCase extends AbstractITCase {
PagedResult<UserTO> issueSYNCOPE1321 = USER_SERVICE.search(new
AnyQuery.Builder().
realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().
-
is("lastLoginDate").lexicalNotBefore("2016-03-02T15:21:22+0300").
+
is("lastLoginDate").lexicalNotBefore("2016-03-02T15:21:22%2B0300").
and("username").equalTo("bellini").query()).
build());
assertEquals(users, issueSYNCOPE1321);
@@ -1004,4 +1004,52 @@ public class SearchITCase extends AbstractITCase {
assertEquals(1, users.getResult().size());
assertEquals(user.getKey(), users.getResult().get(0).getKey());
}
+
+ @Test
+ void issueSYNCOPE1826() {
+ UserCR userCR =
UserITCase.getUniqueSample("[email protected]");
+ userCR.setUsername("user test 1826");
+ createUser(userCR);
+
+ AnyObjectTO anotherPrinter = createAnyObject(new
AnyObjectCR.Builder(SyncopeConstants.ROOT_REALM,
+ PRINTER,
+ "obj test 1826").build()).getEntity();
+
+ userCR = UserITCase.getUniqueSample("[email protected]");
+ userCR.setUsername("user 1826 test");
+ createUser(userCR);
+
+ userCR = UserITCase.getUniqueSample("[email protected]");
+ userCR.setUsername("user test 182");
+ createUser(userCR);
+
+ if (IS_EXT_SEARCH_ENABLED) {
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException ex) {
+ // ignore
+ }
+ }
+
+ try {
+ assertFalse(USER_SERVICE.search(new
AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).details(false)
+
.fiql(SyncopeClient.getUserSearchConditionBuilder().is("username")
+ .equalToIgnoreCase("user test
1826").query()).build()).getResult().isEmpty());
+ assertFalse(ANY_OBJECT_SERVICE.search(new
AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM)
+
.details(false).fiql(SyncopeClient.getAnyObjectSearchConditionBuilder(PRINTER).is("name")
+ .equalToIgnoreCase("obj test
1826").query()).build()).getResult().isEmpty());
+ assertFalse(USER_SERVICE.search(new
AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).details(false)
+
.fiql(SyncopeClient.getUserSearchConditionBuilder().is("username")
+ .equalToIgnoreCase("user 1826
test").query()).build()).getResult().isEmpty());
+ assertFalse(USER_SERVICE.search(new
AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).details(false)
+
.fiql(SyncopeClient.getUserSearchConditionBuilder().is("username")
+ .equalToIgnoreCase("user test
182").query()).build()).getResult().isEmpty());
+ } finally {
+ deleteUser("user test 1826");
+ deleteAnyObject(anotherPrinter.getKey());
+ deleteUser("user 1826 test");
+ deleteUser("user test 182");
+ }
+ }
+
}