/* (c) 2016 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.csw.store.internal; import static org.junit.Assert.*; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Logger; import javax.xml.namespace.QName; import org.custommonkey.xmlunit.XMLUnit; import org.custommonkey.xmlunit.XpathEngine; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.ResourceInfo; import org.geoserver.csw.CSWTestSupport; import org.geoserver.data.test.MockData; import org.geoserver.data.test.SystemTestData; import org.geoserver.data.test.SystemTestData.LayerProperty; import org.geoserver.security.CatalogMode; import org.geoserver.security.DataAccessLimits; import org.geoserver.security.GeoServerRoleStore; import org.geoserver.security.GeoServerUserGroupStore; import org.geoserver.security.ResourceAccessManager; import org.geoserver.security.TestResourceAccessManager; import org.geoserver.security.impl.AbstractUserGroupService; import org.geoserver.security.impl.GeoServerRole; import org.geotools.util.logging.Logging; import org.junit.Before; import org.junit.Test; import org.opengis.filter.Filter; import org.w3c.dom.Document; /** * Performs integration tests using a mock {@link ResourceAccessManager} * * @author Andrea Aime - GeoSolutions */ public class ResourceAccessManagerCSWTest extends CSWTestSupport { static final Logger LOGGER = Logging.getLogger(ResourceAccessManagerCSWTest.class); XpathEngine xpath; @Before public void setupXpath() { this.xpath = XMLUnit.newXpathEngine(); } /** * Add the test resource access manager in the spring context */ @Override protected void setUpSpring(List<String> springContextLocations) { super.setUpSpring(springContextLocations); springContextLocations.add( "classpath:/org/geoserver/csw/store/internal/ResourceAccessManagerContext.xml"); } @Override protected void onSetUp(SystemTestData testData) throws Exception { super.onSetUp(testData); testData.addStyle("raster", "raster.sld", SystemTestData.class, getCatalog()); Map properties = new HashMap(); properties.put(LayerProperty.STYLE, "raster"); testData.addRasterLayer(new QName(MockData.SF_URI, "mosaic", MockData.SF_PREFIX), "raster-filter-test.zip", null, properties, SystemTestData.class, getCatalog()); GeoServerUserGroupStore ugStore = getSecurityManager() .loadUserGroupService(AbstractUserGroupService.DEFAULT_NAME).createStore(); ugStore.addUser(ugStore.createUserObject("cite", "cite", true)); ugStore.addUser(ugStore.createUserObject("citeChallenge", "citeChallenge", true)); ugStore.store(); GeoServerRoleStore roleStore = getSecurityManager().getActiveRoleService().createStore(); GeoServerRole role = roleStore.createRoleObject("ROLE_DUMMY"); roleStore.addRole(role); roleStore.associateRoleToUser(role, "cite"); roleStore.store(); // populate the access manager Catalog catalog = getCatalog(); TestResourceAccessManager tam = (TestResourceAccessManager) applicationContext .getBean("testResourceAccessManager"); // setup hide mode, we should not see the records for (ResourceInfo ri : catalog.getResources(ResourceInfo.class)) { if (!"cite".equals(ri.getStore().getWorkspace().getName())) { tam.putLimits("cite", ri, new DataAccessLimits(CatalogMode.HIDE, Filter.EXCLUDE)); } } // setup challenge mode, the metadata should be visible anyways for (ResourceInfo ri : catalog.getResources(ResourceInfo.class)) { if (!"cite".equals(ri.getStore().getWorkspace().getName())) { tam.putLimits("citeChallenge", ri, new DataAccessLimits(CatalogMode.CHALLENGE, Filter.EXCLUDE)); } } } @Test public void testAllRecordsCite() throws Exception { authenticate("cite", "cite"); String request = "csw?service=CSW&version=2.0.2&request=GetRecords&typeNames=csw:Record&resultType=results&maxRecords=100"; Document d = getAsDOM(request); // print(d); // expected number List<ResourceInfo> citeResources = getCatalog().getResourcesByNamespace(MockData.CITE_URI, ResourceInfo.class); assertEquals(citeResources.size(), xpath.getMatchingNodes("//csw:SummaryRecord", d).getLength()); // check they indeed all start by cite: for (ResourceInfo ri : citeResources) { assertEquals(1, xpath.getMatchingNodes( String.format("//csw:SummaryRecord[dc:identifier='%s']", ri.prefixedName()), d) .getLength()); } } @Test public void testAllRecordsCiteChallenge() throws Exception { // grab before auth to get the full list List<ResourceInfo> citeResources = getCatalog().getResources(ResourceInfo.class); // authenticate authenticate("citeChallenge", "citeChallenge"); String request = "csw?service=CSW&version=2.0.2&request=GetRecords&typeNames=csw:Record&resultType=results&maxRecords=100"; Document d = getAsDOM(request); // print(d); // expected number assertEquals(citeResources.size(), xpath.getMatchingNodes("//csw:SummaryRecord", d).getLength()); // check they indeed all start by cite: for (ResourceInfo ri : citeResources) { assertEquals(1, xpath.getMatchingNodes( String.format("//csw:SummaryRecord[dc:identifier='%s']", ri.prefixedName()), d) .getLength()); } } protected void authenticate(String username, String password) { login(username, password, "MOCKROLE"); } }