/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.security.decorators;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.isA;
import static org.easymock.classextension.EasyMock.createNiceMock;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import org.easymock.IAnswer;
import org.easymock.classextension.EasyMock;
import org.geoserver.catalog.Predicates;
import org.geoserver.security.CatalogMode;
import org.geoserver.security.CoverageAccessLimits;
import org.geoserver.security.WrapperPolicy;
import org.geoserver.security.impl.SecureObjectsTest;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.io.GridCoverage2DReader;
import org.geotools.coverage.grid.io.StructuredGridCoverage2DReader;
import org.geotools.filter.text.ecql.ECQL;
import org.geotools.gce.imagemosaic.ImageMosaicFormat;
import org.junit.Test;
import org.opengis.coverage.grid.Format;
import org.opengis.filter.Filter;
import org.opengis.parameter.GeneralParameterValue;
import org.opengis.parameter.ParameterValue;
public class SecuredGridCoverage2DReaderTest extends SecureObjectsTest {
@Test
public void testFilter() throws Exception {
final Filter securityFilter = ECQL.toFilter("A > 10");
final Filter requestFilter = ECQL.toFilter("B < 10");
// create the mocks we need
Format format = setupFormat();
GridCoverage2DReader reader = createNiceMock(GridCoverage2DReader.class);
expect(reader.getFormat()).andReturn(format).anyTimes();
setupReadAssertion(reader, requestFilter, securityFilter);
CoverageAccessLimits accessLimits = new CoverageAccessLimits(CatalogMode.HIDE, securityFilter, null, null);
SecuredGridCoverage2DReader secured = new SecuredGridCoverage2DReader(reader,
WrapperPolicy.readOnlyHide(accessLimits));
final ParameterValue pv = ImageMosaicFormat.FILTER.createValue();
pv.setValue(requestFilter);
secured.read(new GeneralParameterValue[] { pv });
}
@Test
public void testFilterOnStructured() throws Exception {
final Filter securityFilter = ECQL.toFilter("A > 10");
final Filter requestFilter = ECQL.toFilter("B < 10");
DefaultSecureDataFactory factory = new DefaultSecureDataFactory();
// create the mocks we need
Format format = setupFormat();
StructuredGridCoverage2DReader reader = createNiceMock(StructuredGridCoverage2DReader.class);
expect(reader.getFormat()).andReturn(format).anyTimes();
setupReadAssertion(reader, requestFilter, securityFilter);
CoverageAccessLimits accessLimits = new CoverageAccessLimits(CatalogMode.HIDE, securityFilter, null, null);
Object securedObject = factory.secure(reader, WrapperPolicy.readOnlyHide(accessLimits));
assertTrue(securedObject instanceof SecuredStructuredGridCoverage2DReader);
SecuredStructuredGridCoverage2DReader secured = (SecuredStructuredGridCoverage2DReader) securedObject;
final ParameterValue pv = ImageMosaicFormat.FILTER.createValue();
pv.setValue(requestFilter);
secured.read(new GeneralParameterValue[] { pv });
}
private static void setupReadAssertion(GridCoverage2DReader reader,
final Filter requestFilter, final Filter securityFilter) throws IOException {
// the assertion
expect(reader.read(isA(GeneralParameterValue[].class))).andAnswer(
new IAnswer<GridCoverage2D>() {
@Override
public GridCoverage2D answer() throws Throwable {
GeneralParameterValue[] params = (GeneralParameterValue[]) EasyMock
.getCurrentArguments()[0];
ParameterValue param = (ParameterValue) params[0];
Filter filter = (Filter) param.getValue();
assertEquals(Predicates.and(requestFilter, securityFilter), filter);
return null;
}
});
EasyMock.replay(reader);
}
private Format setupFormat() {
Format format = createNiceMock(Format.class);
expect(format.getReadParameters()).andReturn(new ImageMosaicFormat().getReadParameters())
.anyTimes();
EasyMock.replay(format);
return format;
}
}