diff --git a/core/src/main/java/org/acegisecurity/ui/digestauth/DigestProcessingFilter.java b/core/src/main/java/org/acegisecurity/ui/digestauth/DigestProcessingFilter.java index 0aba78cbb5..a1a46162cf 100644 --- a/core/src/main/java/org/acegisecurity/ui/digestauth/DigestProcessingFilter.java +++ b/core/src/main/java/org/acegisecurity/ui/digestauth/DigestProcessingFilter.java @@ -404,20 +404,21 @@ public class DigestProcessingFilter implements Filter, InitializingBean, * response independently. Provided as a static method to * simplify the coding of user agents. * - * @param passwordAlreadyEncoded DOCUMENT ME! - * @param username DOCUMENT ME! - * @param realm DOCUMENT ME! - * @param password DOCUMENT ME! - * @param httpMethod DOCUMENT ME! - * @param uri DOCUMENT ME! - * @param qop DOCUMENT ME! - * @param nonce DOCUMENT ME! - * @param nc DOCUMENT ME! - * @param cnonce DOCUMENT ME! + * @param passwordAlreadyEncoded true if the password argument is already encoded in + * the correct format. False if it is plain text. + * @param username the user's login name. + * @param realm the name of the realm. + * @param password the user's password in plaintext or ready-encoded. + * @param httpMethod the HTTP request method (GET, POST etc.) + * @param uri the request URI. + * @param qop the qop directive, or null if not set. + * @param nonce the nonce supplied by the server + * @param nc the "nonce-count" as defined in RFC 2617. + * @param cnonce opaque string supplied by the client when qop is set. * * @return the MD5 of the digest authentication response, encoded in hex * - * @throws IllegalArgumentException DOCUMENT ME! + * @throws IllegalArgumentException if the supplied qop value is unsupported. */ public static String generateDigest(boolean passwordAlreadyEncoded, String username, String realm, String password, String httpMethod, diff --git a/core/src/test/java/org/acegisecurity/ui/basicauth/BasicProcessingFilterTests.java b/core/src/test/java/org/acegisecurity/ui/basicauth/BasicProcessingFilterTests.java index e205a0a9ff..4c7ee85a76 100644 --- a/core/src/test/java/org/acegisecurity/ui/basicauth/BasicProcessingFilterTests.java +++ b/core/src/test/java/org/acegisecurity/ui/basicauth/BasicProcessingFilterTests.java @@ -15,32 +15,37 @@ package org.acegisecurity.ui.basicauth; -import junit.framework.TestCase; - import org.acegisecurity.MockAuthenticationEntryPoint; import org.acegisecurity.MockAuthenticationManager; import org.acegisecurity.MockFilterConfig; +import org.acegisecurity.MockFilterChain; +import org.acegisecurity.providers.dao.DaoAuthenticationProvider; +import org.acegisecurity.providers.ProviderManager; import org.acegisecurity.context.SecurityContextHolder; import org.acegisecurity.context.SecurityContextImpl; import org.acegisecurity.userdetails.UserDetails; +import org.acegisecurity.userdetails.memory.InMemoryDaoImpl; +import org.acegisecurity.userdetails.memory.UserMapEditor; +import org.acegisecurity.userdetails.memory.UserMap; import org.apache.commons.codec.binary.Base64; -import org.springframework.context.ApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.ApplicationEvent; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockHttpSession; +import org.jmock.MockObjectTestCase; +import org.jmock.Mock; + import java.io.IOException; +import java.util.Arrays; import javax.servlet.Filter; import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; /** @@ -49,7 +54,8 @@ import javax.servlet.ServletResponse; * @author Ben Alex * @version $Id$ */ -public class BasicProcessingFilterTests extends TestCase { +public class BasicProcessingFilterTests extends MockObjectTestCase { + private BasicProcessingFilter filter; //~ Constructors =========================================================== public BasicProcessingFilterTests() { @@ -66,6 +72,34 @@ public class BasicProcessingFilterTests extends TestCase { junit.textui.TestRunner.run(BasicProcessingFilterTests.class); } + protected void setUp() throws Exception { + super.setUp(); + SecurityContextHolder.setContext(new SecurityContextImpl()); + + // Create User Details Service, provider and authentication manager + InMemoryDaoImpl dao = new InMemoryDaoImpl(); + UserMapEditor editor = new UserMapEditor(); + editor.setAsText("marissa=koala,ROLE_ONE,ROLE_TWO,enabled\r\n"); + dao.setUserMap((UserMap)editor.getValue()); + + DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); + provider.setUserDetailsService(dao); + + ProviderManager manager = new ProviderManager(); + manager.setProviders(Arrays.asList(new Object[] {provider})); + manager.setApplicationEventPublisher(new MockApplicationEventPublisher()); + manager.afterPropertiesSet(); + + filter = new BasicProcessingFilter(); + filter.setAuthenticationManager(manager); + filter.setAuthenticationEntryPoint(new BasicProcessingFilterEntryPoint()); + } + + protected void tearDown() throws Exception { + super.tearDown(); + SecurityContextHolder.setContext(new SecurityContextImpl()); + } + public void testDoFilterWithNonHttpServletRequestDetected() throws Exception { BasicProcessingFilter filter = new BasicProcessingFilter(); @@ -100,22 +134,8 @@ public class BasicProcessingFilterTests extends TestCase { MockHttpServletRequest request = new MockHttpServletRequest(); request.setServletPath("/some_file.html"); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/basicauth/filtertest-valid.xml"); - BasicProcessingFilter filter = (BasicProcessingFilter) ctx.getBean( - "basicProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + executeFilterInContainerSimulator(filter, request, true); assertNull(SecurityContextHolder.getContext().getAuthentication()); } @@ -140,22 +160,8 @@ public class BasicProcessingFilterTests extends TestCase { request.setServletPath("/some_file.html"); request.setSession(new MockHttpSession()); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/basicauth/filtertest-valid.xml"); - BasicProcessingFilter filter = (BasicProcessingFilter) ctx.getBean( - "basicProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + // The filter chain shouldn't proceed + executeFilterInContainerSimulator(filter, request, false); assertNull(SecurityContextHolder.getContext().getAuthentication()); } @@ -169,23 +175,9 @@ public class BasicProcessingFilterTests extends TestCase { request.setServletPath("/some_file.html"); request.setSession(new MockHttpSession()); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/basicauth/filtertest-valid.xml"); - BasicProcessingFilter filter = (BasicProcessingFilter) ctx.getBean( - "basicProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - // Test assertNull(SecurityContextHolder.getContext().getAuthentication()); - executeFilterInContainerSimulator(config, filter, request, response, - chain); + executeFilterInContainerSimulator(filter, request, true); assertNotNull(SecurityContextHolder.getContext().getAuthentication()); assertEquals("marissa", @@ -200,22 +192,8 @@ public class BasicProcessingFilterTests extends TestCase { request.addHeader("Authorization", "SOME_OTHER_AUTHENTICATION_SCHEME"); request.setServletPath("/some_file.html"); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/basicauth/filtertest-valid.xml"); - BasicProcessingFilter filter = (BasicProcessingFilter) ctx.getBean( - "basicProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + executeFilterInContainerSimulator(filter, request, true); assertNull(SecurityContextHolder.getContext().getAuthentication()); } @@ -237,8 +215,8 @@ public class BasicProcessingFilterTests extends TestCase { throws Exception { try { BasicProcessingFilter filter = new BasicProcessingFilter(); - filter.setAuthenticationEntryPoint(new MockAuthenticationEntryPoint( - "x")); + filter.setAuthenticationEntryPoint( + new MockAuthenticationEntryPoint("x")); filter.afterPropertiesSet(); fail("Should have thrown IllegalArgumentException"); } catch (IllegalArgumentException expected) { @@ -257,22 +235,8 @@ public class BasicProcessingFilterTests extends TestCase { request.setServletPath("/some_file.html"); request.setSession(new MockHttpSession()); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/basicauth/filtertest-valid.xml"); - BasicProcessingFilter filter = (BasicProcessingFilter) ctx.getBean( - "basicProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + executeFilterInContainerSimulator(filter, request, true); assertNotNull(SecurityContextHolder.getContext().getAuthentication()); assertEquals("marissa", @@ -288,13 +252,9 @@ public class BasicProcessingFilterTests extends TestCase { request.setServletPath("/some_file.html"); request.setSession(new MockHttpSession()); - // Setup our expectation that the filter chain will not be invoked, as we get a 403 forbidden response - chain = new MockFilterChain(false); - response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + // Test - the filter chain will not be invoked, as we get a 403 forbidden response + MockHttpServletResponse response = + executeFilterInContainerSimulator(filter, request, false); assertNull(SecurityContextHolder.getContext().getAuthentication()); assertEquals(401, response.getStatus()); @@ -309,65 +269,36 @@ public class BasicProcessingFilterTests extends TestCase { request.setServletPath("/some_file.html"); request.setSession(new MockHttpSession()); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/basicauth/filtertest-valid.xml"); - BasicProcessingFilter filter = (BasicProcessingFilter) ctx.getBean( - "basicProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will not be invoked, as we get a 403 forbidden response - MockFilterChain chain = new MockFilterChain(false); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + // Test - the filter chain will not be invoked, as we get a 403 forbidden response + MockHttpServletResponse response = + executeFilterInContainerSimulator(filter, request, false); assertNull(SecurityContextHolder.getContext().getAuthentication()); assertEquals(401, response.getStatus()); } - protected void setUp() throws Exception { - super.setUp(); - SecurityContextHolder.setContext(new SecurityContextImpl()); - } + private MockHttpServletResponse executeFilterInContainerSimulator(Filter filter, + ServletRequest request, boolean expectChainToProceed) + throws ServletException, IOException { + filter.init(new MockFilterConfig()); + MockHttpServletResponse response = new MockHttpServletResponse(); + Mock mockChain = mock(FilterChain.class); + FilterChain chain = (FilterChain)mockChain.proxy(); - protected void tearDown() throws Exception { - super.tearDown(); - SecurityContextHolder.setContext(new SecurityContextImpl()); - } + mockChain.expects( expectChainToProceed ? once() : never() ).method("doFilter"); - private void executeFilterInContainerSimulator(FilterConfig filterConfig, - Filter filter, ServletRequest request, ServletResponse response, - FilterChain filterChain) throws ServletException, IOException { - filter.init(filterConfig); - filter.doFilter(request, response, filterChain); + filter.doFilter(request, response, chain); filter.destroy(); + + return response; } - //~ Inner Classes ========================================================== + private class MockApplicationEventPublisher implements ApplicationEventPublisher { - private class MockFilterChain implements FilterChain { - private boolean expectToProceed; + public MockApplicationEventPublisher() { + } - public MockFilterChain(boolean expectToProceed) { - this.expectToProceed = expectToProceed; - } - - private MockFilterChain() { - super(); - } - - public void doFilter(ServletRequest request, ServletResponse response) - throws IOException, ServletException { - if (expectToProceed) { - assertTrue(true); - } else { - fail("Did not expect filter chain to proceed"); - } - } + public void publishEvent(ApplicationEvent event) { + } } } diff --git a/core/src/test/java/org/acegisecurity/ui/digestauth/DigestProcessingFilterTests.java b/core/src/test/java/org/acegisecurity/ui/digestauth/DigestProcessingFilterTests.java index 617c9ea625..e85d89f652 100644 --- a/core/src/test/java/org/acegisecurity/ui/digestauth/DigestProcessingFilterTests.java +++ b/core/src/test/java/org/acegisecurity/ui/digestauth/DigestProcessingFilterTests.java @@ -15,56 +15,63 @@ package org.acegisecurity.ui.digestauth; -import junit.framework.TestCase; - -import org.acegisecurity.DisabledException; import org.acegisecurity.MockFilterConfig; - +import org.acegisecurity.MockFilterChain; import org.acegisecurity.context.SecurityContextHolder; import org.acegisecurity.context.SecurityContextImpl; - -import org.acegisecurity.providers.dao.UserCache; - -import org.acegisecurity.userdetails.UserDetailsService; +import org.acegisecurity.providers.dao.cache.NullUserCache; import org.acegisecurity.userdetails.UserDetails; -import org.acegisecurity.userdetails.UsernameNotFoundException; +import org.acegisecurity.userdetails.memory.InMemoryDaoImpl; +import org.acegisecurity.userdetails.memory.UserMapEditor; +import org.acegisecurity.userdetails.memory.UserMap; import org.acegisecurity.util.StringSplitUtils; import org.apache.commons.codec.binary.Base64; - -import org.springframework.context.ApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - -import org.springframework.dao.DataAccessException; +import org.apache.commons.codec.digest.DigestUtils; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; - import org.springframework.util.StringUtils; -import java.io.IOException; +import org.jmock.MockObjectTestCase; +import org.jmock.Mock; +import java.io.IOException; import java.util.Map; import javax.servlet.Filter; import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; - /** * Tests {@link DigestProcessingFilter}. * * @author Ben Alex + * @author Luke Taylor * @version $Id$ */ -public class DigestProcessingFilterTests extends TestCase { +public class DigestProcessingFilterTests extends MockObjectTestCase { + private static final String NC = "00000002"; + private static final String CNONCE = "c822c727a648aba7"; + private static final String REALM = "The Correct Realm Name"; + private static final String KEY = "acegi"; + private static final String QOP = "auth"; + private static final String USERNAME = "marissa"; + private static final String PASSWORD = "koala"; + private static final String REQUEST_URI = "/some_file.html"; + /** A standard valid nonce with a validity period of 60 seconds */ + private static final String NONCE = generateNonce(60); + + + //~ Instance Fields ======================================================== +// private ApplicationContext ctx; + private DigestProcessingFilter filter; + private MockHttpServletRequest request; + //~ Constructors =========================================================== public DigestProcessingFilterTests() { - super(); } public DigestProcessingFilterTests(String arg0) { @@ -77,6 +84,32 @@ public class DigestProcessingFilterTests extends TestCase { junit.textui.TestRunner.run(DigestProcessingFilterTests.class); } + protected void setUp() throws Exception { + super.setUp(); + SecurityContextHolder.setContext(new SecurityContextImpl()); + // Create User Details Service + InMemoryDaoImpl dao = new InMemoryDaoImpl(); + UserMapEditor editor = new UserMapEditor(); + editor.setAsText("marissa=koala,ROLE_ONE,ROLE_TWO,enabled\r\n"); + dao.setUserMap((UserMap)editor.getValue()); + + DigestProcessingFilterEntryPoint ep = new DigestProcessingFilterEntryPoint(); + ep.setRealmName(REALM); + ep.setKey(KEY); + + filter = new DigestProcessingFilter(); + filter.setUserDetailsService(dao); + filter.setAuthenticationEntryPoint(ep); + + request = new MockHttpServletRequest("GET", REQUEST_URI); + request.setServletPath(REQUEST_URI); + } + + protected void tearDown() throws Exception { + super.tearDown(); + SecurityContextHolder.setContext(new SecurityContextImpl()); + } + public void testDoFilterWithNonHttpServletRequestDetected() throws Exception { DigestProcessingFilter filter = new DigestProcessingFilter(); @@ -107,43 +140,18 @@ public class DigestProcessingFilterTests extends TestCase { public void testExpiredNonceReturnsForbiddenWithStaleHeader() throws Exception { - Map responseHeaderMap = generateValidHeaders(0); - String username = "marissa"; - String realm = (String) responseHeaderMap.get("realm"); - String nonce = (String) responseHeaderMap.get("nonce"); - String uri = "/some_file.html"; - String qop = (String) responseHeaderMap.get("qop"); - String nc = "00000002"; - String cnonce = "c822c727a648aba7"; - String password = "koala"; + String nonce = generateNonce(0); String responseDigest = DigestProcessingFilter.generateDigest(false, - username, realm, password, "GET", uri, qop, nonce, nc, cnonce); + USERNAME, REALM, PASSWORD, "GET", REQUEST_URI, QOP, nonce, NC, CNONCE); - // Setup our HTTP request - MockHttpServletRequest request = new MockHttpServletRequest("GET", uri); request.addHeader("Authorization", - createAuthorizationHeader(username, realm, nonce, uri, - responseDigest, qop, nc, cnonce)); - request.setServletPath("/some_file.html"); + createAuthorizationHeader(USERNAME, REALM, nonce, REQUEST_URI, + responseDigest, QOP, NC, CNONCE)); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean( - "digestProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test Thread.sleep(1000); // ensures token expired - executeFilterInContainerSimulator(config, filter, request, response, - chain); + MockHttpServletResponse response = + executeFilterInContainerSimulator(filter, request, false); assertNull(SecurityContextHolder.getContext().getAuthentication()); assertEquals(401, response.getStatus()); @@ -158,33 +166,15 @@ public class DigestProcessingFilterTests extends TestCase { public void testFilterIgnoresRequestsContainingNoAuthorizationHeader() throws Exception { - // Setup our HTTP request - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setServletPath("/some_file.html"); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean( - "digestProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + executeFilterInContainerSimulator(filter, request, true); assertNull(SecurityContextHolder.getContext().getAuthentication()); } public void testGettersSetters() { DigestProcessingFilter filter = new DigestProcessingFilter(); - filter.setUserDetailsService(new MockAuthenticationDao()); + filter.setUserDetailsService(new InMemoryDaoImpl()); assertTrue(filter.getUserDetailsService() != null); filter.setAuthenticationEntryPoint(new DigestProcessingFilterEntryPoint()); @@ -192,63 +182,29 @@ public class DigestProcessingFilterTests extends TestCase { filter.setUserCache(null); assertNull(filter.getUserCache()); - filter.setUserCache(new MockUserCache()); + filter.setUserCache(new NullUserCache()); assertNotNull(filter.getUserCache()); } public void testInvalidDigestAuthorizationTokenGeneratesError() throws Exception { - // Setup our HTTP request String token = "NOT_A_VALID_TOKEN_AS_MISSING_COLON"; - MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("Authorization", "Digest " + new String(Base64.encodeBase64(token.getBytes()))); - request.setServletPath("/some_file.html"); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean( - "digestProcessingFilter"); + MockHttpServletResponse response = + executeFilterInContainerSimulator(filter, request, false); - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(false); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); assertEquals(401, response.getStatus()); - assertNull(SecurityContextHolder.getContext().getAuthentication()); } public void testMalformedHeaderReturnsForbidden() throws Exception { - // Setup our HTTP request - MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("Authorization", "Digest scsdcsdc"); - request.setServletPath("/some_file.html"); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean( - "digestProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + MockHttpServletResponse response = + executeFilterInContainerSimulator(filter, request, false); assertNull(SecurityContextHolder.getContext().getAuthentication()); assertEquals(401, response.getStatus()); @@ -256,42 +212,17 @@ public class DigestProcessingFilterTests extends TestCase { public void testNonBase64EncodedNonceReturnsForbidden() throws Exception { - Map responseHeaderMap = generateValidHeaders(60); - - String username = "marissa"; - String realm = (String) responseHeaderMap.get("realm"); String nonce = "NOT_BASE_64_ENCODED"; - String uri = "/some_file.html"; - String qop = (String) responseHeaderMap.get("qop"); - String nc = "00000002"; - String cnonce = "c822c727a648aba7"; - String password = "koala"; + String responseDigest = DigestProcessingFilter.generateDigest(false, - username, realm, password, "GET", uri, qop, nonce, nc, cnonce); + USERNAME, REALM, PASSWORD, "GET", REQUEST_URI, QOP, nonce, NC, CNONCE); - // Setup our HTTP request - MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("Authorization", - createAuthorizationHeader(username, realm, nonce, uri, - responseDigest, qop, nc, cnonce)); - request.setServletPath("/some_file.html"); + createAuthorizationHeader(USERNAME, REALM, nonce, REQUEST_URI, + responseDigest, QOP, NC, CNONCE)); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean( - "digestProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + MockHttpServletResponse response = + executeFilterInContainerSimulator(filter, request, false); assertNull(SecurityContextHolder.getContext().getAuthentication()); assertEquals(401, response.getStatus()); @@ -299,43 +230,18 @@ public class DigestProcessingFilterTests extends TestCase { public void testNonceWithIncorrectSignatureForNumericFieldReturnsForbidden() throws Exception { - Map responseHeaderMap = generateValidHeaders(60); - String username = "marissa"; - String realm = (String) responseHeaderMap.get("realm"); String nonce = new String(Base64.encodeBase64( "123456:incorrectStringPassword".getBytes())); - String uri = "/some_file.html"; - String qop = (String) responseHeaderMap.get("qop"); - String nc = "00000002"; - String cnonce = "c822c727a648aba7"; - String password = "koala"; String responseDigest = DigestProcessingFilter.generateDigest(false, - username, realm, password, "GET", uri, qop, nonce, nc, cnonce); + USERNAME, REALM, PASSWORD, "GET", REQUEST_URI, QOP, nonce, NC, CNONCE); - // Setup our HTTP request - MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("Authorization", - createAuthorizationHeader(username, realm, nonce, uri, - responseDigest, qop, nc, cnonce)); - request.setServletPath("/some_file.html"); + createAuthorizationHeader(USERNAME, REALM, nonce, REQUEST_URI, + responseDigest, QOP, NC, CNONCE)); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean( - "digestProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(false); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + MockHttpServletResponse response = + executeFilterInContainerSimulator(filter, request, false); assertNull(SecurityContextHolder.getContext().getAuthentication()); assertEquals(401, response.getStatus()); @@ -343,43 +249,18 @@ public class DigestProcessingFilterTests extends TestCase { public void testNonceWithNonNumericFirstElementReturnsForbidden() throws Exception { - Map responseHeaderMap = generateValidHeaders(60); - String username = "marissa"; - String realm = (String) responseHeaderMap.get("realm"); String nonce = new String(Base64.encodeBase64( "hello:ignoredSecondElement".getBytes())); - String uri = "/some_file.html"; - String qop = (String) responseHeaderMap.get("qop"); - String nc = "00000002"; - String cnonce = "c822c727a648aba7"; - String password = "koala"; String responseDigest = DigestProcessingFilter.generateDigest(false, - username, realm, password, "GET", uri, qop, nonce, nc, cnonce); + USERNAME, REALM, PASSWORD, "GET", REQUEST_URI, QOP, nonce, NC, CNONCE); - // Setup our HTTP request - MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("Authorization", - createAuthorizationHeader(username, realm, nonce, uri, - responseDigest, qop, nc, cnonce)); - request.setServletPath("/some_file.html"); + createAuthorizationHeader(USERNAME, REALM, nonce, REQUEST_URI, + responseDigest, QOP, NC, CNONCE)); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean( - "digestProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + MockHttpServletResponse response = + executeFilterInContainerSimulator(filter, request, false); assertNull(SecurityContextHolder.getContext().getAuthentication()); assertEquals(401, response.getStatus()); @@ -387,43 +268,18 @@ public class DigestProcessingFilterTests extends TestCase { public void testNonceWithoutTwoColonSeparatedElementsReturnsForbidden() throws Exception { - Map responseHeaderMap = generateValidHeaders(60); - String username = "marissa"; - String realm = (String) responseHeaderMap.get("realm"); String nonce = new String(Base64.encodeBase64( "a base 64 string without a colon".getBytes())); - String uri = "/some_file.html"; - String qop = (String) responseHeaderMap.get("qop"); - String nc = "00000002"; - String cnonce = "c822c727a648aba7"; - String password = "koala"; String responseDigest = DigestProcessingFilter.generateDigest(false, - username, realm, password, "GET", uri, qop, nonce, nc, cnonce); + USERNAME, REALM, PASSWORD, "GET", REQUEST_URI, QOP, nonce, NC, CNONCE); - // Setup our HTTP request - MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("Authorization", - createAuthorizationHeader(username, realm, nonce, uri, - responseDigest, qop, nc, cnonce)); - request.setServletPath("/some_file.html"); + createAuthorizationHeader(USERNAME, REALM, nonce, REQUEST_URI, + responseDigest, QOP, NC, CNONCE)); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean( - "digestProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + MockHttpServletResponse response = + executeFilterInContainerSimulator(filter, request, false); assertNull(SecurityContextHolder.getContext().getAuthentication()); assertEquals(401, response.getStatus()); @@ -431,118 +287,48 @@ public class DigestProcessingFilterTests extends TestCase { public void testNormalOperationWhenPasswordIsAlreadyEncoded() throws Exception { - Map responseHeaderMap = generateValidHeaders(60); - String username = "marissa"; - String realm = (String) responseHeaderMap.get("realm"); - String nonce = (String) responseHeaderMap.get("nonce"); - String uri = "/some_file.html"; - String qop = (String) responseHeaderMap.get("qop"); - String nc = "00000002"; - String cnonce = "c822c727a648aba7"; - String password = DigestProcessingFilter.encodePasswordInA1Format(username, - realm, "koala"); + String encodedPassword = DigestProcessingFilter.encodePasswordInA1Format(USERNAME, + REALM, PASSWORD); String responseDigest = DigestProcessingFilter.generateDigest(true, - username, realm, password, "GET", uri, qop, nonce, nc, cnonce); + USERNAME, REALM, encodedPassword, "GET", REQUEST_URI, QOP, NONCE, NC, CNONCE); - // Setup our HTTP request - MockHttpServletRequest request = new MockHttpServletRequest("GET", uri); request.addHeader("Authorization", - createAuthorizationHeader(username, realm, nonce, uri, - responseDigest, qop, nc, cnonce)); - request.setServletPath("/some_file.html"); + createAuthorizationHeader(USERNAME, REALM, NONCE, REQUEST_URI, + responseDigest, QOP, NC, CNONCE)); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean( - "digestProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + executeFilterInContainerSimulator(filter, request, true); assertNotNull(SecurityContextHolder.getContext().getAuthentication()); - assertEquals("marissa", + assertEquals(USERNAME, ((UserDetails) SecurityContextHolder.getContext().getAuthentication() .getPrincipal()).getUsername()); } public void testNormalOperationWhenPasswordNotAlreadyEncoded() throws Exception { - Map responseHeaderMap = generateValidHeaders(60); - String username = "marissa"; - String realm = (String) responseHeaderMap.get("realm"); - String nonce = (String) responseHeaderMap.get("nonce"); - String uri = "/some_file.html"; - String qop = (String) responseHeaderMap.get("qop"); - String nc = "00000002"; - String cnonce = "c822c727a648aba7"; - String password = "koala"; String responseDigest = DigestProcessingFilter.generateDigest(false, - username, realm, password, "GET", uri, qop, nonce, nc, cnonce); + USERNAME, REALM, PASSWORD, "GET", REQUEST_URI, QOP, NONCE, NC, CNONCE); - // Setup our HTTP request - MockHttpServletRequest request = new MockHttpServletRequest("GET", uri); request.addHeader("Authorization", - createAuthorizationHeader(username, realm, nonce, uri, - responseDigest, qop, nc, cnonce)); - request.setServletPath("/some_file.html"); + createAuthorizationHeader(USERNAME, REALM, NONCE, REQUEST_URI, + responseDigest, QOP, NC, CNONCE)); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean( - "digestProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + executeFilterInContainerSimulator(filter, request, true); assertNotNull(SecurityContextHolder.getContext().getAuthentication()); - assertEquals("marissa", + assertEquals(USERNAME, ((UserDetails) SecurityContextHolder.getContext().getAuthentication() .getPrincipal()).getUsername()); } public void testOtherAuthorizationSchemeIsIgnored() throws Exception { - // Setup our HTTP request - MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader("Authorization", "SOME_OTHER_AUTHENTICATION_SCHEME"); - request.setServletPath("/some_file.html"); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean( - "digestProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + executeFilterInContainerSimulator(filter, request, true); assertNull(SecurityContextHolder.getContext().getAuthentication()); } @@ -564,7 +350,7 @@ public class DigestProcessingFilterTests extends TestCase { throws Exception { try { DigestProcessingFilter filter = new DigestProcessingFilter(); - filter.setUserDetailsService(new MockAuthenticationDao()); + filter.setUserDetailsService(new InMemoryDaoImpl()); filter.afterPropertiesSet(); fail("Should have thrown IllegalArgumentException"); } catch (IllegalArgumentException expected) { @@ -573,58 +359,30 @@ public class DigestProcessingFilterTests extends TestCase { } } - public void testSuccessLoginThenFailureLoginResultsInSessionLoosingToken() + public void testSuccessLoginThenFailureLoginResultsInSessionLosingToken() throws Exception { - Map responseHeaderMap = generateValidHeaders(60); - String username = "marissa"; - String realm = (String) responseHeaderMap.get("realm"); - String nonce = (String) responseHeaderMap.get("nonce"); - String uri = "/some_file.html"; - String qop = (String) responseHeaderMap.get("qop"); - String nc = "00000002"; - String cnonce = "c822c727a648aba7"; - String password = "koala"; String responseDigest = DigestProcessingFilter.generateDigest(false, - username, realm, password, "GET", uri, qop, nonce, nc, cnonce); + USERNAME, REALM, PASSWORD, "GET", REQUEST_URI, QOP, NONCE, NC, CNONCE); - // Setup our HTTP request - MockHttpServletRequest request = new MockHttpServletRequest("GET", uri); request.addHeader("Authorization", - createAuthorizationHeader(username, realm, nonce, uri, - responseDigest, qop, nc, cnonce)); - request.setServletPath("/some_file.html"); + createAuthorizationHeader(USERNAME, REALM, NONCE, REQUEST_URI, + responseDigest, QOP, NC, CNONCE)); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean( - "digestProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + executeFilterInContainerSimulator(filter, request, true); assertNotNull(SecurityContextHolder.getContext().getAuthentication()); // Now retry, giving an invalid nonce - password = "WRONG_PASSWORD"; - responseDigest = DigestProcessingFilter.generateDigest(false, username, - realm, password, "GET", uri, qop, nonce, nc, cnonce); + responseDigest = DigestProcessingFilter.generateDigest(false, USERNAME, + REALM, "WRONG_PASSWORD", "GET", REQUEST_URI, QOP, NONCE, NC, CNONCE); request = new MockHttpServletRequest(); request.addHeader("Authorization", - createAuthorizationHeader(username, realm, nonce, uri, - responseDigest, qop, nc, cnonce)); - executeFilterInContainerSimulator(config, filter, request, response, - chain); + createAuthorizationHeader(USERNAME, REALM, NONCE, REQUEST_URI, + responseDigest, QOP, NC, CNONCE)); + MockHttpServletResponse response = + executeFilterInContainerSimulator(filter, request, false); // Check we lost our previous authentication assertNull(SecurityContextHolder.getContext().getAuthentication()); @@ -633,263 +391,104 @@ public class DigestProcessingFilterTests extends TestCase { public void testWrongCnonceBasedOnDigestReturnsForbidden() throws Exception { - Map responseHeaderMap = generateValidHeaders(60); - String username = "marissa"; - String realm = (String) responseHeaderMap.get("realm"); - String nonce = (String) responseHeaderMap.get("nonce"); - String uri = "/some_file.html"; - String qop = (String) responseHeaderMap.get("qop"); - String nc = "00000002"; String cnonce = "NOT_SAME_AS_USED_FOR_DIGEST_COMPUTATION"; - String password = "koala"; + String responseDigest = DigestProcessingFilter.generateDigest(false, - username, realm, password, "GET", uri, qop, nonce, nc, + USERNAME, REALM, PASSWORD, "GET", REQUEST_URI, QOP, NONCE, NC, "DIFFERENT_CNONCE"); - // Setup our HTTP request - MockHttpServletRequest request = new MockHttpServletRequest("GET", uri); request.addHeader("Authorization", - createAuthorizationHeader(username, realm, nonce, uri, - responseDigest, qop, nc, cnonce)); - request.setServletPath("/some_file.html"); + createAuthorizationHeader(USERNAME, REALM, NONCE, REQUEST_URI, + responseDigest, QOP, NC, cnonce)); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean( - "digestProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + MockHttpServletResponse response = + executeFilterInContainerSimulator(filter, request, false); assertNull(SecurityContextHolder.getContext().getAuthentication()); assertEquals(401, response.getStatus()); } public void testWrongDigestReturnsForbidden() throws Exception { - Map responseHeaderMap = generateValidHeaders(60); - String username = "marissa"; - String realm = (String) responseHeaderMap.get("realm"); - String nonce = (String) responseHeaderMap.get("nonce"); - String uri = "/some_file.html"; - String qop = (String) responseHeaderMap.get("qop"); - String nc = "00000002"; - String cnonce = "c822c727a648aba7"; String password = "WRONG_PASSWORD"; String responseDigest = DigestProcessingFilter.generateDigest(false, - username, realm, password, "GET", uri, qop, nonce, nc, cnonce); + USERNAME, REALM, password, "GET", REQUEST_URI, QOP, NONCE, NC, + CNONCE); - // Setup our HTTP request - MockHttpServletRequest request = new MockHttpServletRequest("GET", uri); request.addHeader("Authorization", - createAuthorizationHeader(username, realm, nonce, uri, - responseDigest, qop, nc, cnonce)); - request.setServletPath("/some_file.html"); + createAuthorizationHeader(USERNAME, REALM, NONCE, REQUEST_URI, + responseDigest, QOP, NC, CNONCE)); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean( - "digestProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + MockHttpServletResponse response = + executeFilterInContainerSimulator(filter, request, false); assertNull(SecurityContextHolder.getContext().getAuthentication()); assertEquals(401, response.getStatus()); } public void testWrongRealmReturnsForbidden() throws Exception { - Map responseHeaderMap = generateValidHeaders(60); - - String username = "marissa"; String realm = "WRONG_REALM"; - String nonce = (String) responseHeaderMap.get("nonce"); - String uri = "/some_file.html"; - String qop = (String) responseHeaderMap.get("qop"); - String nc = "00000002"; - String cnonce = "c822c727a648aba7"; - String password = "koala"; String responseDigest = DigestProcessingFilter.generateDigest(false, - username, realm, password, "GET", uri, qop, nonce, nc, cnonce); + USERNAME, realm, PASSWORD, "GET", REQUEST_URI, QOP, NONCE, NC, + CNONCE); - // Setup our HTTP request - MockHttpServletRequest request = new MockHttpServletRequest("GET", uri); request.addHeader("Authorization", - createAuthorizationHeader(username, realm, nonce, uri, - responseDigest, qop, nc, cnonce)); - request.setServletPath("/some_file.html"); + createAuthorizationHeader(USERNAME, realm, NONCE, REQUEST_URI, + responseDigest, QOP, NC, CNONCE)); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean( - "digestProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + MockHttpServletResponse response = + executeFilterInContainerSimulator(filter, request, false); assertNull(SecurityContextHolder.getContext().getAuthentication()); assertEquals(401, response.getStatus()); } public void testWrongUsernameReturnsForbidden() throws Exception { - Map responseHeaderMap = generateValidHeaders(60); - - String username = "NOT_A_KNOWN_USER"; - String realm = (String) responseHeaderMap.get("realm"); - String nonce = (String) responseHeaderMap.get("nonce"); - String uri = "/some_file.html"; - String qop = (String) responseHeaderMap.get("qop"); - String nc = "00000002"; - String cnonce = "c822c727a648aba7"; - String password = "koala"; String responseDigest = DigestProcessingFilter.generateDigest(false, - username, realm, password, "GET", uri, qop, nonce, nc, cnonce); + "NOT_A_KNOWN_USER", REALM, PASSWORD, "GET", REQUEST_URI, QOP, NONCE, NC, + CNONCE); - // Setup our HTTP request - MockHttpServletRequest request = new MockHttpServletRequest("GET", uri); request.addHeader("Authorization", - createAuthorizationHeader(username, realm, nonce, uri, - responseDigest, qop, nc, cnonce)); - request.setServletPath("/some_file.html"); + createAuthorizationHeader(USERNAME, REALM, NONCE, REQUEST_URI, + responseDigest, QOP, NC, CNONCE)); - // Launch an application context and access our bean - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilter filter = (DigestProcessingFilter) ctx.getBean( - "digestProcessingFilter"); - - // Setup our filter configuration - MockFilterConfig config = new MockFilterConfig(); - - // Setup our expectation that the filter chain will be invoked - MockFilterChain chain = new MockFilterChain(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - - // Test - executeFilterInContainerSimulator(config, filter, request, response, - chain); + MockHttpServletResponse response = + executeFilterInContainerSimulator(filter, request, false); assertNull(SecurityContextHolder.getContext().getAuthentication()); assertEquals(401, response.getStatus()); } - protected void setUp() throws Exception { - super.setUp(); - SecurityContextHolder.setContext(new SecurityContextImpl()); - } - - protected void tearDown() throws Exception { - super.tearDown(); - SecurityContextHolder.setContext(new SecurityContextImpl()); - } - private String createAuthorizationHeader(String username, String realm, - String nonce, String uri, String responseDigest, String qop, String nc, - String cnonce) { + String nonce, String uri, String responseDigest, String qop, String nc, + String cnonce) { return "Digest username=\"" + username + "\", realm=\"" + realm + "\", nonce=\"" + nonce + "\", uri=\"" + uri + "\", response=\"" + responseDigest + "\", qop=" + qop + ", nc=" + nc + ", cnonce=\"" + cnonce + "\""; } - private void executeFilterInContainerSimulator(FilterConfig filterConfig, - Filter filter, ServletRequest request, ServletResponse response, - FilterChain filterChain) throws ServletException, IOException { - filter.init(filterConfig); - filter.doFilter(request, response, filterChain); - filter.destroy(); - } - - private Map generateValidHeaders(int nonceValidityPeriod) - throws Exception { - ApplicationContext ctx = new ClassPathXmlApplicationContext( - "org/acegisecurity/ui/digestauth/filtertest-valid.xml"); - DigestProcessingFilterEntryPoint ep = (DigestProcessingFilterEntryPoint) ctx - .getBean("digestProcessingFilterEntryPoint"); - ep.setNonceValiditySeconds(nonceValidityPeriod); - - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setRequestURI("/some_path"); - + private MockHttpServletResponse executeFilterInContainerSimulator(Filter filter, + ServletRequest request, boolean expectChainToProceed) + throws ServletException, IOException { + filter.init(new MockFilterConfig()); MockHttpServletResponse response = new MockHttpServletResponse(); + Mock mockChain = mock(FilterChain.class); + FilterChain chain = (FilterChain)mockChain.proxy(); - ep.commence(request, response, new DisabledException("foobar")); + mockChain.expects( expectChainToProceed ? once() : never() ).method("doFilter"); - // Break up response header - String header = response.getHeader("WWW-Authenticate").toString() - .substring(7); - String[] headerEntries = StringUtils.commaDelimitedListToStringArray(header); - Map headerMap = StringSplitUtils.splitEachArrayElementAndCreateMap(headerEntries, - "=", "\""); + filter.doFilter(request, response, chain); + filter.destroy(); - return headerMap; + return response; } - //~ Inner Classes ========================================================== - - private class MockAuthenticationDao implements UserDetailsService { - public UserDetails loadUserByUsername(String username) - throws UsernameNotFoundException, DataAccessException { - return null; - } - } - - private class MockFilterChain implements FilterChain { - private boolean expectToProceed; - - public MockFilterChain(boolean expectToProceed) { - this.expectToProceed = expectToProceed; - } - - private MockFilterChain() { - super(); - } - - public void doFilter(ServletRequest request, ServletResponse response) - throws IOException, ServletException { - if (expectToProceed) { - assertTrue(true); - } else { - fail("Did not expect filter chain to proceed"); - } - } - } - - private class MockUserCache implements UserCache { - public UserDetails getUserFromCache(String username) { - return null; - } - - public void putUserInCache(UserDetails user) {} - - public void removeUserFromCache(String username) {} + private static String generateNonce(int validitySeconds) { + long expiryTime = System.currentTimeMillis() + (validitySeconds * 1000); + String signatureValue = new String(DigestUtils.md5Hex(expiryTime + ":" + KEY)); + String nonceValue = expiryTime + ":" + signatureValue; + return new String(Base64.encodeBase64( nonceValue.getBytes() )); } } diff --git a/core/src/test/resources/org/acegisecurity/ui/basicauth/filtertest-valid.xml b/core/src/test/resources/org/acegisecurity/ui/basicauth/filtertest-valid.xml deleted file mode 100644 index 6fa46f1922..0000000000 --- a/core/src/test/resources/org/acegisecurity/ui/basicauth/filtertest-valid.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - marissa=koala,ROLE_TELLER,ROLE_SUPERVISOR - dianne=emu,ROLE_TELLER - scott=wombat,ROLE_TELLER - peter=opal,disabled,ROLE_TELLER - - - - - - - - - - - - - - - - - - - - - - - - - Test Suite Realm - - - diff --git a/core/src/test/resources/org/acegisecurity/ui/digestauth/filtertest-valid.xml b/core/src/test/resources/org/acegisecurity/ui/digestauth/filtertest-valid.xml deleted file mode 100644 index ecf999fa39..0000000000 --- a/core/src/test/resources/org/acegisecurity/ui/digestauth/filtertest-valid.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - marissa=koala,ROLE_TELLER,ROLE_SUPERVISOR - dianne=emu,ROLE_TELLER - scott=wombat,ROLE_TELLER - peter=opal,disabled,ROLE_TELLER - - - - - - - - - - - - - - - - - - - - - - - - - Contacts Realm via Digest Authentication - acegi - 1000 - - -