|
@@ -20,11 +20,14 @@ import junit.framework.TestCase;
|
|
import org.acegisecurity.DisabledException;
|
|
import org.acegisecurity.DisabledException;
|
|
import org.acegisecurity.MockFilterConfig;
|
|
import org.acegisecurity.MockFilterConfig;
|
|
import org.acegisecurity.UserDetails;
|
|
import org.acegisecurity.UserDetails;
|
|
|
|
+
|
|
import org.acegisecurity.context.SecurityContextHolder;
|
|
import org.acegisecurity.context.SecurityContextHolder;
|
|
import org.acegisecurity.context.SecurityContextImpl;
|
|
import org.acegisecurity.context.SecurityContextImpl;
|
|
|
|
+
|
|
import org.acegisecurity.providers.dao.AuthenticationDao;
|
|
import org.acegisecurity.providers.dao.AuthenticationDao;
|
|
import org.acegisecurity.providers.dao.UserCache;
|
|
import org.acegisecurity.providers.dao.UserCache;
|
|
import org.acegisecurity.providers.dao.UsernameNotFoundException;
|
|
import org.acegisecurity.providers.dao.UsernameNotFoundException;
|
|
|
|
+
|
|
import org.acegisecurity.util.StringSplitUtils;
|
|
import org.acegisecurity.util.StringSplitUtils;
|
|
|
|
|
|
import org.apache.commons.codec.binary.Base64;
|
|
import org.apache.commons.codec.binary.Base64;
|
|
@@ -114,8 +117,8 @@ public class DigestProcessingFilterTests extends TestCase {
|
|
String nc = "00000002";
|
|
String nc = "00000002";
|
|
String cnonce = "c822c727a648aba7";
|
|
String cnonce = "c822c727a648aba7";
|
|
String password = "koala";
|
|
String password = "koala";
|
|
- String responseDigest = DigestProcessingFilter.generateDigest(username,
|
|
|
|
- realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
+ String responseDigest = DigestProcessingFilter.generateDigest(false,
|
|
|
|
+ username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
// Setup our HTTP request
|
|
// Setup our HTTP request
|
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
|
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
|
|
@@ -263,8 +266,8 @@ public class DigestProcessingFilterTests extends TestCase {
|
|
String nc = "00000002";
|
|
String nc = "00000002";
|
|
String cnonce = "c822c727a648aba7";
|
|
String cnonce = "c822c727a648aba7";
|
|
String password = "koala";
|
|
String password = "koala";
|
|
- String responseDigest = DigestProcessingFilter.generateDigest(username,
|
|
|
|
- realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
+ String responseDigest = DigestProcessingFilter.generateDigest(false,
|
|
|
|
+ username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
// Setup our HTTP request
|
|
// Setup our HTTP request
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
@@ -307,8 +310,8 @@ public class DigestProcessingFilterTests extends TestCase {
|
|
String nc = "00000002";
|
|
String nc = "00000002";
|
|
String cnonce = "c822c727a648aba7";
|
|
String cnonce = "c822c727a648aba7";
|
|
String password = "koala";
|
|
String password = "koala";
|
|
- String responseDigest = DigestProcessingFilter.generateDigest(username,
|
|
|
|
- realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
+ String responseDigest = DigestProcessingFilter.generateDigest(false,
|
|
|
|
+ username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
// Setup our HTTP request
|
|
// Setup our HTTP request
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
@@ -351,8 +354,8 @@ public class DigestProcessingFilterTests extends TestCase {
|
|
String nc = "00000002";
|
|
String nc = "00000002";
|
|
String cnonce = "c822c727a648aba7";
|
|
String cnonce = "c822c727a648aba7";
|
|
String password = "koala";
|
|
String password = "koala";
|
|
- String responseDigest = DigestProcessingFilter.generateDigest(username,
|
|
|
|
- realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
+ String responseDigest = DigestProcessingFilter.generateDigest(false,
|
|
|
|
+ username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
// Setup our HTTP request
|
|
// Setup our HTTP request
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
@@ -395,8 +398,8 @@ public class DigestProcessingFilterTests extends TestCase {
|
|
String nc = "00000002";
|
|
String nc = "00000002";
|
|
String cnonce = "c822c727a648aba7";
|
|
String cnonce = "c822c727a648aba7";
|
|
String password = "koala";
|
|
String password = "koala";
|
|
- String responseDigest = DigestProcessingFilter.generateDigest(username,
|
|
|
|
- realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
+ String responseDigest = DigestProcessingFilter.generateDigest(false,
|
|
|
|
+ username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
// Setup our HTTP request
|
|
// Setup our HTTP request
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
@@ -426,7 +429,54 @@ public class DigestProcessingFilterTests extends TestCase {
|
|
assertEquals(401, response.getStatus());
|
|
assertEquals(401, response.getStatus());
|
|
}
|
|
}
|
|
|
|
|
|
- public void testNormalOperation() throws Exception {
|
|
|
|
|
|
+ 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 responseDigest = DigestProcessingFilter.generateDigest(true,
|
|
|
|
+ username, realm, password, "GET", 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");
|
|
|
|
+
|
|
|
|
+ // 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);
|
|
|
|
+
|
|
|
|
+ assertNotNull(SecurityContextHolder.getContext().getAuthentication());
|
|
|
|
+ assertEquals("marissa",
|
|
|
|
+ ((UserDetails) SecurityContextHolder.getContext().getAuthentication()
|
|
|
|
+ .getPrincipal()).getUsername());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void testNormalOperationWhenPasswordNotAlreadyEncoded()
|
|
|
|
+ throws Exception {
|
|
Map responseHeaderMap = generateValidHeaders(60);
|
|
Map responseHeaderMap = generateValidHeaders(60);
|
|
|
|
|
|
String username = "marissa";
|
|
String username = "marissa";
|
|
@@ -437,8 +487,8 @@ public class DigestProcessingFilterTests extends TestCase {
|
|
String nc = "00000002";
|
|
String nc = "00000002";
|
|
String cnonce = "c822c727a648aba7";
|
|
String cnonce = "c822c727a648aba7";
|
|
String password = "koala";
|
|
String password = "koala";
|
|
- String responseDigest = DigestProcessingFilter.generateDigest(username,
|
|
|
|
- realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
+ String responseDigest = DigestProcessingFilter.generateDigest(false,
|
|
|
|
+ username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
// Setup our HTTP request
|
|
// Setup our HTTP request
|
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
|
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
|
|
@@ -466,8 +516,8 @@ public class DigestProcessingFilterTests extends TestCase {
|
|
|
|
|
|
assertNotNull(SecurityContextHolder.getContext().getAuthentication());
|
|
assertNotNull(SecurityContextHolder.getContext().getAuthentication());
|
|
assertEquals("marissa",
|
|
assertEquals("marissa",
|
|
- ((UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal())
|
|
|
|
- .getUsername());
|
|
|
|
|
|
+ ((UserDetails) SecurityContextHolder.getContext().getAuthentication()
|
|
|
|
+ .getPrincipal()).getUsername());
|
|
}
|
|
}
|
|
|
|
|
|
public void testOtherAuthorizationSchemeIsIgnored()
|
|
public void testOtherAuthorizationSchemeIsIgnored()
|
|
@@ -535,8 +585,8 @@ public class DigestProcessingFilterTests extends TestCase {
|
|
String nc = "00000002";
|
|
String nc = "00000002";
|
|
String cnonce = "c822c727a648aba7";
|
|
String cnonce = "c822c727a648aba7";
|
|
String password = "koala";
|
|
String password = "koala";
|
|
- String responseDigest = DigestProcessingFilter.generateDigest(username,
|
|
|
|
- realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
+ String responseDigest = DigestProcessingFilter.generateDigest(false,
|
|
|
|
+ username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
// Setup our HTTP request
|
|
// Setup our HTTP request
|
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
|
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
|
|
@@ -566,8 +616,8 @@ public class DigestProcessingFilterTests extends TestCase {
|
|
|
|
|
|
// Now retry, giving an invalid nonce
|
|
// Now retry, giving an invalid nonce
|
|
password = "WRONG_PASSWORD";
|
|
password = "WRONG_PASSWORD";
|
|
- responseDigest = DigestProcessingFilter.generateDigest(username, realm,
|
|
|
|
- password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
+ responseDigest = DigestProcessingFilter.generateDigest(false, username,
|
|
|
|
+ realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
request = new MockHttpServletRequest();
|
|
request = new MockHttpServletRequest();
|
|
request.addHeader("Authorization",
|
|
request.addHeader("Authorization",
|
|
@@ -593,8 +643,9 @@ public class DigestProcessingFilterTests extends TestCase {
|
|
String nc = "00000002";
|
|
String nc = "00000002";
|
|
String cnonce = "NOT_SAME_AS_USED_FOR_DIGEST_COMPUTATION";
|
|
String cnonce = "NOT_SAME_AS_USED_FOR_DIGEST_COMPUTATION";
|
|
String password = "koala";
|
|
String password = "koala";
|
|
- String responseDigest = DigestProcessingFilter.generateDigest(username,
|
|
|
|
- realm, password, "GET", uri, qop, nonce, nc, "DIFFERENT_CNONCE");
|
|
|
|
|
|
+ String responseDigest = DigestProcessingFilter.generateDigest(false,
|
|
|
|
+ username, realm, password, "GET", uri, qop, nonce, nc,
|
|
|
|
+ "DIFFERENT_CNONCE");
|
|
|
|
|
|
// Setup our HTTP request
|
|
// Setup our HTTP request
|
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
|
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
|
|
@@ -635,8 +686,8 @@ public class DigestProcessingFilterTests extends TestCase {
|
|
String nc = "00000002";
|
|
String nc = "00000002";
|
|
String cnonce = "c822c727a648aba7";
|
|
String cnonce = "c822c727a648aba7";
|
|
String password = "WRONG_PASSWORD";
|
|
String password = "WRONG_PASSWORD";
|
|
- String responseDigest = DigestProcessingFilter.generateDigest(username,
|
|
|
|
- realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
+ String responseDigest = DigestProcessingFilter.generateDigest(false,
|
|
|
|
+ username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
// Setup our HTTP request
|
|
// Setup our HTTP request
|
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
|
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
|
|
@@ -677,8 +728,8 @@ public class DigestProcessingFilterTests extends TestCase {
|
|
String nc = "00000002";
|
|
String nc = "00000002";
|
|
String cnonce = "c822c727a648aba7";
|
|
String cnonce = "c822c727a648aba7";
|
|
String password = "koala";
|
|
String password = "koala";
|
|
- String responseDigest = DigestProcessingFilter.generateDigest(username,
|
|
|
|
- realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
+ String responseDigest = DigestProcessingFilter.generateDigest(false,
|
|
|
|
+ username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
// Setup our HTTP request
|
|
// Setup our HTTP request
|
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
|
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
|
|
@@ -719,8 +770,8 @@ public class DigestProcessingFilterTests extends TestCase {
|
|
String nc = "00000002";
|
|
String nc = "00000002";
|
|
String cnonce = "c822c727a648aba7";
|
|
String cnonce = "c822c727a648aba7";
|
|
String password = "koala";
|
|
String password = "koala";
|
|
- String responseDigest = DigestProcessingFilter.generateDigest(username,
|
|
|
|
- realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
+ String responseDigest = DigestProcessingFilter.generateDigest(false,
|
|
|
|
+ username, realm, password, "GET", uri, qop, nonce, nc, cnonce);
|
|
|
|
|
|
// Setup our HTTP request
|
|
// Setup our HTTP request
|
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
|
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", uri);
|