From 55ba64b96052c222d97bf0c24de89b56c46714d8 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Thu, 14 Oct 2010 13:59:12 +0000
Subject: [PATCH] [LMS-1833] bugfix and changed authorization

SVN: 18310
---
 .../application/ui/field/ParameterField.java  | 25 +++++++++----------
 .../client/web/server/QueryClientService.java |  5 ++--
 .../plugin/query/server/QueryServer.java      | 10 ++++++--
 .../query/server/QueryServerLogger.java       |  6 ++---
 .../plugin/query/shared/IQueryServer.java     |  2 +-
 .../query/shared/IQueryServer.java.expected   |  2 +-
 6 files changed, 28 insertions(+), 22 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ParameterField.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ParameterField.java
index 4870020892b..972ab3ed01b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ParameterField.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ParameterField.java
@@ -66,7 +66,7 @@ public class ParameterField extends TriggerField<ModelData> implements IParamete
         {
             final String namePart = split[0];
             final String expressionPart = split[1];
-            final String idSuffix = parameterName.replaceAll(" ", "_");
+            final String idSuffix = namePart.replaceAll(" ", "_");
             if (expressionPart.startsWith(ENUM_LIST_EXPRESSION_PREFIX))
             {
                 String itemList = expressionPart.substring(ENUM_LIST_EXPRESSION_PREFIX.length());
@@ -76,19 +76,20 @@ public class ParameterField extends TriggerField<ModelData> implements IParamete
                 {
                     parameterValues.add(new ParameterValue(value, null));
                 }
-                return ParameterSelectionDropDownList.createWithValues(parameterName, idSuffix,
+                return ParameterSelectionField.createWithValues(namePart, idSuffix,
                         parameterValues, initialValueOrNull, onValueChangeAction);
             } else if (expressionPart.startsWith(QUERY_LIST_EXPRESSION_PREFIX))
             {
                 String queryExpression =
                         expressionPart.substring(QUERY_LIST_EXPRESSION_PREFIX.length());
-                return ParameterSelectionDropDownList.createWithLoader(parameterName,
-                        queryExpression, idSuffix, viewContextOrNull, loaderOrNull,
-                        initialValueOrNull, onValueChangeAction);
+                return ParameterSelectionField.createWithLoader(namePart, queryExpression,
+                        idSuffix, viewContextOrNull, loaderOrNull, initialValueOrNull,
+                        onValueChangeAction);
             } else
             {
                 MessageBox.alert("Error", "Filter parameter '" + namePart
                         + "' is not defined properly.", null);
+                return new ParameterField(namePart, onValueChangeAction, initialValueOrNull);
             }
         }
         return new ParameterField(parameterName, onValueChangeAction, initialValueOrNull);
@@ -147,8 +148,7 @@ public class ParameterField extends TriggerField<ModelData> implements IParamete
         onValueChangeAction.execute();
     }
 
