/* (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.rest.catalog; import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo; import static org.custommonkey.xmlunit.XMLAssert.assertXpathNotExists; import static org.junit.Assert.*; import java.util.Collections; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.LayerGroupInfo; import org.geoserver.catalog.StyleInfo; import org.geoserver.data.test.SystemTestData; import org.geoserver.rest.RestBaseController; import org.geoserver.security.AccessMode; import org.geoserver.security.AdminRequest; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.referencing.CRS; import org.junit.After; import org.junit.Test; import org.springframework.mock.web.MockHttpServletResponse; import org.w3c.dom.Document; public class AdminRequestTest extends CatalogRESTTestSupport { @Override protected void onSetUp(SystemTestData testData) throws Exception { super.onSetUp(testData); LayerGroupInfo lg = catalog.getFactory().createLayerGroup(); lg.setName( "global" ); lg.getLayers().add( catalog.getLayerByName( "sf:PrimitiveGeoFeature" ) ); lg.getLayers().add( catalog.getLayerByName( "sf:AggregateGeoFeature" ) ); lg.getStyles().add( catalog.getStyleByName( StyleInfo.DEFAULT_POINT ) ); lg.getStyles().add( catalog.getStyleByName( StyleInfo.DEFAULT_POINT ) ); lg.setBounds( new ReferencedEnvelope( -180,-90,180,90, CRS.decode( "EPSG:4326") ) ); catalog.add( lg ); lg = catalog.getFactory().createLayerGroup(); lg.setName( "local" ); lg.setWorkspace(catalog.getWorkspaceByName("sf")); lg.getLayers().add( catalog.getLayerByName( "sf:PrimitiveGeoFeature" ) ); lg.getLayers().add( catalog.getLayerByName( "sf:AggregateGeoFeature" ) ); lg.getStyles().add( catalog.getStyleByName( StyleInfo.DEFAULT_POINT ) ); lg.getStyles().add( catalog.getStyleByName( StyleInfo.DEFAULT_POINT ) ); lg.setBounds( new ReferencedEnvelope( -180,-90,180,90, CRS.decode( "EPSG:4326") ) ); catalog.add( lg ); Catalog cat = getCatalog(); //add two workspace specific styles StyleInfo s = cat.getFactory().createStyle(); s.setName("sf_style"); s.setWorkspace(cat.getWorkspaceByName("sf")); s.setFilename("sf.sld"); cat.add(s); s = cat.getFactory().createStyle(); s.setName("cite_style"); s.setWorkspace(cat.getWorkspaceByName("cite")); s.setFilename("cite.sld"); cat.add(s); addUser("cite", "cite", null, Collections.singletonList("ROLE_CITE_ADMIN")); addUser("sf", "sf", null, Collections.singletonList("ROLE_SF_ADMIN")); addLayerAccessRule("*", "*", AccessMode.ADMIN, "ROLE_ADMINISTRATOR"); addLayerAccessRule("cite", "*", AccessMode.ADMIN, "ROLE_CITE_ADMIN"); addLayerAccessRule("sf", "*", AccessMode.ADMIN, "ROLE_SF_ADMIN"); } @After public void clearAdminRequest() { AdminRequest.finish(); } @Override public void login() throws Exception { //skip the login by default } void loginAsCite() { login("cite", "cite","ROLE_CITE_ADMIN"); } void loginAsSf() { login("sf", "sf","ROLE_SF_ADMIN"); } @Test public void testWorkspaces() throws Exception { assertEquals(200, getAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces.xml").getStatus()); Document dom = getAsDOM(RestBaseController.ROOT_PATH + "/workspaces.xml"); assertEquals(0, dom.getElementsByTagName("workspace").getLength()); super.login(); dom = getAsDOM(RestBaseController.ROOT_PATH + "/workspaces.xml"); assertEquals(getCatalog().getWorkspaces().size(), dom.getElementsByTagName("workspace").getLength()); loginAsCite(); assertEquals(200, getAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces.xml").getStatus()); dom = getAsDOM(RestBaseController.ROOT_PATH + "/workspaces.xml"); assertEquals(1, dom.getElementsByTagName("workspace").getLength()); } @Test public void testWorkspace() throws Exception { assertEquals(404, getAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/sf.xml").getStatus()); assertEquals(404, getAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/cite.xml").getStatus()); loginAsCite(); assertEquals(404, getAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/sf.xml").getStatus()); assertEquals(200, getAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/cite.xml").getStatus()); } @Test public void testGlobalLayerGroupReadOnly() throws Exception { loginAsSf(); Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/layergroups.xml"); assertEquals( 1, dom.getElementsByTagName( "layerGroup").getLength()); assertXpathEvaluatesTo("global", "//layerGroup/name", dom); dom = getAsDOM( RestBaseController.ROOT_PATH + "/layergroups/global.xml"); assertEquals( "layerGroup", dom.getDocumentElement().getNodeName()); String xml = "<layerGroup>" + "<styles>" + "<style>polygon</style>" + "<style>line</style>" + "</styles>" + "</layerGroup>"; MockHttpServletResponse response = putAsServletResponse(RestBaseController.ROOT_PATH + "/layergroups/global", xml, "text/xml" ); assertEquals(405, response.getStatus()); xml = "<layerGroup>" + "<name>newLayerGroup</name>" + "<layers>" + "<layer>Ponds</layer>" + "<layer>Forests</layer>" + "</layers>" + "<styles>" + "<style>polygon</style>" + "<style>point</style>" + "</styles>" + "</layerGroup>"; response = postAsServletResponse(RestBaseController.ROOT_PATH + "/layergroups", xml, "text/xml" ); assertEquals(405, response.getStatus()); } @Test public void testLocalLayerGroupHidden() throws Exception { loginAsSf(); Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/layergroups.xml"); print(dom); assertEquals( 1, dom.getElementsByTagName( "layerGroup").getLength()); assertXpathEvaluatesTo("global", "//layerGroup/name", dom); MockHttpServletResponse response = getAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/cite/layergroups.xml"); assertEquals(404, response.getStatus()); response = getAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/cite/layergroups.xml"); assertEquals(404, response.getStatus()); dom = getAsDOM( RestBaseController.ROOT_PATH + "/layergroups.xml"); assertEquals( 1, dom.getElementsByTagName( "layerGroup").getLength()); assertXpathEvaluatesTo("global", "//layerGroup/name", dom); dom = getAsDOM( RestBaseController.ROOT_PATH + "/workspaces/sf/layergroups.xml"); assertEquals( 1, dom.getElementsByTagName( "layerGroup").getLength()); assertXpathEvaluatesTo("local", "//layerGroup/name", dom); } @Test public void testGlobalStyleReadOnly() throws Exception { loginAsSf(); Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/styles.xml"); assertXpathNotExists("//style/name[text() = 'sf_style']", dom); assertXpathNotExists("//style/name[text() = 'cite_style']", dom); dom = getAsDOM( RestBaseController.ROOT_PATH + "/styles/point.xml"); assertEquals( "style", dom.getDocumentElement().getNodeName()); String xml = "<style>" + "<filename>foo.sld</filename>" + "</style>"; MockHttpServletResponse response = putAsServletResponse(RestBaseController.ROOT_PATH + "/styles/point", xml, "text/xml" ); assertEquals(405, response.getStatus()); xml = "<style>" + "<name>foo</name>" + "<filename>foo.sld</filename>" + "</style>"; response = postAsServletResponse(RestBaseController.ROOT_PATH + "/styles", xml, "text/xml" ); assertEquals(405, response.getStatus()); } @Test public void testLocalStyleHidden() throws Exception { loginAsCite(); Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/styles.xml"); assertXpathNotExists("//style/name[text() = 'cite_style']", dom); assertXpathNotExists("//style/name[text() = 'sf_style']", dom); MockHttpServletResponse response = getAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/sf/styles.xml"); assertEquals(404, response.getStatus()); loginAsSf(); dom = getAsDOM( RestBaseController.ROOT_PATH + "/styles.xml"); assertXpathNotExists("//style/name[text() = 'cite_style']", dom); assertXpathNotExists("//style/name[text() = 'sf_style']", dom); dom = getAsDOM( RestBaseController.ROOT_PATH + "/workspaces/sf/styles.xml"); assertEquals( 1, dom.getElementsByTagName( "style").getLength()); assertXpathEvaluatesTo("sf_style", "//style/name", dom); } }