This is an automated email from the ASF dual-hosted git repository. andreapatricelli 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 318db330a7 [SYNCOPE-1826] ensuring to correctly handle plus in fiql and make search with four digits work (#804) 318db330a7 is described below commit 318db330a7b5bd1359bfcba9280549d84684087f Author: Andrea Patricelli <andreapatrice...@apache.org> 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 4078f6fe53..4b3244d439 100644 --- a/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml +++ b/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml @@ -333,7 +333,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":"bell...@apache.org"},"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 466cd6526a..b4bb9f766e 100644 --- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml +++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml @@ -195,7 +195,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 0dccaac2ca..ae102c7964 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 @@ -351,7 +351,7 @@ public class SearchITCase extends AbstractITCase { PagedResult<UserTO> issueSYNCOPE1321 = USER_SERVICE.search(new AnyQuery.Builder(). realm(SyncopeConstants.ROOT_REALM). fiql(SyncopeClient.getUserSearchConditionBuilder(). - is("creationDate").lexicalNotBefore("2009-03-02 15:21:22"). + is("lastLoginDate").lexicalNotBefore("2016-03-02T15:21:22%2B0300"). and("username").equalTo("bellini").query()). build()); assertEquals(users, issueSYNCOPE1321); @@ -1002,4 +1002,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("issuesear...@syncope.apache.org"); + 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("issuesear...@syncope.apache.org"); + userCR.setUsername("user 1826 test"); + createUser(userCR); + + userCR = UserITCase.getUniqueSample("issuesear...@syncope.apache.org"); + 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"); + } + } + }