-    // TODO 2010-10-13, Piotr Buczek: extract common code with ParameterField
-    private static class ParameterSelectionDropDownList extends
+    private static class ParameterSelectionField extends
             DropDownList<ParameterValueModel, ParameterValue> implements IParameterField
     {
 
@@ -178,8 +178,8 @@ public class ParameterField extends TriggerField<ModelData> implements IParamete
                 IParameterValuesLoader loader, String initialValueOrNull,
                 IDelegatedAction onValueChangeAction)
         {
-            return new ParameterSelectionDropDownList(parameterName, idSuffix, viewContextOrNull,
-                    loader, queryExpression, null, initialValueOrNull, onValueChangeAction);
+            return new ParameterSelectionField(parameterName, idSuffix, viewContextOrNull, loader,
+                    queryExpression, null, initialValueOrNull, onValueChangeAction);
         }
 
         /**
@@ -189,11 +189,11 @@ public class ParameterField extends TriggerField<ModelData> implements IParamete
                 List<ParameterValue> initialValues, String initialValueOrNull,
                 IDelegatedAction onValueChangeAction)
         {
-            return new ParameterSelectionDropDownList(parameterName, idSuffix, null, null, null,
+            return new ParameterSelectionField(parameterName, idSuffix, null, null, null,
                     initialValues, initialValueOrNull, onValueChangeAction);
         }
 
-        protected ParameterSelectionDropDownList(final String parameterName, String idSuffix,
+        protected ParameterSelectionField(final String parameterName, String idSuffix,
                 IViewContext<?> viewContextOrNull, IParameterValuesLoader loaderOrNull,
                 String queryExpressionOrNull, List<ParameterValue> valuesOrNull,
                 String initialValueOrNull, final IDelegatedAction onValueChangeAction)
@@ -271,8 +271,7 @@ public class ParameterField extends TriggerField<ModelData> implements IParamete
             GWTUtils.setSelectedItem(this, ModelDataPropertyNames.CODE, parameterValue);
         }
 
-        private class ListParameterValuesCallback extends
-                ParameterSelectionDropDownList.ListItemsCallback
+        private class ListParameterValuesCallback extends ParameterSelectionField.ListItemsCallback
         {
 
             protected ListParameterValuesCallback(IViewContext<?> viewContext)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/server/QueryClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/server/QueryClientService.java
index 040a4310b49..4dac8692e4a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/server/QueryClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/server/QueryClientService.java
@@ -118,7 +118,8 @@ public class QueryClientService extends AbstractClientService implements IQueryC
         {
             final String sessionToken = getSessionToken();
             final TableModel tableModel =
-                    queryServer.queryDatabase(sessionToken, database, sqlQuery, bindingsOrNull);
+                    queryServer.queryDatabase(sessionToken, database, sqlQuery, bindingsOrNull,
+                            false);
             return createTableModelReference(tableModel);
         } catch (final UserFailureException e)
         {
@@ -132,7 +133,7 @@ public class QueryClientService extends AbstractClientService implements IQueryC
         {
             final String sessionToken = getSessionToken();
             final TableModel tableModel =
-                    queryServer.queryDatabase(sessionToken, database, sqlQuery, null);
+                    queryServer.queryDatabase(sessionToken, database, sqlQuery, null, true);
             // TreeSet is used because we want distinct values and we want them to be sorted
             Set<ParameterValue> valuesSet = new TreeSet<ParameterValue>();
             boolean withDescription = tableModel.getHeader().size() > 1;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServer.java
index 236b8a3fe28..9746b81e8e2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServer.java
@@ -219,13 +219,19 @@ public class QueryServer extends AbstractServer<IQueryServer> implements IQueryS
     }
 
     public TableModel queryDatabase(String sessionToken, QueryDatabase database, String sqlQuery,
-            QueryParameterBindings bindings)
+            QueryParameterBindings bindings, boolean onlyPerform)
     {
         Session session = getSession(sessionToken);
         try
         {
             String dbKey = database.getKey();
-            QueryAccessController.checkWriteAccess(session, dbKey, "create and perform");
+            if (onlyPerform)
+            {
+                QueryAccessController.checkReadAccess(session, dbKey);
+            } else
+            {
+                QueryAccessController.checkWriteAccess(session, dbKey, "create and perform");
+            }
             return QueryAccessController.filterResults(session.tryGetPerson(), dbKey,
                     getDAOFactory(), queryDatabaseWithKey(dbKey, sqlQuery, bindings));
         } catch (DataAccessException ex)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServerLogger.java
index dad9344758b..272450d884d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServerLogger.java
@@ -93,10 +93,10 @@ class QueryServerLogger extends AbstractServerLogger implements IQueryServer
     }
 
     public TableModel queryDatabase(String sessionToken, QueryDatabase database, String sqlQuery,
-            QueryParameterBindings bindings)
+            QueryParameterBindings bindings, boolean onlyPerform)
     {
-        logAccess(sessionToken, "query_database", "DB(%s) SQL(%s) BINDINGS(%s)", database,
-                sqlQuery, bindings);
+        logAccess(sessionToken, "query_database", "DB(%s) SQL(%s) BINDINGS(%s) ACTION(%s)",
+                database, sqlQuery, bindings, onlyPerform ? "perform" : "create & perform");
         return null;
 
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/IQueryServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/IQueryServer.java
index eb62fa51740..824b08e5e72 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/IQueryServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/IQueryServer.java
@@ -57,7 +57,7 @@ public interface IQueryServer extends IServer
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public TableModel queryDatabase(String sessionToken, QueryDatabase database, String sqlQuery,
-            QueryParameterBindings bindings);
+            QueryParameterBindings bindings, boolean onlyPerform);
 
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/query/shared/IQueryServer.java.expected b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/query/shared/IQueryServer.java.expected
index 8d2a05e6ee5..f98d232bda1 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/query/shared/IQueryServer.java.expected
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/query/shared/IQueryServer.java.expected
@@ -57,7 +57,7 @@ public interface IQueryServer extends IServer
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public TableModel queryDatabase(String sessionToken, QueryDatabase database, String sqlQuery,
-            QueryParameterBindings bindings);
+            QueryParameterBindings bindings, boolean onlyPerform);
 
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-- 
GitLab