1 package com.atlassian.asap.core.server.jersey;
2
3 import com.atlassian.asap.api.Jwt;
4 import com.atlassian.asap.api.JwtClaims;
5 import com.atlassian.asap.api.exception.AuthenticationFailedException;
6 import com.atlassian.asap.api.exception.AuthorizationFailedException;
7 import com.atlassian.asap.api.exception.PermanentAuthenticationFailedException;
8 import com.atlassian.asap.api.server.http.RequestAuthenticator;
9 import org.junit.Before;
10 import org.junit.Rule;
11 import org.junit.Test;
12 import org.mockito.Mock;
13 import org.mockito.junit.MockitoJUnit;
14 import org.mockito.junit.MockitoRule;
15
16 import javax.ws.rs.container.ContainerRequestContext;
17 import javax.ws.rs.container.ResourceInfo;
18 import javax.ws.rs.core.Response;
19 import java.io.IOException;
20 import java.util.Optional;
21
22 import static com.atlassian.asap.core.server.filter.AbstractRequestAuthenticationFilter.AUTHENTIC_JWT_REQUEST_ATTRIBUTE;
23 import static com.atlassian.asap.core.server.jersey.AuthenticationRequestFilter.ASAP_REQUEST_ATTRIBUTE;
24 import static com.google.common.collect.Sets.newHashSet;
25 import static org.mockito.Mockito.any;
26 import static org.mockito.Mockito.doThrow;
27 import static org.mockito.Mockito.eq;
28 import static org.mockito.Mockito.mock;
29 import static org.mockito.Mockito.never;
30 import static org.mockito.Mockito.verify;
31 import static org.mockito.Mockito.when;
32
33 public class AuthorizationRequestFilterTest {
34 @Rule
35 public MockitoRule rule = MockitoJUnit.rule();
36
37 @Mock
38 private RequestAuthenticator authenticator;
39 @Mock
40 private ResourceInfo resourceInfo;
41 @Mock
42 private ContainerRequestContext context;
43 @Mock
44 private Jwt jwt;
45 private AuthorizationRequestFilter filter;
46 private AsapValidator asapValidator;
47
48 @Before
49 public void setUp() throws AuthenticationFailedException {
50 String audience = "presence-test";
51 JwtClaims claims = mock(JwtClaims.class);
52 when(claims.getAudience()).thenReturn(newHashSet(audience));
53 when(claims.getIssuer()).thenReturn("presence-test");
54 when(claims.getSubject()).thenReturn(Optional.empty());
55 when(jwt.getClaims()).thenReturn(claims);
56
57 when(authenticator.authenticateRequest("Bearer validjwt")).thenReturn(jwt);
58
59 when(authenticator.authenticateRequest("Bearer invalidjwt"))
60 .thenThrow(new PermanentAuthenticationFailedException("invalid jwt", null));
61
62 asapValidator = mock(AsapValidator.class);
63 filter = new AuthorizationRequestFilter(new EmptyBodyFailureHandler(), asapValidator);
64 filter.resourceInfo = resourceInfo;
65 }
66
67 @Test
68 @SuppressWarnings("unchecked")
69 public void filterWithAuthorizationFailure() throws IOException, NoSuchMethodException,
70 AuthorizationFailedException {
71 Asap asap = mock(Asap.class);
72 when(context.getProperty(AUTHENTIC_JWT_REQUEST_ATTRIBUTE)).thenReturn(jwt);
73 when(context.getProperty(ASAP_REQUEST_ATTRIBUTE)).thenReturn(asap);
74
75 doThrow(new AuthorizationFailedException("blah")).when(asapValidator).validate(any(Asap.class), eq(jwt));
76 filter.filter(context);
77 verify(context).abortWith(any(Response.class));
78 verify(context).getProperty(AUTHENTIC_JWT_REQUEST_ATTRIBUTE);
79 }
80
81 @Test
82 @SuppressWarnings("unchecked")
83 public void filterWithoutAsap() throws IOException, NoSuchMethodException {
84 filter.filter(context);
85
86 verify(context).getProperty(AUTHENTIC_JWT_REQUEST_ATTRIBUTE);
87 verify(context, never()).getProperty(ASAP_REQUEST_ATTRIBUTE);
88 }
89 }