From e8b96df9b9ee2823a984863f7993b1c6d8cb6f78 Mon Sep 17 00:00:00 2001
From: felmer <franz-josef.elmer@id.ethz.ch>
Date: Thu, 16 May 2019 10:38:42 +0200
Subject: [PATCH] SSDM-7557: Fixing bug in HibernateSearchDAO by no allowing
 CODE search for invalid codes

---
 .../dataaccess/db/HibernateSearchDAO.java     | 34 +++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java
index 312cc4b181e..1ea28d49a95 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java
@@ -87,12 +87,17 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.LuceneQueryB
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.detailed.DetailedQueryBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriterion;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchField;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchFieldKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchSubCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IAssociationCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyMatch;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Span;
+import ch.systemsx.cisd.openbis.generic.shared.dto.AbstractIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SearchableEntity;
 import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
@@ -106,6 +111,8 @@ import ch.systemsx.cisd.openbis.generic.shared.translator.DtoConverters;
 
 final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernateSearchDAO
 {
+    private static final Pattern VALID_CODE_PATTERN = Pattern.compile("^[^\\s/&]+$", Pattern.CASE_INSENSITIVE);
+
     /**
      * The <code>Logger</code> of this class.
      * <p>
@@ -784,6 +791,10 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate
             DetailedSearchCriteria searchCriteria, EntityKind entityKind,
             List<IAssociationCriteria> associations)
     {
+        if (hasInvalidCodes(searchCriteria))
+        {
+            return Collections.emptyList();
+        }
         List<String> fieldNames = DetailedQueryBuilder.getIndexFieldNames(searchCriteria.getCriteria(), DtoConverters.convertEntityKind(entityKind));
 
         Query query = LuceneQueryBuilder.createDetailedSearchQuery(userId, searchCriteria, associations, entityKind, getFieldTypes(fieldNames));
@@ -802,6 +813,29 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate
         return entityIds;
     }
 
+    private boolean hasInvalidCodes(DetailedSearchCriteria searchCriteria)
+    {
+        for (DetailedSearchCriterion criterion : searchCriteria.getCriteria())
+        {
+            String value = criterion.getValue();
+            DetailedSearchField field = criterion.getField();
+            DetailedSearchFieldKind kind = field.getKind();
+            if (DetailedSearchFieldKind.ATTRIBUTE.equals(kind) && field.getAttributeCode().equals("CODE") 
+                    && VALID_CODE_PATTERN.matcher(value).matches() == false)
+            {
+                return true;
+            }
+        }
+        for (DetailedSearchSubCriteria subCriteria : searchCriteria.getSubCriterias())
+        {
+            if (hasInvalidCodes(subCriteria.getCriteria()))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
     //
     // Helpers
     //
-- 
GitLab