Package org.geoserver.xacml.geoxacml

Source Code of org.geoserver.xacml.geoxacml.GeoXACMLPDPControllerTest

/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, availible at the root
* application directory.
*/

package org.geoserver.xacml.geoxacml;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.acegisecurity.Authentication;
import org.acegisecurity.GrantedAuthority;
import org.acegisecurity.context.SecurityContextHolder;
import org.acegisecurity.providers.AuthenticationProvider;
import org.acegisecurity.providers.ProviderManager;
import org.acegisecurity.providers.TestingAuthenticationProvider;
import org.acegisecurity.providers.TestingAuthenticationToken;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.platform.GeoServerExtensions;
import org.geoserver.security.AccessMode;
import org.geoserver.test.GeoServerTestSupport;
import org.geoserver.xacml.role.XACMLRole;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

import com.sun.xacml.Indenter;
import com.sun.xacml.ctx.RequestCtx;

public class GeoXACMLPDPControllerTest extends GeoServerTestSupport {

    @Override
    protected void setUpInternal() throws Exception {
        super.setUpInternal();

        ProviderManager providerManager = (ProviderManager) GeoServerExtensions
                .bean("authenticationManager");
        List<AuthenticationProvider> list = new ArrayList<AuthenticationProvider>();
        list.add(new TestingAuthenticationProvider());
        providerManager.setProviders(list);

        Authentication admin = new TestingAuthenticationToken("admin", "geoserver",
                new GrantedAuthority[] { new XACMLRole("ROLE_ADMINISTRATOR") });
        // Authentication anonymous = new TestingAuthenticationToken("anonymous", null, null);
        SecurityContextHolder.getContext().setAuthentication(admin);

    }

    public void testDirExists() throws Exception {
        File dir = new File(testData.getDataDirectoryRoot(), DataDirPolicyFinderModlule.BASE_DIR);
        assertTrue(dir.exists());

    }

    public void testRemote() throws Exception {

        List<RequestCtx> requestCtxs = createRequestCtxList();

        for (RequestCtx requestCtx : requestCtxs) {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            requestCtx.encode(out, new Indenter(0), true);
            InputStream resp = post("security/geoxacml", out.toString());
            checkXACMLRepsonse(resp, "Permit");
        }
    }

    public void testCatalogReload() throws Exception {
        // System.out.println(getAsString("/rest/reloadXACML.txt"));
        assertEquals(GeoXACMLRESTRepositoryReloader.ReloadedMsg,
                getAsString("/rest/reloadXACML.txt"));
    }

    private List<RequestCtx> createRequestCtxList() {
        List<RequestCtx> result = new ArrayList<RequestCtx>();
        for (WorkspaceInfo wsInfo : getCatalog().getWorkspaces()) {
            for (GrantedAuthority role : SecurityContextHolder.getContext().getAuthentication()
                    .getAuthorities()) {
                RequestCtx rctx = GeoXACMLConfig.getRequestCtxBuilderFactory()
                        .getWorkspaceRequestCtxBuilder((XACMLRole) role, wsInfo, AccessMode.READ)
                        .createRequestCtx();
                result.add(rctx);
            }
        }
        return result;

    }

    protected void checkXACMLRepsonse(InputStream resp, String decision) throws Exception {
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = builder.parse(resp);
        Node decisionNode = doc.getElementsByTagName("Decision").item(0);
        assertEquals(decision, decisionNode.getTextContent());
        Node statusNode = doc.getElementsByTagName("StatusCode").item(0);
        String statusCode = statusNode.getAttributes().getNamedItem("Value").getTextContent();
        assertEquals("urn:oasis:names:tc:xacml:1.0:status:ok", statusCode);

    }

    protected void dumpResponse(InputStream resp) throws IOException {
        System.out.println("RESPONSE");
        byte[] bytes = new byte[512];
        while (resp.read(bytes) != -1) {
            System.out.println(new String(bytes));
        }
    }

}
TOP

Related Classes of org.geoserver.xacml.geoxacml.GeoXACMLPDPControllerTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.