/* (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.web.admin; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.Arrays; import java.util.Iterator; import org.apache.wicket.core.request.handler.RenderPageRequestHandler; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.CatalogBuilder; import org.geoserver.catalog.LayerGroupInfo; import org.geoserver.catalog.ResourceInfo; import org.geoserver.catalog.StoreInfo; import org.geoserver.catalog.WorkspaceInfo; import org.geoserver.data.test.MockData; import org.geoserver.data.test.SystemTestData; import org.geoserver.security.AdminRequest; import org.geoserver.web.GeoServerWicketTestSupport; import org.geoserver.web.UnauthorizedPage; import org.geoserver.web.data.layer.LayerPage; import org.geoserver.web.data.layer.NewFeatureTypePage; import org.geoserver.web.data.layer.SQLViewNewPage; import org.geoserver.web.data.layergroup.LayerGroupEditPage; import org.geoserver.web.data.layergroup.LayerGroupPage; import org.geoserver.web.data.store.DataAccessEditPage; import org.geoserver.web.data.store.DataAccessNewPage; import org.geoserver.web.data.store.StorePage; import org.geoserver.web.data.workspace.WorkspaceEditPage; import org.geoserver.web.data.workspace.WorkspaceNewPage; import org.geoserver.web.data.workspace.WorkspacePage; import org.geotools.data.property.PropertyDataStoreFactory; import org.junit.After; import org.junit.Test; public abstract class AbstractAdminPrivilegeTest extends GeoServerWicketTestSupport { @Override protected void onSetUp(SystemTestData testData) throws Exception { super.onSetUp(testData); addUser("cite", "cite", null, Arrays.asList("ROLE_CITE_ADMIN")); addUser("sf", "sf", null, Arrays.asList("ROLE_SF_ADMIN")); setupAccessRules(); Catalog cat = getCatalog(); //add two workspace local layer group LayerGroupInfo lg = cat.getFactory().createLayerGroup(); lg.setName("cite_local"); lg.setWorkspace(cat.getWorkspaceByName("cite")); lg.getLayers().add(cat.getLayerByName(getLayerId(MockData.LAKES))); lg.getLayers().add(cat.getLayerByName(getLayerId(MockData.FORESTS))); new CatalogBuilder(cat).calculateLayerGroupBounds(lg); cat.add(lg); lg = cat.getFactory().createLayerGroup(); lg.setName("sf_local"); lg.setWorkspace(cat.getWorkspaceByName("sf")); lg.getLayers().add(cat.getLayerByName(getLayerId(MockData.PRIMITIVEGEOFEATURE))); lg.getLayers().add(cat.getLayerByName(getLayerId(MockData.AGGREGATEGEOFEATURE))); new CatalogBuilder(cat).calculateLayerGroupBounds(lg); cat.add(lg); // add two global layer group lg = cat.getFactory().createLayerGroup(); lg.setName("cite_global"); lg.getLayers().add(cat.getLayerByName(getLayerId(MockData.LAKES))); lg.getLayers().add(cat.getLayerByName(getLayerId(MockData.FORESTS))); new CatalogBuilder(cat).calculateLayerGroupBounds(lg); cat.add(lg); lg = cat.getFactory().createLayerGroup(); lg.setName("sf_global"); lg.getLayers().add(cat.getLayerByName(getLayerId(MockData.PRIMITIVEGEOFEATURE))); lg.getLayers().add(cat.getLayerByName(getLayerId(MockData.AGGREGATEGEOFEATURE))); new CatalogBuilder(cat).calculateLayerGroupBounds(lg); cat.add(lg); } protected abstract void setupAccessRules() throws IOException; @After public void finishAdminRequest() { AdminRequest.finish(); } void loginAsCite() { login("cite", "cite", "ROLE_CITE_ADMIN"); } void loginAsSf() { login("sf", "sf", "ROLE_SF_ADMIN"); } @Test public void testWorkspaceAllPage() throws Exception { loginAsCite(); tester.startPage(WorkspacePage.class); tester.assertRenderedPage(WorkspacePage.class); tester.assertNoErrorMessage(); //assert only cite workspace visible DataView dv = (DataView) tester.getComponentFromLastRenderedPage("table:listContainer:items"); assertEquals(1, dv.size()); //the actual web request is finished, so we need to fake another one AdminRequest.start(new Object()); assertEquals(1, dv.getDataProvider().size()); WorkspaceInfo ws = (WorkspaceInfo) dv.getDataProvider().iterator(0, 1).next(); assertEquals("cite", ws.getName()); } @Test public void testWorkspaceNewPage() throws Exception { loginAsCite(); tester.startPage(WorkspaceNewPage.class); tester.assertRenderedPage(UnauthorizedPage.class); } @Test public void testWorkspaceEditPage() throws Exception { loginAsCite(); tester.startPage(WorkspaceEditPage.class,new PageParameters().add("name", "cite")); tester.assertRenderedPage(WorkspaceEditPage.class); tester.assertNoErrorMessage(); } @Test public void testWorkspaceEditPageUnauthorized() throws Exception { loginAsCite(); tester.startPage(WorkspaceEditPage.class,new PageParameters().add("name", "cdf")); tester.assertErrorMessages(new String[]{"Could not find workspace \"cdf\""}); } @Test public void testLayerAllPage() throws Exception { loginAsCite(); tester.startPage(LayerPage.class); tester.assertRenderedPage(LayerPage.class); print(tester.getLastRenderedPage(), true, true, true); DataView dv = (DataView) tester.getComponentFromLastRenderedPage("table:listContainer:items"); assertEquals(getCatalog().getResourcesByNamespace("cite", ResourceInfo.class).size(), dv.size()); } @Test public void testStoreAllPage() throws Exception { loginAsCite(); tester.startPage(StorePage.class); tester.assertRenderedPage(StorePage.class); tester.assertNoErrorMessage(); DataView dv = (DataView) tester.getComponentFromLastRenderedPage("table:listContainer:items"); assertEquals(getCatalog().getStoresByWorkspace("cite", StoreInfo.class).size(), dv.size()); } @Test public void testStoreNewPage() throws Exception { loginAsCite(); final String dataStoreFactoryDisplayName = new PropertyDataStoreFactory().getDisplayName(); tester.startPage(new DataAccessNewPage(dataStoreFactoryDisplayName)); tester.assertRenderedPage(DataAccessNewPage.class); tester.assertNoErrorMessage(); //the actual web request is finished, so we need to fake another one AdminRequest.start(new Object()); DropDownChoice<WorkspaceInfo> wsChoice = (DropDownChoice<WorkspaceInfo>) tester.getComponentFromLastRenderedPage("dataStoreForm:workspacePanel:border:border_body:paramValue"); assertEquals(1, wsChoice.getChoices().size()); assertEquals("cite", wsChoice.getChoices().get(0).getName()); } @Test public void testStoreEditPage() throws Exception { loginAsCite(); tester.startPage(DataAccessEditPage.class, new PageParameters().add("wsName", "cite").add("storeName", "cite")); tester.assertRenderedPage(DataAccessEditPage.class); tester.assertNoErrorMessage(); } @Test public void testStoreEditPageUnauthorized() throws Exception { loginAsCite(); tester.startPage(DataAccessEditPage.class, new PageParameters().add("wsName", "cdf").add("storeName", "cdf")); tester.assertRenderedPage(StorePage.class); tester.assertErrorMessages(new String[]{"Could not find data store \"cdf\" in workspace \"cdf\""}); } @Test public void testLayerGroupAllPageAsAdmin() throws Exception { login(); tester.startPage(LayerGroupPage.class); tester.assertRenderedPage(LayerGroupPage.class); Catalog cat = getCatalog(); DataView view = (DataView) tester.getComponentFromLastRenderedPage("table:listContainer:items"); assertEquals(cat.getLayerGroups().size(), view.getItemCount()); } @Test public void testLayerGroupAllPage() throws Exception { loginAsCite(); tester.startPage(LayerGroupPage.class); tester.assertRenderedPage(LayerGroupPage.class); Catalog cat = getCatalog(); DataView view = (DataView) tester.getComponentFromLastRenderedPage("table:listContainer:items"); AdminRequest.start(new Object()); assertEquals(cat.getLayerGroups().size(), view.getItemCount()); for (Iterator<Item> it = view.getItems(); it.hasNext();) { String name = it.next().get("itemProperties:0:component:link:label") .getDefaultModelObjectAsString(); assertFalse("sf_local".equals(name)); } } @Test public void testLayerGroupEditPageAsAdmin() throws Exception { login(); tester.startPage(LayerGroupEditPage.class); tester.assertRenderedPage(LayerGroupEditPage.class); tester.assertModelValue("publishedinfo:tabs:panel:workspace", null); DropDownChoice choice = (DropDownChoice) tester.getComponentFromLastRenderedPage("publishedinfo:tabs:panel:workspace"); assertTrue(choice.isNullValid()); assertFalse(choice.isRequired()); } @Test public void testLayerGroupEditPage() throws Exception { loginAsCite(); tester.startPage(LayerGroupEditPage.class); tester.assertRenderedPage(LayerGroupEditPage.class); Catalog cat = getCatalog(); tester.assertModelValue("publishedinfo:tabs:panel:workspace", cat.getWorkspaceByName("cite")); DropDownChoice choice = (DropDownChoice) tester.getComponentFromLastRenderedPage("publishedinfo:tabs:panel:workspace"); assertFalse(choice.isNullValid()); assertTrue(choice.isRequired()); } @Test public void testLayerGroupEditPageGlobal() throws Exception { loginAsCite(); tester.startPage(LayerGroupEditPage.class, new PageParameters().add(LayerGroupEditPage.GROUP, "cite_global")); tester.assertRenderedPage(LayerGroupEditPage.class); //assert all form components disabled except for cancel assertFalse(tester.getComponentFromLastRenderedPage("publishedinfo:tabs:panel:name").isEnabled()); assertFalse(tester.getComponentFromLastRenderedPage("publishedinfo:tabs:panel:workspace").isEnabled()); assertNull(tester.getComponentFromLastRenderedPage("publishedinfo:save")); assertTrue(tester.getComponentFromLastRenderedPage("publishedinfo:cancel").isEnabled()); } public void testSqlViewNewPageAsWorkspaceAdmin() throws Exception { loginAsCite(); PageParameters pp = new PageParameters(); pp.add(SQLViewNewPage.WORKSPACE, "cite"); //not a jdbc datastore obviously but we don't need one to simply test that the // page will render with worksapce admin privilieges pp.add(SQLViewNewPage.DATASTORE, "cite"); new SQLViewNewPage(pp); RequestCycle cycle = RequestCycle.get(); RenderPageRequestHandler handler = (RenderPageRequestHandler) cycle.getRequestHandlerScheduledAfterCurrent(); assertFalse(UnauthorizedPage.class.equals( handler.getPageClass() )); } public void testCreateNewFeatureTypePageAsWorkspaceAdmin() throws Exception { loginAsCite(); PageParameters pp = new PageParameters(); pp.add(NewFeatureTypePage.WORKSPACE, "cite"); //not a jdbc datastore obviously but we don't need one to simply test that the // page will render with worksapce admin privilieges pp.add(NewFeatureTypePage.DATASTORE, "cite"); new NewFeatureTypePage(pp); RequestCycle cycle = RequestCycle.get(); RenderPageRequestHandler handler = (RenderPageRequestHandler) cycle.getRequestHandlerScheduledAfterCurrent(); assertFalse(UnauthorizedPage.class.equals( handler.getPageClass() )); } }