|
@@ -23,6 +23,7 @@ import java.util.Vector;
|
|
|
|
|
|
import javax.servlet.FilterChain;
|
|
|
import javax.servlet.FilterConfig;
|
|
|
+import javax.servlet.ServletContext;
|
|
|
import javax.servlet.ServletException;
|
|
|
import javax.servlet.ServletRequest;
|
|
|
import javax.servlet.ServletResponse;
|
|
@@ -33,6 +34,8 @@ import javax.servlet.http.HttpServletResponse;
|
|
|
import org.apache.hadoop.security.authentication.client.AuthenticatedURL;
|
|
|
import org.apache.hadoop.security.authentication.client.AuthenticationException;
|
|
|
import org.apache.hadoop.security.authentication.util.Signer;
|
|
|
+import org.apache.hadoop.security.authentication.util.SignerSecretProvider;
|
|
|
+import org.apache.hadoop.security.authentication.util.StringSignerSecretProvider;
|
|
|
import org.junit.Assert;
|
|
|
import org.junit.Test;
|
|
|
import org.mockito.Mockito;
|
|
@@ -157,9 +160,14 @@ public class TestAuthenticationFilter {
|
|
|
Mockito.when(config.getInitParameterNames()).thenReturn(
|
|
|
new Vector<String>(Arrays.asList(AuthenticationFilter.AUTH_TYPE,
|
|
|
AuthenticationFilter.AUTH_TOKEN_VALIDITY)).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(null);
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
filter.init(config);
|
|
|
Assert.assertEquals(PseudoAuthenticationHandler.class, filter.getAuthenticationHandler().getClass());
|
|
|
Assert.assertTrue(filter.isRandomSecret());
|
|
|
+ Assert.assertFalse(filter.isCustomSignerSecretProvider());
|
|
|
Assert.assertNull(filter.getCookieDomain());
|
|
|
Assert.assertNull(filter.getCookiePath());
|
|
|
Assert.assertEquals(TOKEN_VALIDITY_SEC, filter.getValidity());
|
|
@@ -167,6 +175,26 @@ public class TestAuthenticationFilter {
|
|
|
filter.destroy();
|
|
|
}
|
|
|
|
|
|
+ // string secret
|
|
|
+ filter = new AuthenticationFilter();
|
|
|
+ try {
|
|
|
+ FilterConfig config = Mockito.mock(FilterConfig.class);
|
|
|
+ Mockito.when(config.getInitParameter(AuthenticationFilter.AUTH_TYPE)).thenReturn("simple");
|
|
|
+ Mockito.when(config.getInitParameter(AuthenticationFilter.SIGNATURE_SECRET)).thenReturn("secret");
|
|
|
+ Mockito.when(config.getInitParameterNames()).thenReturn(
|
|
|
+ new Vector<String>(Arrays.asList(AuthenticationFilter.AUTH_TYPE,
|
|
|
+ AuthenticationFilter.SIGNATURE_SECRET)).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(null);
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
+ filter.init(config);
|
|
|
+ Assert.assertFalse(filter.isRandomSecret());
|
|
|
+ Assert.assertFalse(filter.isCustomSignerSecretProvider());
|
|
|
+ } finally {
|
|
|
+ filter.destroy();
|
|
|
+ }
|
|
|
+
|
|
|
// custom secret
|
|
|
filter = new AuthenticationFilter();
|
|
|
try {
|
|
@@ -176,8 +204,26 @@ public class TestAuthenticationFilter {
|
|
|
Mockito.when(config.getInitParameterNames()).thenReturn(
|
|
|
new Vector<String>(Arrays.asList(AuthenticationFilter.AUTH_TYPE,
|
|
|
AuthenticationFilter.SIGNATURE_SECRET)).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(
|
|
|
+ new SignerSecretProvider() {
|
|
|
+ @Override
|
|
|
+ public void init(Properties config, long tokenValidity) {
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public byte[] getCurrentSecret() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public byte[][] getAllSecrets() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
filter.init(config);
|
|
|
Assert.assertFalse(filter.isRandomSecret());
|
|
|
+ Assert.assertTrue(filter.isCustomSignerSecretProvider());
|
|
|
} finally {
|
|
|
filter.destroy();
|
|
|
}
|
|
@@ -193,6 +239,10 @@ public class TestAuthenticationFilter {
|
|
|
new Vector<String>(Arrays.asList(AuthenticationFilter.AUTH_TYPE,
|
|
|
AuthenticationFilter.COOKIE_DOMAIN,
|
|
|
AuthenticationFilter.COOKIE_PATH)).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(null);
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
filter.init(config);
|
|
|
Assert.assertEquals(".foo.com", filter.getCookieDomain());
|
|
|
Assert.assertEquals("/bar", filter.getCookiePath());
|
|
@@ -213,6 +263,10 @@ public class TestAuthenticationFilter {
|
|
|
new Vector<String>(
|
|
|
Arrays.asList(AuthenticationFilter.AUTH_TYPE,
|
|
|
"management.operation.return")).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(null);
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
filter.init(config);
|
|
|
Assert.assertTrue(DummyAuthenticationHandler.init);
|
|
|
} finally {
|
|
@@ -248,6 +302,10 @@ public class TestAuthenticationFilter {
|
|
|
Mockito.when(config.getInitParameterNames()).thenReturn(
|
|
|
new Vector<String>(Arrays.asList(AuthenticationFilter.AUTH_TYPE,
|
|
|
AuthenticationFilter.AUTH_TOKEN_VALIDITY)).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(null);
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
|
|
|
filter.init(config);
|
|
|
Assert.assertEquals(PseudoAuthenticationHandler.class,
|
|
@@ -270,6 +328,10 @@ public class TestAuthenticationFilter {
|
|
|
new Vector<String>(
|
|
|
Arrays.asList(AuthenticationFilter.AUTH_TYPE,
|
|
|
"management.operation.return")).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(null);
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
filter.init(config);
|
|
|
|
|
|
HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
|
|
@@ -297,11 +359,15 @@ public class TestAuthenticationFilter {
|
|
|
Arrays.asList(AuthenticationFilter.AUTH_TYPE,
|
|
|
AuthenticationFilter.SIGNATURE_SECRET,
|
|
|
"management.operation.return")).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(null);
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
filter.init(config);
|
|
|
|
|
|
AuthenticationToken token = new AuthenticationToken("u", "p", DummyAuthenticationHandler.TYPE);
|
|
|
token.setExpires(System.currentTimeMillis() + TOKEN_VALIDITY_SEC);
|
|
|
- Signer signer = new Signer("secret".getBytes());
|
|
|
+ Signer signer = new Signer(new StringSignerSecretProvider("secret"));
|
|
|
String tokenSigned = signer.sign(token.toString());
|
|
|
|
|
|
Cookie cookie = new Cookie(AuthenticatedURL.AUTH_COOKIE, tokenSigned);
|
|
@@ -330,12 +396,16 @@ public class TestAuthenticationFilter {
|
|
|
Arrays.asList(AuthenticationFilter.AUTH_TYPE,
|
|
|
AuthenticationFilter.SIGNATURE_SECRET,
|
|
|
"management.operation.return")).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(null);
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
filter.init(config);
|
|
|
|
|
|
AuthenticationToken token =
|
|
|
new AuthenticationToken("u", "p", DummyAuthenticationHandler.TYPE);
|
|
|
token.setExpires(System.currentTimeMillis() - TOKEN_VALIDITY_SEC);
|
|
|
- Signer signer = new Signer("secret".getBytes());
|
|
|
+ Signer signer = new Signer(new StringSignerSecretProvider("secret"));
|
|
|
String tokenSigned = signer.sign(token.toString());
|
|
|
|
|
|
Cookie cookie = new Cookie(AuthenticatedURL.AUTH_COOKIE, tokenSigned);
|
|
@@ -371,11 +441,15 @@ public class TestAuthenticationFilter {
|
|
|
Arrays.asList(AuthenticationFilter.AUTH_TYPE,
|
|
|
AuthenticationFilter.SIGNATURE_SECRET,
|
|
|
"management.operation.return")).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(null);
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
filter.init(config);
|
|
|
|
|
|
AuthenticationToken token = new AuthenticationToken("u", "p", "invalidtype");
|
|
|
token.setExpires(System.currentTimeMillis() + TOKEN_VALIDITY_SEC);
|
|
|
- Signer signer = new Signer("secret".getBytes());
|
|
|
+ Signer signer = new Signer(new StringSignerSecretProvider("secret"));
|
|
|
String tokenSigned = signer.sign(token.toString());
|
|
|
|
|
|
Cookie cookie = new Cookie(AuthenticatedURL.AUTH_COOKIE, tokenSigned);
|
|
@@ -409,6 +483,10 @@ public class TestAuthenticationFilter {
|
|
|
new Vector<String>(
|
|
|
Arrays.asList(AuthenticationFilter.AUTH_TYPE,
|
|
|
"management.operation.return")).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(null);
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
filter.init(config);
|
|
|
|
|
|
HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
|
|
@@ -458,6 +536,10 @@ public class TestAuthenticationFilter {
|
|
|
AuthenticationFilter.AUTH_TOKEN_VALIDITY,
|
|
|
AuthenticationFilter.SIGNATURE_SECRET, "management.operation" +
|
|
|
".return", "expired.token")).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(null);
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
|
|
|
if (withDomainPath) {
|
|
|
Mockito.when(config.getInitParameter(AuthenticationFilter
|
|
@@ -511,7 +593,7 @@ public class TestAuthenticationFilter {
|
|
|
Mockito.verify(chain).doFilter(Mockito.any(ServletRequest.class),
|
|
|
Mockito.any(ServletResponse.class));
|
|
|
|
|
|
- Signer signer = new Signer("secret".getBytes());
|
|
|
+ Signer signer = new Signer(new StringSignerSecretProvider("secret"));
|
|
|
String value = signer.verifyAndExtract(v);
|
|
|
AuthenticationToken token = AuthenticationToken.parse(value);
|
|
|
assertThat(token.getExpires(), not(0L));
|
|
@@ -578,6 +660,10 @@ public class TestAuthenticationFilter {
|
|
|
new Vector<String>(
|
|
|
Arrays.asList(AuthenticationFilter.AUTH_TYPE,
|
|
|
"management.operation.return")).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(null);
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
filter.init(config);
|
|
|
|
|
|
HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
|
|
@@ -585,7 +671,7 @@ public class TestAuthenticationFilter {
|
|
|
|
|
|
AuthenticationToken token = new AuthenticationToken("u", "p", "t");
|
|
|
token.setExpires(System.currentTimeMillis() + TOKEN_VALIDITY_SEC);
|
|
|
- Signer signer = new Signer("secret".getBytes());
|
|
|
+ Signer signer = new Signer(new StringSignerSecretProvider("secret"));
|
|
|
String tokenSigned = signer.sign(token.toString());
|
|
|
|
|
|
Cookie cookie = new Cookie(AuthenticatedURL.AUTH_COOKIE, tokenSigned);
|
|
@@ -628,6 +714,10 @@ public class TestAuthenticationFilter {
|
|
|
new Vector<String>(
|
|
|
Arrays.asList(AuthenticationFilter.AUTH_TYPE,
|
|
|
"management.operation.return")).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(null);
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
filter.init(config);
|
|
|
|
|
|
HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
|
|
@@ -691,6 +781,10 @@ public class TestAuthenticationFilter {
|
|
|
Arrays.asList(AuthenticationFilter.AUTH_TYPE,
|
|
|
AuthenticationFilter.SIGNATURE_SECRET,
|
|
|
"management.operation.return")).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(null);
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
filter.init(config);
|
|
|
|
|
|
HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
|
|
@@ -698,7 +792,7 @@ public class TestAuthenticationFilter {
|
|
|
|
|
|
AuthenticationToken token = new AuthenticationToken("u", "p", DummyAuthenticationHandler.TYPE);
|
|
|
token.setExpires(System.currentTimeMillis() - TOKEN_VALIDITY_SEC);
|
|
|
- Signer signer = new Signer(secret.getBytes());
|
|
|
+ Signer signer = new Signer(new StringSignerSecretProvider(secret));
|
|
|
String tokenSigned = signer.sign(token.toString());
|
|
|
|
|
|
Cookie cookie = new Cookie(AuthenticatedURL.AUTH_COOKIE, tokenSigned);
|
|
@@ -758,6 +852,10 @@ public class TestAuthenticationFilter {
|
|
|
Arrays.asList(AuthenticationFilter.AUTH_TYPE,
|
|
|
AuthenticationFilter.SIGNATURE_SECRET,
|
|
|
"management.operation.return")).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(null);
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
filter.init(config);
|
|
|
|
|
|
HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
|
|
@@ -765,7 +863,7 @@ public class TestAuthenticationFilter {
|
|
|
|
|
|
AuthenticationToken token = new AuthenticationToken("u", "p", "invalidtype");
|
|
|
token.setExpires(System.currentTimeMillis() + TOKEN_VALIDITY_SEC);
|
|
|
- Signer signer = new Signer(secret.getBytes());
|
|
|
+ Signer signer = new Signer(new StringSignerSecretProvider(secret));
|
|
|
String tokenSigned = signer.sign(token.toString());
|
|
|
|
|
|
Cookie cookie = new Cookie(AuthenticatedURL.AUTH_COOKIE, tokenSigned);
|
|
@@ -793,6 +891,10 @@ public class TestAuthenticationFilter {
|
|
|
new Vector<String>(
|
|
|
Arrays.asList(AuthenticationFilter.AUTH_TYPE,
|
|
|
"management.operation.return")).elements());
|
|
|
+ ServletContext context = Mockito.mock(ServletContext.class);
|
|
|
+ Mockito.when(context.getAttribute(
|
|
|
+ AuthenticationFilter.SIGNATURE_PROVIDER_ATTRIBUTE)).thenReturn(null);
|
|
|
+ Mockito.when(config.getServletContext()).thenReturn(context);
|
|
|
filter.init(config);
|
|
|
|
|
|
HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
|
|
@@ -812,7 +914,7 @@ public class TestAuthenticationFilter {
|
|
|
|
|
|
AuthenticationToken token = new AuthenticationToken("u", "p", "t");
|
|
|
token.setExpires(System.currentTimeMillis() + TOKEN_VALIDITY_SEC);
|
|
|
- Signer signer = new Signer("secret".getBytes());
|
|
|
+ Signer signer = new Signer(new StringSignerSecretProvider("secret"));
|
|
|
String tokenSigned = signer.sign(token.toString());
|
|
|
Cookie cookie = new Cookie(AuthenticatedURL.AUTH_COOKIE, tokenSigned);
|
|
|
Mockito.when(request.getCookies()).thenReturn(new Cookie[]{cookie});
|