From aaed3bb297b5edda94e71a8d3a13f3c2ca8f18f4 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Mon, 22 Oct 2012 12:39:33 +0000
Subject: [PATCH] SP-328, BIS-227:
 DataSetProcessingContext.getHierarchicalContentProvider() returns a proxy
 which checks authorization for the non-deprecated methods.

SVN: 27292
---
 .../shared/DataSetProcessingContext.java      | 81 ++++++++++++++++++-
 1 file changed, 79 insertions(+), 2 deletions(-)

diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/DataSetProcessingContext.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/DataSetProcessingContext.java
index d2b2d14fced..5d98370f194 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/DataSetProcessingContext.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/DataSetProcessingContext.java
@@ -16,11 +16,19 @@
 
 package ch.systemsx.cisd.openbis.dss.generic.shared;
 
+import java.io.File;
 import java.util.Map;
 
+import org.apache.log4j.Logger;
+
+import ch.systemsx.cisd.common.io.hierarchical_content.api.IHierarchicalContent;
+import ch.systemsx.cisd.common.logging.LogCategory;
+import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.common.mail.IMailClient;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IProcessingPluginTask;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.ISessionWorkspaceProvider;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 
 /**
  * Context for processing data sets by a {@link IProcessingPluginTask}.
@@ -29,6 +37,9 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.ISessionWorks
  */
 public class DataSetProcessingContext
 {
+    final static Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION,
+            DataSetProcessingContext.class);
+    
     private final Map<String, String> parameterBindings;
 
     private final IMailClient mailClient;
@@ -45,15 +56,18 @@ public class DataSetProcessingContext
 
     private final String userId;
 
+    private final IEncapsulatedOpenBISService service;
+
     /**
      * Creates an instance for specified directory provider, parameter bindings, e-mail client, and
      * optional user e-mail address and sessionToken.
      */
+    // This method is only used in tests.
     public DataSetProcessingContext(IHierarchicalContentProvider contentProvider,
             IDataSetDirectoryProvider directoryProvider, Map<String, String> parameterBindings,
             IMailClient mailClient, String userId, String userEmailOrNull)
     {
-        this(contentProvider, directoryProvider, parameterBindings, mailClient, userId,
+        this(null, contentProvider, directoryProvider, null, parameterBindings, mailClient, userId,
                 userEmailOrNull, null);
     }
 
@@ -79,6 +93,23 @@ public class DataSetProcessingContext
             Map<String, String> parameterBindings, IMailClient mailClient, String userId,
             String userEmailOrNull, String sessionTokenOrNull)
     {
+        this(ServiceProvider.getOpenBISService(), contentProvider, directoryProvider,
+                sessionWorkspaceProviderOrNull, parameterBindings, mailClient, userId,
+                userEmailOrNull, sessionTokenOrNull);
+    }
+
+    /**
+     * Creates an instance for specified service, directory provider, workspace provider, parameter
+     * bindings, e-mail client, and optional user e-mail address and sessionToken.
+     */
+    public DataSetProcessingContext(IEncapsulatedOpenBISService service,
+            IHierarchicalContentProvider contentProvider,
+            IDataSetDirectoryProvider directoryProvider,
+            ISessionWorkspaceProvider sessionWorkspaceProviderOrNull,
+            Map<String, String> parameterBindings, IMailClient mailClient, String userId,
+            String userEmailOrNull, String sessionTokenOrNull)
+    {
+        this.service = service;
         this.hierarchicalContentProvider = contentProvider;
         this.directoryProvider = directoryProvider;
         this.parameterBindings = parameterBindings;
@@ -130,6 +161,52 @@ public class DataSetProcessingContext
 
     public IHierarchicalContentProvider getHierarchicalContentProvider()
     {
-        return hierarchicalContentProvider;
+        return new IHierarchicalContentProvider()
+            {
+
+                @Override
+                public IHierarchicalContent asContent(ExternalData dataSet)
+                {
+                    assertAuthorization(dataSet.getCode());
+                    return hierarchicalContentProvider.asContent(dataSet);
+                }
+
+                @Override
+                public IHierarchicalContent asContent(String dataSetCode)
+                        throws IllegalArgumentException
+                {
+                    assertAuthorization(dataSetCode);
+                    return hierarchicalContentProvider.asContent(dataSetCode);
+                }
+
+                @SuppressWarnings("deprecation")
+                @Override
+                public IHierarchicalContent asContent(File datasetDirectory)
+                {
+                    return hierarchicalContentProvider.asContent(datasetDirectory);
+                }
+
+                @SuppressWarnings("deprecation")
+                @Override
+                public IHierarchicalContent asContent(IDatasetLocation datasetLocation)
+                {
+                    return hierarchicalContentProvider.asContent(datasetLocation);
+                }
+            };
+    }
+    
+    private void assertAuthorization(String dataSetCode)
+    {
+        if (sessionTokenOrNull == null)
+        {
+            operationLog.warn("Undefined user session token. Skip authorization check for data set " + dataSetCode + ".");
+            return;
+        }
+        if (service == null)
+        {
+            operationLog.warn("Undefined service. Skip authorization check for data set " + dataSetCode + ".");
+            return;
+        }
+        service.checkDataSetAccess(sessionTokenOrNull, dataSetCode);
     }
 }
-- 
GitLab