/rpc-jira-plugin/src/test/java/com/atlassian/jira/rpc/auth/TestTokenManagerImpl.java

https://bitbucket.org/atlassianlabs/rpc-jira-plugin · Java · 323 lines · 265 code · 52 blank · 6 comment · 0 complexity · 3f4e3841241585dc7bc848abef636988 MD5 · raw file

  1. package com.atlassian.jira.rpc.auth;
  2. import com.atlassian.cache.memory.MemoryCacheManager;
  3. import com.atlassian.crowd.embedded.api.User;
  4. import com.atlassian.jira.bc.security.login.LoginReason;
  5. import com.atlassian.jira.bc.security.login.LoginResult;
  6. import com.atlassian.jira.bc.security.login.LoginResultImpl;
  7. import com.atlassian.jira.bc.security.login.LoginService;
  8. import com.atlassian.jira.rpc.exception.RemoteAuthenticationException;
  9. import com.atlassian.jira.rpc.exception.RemoteException;
  10. import com.atlassian.jira.rpc.exception.RemotePermissionException;
  11. import com.atlassian.jira.rpc.mock.MockUser;
  12. import com.atlassian.jira.security.JiraAuthenticationContext;
  13. import com.atlassian.jira.security.PermissionManager;
  14. import com.atlassian.jira.security.Permissions;
  15. import com.atlassian.jira.user.util.UserManager;
  16. import junit.framework.TestCase;
  17. import org.easymock.EasyMock;
  18. import static com.atlassian.jira.bc.security.login.LoginReason.OK;
  19. import static org.easymock.EasyMock.expect;
  20. import static org.easymock.EasyMock.replay;
  21. import static org.easymock.EasyMock.verify;
  22. public class TestTokenManagerImpl extends TestCase
  23. {
  24. private PermissionManager permissionManager;
  25. private LoginService loginService;
  26. private JiraAuthenticationContext jiraAuthenticationContext;
  27. private UserManager userManager;
  28. private User bob;
  29. protected void setUp() throws Exception
  30. {
  31. permissionManager = EasyMock.createMock(PermissionManager.class);
  32. loginService = EasyMock.createMock(LoginService.class);
  33. jiraAuthenticationContext = EasyMock.createMock(JiraAuthenticationContext.class);
  34. userManager = EasyMock.createMock(UserManager.class);
  35. bob = new MockUser("bob");
  36. }
  37. @Override
  38. protected void tearDown() throws Exception
  39. {
  40. verify(permissionManager, loginService, userManager, jiraAuthenticationContext);
  41. }
  42. private TokenManagerImpl instantiateTokenManager()
  43. {
  44. replay(permissionManager, loginService, userManager, jiraAuthenticationContext);
  45. return new TokenManagerImpl(permissionManager, loginService, jiraAuthenticationContext, userManager, new MemoryCacheManager());
  46. }
  47. public void testLogin_FAIL() throws RemoteException
  48. {
  49. final LoginResult loginResultFAIL = new LoginResultImpl(LoginReason.AUTHENTICATED_FAILED, null, "bob");
  50. expect(jiraAuthenticationContext.getLoggedInUser()).andStubReturn(null);
  51. expect(userManager.getUserObject("bob")).andStubReturn(bob);
  52. expect(loginService.authenticate(bob, "badpass")).andStubReturn(loginResultFAIL);
  53. expect(permissionManager.hasPermission(Permissions.USE, bob)).andStubReturn(true);
  54. TokenManager tokenManager = instantiateTokenManager();
  55. // invalid login
  56. try
  57. {
  58. tokenManager.login("bob", "badpass");
  59. fail("Should have barfed.");
  60. }
  61. catch (RemoteAuthenticationException e)
  62. {
  63. assertTrue(e.getMessage().contains("Invalid username or password"));
  64. }
  65. }
  66. public void testLogin_FAIL_for_unknown_user() throws RemoteException
  67. {
  68. expect(jiraAuthenticationContext.getLoggedInUser()).andStubReturn(null);
  69. expect(userManager.getUserObject("bob")).andStubReturn(null);
  70. TokenManager tokenManager = instantiateTokenManager();
  71. // invalid login
  72. try
  73. {
  74. tokenManager.login("bob", "badpass");
  75. fail("Should have barfed.");
  76. }
  77. catch (RemoteAuthenticationException e)
  78. {
  79. assertTrue(e.getMessage().contains("Invalid username or password"));
  80. }
  81. }
  82. public void testLogin_FAIL_for_ElevateSecurity()
  83. throws RemoteException
  84. {
  85. final LoginResult loginResultFAIL = new LoginResultImpl(LoginReason.AUTHENTICATION_DENIED, null, "bob");
  86. expect(jiraAuthenticationContext.getLoggedInUser()).andStubReturn(null);
  87. expect(userManager.getUserObject("bob")).andStubReturn(bob);
  88. expect(loginService.authenticate(bob, "badpass")).andStubReturn(loginResultFAIL);
  89. expect(permissionManager.hasPermission(Permissions.USE, bob)).andStubReturn(true);
  90. TokenManager tokenManager = instantiateTokenManager();
  91. // invalid login
  92. try
  93. {
  94. tokenManager.login("bob", "badpass");
  95. fail("Should have barfed.");
  96. }
  97. catch (RemoteAuthenticationException e)
  98. {
  99. assertTrue(e.getMessage().contains("The maximum number of failed login attempts has been reached. Please log into the application through the web interface to reset the number of failed login attempts."));
  100. }
  101. }
  102. public void testLogin_OK_inContext()
  103. throws RemoteException
  104. {
  105. expect(jiraAuthenticationContext.getLoggedInUser()).andStubReturn(bob);
  106. TokenManager tokenManager = instantiateTokenManager();
  107. String token = tokenManager.login("bob", "badpass");
  108. assertEquals("trustedappstoken", token);
  109. }
  110. public void testLoginRetrieveLogout() throws RemoteException
  111. {
  112. final LoginResult loginResultOK = new LoginResultImpl(OK, null, "bob");
  113. expect(jiraAuthenticationContext.getLoggedInUser()).andStubReturn(null);
  114. expect(userManager.getUserObject("bob")).andStubReturn(bob);
  115. expect(loginService.authenticate(bob, "password")).andStubReturn(loginResultOK);
  116. expect(permissionManager.hasPermission(Permissions.USE, bob)).andStubReturn(true);
  117. TokenManager tokenManager = instantiateTokenManager();
  118. String token = tokenManager.login("bob", "password");
  119. assertEquals(bob, tokenManager.retrieveUser(token));
  120. assertTrue(tokenManager.logout(token));
  121. assertTrue(tokenManager.logout(null));
  122. }
  123. public void testRetrieveUser_UnknownToken() throws RemoteException
  124. {
  125. expect(jiraAuthenticationContext.getLoggedInUser()).andStubReturn(null);
  126. TokenManager tokenManager = instantiateTokenManager();
  127. try
  128. {
  129. tokenManager.retrieveUser("badtoken");
  130. fail("Should have barfed.");
  131. }
  132. catch (RemoteAuthenticationException e)
  133. {
  134. }
  135. }
  136. public void testRetrieveUser_NullToken() throws RemoteException
  137. {
  138. expect(jiraAuthenticationContext.getLoggedInUser()).andStubReturn(null);
  139. TokenManager tokenManager = instantiateTokenManager();
  140. try
  141. {
  142. tokenManager.retrieveUser(null);
  143. fail("Should have barfed.");
  144. }
  145. catch (RemoteAuthenticationException e)
  146. {
  147. }
  148. }
  149. public void testRetrieveUser_WithNoPermission() throws RemoteException
  150. {
  151. final LoginResult loginResult = new LoginResultImpl(OK, null, "bob");
  152. expect(jiraAuthenticationContext.getLoggedInUser()).andStubReturn(null);
  153. expect(userManager.getUserObject("bob")).andStubReturn(bob);
  154. expect(loginService.authenticate(bob, "password")).andStubReturn(loginResult);
  155. expect(permissionManager.hasPermission(Permissions.USE, bob)).andStubReturn(false);
  156. TokenManager tokenManager = instantiateTokenManager();
  157. try
  158. {
  159. String token = tokenManager.login("bob", "password");
  160. tokenManager.retrieveUser(token);
  161. fail("Should have barfed.");
  162. }
  163. catch (RemotePermissionException e)
  164. {
  165. }
  166. }
  167. public void testRetrieveUser_OK() throws RemoteException
  168. {
  169. final LoginResult loginResult = new LoginResultImpl(OK, null, "bob");
  170. expect(jiraAuthenticationContext.getLoggedInUser()).andStubReturn(null);
  171. expect(userManager.getUserObject("bob")).andStubReturn(bob);
  172. expect(loginService.authenticate(bob, "password")).andStubReturn(loginResult);
  173. expect(permissionManager.hasPermission(Permissions.USE, bob)).andStubReturn(true);
  174. TokenManager tokenManager = instantiateTokenManager();
  175. String token = tokenManager.login("bob", "password");
  176. User actual = tokenManager.retrieveUser(token);
  177. assertEquals(bob.getName(), actual.getName());
  178. }
  179. public void testRetrieveUser_FAIL_noPermission_fromAuthContext()
  180. throws RemoteException
  181. {
  182. expect(jiraAuthenticationContext.getLoggedInUser()).andStubReturn(bob);
  183. expect(permissionManager.hasPermission(Permissions.USE, bob)).andStubReturn(false);
  184. TokenManager tokenManager = instantiateTokenManager();
  185. String token = tokenManager.login("bob", "password");
  186. try
  187. {
  188. tokenManager.retrieveUser(token);
  189. fail("Should have barfed");
  190. }
  191. catch (RemotePermissionException ignored)
  192. {
  193. }
  194. }
  195. public void testRetrieveUser_OK_butfromAuthContext()
  196. throws RemoteException
  197. {
  198. expect(jiraAuthenticationContext.getLoggedInUser()).andStubReturn(bob);
  199. expect(permissionManager.hasPermission(Permissions.USE, bob)).andStubReturn(true);
  200. TokenManager tokenManager = instantiateTokenManager();
  201. String token = tokenManager.login("bob", "password");
  202. User actual = tokenManager.retrieveUser(token);
  203. assertEquals(bob.getName(), actual.getName());
  204. }
  205. public void testRetrieveUserNoPermissions_NullToken()
  206. throws RemoteException
  207. {
  208. expect(jiraAuthenticationContext.getLoggedInUser()).andStubReturn(null);
  209. TokenManager tokenManager = instantiateTokenManager();
  210. assertNull(tokenManager.retrieveUserNoPermissionCheck(null));
  211. }
  212. public void testRetrieveUserNoPermissions_BadToken()
  213. throws RemoteException
  214. {
  215. expect(jiraAuthenticationContext.getLoggedInUser()).andStubReturn(null);
  216. TokenManager tokenManager = instantiateTokenManager();
  217. try
  218. {
  219. tokenManager.retrieveUserNoPermissionCheck("badtoken");
  220. fail("Should have barfed");
  221. }
  222. catch (RemoteAuthenticationException e)
  223. {
  224. }
  225. }
  226. public void testRetrieveUserNoPermissions_OK() throws RemoteException
  227. {
  228. final LoginResult loginResult = new LoginResultImpl(OK, null, "bob");
  229. expect(jiraAuthenticationContext.getLoggedInUser()).andStubReturn(null);
  230. expect(userManager.getUserObject("bob")).andStubReturn(bob);
  231. expect(loginService.authenticate(bob, "password")).andStubReturn(loginResult);
  232. expect(permissionManager.hasPermission(Permissions.USE, bob)).andStubReturn(false);
  233. TokenManager tokenManager = instantiateTokenManager();
  234. String token = tokenManager.login("bob", "password");
  235. final User actualUser = tokenManager.retrieveUserNoPermissionCheck(token);
  236. assertEquals(bob.getName(), actualUser.getName());
  237. }
  238. public void testRetrieveUserNoPermissions_OK_FromAuthContext() throws RemoteException
  239. {
  240. expect(jiraAuthenticationContext.getLoggedInUser()).andStubReturn(bob);
  241. TokenManager tokenManager = instantiateTokenManager();
  242. String token = tokenManager.login("bob", "password");
  243. final User actualUser = tokenManager.retrieveUserNoPermissionCheck(token);
  244. assertEquals(bob.getName(), actualUser.getName());
  245. }
  246. public void testThatClearCacheEventClearsUserTokenMap() throws Exception
  247. {
  248. // Set up
  249. final String username = "bob";
  250. final String password = "password";
  251. final LoginResult loginResult = new LoginResultImpl(OK, null, username);
  252. expect(jiraAuthenticationContext.getLoggedInUser()).andStubReturn(null);
  253. expect(userManager.getUserObject(username)).andStubReturn(bob);
  254. expect(loginService.authenticate(bob, password)).andStubReturn(loginResult);
  255. final TokenManagerImpl tokenManager = instantiateTokenManager();
  256. final String token = tokenManager.login(username, password);
  257. assertNotNull(tokenManager.retrieveUserNoPermissionCheck(token));
  258. // Invoke
  259. tokenManager.onClearCache(null);
  260. // Check
  261. try
  262. {
  263. tokenManager.retrieveUserNoPermissionCheck(token);
  264. fail("Expected a " + RemoteAuthenticationException.class);
  265. }
  266. catch (final RemoteAuthenticationException e)
  267. {
  268. assertEquals(TokenManagerImpl.UNKNOWN_USER_MESSAGE, e.getMessage());
  269. }
  270. }
  271. }