diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/AbstractDssServiceRpc.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/AbstractDssServiceRpc.java index 88a486953fafb855bef8fe1514cf8c52405471bb..aa43628d42e3ed1aaa7ff5816d6a4c9dbc5779a8 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/AbstractDssServiceRpc.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/AbstractDssServiceRpc.java @@ -169,48 +169,6 @@ public abstract class AbstractDssServiceRpc<T> extends AbstractServiceWithLogger return access; } - /** - * Asserts that specified data sets are all accessible by the user of the specified session. - */ - protected void checkDatasetsAuthorization(String sessionToken, Set<String> dataSetCodes) - { - if (isSessionAuthorizedForDatasets(sessionToken, dataSetCodes) == false) - { - throw new IllegalArgumentException( - "User is not allowed to access at least one of the following data sets: " - + dataSetCodes); - } - } - - /** - * Check with openBIS and return a collection of the data sets the user with the given - * sessionToken is allowed to access. - * - * @param sessionToken The session token for the user. - * @param dataSetCodes The data set codes we want to check access for. - * @return True if all the data sets are accessible, false if one or more are not accessible. - */ - protected boolean isSessionAuthorizedForDatasets(String sessionToken, Set<String> dataSetCodes) - { - boolean access; - if (operationLog.isInfoEnabled()) - { - operationLog.info(String.format( - "Check access to the data sets '%s' on openBIS server.", dataSetCodes)); - } - - try - { - openBISService.checkDataSetCollectionAccess(sessionToken, new ArrayList<String>(dataSetCodes)); - access = true; - } catch (UserFailureException ex) - { - access = false; - } - - return access; - } - protected File getRootDirectory(String datasetCode) { List<ExternalData> list = getOpenBISService().listDataSetsByCode(Arrays.asList(datasetCode)); @@ -245,14 +203,9 @@ public abstract class AbstractDssServiceRpc<T> extends AbstractServiceWithLogger /** * Return a map keyed by data set code with value root directory for that data set. */ - protected Map<String, File> checkAccessAndGetRootDirectories(String sessionToken, + protected Map<String, File> getRootDirectories(String sessionToken, Set<String> dataSetCodes) throws IllegalArgumentException { - if (isSessionAuthorizedForDatasets(sessionToken, dataSetCodes) == false) - { - throw new IllegalArgumentException("Path does not exist."); - } - HashMap<String, File> rootDirectories = new HashMap<String, File>(); List<ExternalData> dataSets = openBISService.listDataSetsByCode(new ArrayList<String>(dataSetCodes)); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerLogger.java index d30d2edb3b6fd841afcff75c12ba88fa14bee965..1ee8d178c7eebf67db4444c07531609264b9e2ca 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerLogger.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerLogger.java @@ -113,7 +113,7 @@ public abstract class AbstractServerLogger implements IServer if (sessionManagerOrNull == null || sessionManagerOrNull.isAWellFormedSessionToken(sessionToken) == false) { - return null; + return "[SESSION:" + sessionToken + "]"; } try { @@ -122,7 +122,7 @@ public abstract class AbstractServerLogger implements IServer } catch (InvalidSessionException e) { // ignore the situation when session is not available - return null; + return "[NO SESSION]"; } } diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java index dae229d8667501f5502b49d00908b9292ed04a10..80a853c2622d0a4961f24beab05ce664bc28db75 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java @@ -24,7 +24,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -56,7 +55,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.Size; import ch.systemsx.cisd.openbis.dss.generic.shared.utils.CodeAndLabelUtil; import ch.systemsx.cisd.openbis.dss.generic.shared.utils.ImageUtil; -import ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreeningInternal; +import ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreening; import ch.systemsx.cisd.openbis.dss.shared.DssScreeningUtils; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; @@ -94,8 +93,8 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.Trans * * @author Tomasz Pylak */ -public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpcScreeningInternal> - implements IDssServiceRpcScreeningInternal +public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpcScreening> + implements IDssServiceRpcScreening { /** @@ -158,7 +157,7 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc return listAvailableFeatureCodes(sessionToken, featureDatasets); } - public IDssServiceRpcScreeningInternal createLogger(IInvocationLoggerContext context) + public IDssServiceRpcScreening createLogger(IInvocationLoggerContext context) { return new DssServiceRpcScreeningLogger(context); } @@ -166,7 +165,6 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc public List<String> listAvailableFeatureCodes(String sessionToken, List<? extends IFeatureVectorDatasetIdentifier> featureDatasets) { - checkDatasetsAuthorizationForIDatasetIdentifier(sessionToken, featureDatasets); List<String> result = new ArrayList<String>(); // keep the order for (IFeatureVectorDatasetIdentifier identifier : featureDatasets) { @@ -187,14 +185,12 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc public List<ImageDatasetMetadata> listImageMetadata(String sessionToken, List<? extends IImageDatasetIdentifier> imageDatasets) { - checkDatasetsAuthorizationForIDatasetIdentifier(sessionToken, imageDatasets); Set<String> datasetCodes = new HashSet<String>(); for (IImageDatasetIdentifier dataset : imageDatasets) { datasetCodes.add(dataset.getDatasetCode()); } - Map<String, File> datasetRoots = - checkAccessAndGetRootDirectories(sessionToken, datasetCodes); + Map<String, File> datasetRoots = getRootDirectories(sessionToken, datasetCodes); List<ImageDatasetMetadata> result = new ArrayList<ImageDatasetMetadata>(); for (IImageDatasetIdentifier dataset : imageDatasets) { @@ -317,7 +313,6 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc public List<FeatureVectorDataset> loadFeatures(String sessionToken, List<FeatureVectorDatasetReference> featureDatasets, List<String> featureNames) { - checkDatasetsAuthorizationForIDatasetIdentifier(sessionToken, featureDatasets); List<String> codes = normalize(featureNames); List<FeatureVectorDataset> result = new ArrayList<FeatureVectorDataset>(); for (FeatureVectorDatasetReference dataset : featureDatasets) @@ -383,7 +378,6 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc String sessionToken, List<FeatureVectorDatasetWellReference> datasetWellReferences, List<String> featureNames) { - checkDatasetsAuthorizationForIDatasetIdentifier(sessionToken, datasetWellReferences); WellFeatureCollection<FeatureTableRow> features = FeatureVectorLoader.fetchWellFeatures(datasetWellReferences, featureNames, dao, createMetadataProvider()); @@ -438,7 +432,6 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc private InputStream loadImages(String sessionToken, List<PlateImageReference> imageReferences, final Size sizeOrNull, final boolean convertToPng) { - checkDatasetsAuthorizationForIDatasetIdentifier(sessionToken, imageReferences); final Map<String, IImagingDatasetLoader> imageLoadersMap = getImageDatasetsMap(sessionToken, imageReferences); return loadImages(imageReferences, sizeOrNull, convertToPng, imageLoadersMap); @@ -1022,17 +1015,6 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc return getDAO().listFeatureDefsByDataSetId(dataSet.getId()); } - public void checkDatasetsAuthorizationForIDatasetIdentifier(String sessionToken, - List<? extends IDatasetIdentifier> identifiers) - { - Set<String> dataSetCodes = new LinkedHashSet<String>(); - for (IDatasetIdentifier identifier : identifiers) - { - dataSetCodes.add(identifier.getDatasetCode()); - } - checkDatasetsAuthorization(sessionToken, dataSetCodes); - } - private IImagingReadonlyQueryDAO getDAO() { synchronized (this) diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningLogger.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningLogger.java index 9f52eebfca32741cdc5b6fae2ac423644eddc21a..e5f6a474cfbfbc6975cde0a231b7e3f0c70ab433 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningLogger.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningLogger.java @@ -21,7 +21,7 @@ import java.util.List; import ch.systemsx.cisd.base.image.IImageTransformerFactory; import ch.systemsx.cisd.common.spring.IInvocationLoggerContext; -import ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreeningInternal; +import ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreening; import ch.systemsx.cisd.openbis.generic.shared.AbstractServerLogger; import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.FeatureVectorDataset; import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.FeatureVectorDatasetReference; @@ -40,7 +40,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.WellPosition; * @author Franz-Josef Elmer */ public class DssServiceRpcScreeningLogger extends AbstractServerLogger implements - IDssServiceRpcScreeningInternal + IDssServiceRpcScreening { DssServiceRpcScreeningLogger(IInvocationLoggerContext context) diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/v1/DatasetIdentifierPredicate.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/v1/DatasetIdentifierPredicate.java index 7f9735d21813c8946c7b82e3d2b04234427a01b3..f739a2afb3550d910c0853932852e4e6acb0868c 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/v1/DatasetIdentifierPredicate.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/v1/DatasetIdentifierPredicate.java @@ -16,10 +16,17 @@ package ch.systemsx.cisd.openbis.dss.screening.shared.api.v1; +import java.util.ArrayList; import java.util.List; +import org.apache.log4j.Logger; + import ch.systemsx.cisd.common.exceptions.Status; import ch.systemsx.cisd.common.exceptions.UserFailureException; +import ch.systemsx.cisd.common.logging.LogCategory; +import ch.systemsx.cisd.common.logging.LogFactory; +import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; +import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; import ch.systemsx.cisd.openbis.dss.generic.shared.api.authorization.IAuthorizationGuardPredicate; import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.IDatasetIdentifier; @@ -30,21 +37,41 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.IDatasetIdent */ public class DatasetIdentifierPredicate implements - IAuthorizationGuardPredicate<IDssServiceRpcScreeningInternal, List<? extends IDatasetIdentifier>> + IAuthorizationGuardPredicate<IDssServiceRpcScreening, List<? extends IDatasetIdentifier>> { - public Status evaluate(IDssServiceRpcScreeningInternal receiver, String sessionToken, + static protected final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, + DatasetIdentifierPredicate.class); + + public Status evaluate(IDssServiceRpcScreening receiver, String sessionToken, List<? extends IDatasetIdentifier> datasetIdentifiers) throws UserFailureException { + final IEncapsulatedOpenBISService openBISService = ServiceProvider.getOpenBISService(); + if (operationLog.isInfoEnabled()) + { + operationLog.info(String.format( + "Check access to the data sets '%s' on openBIS server.", datasetIdentifiers)); + } + try { - receiver.checkDatasetsAuthorizationForIDatasetIdentifier(sessionToken, - datasetIdentifiers); - } catch (IllegalArgumentException e) + openBISService.checkDataSetCollectionAccess(sessionToken, + getDatasetCodes(datasetIdentifiers)); + return Status.OK; + } catch (UserFailureException ex) + { + return Status.createError(ex.getMessage()); + } + } + + private List<String> getDatasetCodes(List<? extends IDatasetIdentifier> datasetIdentifiers) + { + final List<String> result = new ArrayList<String>(); + for (IDatasetIdentifier id : datasetIdentifiers) { - return Status.createError(e.getMessage()); + result.add(id.getDatasetCode()); } - return Status.OK; + return result; } } diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/v1/IDssServiceRpcScreeningInternal.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/v1/IDssServiceRpcScreeningInternal.java deleted file mode 100644 index 69af43ebdada394e66bc6eb998c459a6dc498fb7..0000000000000000000000000000000000000000 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/v1/IDssServiceRpcScreeningInternal.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.dss.screening.shared.api.v1; - -import java.util.List; - -import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.IDatasetIdentifier; - -/** - * Interface containing internal methods for the screening RPC interface. - * - * @author Chandrasekhar Ramakrishnan - */ -public interface IDssServiceRpcScreeningInternal extends IDssServiceRpcScreening -{ - void checkDatasetsAuthorizationForIDatasetIdentifier(String sessionToken, - List<? extends IDatasetIdentifier> featureDatasets); -} diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/v1/SingleDataSetIdentifierPredicate.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/v1/SingleDataSetIdentifierPredicate.java index cf1eb8807475e0986d4e37e23ad707f8b278190f..44fc0f5633c1c70354c5fef655cb561f3b85265b 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/v1/SingleDataSetIdentifierPredicate.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/v1/SingleDataSetIdentifierPredicate.java @@ -24,17 +24,17 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.api.authorization.IAuthorizat import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.IDatasetIdentifier; /** - * + * A predicate for testing a single data set identifier. * * @author Franz-Josef Elmer */ public class SingleDataSetIdentifierPredicate implements - IAuthorizationGuardPredicate<IDssServiceRpcScreeningInternal, IDatasetIdentifier> + IAuthorizationGuardPredicate<IDssServiceRpcScreening, IDatasetIdentifier> { private static final DatasetIdentifierPredicate PREDICATE = new DatasetIdentifierPredicate(); - public Status evaluate(IDssServiceRpcScreeningInternal receiver, String sessionToken, + public Status evaluate(IDssServiceRpcScreening receiver, String sessionToken, IDatasetIdentifier datasetIdentifier) throws UserFailureException { return PREDICATE.evaluate(receiver, sessionToken, diff --git a/screening/source/java/screening-dssApplicationContext.xml b/screening/source/java/screening-dssApplicationContext.xml index 80d65a713cd55410816a31f7f8664194dfbdbb98..9cea2888f2a34282dda0c32428d1ce4a9b3134a3 100644 --- a/screening/source/java/screening-dssApplicationContext.xml +++ b/screening/source/java/screening-dssApplicationContext.xml @@ -28,12 +28,13 @@ <bean class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <list> - <value>ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreeningInternal</value> + <value>ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreening</value> </list> </property> <property name="interceptorNames"> <list> <value>screening-rpc-authorization-advisor</value> + <value>screening-rpc-log-advisor</value> </list> </property> <property name="target"> @@ -46,12 +47,6 @@ <property name="serviceInterface" value="ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreening" /> </bean> - <!-- - // This discovers on-the-fly all <code>org.springframework.aop.Advisor</code> implementations. - --> - <bean id="bean-post-processor" - class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" /> - <!-- // Authorization --> @@ -62,5 +57,5 @@ // Logging --> - <bean class="ch.systemsx.cisd.common.spring.LogAdvisor" /> + <bean id="screening-rpc-log-advisor" class="ch.systemsx.cisd.common.spring.LogAdvisor" /> </beans> \ No newline at end of file diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningTest.java index bb39918913968259de35d2feb791591f5b0a4581..93d4b5826725bf9a4b36709fe1751bd50843c3ca 100644 --- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningTest.java +++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningTest.java @@ -55,7 +55,7 @@ import ch.systemsx.cisd.openbis.dss.generic.server.images.dto.RequestedImageSize import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.Size; import ch.systemsx.cisd.openbis.dss.generic.shared.utils.ImageUtil; -import ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreeningInternal; +import ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreening; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; @@ -247,7 +247,7 @@ public class DssServiceRpcScreeningTest extends AssertJUnit }); TestMethodInterceptor interceptor = new TestMethodInterceptor(); - IDssServiceRpcScreeningInternal serviceInternal = getAdvisedService(interceptor); + IDssServiceRpcScreening serviceInternal = getAdvisedService(interceptor); List<String> names = serviceInternal.listAvailableFeatureCodes(SESSION_TOKEN, Arrays.asList( @@ -640,13 +640,13 @@ public class DssServiceRpcScreeningTest extends AssertJUnit } } - private IDssServiceRpcScreeningInternal getAdvisedService( + private IDssServiceRpcScreening getAdvisedService( TestMethodInterceptor testMethodInterceptor) { ProxyFactory pf = new ProxyFactory(); pf.addAdvisor(new DssServiceRpcAuthorizationAdvisor(testMethodInterceptor)); pf.setTarget(screeningService); - pf.addInterface(IDssServiceRpcScreeningInternal.class); - return (IDssServiceRpcScreeningInternal) pf.getProxy(); + pf.addInterface(IDssServiceRpcScreening.class); + return (IDssServiceRpcScreening) pf.getProxy(); } }