/* 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.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import junit.framework.TestCase;
import org.acegisecurity.Authentication;
import org.acegisecurity.ConfigAttributeDefinition;
import org.acegisecurity.intercept.web.FilterInvocation;
import org.acegisecurity.providers.TestingAuthenticationToken;
import org.acegisecurity.vote.AccessDecisionVoter;
import org.easymock.EasyMock;
import org.geoserver.xacml.acegi.XACMLFilterDecisionVoter;
import org.geoserver.xacml.role.XACMLRole;
import com.sun.xacml.attr.StringAttribute;
import com.sun.xacml.ctx.Attribute;
import com.sun.xacml.ctx.RequestCtx;
/**
* Testing URL matching
*
*
* @author Christian Mueller
*
*/
public class XACMLURLMatchingTest extends TestCase {
Authentication anonymous, admin, authenticated;
@Override
protected void setUp() throws Exception {
super.setUp();
GeoXACMLConfig.setPolicyRepsoitoryBaseDir("src/test/resources/urltest/");
GeoXACMLConfig.reset();
anonymous = new TestingAuthenticationToken("anonymous", "passwd",
new XACMLRole[] { new XACMLRole(XACMLConstants.AnonymousRole) });
admin = new TestingAuthenticationToken("admin", "passwd", new XACMLRole[] { new XACMLRole(
XACMLConstants.AdminRole) });
authenticated = new TestingAuthenticationToken("xy", "passwd",
new XACMLRole[] { new XACMLRole(XACMLConstants.Authenticated) });
}
public void testGeoXACMLURL() {
assertTrue(AccessDecisionVoter.ACCESS_GRANTED == executeFor(anonymous,
"/security/geoxacml", "GET"));
assertTrue(AccessDecisionVoter.ACCESS_GRANTED == executeFor(authenticated,
"/security/geoxacml", "GET"));
assertTrue(AccessDecisionVoter.ACCESS_GRANTED == executeFor(admin, "/security/geoxacml",
"GET"));
}
public void testConfigURL() {
assertTrue(AccessDecisionVoter.ACCESS_DENIED == executeFor(anonymous, "/COnFig/abc", "GET"));
assertTrue(AccessDecisionVoter.ACCESS_DENIED == executeFor(authenticated, "/COnFig/abc",
"GET"));
assertTrue(AccessDecisionVoter.ACCESS_GRANTED == executeFor(admin, "/COnFig/abc", "GET"));
}
public void testRestURL() {
assertTrue(AccessDecisionVoter.ACCESS_GRANTED == executeFor(anonymous, "/rest/abc", "GET"));
assertTrue(AccessDecisionVoter.ACCESS_GRANTED == executeFor(authenticated, "/rest/abc",
"GET"));
assertTrue(AccessDecisionVoter.ACCESS_GRANTED == executeFor(admin, "/rest/abc", "GET"));
String methods[] = new String[] { "POST", "PUT", "DELETE" };
for (String method : methods) {
assertTrue(AccessDecisionVoter.ACCESS_DENIED == executeFor(anonymous, "/rest/", method));
assertTrue(AccessDecisionVoter.ACCESS_GRANTED == executeFor(authenticated, "/rest/",
method));
assertTrue(AccessDecisionVoter.ACCESS_GRANTED == executeFor(admin, "/rest/", method));
}
}
public void testHttpParams() {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("param1", "value1");
paramMap.put("param2", new String[] { "value2" });
RequestCtx request = GeoXACMLConfig.getRequestCtxBuilderFactory()
.getURLMatchRequestCtxBuilder((XACMLRole) anonymous.getAuthorities()[0], "/rest/",
"GET", paramMap,"127.0.0.1", "localhost").createRequestCtx();
//System.out.println(XACMLUtil.asXMLString(request));
int count = 0;
for (Attribute attr : request.getResource()) {
if (attr.getId().toString().equals(XACMLConstants.URLParamPrefix + "param1")) {
assertTrue(((StringAttribute) attr.getValue()).getValue().equals("value1"));
count++;
}
if (attr.getId().toString().equals(XACMLConstants.URLParamPrefix + "param2")) {
assertTrue(((StringAttribute) attr.getValue()).getValue().equals("value2"));
count++;
}
}
assertTrue(count == 2);
}
private int executeFor(Authentication aut, String path, String method) {
HttpServletRequest mockRequest = EasyMock.createMock(HttpServletRequest.class);
EasyMock.expect(mockRequest.getMethod()).andReturn(method).anyTimes();
EasyMock.expect(mockRequest.getServletPath()).andReturn(path).anyTimes();
EasyMock.expect(mockRequest.getParameterMap()).andReturn(null).anyTimes();
EasyMock.expect(mockRequest.getRemoteHost()).andReturn("localhost").anyTimes();
EasyMock.expect(mockRequest.getRemoteAddr()).andReturn("127.0.0.1").anyTimes();
EasyMock.replay(mockRequest);
FilterInvocation filter = org.easymock.classextension.EasyMock
.createMock(FilterInvocation.class);
org.easymock.classextension.EasyMock.expect(filter.getRequestUrl()).andReturn(path)
.anyTimes();
org.easymock.classextension.EasyMock.expect(filter.getHttpRequest()).andReturn(mockRequest)
.anyTimes();
org.easymock.classextension.EasyMock.replay(filter);
XACMLFilterDecisionVoter voter = new XACMLFilterDecisionVoter();
return voter.vote(aut, filter, new ConfigAttributeDefinition());
}
}