Make ChannelDecisionManagerImpl iterate through a list of channel security processors.
This commit is contained in:
@@ -56,7 +56,11 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
||||
}
|
||||
|
||||
public boolean isCommitted() {
|
||||
throw new UnsupportedOperationException("mock method not implemented");
|
||||
if (redirect == null) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public void setContentLength(int arg0) {
|
||||
|
||||
@@ -17,6 +17,7 @@ package net.sf.acegisecurity.securechannel;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import net.sf.acegisecurity.ConfigAttribute;
|
||||
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
||||
import net.sf.acegisecurity.MockFilterChain;
|
||||
import net.sf.acegisecurity.MockHttpServletRequest;
|
||||
@@ -24,6 +25,14 @@ import net.sf.acegisecurity.MockHttpServletResponse;
|
||||
import net.sf.acegisecurity.SecurityConfig;
|
||||
import net.sf.acegisecurity.intercept.web.FilterInvocation;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Vector;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
|
||||
|
||||
/**
|
||||
* Tests {@link ChannelDecisionManagerImpl}.
|
||||
@@ -42,141 +51,175 @@ public class ChannelDecisionManagerImplTests extends TestCase {
|
||||
junit.textui.TestRunner.run(ChannelDecisionManagerImplTests.class);
|
||||
}
|
||||
|
||||
public void testDetectsInvalidInsecureKeyword() throws Exception {
|
||||
public void testCannotSetEmptyChannelProcessorsList()
|
||||
throws Exception {
|
||||
ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
|
||||
cdm.setInsecureKeyword("");
|
||||
|
||||
try {
|
||||
cdm.afterPropertiesSet();
|
||||
cdm.setChannelProcessors(new Vector());
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertEquals("insecureKeyword required", expected.getMessage());
|
||||
}
|
||||
|
||||
cdm.setInsecureKeyword(null);
|
||||
|
||||
try {
|
||||
cdm.afterPropertiesSet();
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertEquals("insecureKeyword required", expected.getMessage());
|
||||
assertEquals("A list of ChannelProcessors is required",
|
||||
expected.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void testDetectsInvalidSecureKeyword() throws Exception {
|
||||
public void testCannotSetIncorrectObjectTypesIntoChannelProcessorsList()
|
||||
throws Exception {
|
||||
ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
|
||||
cdm.setSecureKeyword("");
|
||||
List list = new Vector();
|
||||
list.add("THIS IS NOT A CHANNELPROCESSOR");
|
||||
|
||||
try {
|
||||
cdm.afterPropertiesSet();
|
||||
cdm.setChannelProcessors(list);
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertEquals("secureKeyword required", expected.getMessage());
|
||||
}
|
||||
|
||||
cdm.setSecureKeyword(null);
|
||||
|
||||
try {
|
||||
cdm.afterPropertiesSet();
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertEquals("secureKeyword required", expected.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void testDetectsNullsPassedToMainMethod() {
|
||||
ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
|
||||
|
||||
try {
|
||||
cdm.decide(null, new ConfigAttributeDefinition());
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertEquals("Nulls cannot be provided", expected.getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
cdm.decide(new FilterInvocation(new MockHttpServletRequest("x"),
|
||||
new MockHttpServletResponse(), new MockFilterChain()), null);
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertEquals("Nulls cannot be provided", expected.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void testDetectsWhenInsecureChannelNeededAndInsecureSchemeUsed() {
|
||||
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||
attr.addConfigAttribute(new SecurityConfig(
|
||||
"SOME_CONFIG_ATTRIBUTE_TO_IGNORE"));
|
||||
attr.addConfigAttribute(new SecurityConfig("REQUIRES_INSECURE_CHANNEL"));
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("foo=bar");
|
||||
request.setScheme("http");
|
||||
|
||||
ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
|
||||
cdm.decide(new FilterInvocation(request, new MockHttpServletResponse(),
|
||||
new MockFilterChain()), attr);
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
public void testDetectsWhenInsecureChannelNeededAndSecureSchemeUsed() {
|
||||
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||
attr.addConfigAttribute(new SecurityConfig(
|
||||
"SOME_CONFIG_ATTRIBUTE_TO_IGNORE"));
|
||||
attr.addConfigAttribute(new SecurityConfig("REQUIRES_INSECURE_CHANNEL"));
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("foo=bar");
|
||||
request.setScheme("https");
|
||||
|
||||
ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
|
||||
|
||||
try {
|
||||
cdm.decide(new FilterInvocation(request,
|
||||
new MockHttpServletResponse(), new MockFilterChain()), attr);
|
||||
} catch (InsecureChannelRequiredException expected) {
|
||||
assertTrue(true);
|
||||
}
|
||||
}
|
||||
|
||||
public void testDetectsWhenSecureChannelNeeded() {
|
||||
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||
attr.addConfigAttribute(new SecurityConfig(
|
||||
"SOME_CONFIG_ATTRIBUTE_TO_IGNORE"));
|
||||
attr.addConfigAttribute(new SecurityConfig("REQUIRES_SECURE_CHANNEL"));
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("foo=bar");
|
||||
request.setScheme("http");
|
||||
|
||||
public void testCannotSetNullChannelProcessorsList()
|
||||
throws Exception {
|
||||
ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
|
||||
|
||||
try {
|
||||
cdm.decide(new FilterInvocation(request,
|
||||
new MockHttpServletResponse(), new MockFilterChain()), attr);
|
||||
} catch (SecureChannelRequiredException expected) {
|
||||
assertTrue(true);
|
||||
cdm.setChannelProcessors(null);
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertEquals("A list of ChannelProcessors is required",
|
||||
expected.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void testGetterSetters() throws Exception {
|
||||
public void testDecideIsOperational() throws Exception {
|
||||
ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
|
||||
MockChannelProcessor cpXyz = new MockChannelProcessor("xyz", false);
|
||||
MockChannelProcessor cpAbc = new MockChannelProcessor("abc", true);
|
||||
List list = new Vector();
|
||||
list.add(cpXyz);
|
||||
list.add(cpAbc);
|
||||
cdm.setChannelProcessors(list);
|
||||
cdm.afterPropertiesSet();
|
||||
assertEquals("REQUIRES_INSECURE_CHANNEL", cdm.getInsecureKeyword());
|
||||
assertEquals("REQUIRES_SECURE_CHANNEL", cdm.getSecureKeyword());
|
||||
|
||||
cdm.setInsecureKeyword("MY_INSECURE");
|
||||
cdm.setSecureKeyword("MY_SECURE");
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("not used");
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
MockFilterChain chain = new MockFilterChain();
|
||||
FilterInvocation fi = new FilterInvocation(request, response, chain);
|
||||
|
||||
assertEquals("MY_INSECURE", cdm.getInsecureKeyword());
|
||||
assertEquals("MY_SECURE", cdm.getSecureKeyword());
|
||||
ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
|
||||
cad.addConfigAttribute(new SecurityConfig("xyz"));
|
||||
|
||||
cdm.decide(fi, cad);
|
||||
assertTrue(fi.getResponse().isCommitted());
|
||||
}
|
||||
|
||||
public void testIgnoresOtherConfigAttributes() {
|
||||
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||
attr.addConfigAttribute(new SecurityConfig("XYZ"));
|
||||
|
||||
public void testDecideIteratesAllProcessorsIfNoneCommitAResponse()
|
||||
throws Exception {
|
||||
ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
|
||||
cdm.decide(new FilterInvocation(new MockHttpServletRequest("x"),
|
||||
new MockHttpServletResponse(), new MockFilterChain()), attr);
|
||||
assertTrue(true);
|
||||
MockChannelProcessor cpXyz = new MockChannelProcessor("xyz", false);
|
||||
MockChannelProcessor cpAbc = new MockChannelProcessor("abc", false);
|
||||
List list = new Vector();
|
||||
list.add(cpXyz);
|
||||
list.add(cpAbc);
|
||||
cdm.setChannelProcessors(list);
|
||||
cdm.afterPropertiesSet();
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("not used");
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
MockFilterChain chain = new MockFilterChain();
|
||||
FilterInvocation fi = new FilterInvocation(request, response, chain);
|
||||
|
||||
ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
|
||||
cad.addConfigAttribute(new SecurityConfig(
|
||||
"SOME_ATTRIBUTE_NO_PROCESSORS_SUPPORT"));
|
||||
|
||||
cdm.decide(fi, cad);
|
||||
assertFalse(fi.getResponse().isCommitted());
|
||||
}
|
||||
|
||||
public void testDelegatesSupports() throws Exception {
|
||||
ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
|
||||
MockChannelProcessor cpXyz = new MockChannelProcessor("xyz", false);
|
||||
MockChannelProcessor cpAbc = new MockChannelProcessor("abc", false);
|
||||
List list = new Vector();
|
||||
list.add(cpXyz);
|
||||
list.add(cpAbc);
|
||||
cdm.setChannelProcessors(list);
|
||||
cdm.afterPropertiesSet();
|
||||
|
||||
assertTrue(cdm.supports(new SecurityConfig("xyz")));
|
||||
assertTrue(cdm.supports(new SecurityConfig("abc")));
|
||||
assertFalse(cdm.supports(new SecurityConfig("UNSUPPORTED")));
|
||||
}
|
||||
|
||||
public void testGettersSetters() {
|
||||
ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
|
||||
assertNull(cdm.getChannelProcessors());
|
||||
|
||||
MockChannelProcessor cpXyz = new MockChannelProcessor("xyz", false);
|
||||
MockChannelProcessor cpAbc = new MockChannelProcessor("abc", false);
|
||||
List list = new Vector();
|
||||
list.add(cpXyz);
|
||||
list.add(cpAbc);
|
||||
cdm.setChannelProcessors(list);
|
||||
|
||||
assertEquals(list, cdm.getChannelProcessors());
|
||||
}
|
||||
|
||||
public void testStartupFailsWithEmptyChannelProcessorsList()
|
||||
throws Exception {
|
||||
ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
|
||||
|
||||
try {
|
||||
cdm.afterPropertiesSet();
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertEquals("A list of ChannelProcessors is required",
|
||||
expected.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
//~ Inner Classes ==========================================================
|
||||
|
||||
private class MockChannelProcessor implements ChannelProcessor {
|
||||
private String configAttribute;
|
||||
private boolean failIfCalled;
|
||||
|
||||
public MockChannelProcessor(String configAttribute, boolean failIfCalled) {
|
||||
this.configAttribute = configAttribute;
|
||||
this.failIfCalled = failIfCalled;
|
||||
}
|
||||
|
||||
private MockChannelProcessor() {
|
||||
super();
|
||||
}
|
||||
|
||||
public void decide(FilterInvocation invocation,
|
||||
ConfigAttributeDefinition config)
|
||||
throws IOException, ServletException {
|
||||
Iterator iter = config.getConfigAttributes();
|
||||
|
||||
if (failIfCalled) {
|
||||
fail("Should not have called this channel processor");
|
||||
}
|
||||
|
||||
while (iter.hasNext()) {
|
||||
ConfigAttribute attr = (ConfigAttribute) iter.next();
|
||||
|
||||
if (attr.equals(configAttribute)) {
|
||||
invocation.getHttpResponse().sendRedirect("/redirected");
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean supports(ConfigAttribute attribute) {
|
||||
if (attribute.getAttribute().equals(configAttribute)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
@@ -17,18 +17,19 @@ package net.sf.acegisecurity.securechannel;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import net.sf.acegisecurity.ConfigAttribute;
|
||||
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
||||
import net.sf.acegisecurity.MockFilterConfig;
|
||||
import net.sf.acegisecurity.MockHttpServletRequest;
|
||||
import net.sf.acegisecurity.MockHttpServletResponse;
|
||||
import net.sf.acegisecurity.SecurityConfig;
|
||||
import net.sf.acegisecurity.intercept.web.FilterInvocation;
|
||||
import net.sf.acegisecurity.intercept.web.FilterInvocationDefinitionSource;
|
||||
import net.sf.acegisecurity.intercept.web.RegExpBasedFilterInvocationDefinitionMap;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Vector;
|
||||
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.ServletException;
|
||||
@@ -53,61 +54,16 @@ public class ChannelProcessingFilterTests extends TestCase {
|
||||
junit.textui.TestRunner.run(ChannelProcessingFilterTests.class);
|
||||
}
|
||||
|
||||
public void testCallsInsecureEntryPointWhenTooMuchChannelSecurity()
|
||||
throws Exception {
|
||||
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||
attr.addConfigAttribute(new SecurityConfig("REQUIRES_INSECURE_CHANNEL"));
|
||||
|
||||
MockFilterInvocationDefinitionMap fids = new MockFilterInvocationDefinitionMap("/path",
|
||||
attr);
|
||||
|
||||
ChannelProcessingFilter filter = new ChannelProcessingFilter();
|
||||
filter.setInsecureChannelEntryPoint(new MockEntryPoint(true));
|
||||
filter.setSecureChannelEntryPoint(new MockEntryPoint(false));
|
||||
filter.setFilterInvocationDefinitionSource(fids);
|
||||
filter.setChannelDecisionManager(new ChannelDecisionManagerImpl());
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("info=now");
|
||||
request.setServletPath("/path");
|
||||
request.setScheme("https");
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
MockFilterChain chain = new MockFilterChain(false);
|
||||
|
||||
filter.doFilter(request, response, chain);
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
public void testCallsSecureEntryPointWhenTooLittleChannelSecurity()
|
||||
throws Exception {
|
||||
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||
attr.addConfigAttribute(new SecurityConfig("REQUIRES_SECURE_CHANNEL"));
|
||||
|
||||
MockFilterInvocationDefinitionMap fids = new MockFilterInvocationDefinitionMap("/path",
|
||||
attr);
|
||||
|
||||
ChannelProcessingFilter filter = new ChannelProcessingFilter();
|
||||
filter.setInsecureChannelEntryPoint(new MockEntryPoint(false));
|
||||
filter.setSecureChannelEntryPoint(new MockEntryPoint(true));
|
||||
filter.setFilterInvocationDefinitionSource(fids);
|
||||
filter.setChannelDecisionManager(new ChannelDecisionManagerImpl());
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("info=now");
|
||||
request.setServletPath("/path");
|
||||
request.setScheme("http");
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
MockFilterChain chain = new MockFilterChain(false);
|
||||
|
||||
filter.doFilter(request, response, chain);
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
public void testDetectsMissingChannelDecisionManager()
|
||||
throws Exception {
|
||||
ChannelProcessingFilter filter = new ChannelProcessingFilter();
|
||||
filter.setSecureChannelEntryPoint(new RetryWithHttpsEntryPoint());
|
||||
filter.setFilterInvocationDefinitionSource(new RegExpBasedFilterInvocationDefinitionMap());
|
||||
|
||||
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||
attr.addConfigAttribute(new SecurityConfig("MOCK"));
|
||||
|
||||
MockFilterInvocationDefinitionMap fids = new MockFilterInvocationDefinitionMap("/path",
|
||||
attr, true);
|
||||
filter.setFilterInvocationDefinitionSource(fids);
|
||||
|
||||
try {
|
||||
filter.afterPropertiesSet();
|
||||
@@ -118,12 +74,11 @@ public class ChannelProcessingFilterTests extends TestCase {
|
||||
}
|
||||
}
|
||||
|
||||
public void testDetectsMissingFilterInvocationDefinitionMap()
|
||||
public void testDetectsMissingFilterInvocationDefinitionSource()
|
||||
throws Exception {
|
||||
ChannelProcessingFilter filter = new ChannelProcessingFilter();
|
||||
filter.setInsecureChannelEntryPoint(new RetryWithHttpEntryPoint());
|
||||
filter.setSecureChannelEntryPoint(new RetryWithHttpsEntryPoint());
|
||||
filter.setChannelDecisionManager(new ChannelDecisionManagerImpl());
|
||||
filter.setChannelDecisionManager(new MockChannelDecisionManager(false,
|
||||
"MOCK"));
|
||||
|
||||
try {
|
||||
filter.afterPropertiesSet();
|
||||
@@ -134,36 +89,116 @@ public class ChannelProcessingFilterTests extends TestCase {
|
||||
}
|
||||
}
|
||||
|
||||
public void testDetectsMissingInsecureChannelEntryPoint()
|
||||
public void testDetectsSupportedConfigAttribute() throws Exception {
|
||||
ChannelProcessingFilter filter = new ChannelProcessingFilter();
|
||||
filter.setChannelDecisionManager(new MockChannelDecisionManager(false,
|
||||
"SUPPORTS_MOCK_ONLY"));
|
||||
|
||||
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||
attr.addConfigAttribute(new SecurityConfig("SUPPORTS_MOCK_ONLY"));
|
||||
|
||||
MockFilterInvocationDefinitionMap fids = new MockFilterInvocationDefinitionMap("/path",
|
||||
attr, true);
|
||||
|
||||
filter.setFilterInvocationDefinitionSource(fids);
|
||||
|
||||
filter.afterPropertiesSet();
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
public void testDetectsUnsupportedConfigAttribute()
|
||||
throws Exception {
|
||||
ChannelProcessingFilter filter = new ChannelProcessingFilter();
|
||||
filter.setSecureChannelEntryPoint(new RetryWithHttpsEntryPoint());
|
||||
filter.setFilterInvocationDefinitionSource(new RegExpBasedFilterInvocationDefinitionMap());
|
||||
filter.setChannelDecisionManager(new ChannelDecisionManagerImpl());
|
||||
filter.setChannelDecisionManager(new MockChannelDecisionManager(false,
|
||||
"SUPPORTS_MOCK_ONLY"));
|
||||
|
||||
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||
attr.addConfigAttribute(new SecurityConfig("SUPPORTS_MOCK_ONLY"));
|
||||
attr.addConfigAttribute(new SecurityConfig("INVALID_ATTRIBUTE"));
|
||||
|
||||
MockFilterInvocationDefinitionMap fids = new MockFilterInvocationDefinitionMap("/path",
|
||||
attr, true);
|
||||
|
||||
filter.setFilterInvocationDefinitionSource(fids);
|
||||
|
||||
try {
|
||||
filter.afterPropertiesSet();
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertEquals("insecureChannelEntryPoint must be specified",
|
||||
expected.getMessage());
|
||||
assertTrue(expected.getMessage().startsWith("Unsupported configuration attributes:"));
|
||||
}
|
||||
}
|
||||
|
||||
public void testDetectsMissingSecureChannelEntryPoint()
|
||||
public void testDoFilterWhenManagerDoesCommitResponse()
|
||||
throws Exception {
|
||||
ChannelProcessingFilter filter = new ChannelProcessingFilter();
|
||||
filter.setInsecureChannelEntryPoint(new RetryWithHttpEntryPoint());
|
||||
filter.setFilterInvocationDefinitionSource(new RegExpBasedFilterInvocationDefinitionMap());
|
||||
filter.setChannelDecisionManager(new ChannelDecisionManagerImpl());
|
||||
filter.setChannelDecisionManager(new MockChannelDecisionManager(true,
|
||||
"SOME_ATTRIBUTE"));
|
||||
|
||||
try {
|
||||
filter.afterPropertiesSet();
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertEquals("secureChannelEntryPoint must be specified",
|
||||
expected.getMessage());
|
||||
}
|
||||
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||
attr.addConfigAttribute(new SecurityConfig("SOME_ATTRIBUTE"));
|
||||
|
||||
MockFilterInvocationDefinitionMap fids = new MockFilterInvocationDefinitionMap("/path",
|
||||
attr, true);
|
||||
|
||||
filter.setFilterInvocationDefinitionSource(fids);
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("info=now");
|
||||
request.setServletPath("/path");
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
MockFilterChain chain = new MockFilterChain(false);
|
||||
|
||||
filter.doFilter(request, response, chain);
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
public void testDoFilterWhenManagerDoesNotCommitResponse()
|
||||
throws Exception {
|
||||
ChannelProcessingFilter filter = new ChannelProcessingFilter();
|
||||
filter.setChannelDecisionManager(new MockChannelDecisionManager(false,
|
||||
"SOME_ATTRIBUTE"));
|
||||
|
||||
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||
attr.addConfigAttribute(new SecurityConfig("SOME_ATTRIBUTE"));
|
||||
|
||||
MockFilterInvocationDefinitionMap fids = new MockFilterInvocationDefinitionMap("/path",
|
||||
attr, true);
|
||||
|
||||
filter.setFilterInvocationDefinitionSource(fids);
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("info=now");
|
||||
request.setServletPath("/path");
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
MockFilterChain chain = new MockFilterChain(true);
|
||||
|
||||
filter.doFilter(request, response, chain);
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
public void testDoFilterWhenNullConfigAttributeReturned()
|
||||
throws Exception {
|
||||
ChannelProcessingFilter filter = new ChannelProcessingFilter();
|
||||
filter.setChannelDecisionManager(new MockChannelDecisionManager(false,
|
||||
"NOT_USED"));
|
||||
|
||||
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||
attr.addConfigAttribute(new SecurityConfig("NOT_USED"));
|
||||
|
||||
MockFilterInvocationDefinitionMap fids = new MockFilterInvocationDefinitionMap("/path",
|
||||
attr, true);
|
||||
|
||||
filter.setFilterInvocationDefinitionSource(fids);
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("info=now");
|
||||
request.setServletPath("/PATH_NOT_MATCHING_CONFIG_ATTRIBUTE");
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
MockFilterChain chain = new MockFilterChain(true);
|
||||
|
||||
filter.doFilter(request, response, chain);
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
public void testDoFilterWithNonHttpServletRequestDetected()
|
||||
@@ -192,91 +227,55 @@ public class ChannelProcessingFilterTests extends TestCase {
|
||||
}
|
||||
}
|
||||
|
||||
public void testDoesNotInterruptRequestsWithCorrectChannelSecurity()
|
||||
throws Exception {
|
||||
public void testGetterSetters() throws Exception {
|
||||
ChannelProcessingFilter filter = new ChannelProcessingFilter();
|
||||
filter.setChannelDecisionManager(new MockChannelDecisionManager(false,
|
||||
"MOCK"));
|
||||
assertTrue(filter.getChannelDecisionManager() != null);
|
||||
|
||||
ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
|
||||
attr.addConfigAttribute(new SecurityConfig("REQUIRES_SECURE_CHANNEL"));
|
||||
attr.addConfigAttribute(new SecurityConfig("MOCK"));
|
||||
|
||||
MockFilterInvocationDefinitionMap fids = new MockFilterInvocationDefinitionMap("/path",
|
||||
attr);
|
||||
attr, false);
|
||||
|
||||
ChannelProcessingFilter filter = new ChannelProcessingFilter();
|
||||
filter.setInsecureChannelEntryPoint(new RetryWithHttpEntryPoint());
|
||||
filter.setSecureChannelEntryPoint(new RetryWithHttpsEntryPoint());
|
||||
filter.setFilterInvocationDefinitionSource(fids);
|
||||
filter.setChannelDecisionManager(new ChannelDecisionManagerImpl());
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("info=now");
|
||||
request.setServletPath("/path");
|
||||
request.setScheme("https");
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
MockFilterChain chain = new MockFilterChain(true);
|
||||
|
||||
filter.doFilter(request, response, chain);
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
public void testDoesNotInterruptRequestsWithNoConfigAttribute()
|
||||
throws Exception {
|
||||
ChannelProcessingFilter filter = new ChannelProcessingFilter();
|
||||
filter.setInsecureChannelEntryPoint(new RetryWithHttpEntryPoint());
|
||||
filter.setSecureChannelEntryPoint(new RetryWithHttpsEntryPoint());
|
||||
filter.setFilterInvocationDefinitionSource(new RegExpBasedFilterInvocationDefinitionMap());
|
||||
filter.setChannelDecisionManager(new ChannelDecisionManagerImpl());
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("info=now");
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
MockFilterChain chain = new MockFilterChain(true);
|
||||
|
||||
filter.doFilter(request, response, chain);
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
public void testGetterSetters() {
|
||||
ChannelProcessingFilter filter = new ChannelProcessingFilter();
|
||||
filter.setInsecureChannelEntryPoint(new RetryWithHttpEntryPoint());
|
||||
filter.setSecureChannelEntryPoint(new RetryWithHttpsEntryPoint());
|
||||
filter.setFilterInvocationDefinitionSource(new RegExpBasedFilterInvocationDefinitionMap());
|
||||
filter.setChannelDecisionManager(new ChannelDecisionManagerImpl());
|
||||
|
||||
assertTrue(filter.getInsecureChannelEntryPoint() != null);
|
||||
assertTrue(filter.getSecureChannelEntryPoint() != null);
|
||||
assertTrue(filter.getFilterInvocationDefinitionSource() != null);
|
||||
assertTrue(filter.getChannelDecisionManager() != null);
|
||||
}
|
||||
|
||||
public void testLifecycle() throws Exception {
|
||||
ChannelProcessingFilter filter = new ChannelProcessingFilter();
|
||||
filter.setInsecureChannelEntryPoint(new RetryWithHttpEntryPoint());
|
||||
filter.setSecureChannelEntryPoint(new RetryWithHttpsEntryPoint());
|
||||
filter.setFilterInvocationDefinitionSource(new RegExpBasedFilterInvocationDefinitionMap());
|
||||
filter.setChannelDecisionManager(new ChannelDecisionManagerImpl());
|
||||
filter.init(null);
|
||||
filter.afterPropertiesSet();
|
||||
|
||||
filter.init(new MockFilterConfig());
|
||||
filter.destroy();
|
||||
}
|
||||
|
||||
//~ Inner Classes ==========================================================
|
||||
|
||||
private class MockEntryPoint implements ChannelEntryPoint {
|
||||
private boolean expectToBeCalled;
|
||||
private class MockChannelDecisionManager implements ChannelDecisionManager {
|
||||
private String supportAttribute;
|
||||
private boolean commitAResponse;
|
||||
|
||||
public MockEntryPoint(boolean expectToBeCalled) {
|
||||
this.expectToBeCalled = expectToBeCalled;
|
||||
public MockChannelDecisionManager(boolean commitAResponse,
|
||||
String supportAttribute) {
|
||||
this.commitAResponse = commitAResponse;
|
||||
this.supportAttribute = supportAttribute;
|
||||
}
|
||||
|
||||
private MockEntryPoint() {
|
||||
private MockChannelDecisionManager() {
|
||||
super();
|
||||
}
|
||||
|
||||
public void commence(ServletRequest request, ServletResponse response)
|
||||
public void decide(FilterInvocation invocation,
|
||||
ConfigAttributeDefinition config)
|
||||
throws IOException, ServletException {
|
||||
if (expectToBeCalled) {
|
||||
assertTrue(true);
|
||||
if (commitAResponse) {
|
||||
invocation.getHttpResponse().sendRedirect("/redirected");
|
||||
}
|
||||
}
|
||||
|
||||
public boolean supports(ConfigAttribute attribute) {
|
||||
if (attribute.getAttribute().equals(supportAttribute)) {
|
||||
return true;
|
||||
} else {
|
||||
fail("Did not expect this ChannelEntryPoint to be called");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -306,11 +305,13 @@ public class ChannelProcessingFilterTests extends TestCase {
|
||||
implements FilterInvocationDefinitionSource {
|
||||
private ConfigAttributeDefinition toReturn;
|
||||
private String servletPath;
|
||||
private boolean provideIterator;
|
||||
|
||||
public MockFilterInvocationDefinitionMap(String servletPath,
|
||||
ConfigAttributeDefinition toReturn) {
|
||||
ConfigAttributeDefinition toReturn, boolean provideIterator) {
|
||||
this.servletPath = servletPath;
|
||||
this.toReturn = toReturn;
|
||||
this.provideIterator = provideIterator;
|
||||
}
|
||||
|
||||
private MockFilterInvocationDefinitionMap() {
|
||||
@@ -329,7 +330,14 @@ public class ChannelProcessingFilterTests extends TestCase {
|
||||
}
|
||||
|
||||
public Iterator getConfigAttributeDefinitions() {
|
||||
return null;
|
||||
if (!provideIterator) {
|
||||
return null;
|
||||
}
|
||||
|
||||
List list = new Vector();
|
||||
list.add(toReturn);
|
||||
|
||||
return list.iterator();
|
||||
}
|
||||
|
||||
public boolean supports(Class clazz) {
|
||||
|
||||
@@ -0,0 +1,153 @@
|
||||
/* Copyright 2004 Acegi Technology Pty Limited
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package net.sf.acegisecurity.securechannel;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
||||
import net.sf.acegisecurity.MockFilterChain;
|
||||
import net.sf.acegisecurity.MockHttpServletRequest;
|
||||
import net.sf.acegisecurity.MockHttpServletResponse;
|
||||
import net.sf.acegisecurity.SecurityConfig;
|
||||
import net.sf.acegisecurity.intercept.web.FilterInvocation;
|
||||
|
||||
|
||||
/**
|
||||
* Tests {@link InsecureChannelProcessor}.
|
||||
*
|
||||
* @author Ben Alex
|
||||
* @version $Id$
|
||||
*/
|
||||
public class InsecureChannelProcessorTests extends TestCase {
|
||||
//~ Methods ================================================================
|
||||
|
||||
public final void setUp() throws Exception {
|
||||
super.setUp();
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
junit.textui.TestRunner.run(InsecureChannelProcessorTests.class);
|
||||
}
|
||||
|
||||
public void testDecideDetectsAcceptableChannel() throws Exception {
|
||||
ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
|
||||
cad.addConfigAttribute(new SecurityConfig("SOME_IGNORED_ATTRIBUTE"));
|
||||
cad.addConfigAttribute(new SecurityConfig("REQUIRES_INSECURE_CHANNEL"));
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("info=true");
|
||||
request.setServerName("localhost");
|
||||
request.setContextPath("/bigapp");
|
||||
request.setServletPath("/servlet");
|
||||
request.setScheme("http");
|
||||
request.setServerPort(8080);
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
MockFilterChain chain = new MockFilterChain();
|
||||
FilterInvocation fi = new FilterInvocation(request, response, chain);
|
||||
|
||||
InsecureChannelProcessor processor = new InsecureChannelProcessor();
|
||||
processor.decide(fi, cad);
|
||||
|
||||
assertFalse(fi.getResponse().isCommitted());
|
||||
}
|
||||
|
||||
public void testDecideDetectsUnacceptableChannel()
|
||||
throws Exception {
|
||||
ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
|
||||
cad.addConfigAttribute(new SecurityConfig("SOME_IGNORED_ATTRIBUTE"));
|
||||
cad.addConfigAttribute(new SecurityConfig("REQUIRES_INSECURE_CHANNEL"));
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("info=true");
|
||||
request.setServerName("localhost");
|
||||
request.setContextPath("/bigapp");
|
||||
request.setServletPath("/servlet");
|
||||
request.setScheme("https");
|
||||
request.setServerPort(8443);
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
MockFilterChain chain = new MockFilterChain();
|
||||
FilterInvocation fi = new FilterInvocation(request, response, chain);
|
||||
|
||||
InsecureChannelProcessor processor = new InsecureChannelProcessor();
|
||||
processor.decide(fi, cad);
|
||||
|
||||
assertTrue(fi.getResponse().isCommitted());
|
||||
}
|
||||
|
||||
public void testDecideRejectsNulls() throws Exception {
|
||||
InsecureChannelProcessor processor = new InsecureChannelProcessor();
|
||||
processor.afterPropertiesSet();
|
||||
|
||||
try {
|
||||
processor.decide(null, null);
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertTrue(true);
|
||||
}
|
||||
}
|
||||
|
||||
public void testGettersSetters() {
|
||||
InsecureChannelProcessor processor = new InsecureChannelProcessor();
|
||||
assertEquals("REQUIRES_INSECURE_CHANNEL", processor.getInsecureKeyword());
|
||||
processor.setInsecureKeyword("X");
|
||||
assertEquals("X", processor.getInsecureKeyword());
|
||||
|
||||
assertTrue(processor.getEntryPoint() != null);
|
||||
processor.setEntryPoint(null);
|
||||
assertTrue(processor.getEntryPoint() == null);
|
||||
}
|
||||
|
||||
public void testMissingEntryPoint() throws Exception {
|
||||
InsecureChannelProcessor processor = new InsecureChannelProcessor();
|
||||
processor.setEntryPoint(null);
|
||||
|
||||
try {
|
||||
processor.afterPropertiesSet();
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertEquals("entryPoint required", expected.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void testMissingSecureChannelKeyword() throws Exception {
|
||||
InsecureChannelProcessor processor = new InsecureChannelProcessor();
|
||||
processor.setInsecureKeyword(null);
|
||||
|
||||
try {
|
||||
processor.afterPropertiesSet();
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertEquals("insecureKeyword required", expected.getMessage());
|
||||
}
|
||||
|
||||
processor.setInsecureKeyword("");
|
||||
|
||||
try {
|
||||
processor.afterPropertiesSet();
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertEquals("insecureKeyword required", expected.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void testSupports() {
|
||||
InsecureChannelProcessor processor = new InsecureChannelProcessor();
|
||||
assertTrue(processor.supports(
|
||||
new SecurityConfig("REQUIRES_INSECURE_CHANNEL")));
|
||||
assertFalse(processor.supports(null));
|
||||
assertFalse(processor.supports(new SecurityConfig("NOT_SUPPORTED")));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
/* Copyright 2004 Acegi Technology Pty Limited
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package net.sf.acegisecurity.securechannel;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import net.sf.acegisecurity.ConfigAttributeDefinition;
|
||||
import net.sf.acegisecurity.MockFilterChain;
|
||||
import net.sf.acegisecurity.MockHttpServletRequest;
|
||||
import net.sf.acegisecurity.MockHttpServletResponse;
|
||||
import net.sf.acegisecurity.SecurityConfig;
|
||||
import net.sf.acegisecurity.intercept.web.FilterInvocation;
|
||||
|
||||
|
||||
/**
|
||||
* Tests {@link SecureChannelProcessor}.
|
||||
*
|
||||
* @author Ben Alex
|
||||
* @version $Id$
|
||||
*/
|
||||
public class SecureChannelProcessorTests extends TestCase {
|
||||
//~ Methods ================================================================
|
||||
|
||||
public final void setUp() throws Exception {
|
||||
super.setUp();
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
junit.textui.TestRunner.run(SecureChannelProcessorTests.class);
|
||||
}
|
||||
|
||||
public void testDecideDetectsAcceptableChannel() throws Exception {
|
||||
ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
|
||||
cad.addConfigAttribute(new SecurityConfig("SOME_IGNORED_ATTRIBUTE"));
|
||||
cad.addConfigAttribute(new SecurityConfig("REQUIRES_SECURE_CHANNEL"));
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("info=true");
|
||||
request.setServerName("localhost");
|
||||
request.setContextPath("/bigapp");
|
||||
request.setServletPath("/servlet");
|
||||
request.setScheme("https");
|
||||
request.setServerPort(8443);
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
MockFilterChain chain = new MockFilterChain();
|
||||
FilterInvocation fi = new FilterInvocation(request, response, chain);
|
||||
|
||||
SecureChannelProcessor processor = new SecureChannelProcessor();
|
||||
processor.decide(fi, cad);
|
||||
|
||||
assertFalse(fi.getResponse().isCommitted());
|
||||
}
|
||||
|
||||
public void testDecideDetectsUnacceptableChannel()
|
||||
throws Exception {
|
||||
ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
|
||||
cad.addConfigAttribute(new SecurityConfig("SOME_IGNORED_ATTRIBUTE"));
|
||||
cad.addConfigAttribute(new SecurityConfig("REQUIRES_SECURE_CHANNEL"));
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("info=true");
|
||||
request.setServerName("localhost");
|
||||
request.setContextPath("/bigapp");
|
||||
request.setServletPath("/servlet");
|
||||
request.setScheme("http");
|
||||
request.setServerPort(8080);
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
MockFilterChain chain = new MockFilterChain();
|
||||
FilterInvocation fi = new FilterInvocation(request, response, chain);
|
||||
|
||||
SecureChannelProcessor processor = new SecureChannelProcessor();
|
||||
processor.decide(fi, cad);
|
||||
|
||||
assertTrue(fi.getResponse().isCommitted());
|
||||
}
|
||||
|
||||
public void testDecideRejectsNulls() throws Exception {
|
||||
SecureChannelProcessor processor = new SecureChannelProcessor();
|
||||
processor.afterPropertiesSet();
|
||||
|
||||
try {
|
||||
processor.decide(null, null);
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertTrue(true);
|
||||
}
|
||||
}
|
||||
|
||||
public void testGettersSetters() {
|
||||
SecureChannelProcessor processor = new SecureChannelProcessor();
|
||||
assertEquals("REQUIRES_SECURE_CHANNEL", processor.getSecureKeyword());
|
||||
processor.setSecureKeyword("X");
|
||||
assertEquals("X", processor.getSecureKeyword());
|
||||
|
||||
assertTrue(processor.getEntryPoint() != null);
|
||||
processor.setEntryPoint(null);
|
||||
assertTrue(processor.getEntryPoint() == null);
|
||||
}
|
||||
|
||||
public void testMissingEntryPoint() throws Exception {
|
||||
SecureChannelProcessor processor = new SecureChannelProcessor();
|
||||
processor.setEntryPoint(null);
|
||||
|
||||
try {
|
||||
processor.afterPropertiesSet();
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertEquals("entryPoint required", expected.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void testMissingSecureChannelKeyword() throws Exception {
|
||||
SecureChannelProcessor processor = new SecureChannelProcessor();
|
||||
processor.setSecureKeyword(null);
|
||||
|
||||
try {
|
||||
processor.afterPropertiesSet();
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertEquals("secureKeyword required", expected.getMessage());
|
||||
}
|
||||
|
||||
processor.setSecureKeyword("");
|
||||
|
||||
try {
|
||||
processor.afterPropertiesSet();
|
||||
fail("Should have thrown IllegalArgumentException");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
assertEquals("secureKeyword required", expected.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void testSupports() {
|
||||
SecureChannelProcessor processor = new SecureChannelProcessor();
|
||||
assertTrue(processor.supports(
|
||||
new SecurityConfig("REQUIRES_SECURE_CHANNEL")));
|
||||
assertFalse(processor.supports(null));
|
||||
assertFalse(processor.supports(new SecurityConfig("NOT_SUPPORTED")));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user