You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

AuthenticationManagerTest.java 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742
  1. /*
  2. * Copyright 2013 gitblit.com.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.gitblit.tests;
  17. import java.io.BufferedReader;
  18. import java.io.IOException;
  19. import java.io.UnsupportedEncodingException;
  20. import java.security.Principal;
  21. import java.util.Collection;
  22. import java.util.Collections;
  23. import java.util.Enumeration;
  24. import java.util.HashMap;
  25. import java.util.List;
  26. import java.util.Locale;
  27. import java.util.Map;
  28. import javax.servlet.AsyncContext;
  29. import javax.servlet.DispatcherType;
  30. import javax.servlet.RequestDispatcher;
  31. import javax.servlet.ServletContext;
  32. import javax.servlet.ServletException;
  33. import javax.servlet.ServletInputStream;
  34. import javax.servlet.ServletRequest;
  35. import javax.servlet.ServletResponse;
  36. import javax.servlet.http.Cookie;
  37. import javax.servlet.http.HttpServletRequest;
  38. import javax.servlet.http.HttpServletResponse;
  39. import javax.servlet.http.HttpSession;
  40. import javax.servlet.http.HttpSessionContext;
  41. import javax.servlet.http.HttpUpgradeHandler;
  42. import javax.servlet.http.Part;
  43. import com.gitblit.utils.PasswordHash;
  44. import org.junit.Test;
  45. import com.gitblit.IUserService;
  46. import com.gitblit.Keys;
  47. import com.gitblit.manager.AuthenticationManager;
  48. import com.gitblit.manager.IAuthenticationManager;
  49. import com.gitblit.manager.IRuntimeManager;
  50. import com.gitblit.manager.RuntimeManager;
  51. import com.gitblit.manager.UserManager;
  52. import com.gitblit.models.TeamModel;
  53. import com.gitblit.models.UserModel;
  54. import com.gitblit.tests.mock.MemorySettings;
  55. import com.gitblit.utils.XssFilter;
  56. import com.gitblit.utils.XssFilter.AllowXssFilter;
  57. /**
  58. * Class for testing local authentication.
  59. *
  60. * @author James Moger
  61. *
  62. */
  63. @SuppressWarnings("deprecation")
  64. public class AuthenticationManagerTest extends GitblitUnitTest {
  65. UserManager users;
  66. private static final class DummyHttpServletRequest implements HttpServletRequest {
  67. @Override
  68. public Object getAttribute(String name) {
  69. return null;
  70. }
  71. @Override
  72. public Enumeration<String> getAttributeNames() {
  73. return null;
  74. }
  75. @Override
  76. public String getCharacterEncoding() {
  77. return null;
  78. }
  79. @Override
  80. public void setCharacterEncoding(String env)
  81. throws UnsupportedEncodingException {
  82. }
  83. @Override
  84. public int getContentLength() {
  85. return 0;
  86. }
  87. @Override
  88. public long getContentLengthLong() {
  89. return 0;
  90. }
  91. @Override
  92. public String getContentType() {
  93. return null;
  94. }
  95. @Override
  96. public ServletInputStream getInputStream() throws IOException {
  97. return null;
  98. }
  99. @Override
  100. public String getParameter(String name) {
  101. return null;
  102. }
  103. @Override
  104. public Enumeration<String> getParameterNames() {
  105. return null;
  106. }
  107. @Override
  108. public String[] getParameterValues(String name) {
  109. return null;
  110. }
  111. @Override
  112. public Map<String, String[]> getParameterMap() {
  113. return null;
  114. }
  115. @Override
  116. public String getProtocol() {
  117. return null;
  118. }
  119. @Override
  120. public String getScheme() {
  121. return null;
  122. }
  123. @Override
  124. public String getServerName() {
  125. return null;
  126. }
  127. @Override
  128. public int getServerPort() {
  129. return 0;
  130. }
  131. @Override
  132. public BufferedReader getReader() throws IOException {
  133. return null;
  134. }
  135. @Override
  136. public String getRemoteAddr() {
  137. return null;
  138. }
  139. @Override
  140. public String getRemoteHost() {
  141. return null;
  142. }
  143. @Override
  144. public void setAttribute(String name, Object o) {
  145. }
  146. @Override
  147. public void removeAttribute(String name) {
  148. }
  149. @Override
  150. public Locale getLocale() {
  151. return null;
  152. }
  153. @Override
  154. public Enumeration<Locale> getLocales() {
  155. return null;
  156. }
  157. @Override
  158. public boolean isSecure() {
  159. return false;
  160. }
  161. @Override
  162. public RequestDispatcher getRequestDispatcher(String path) {
  163. return null;
  164. }
  165. @Override
  166. public String getRealPath(String path) {
  167. return null;
  168. }
  169. @Override
  170. public int getRemotePort() {
  171. return 0;
  172. }
  173. @Override
  174. public String getLocalName() {
  175. return null;
  176. }
  177. @Override
  178. public String getLocalAddr() {
  179. return null;
  180. }
  181. @Override
  182. public int getLocalPort() {
  183. return 0;
  184. }
  185. @Override
  186. public ServletContext getServletContext() {
  187. return null;
  188. }
  189. @Override
  190. public AsyncContext startAsync() throws IllegalStateException {
  191. return null;
  192. }
  193. @Override
  194. public AsyncContext startAsync(ServletRequest servletRequest,
  195. ServletResponse servletResponse)
  196. throws IllegalStateException {
  197. return null;
  198. }
  199. @Override
  200. public boolean isAsyncStarted() {
  201. return false;
  202. }
  203. @Override
  204. public boolean isAsyncSupported() {
  205. return false;
  206. }
  207. @Override
  208. public AsyncContext getAsyncContext() {
  209. return null;
  210. }
  211. @Override
  212. public DispatcherType getDispatcherType() {
  213. return null;
  214. }
  215. @Override
  216. public String getAuthType() {
  217. return null;
  218. }
  219. @Override
  220. public Cookie[] getCookies() {
  221. return null;
  222. }
  223. @Override
  224. public long getDateHeader(String name) {
  225. return 0;
  226. }
  227. @Override
  228. public String getHeader(String name) {
  229. return null;
  230. }
  231. @Override
  232. public Enumeration<String> getHeaders(String name) {
  233. return null;
  234. }
  235. @Override
  236. public Enumeration<String> getHeaderNames() {
  237. return null;
  238. }
  239. @Override
  240. public int getIntHeader(String name) {
  241. return 0;
  242. }
  243. @Override
  244. public String getMethod() {
  245. return null;
  246. }
  247. @Override
  248. public String getPathInfo() {
  249. return null;
  250. }
  251. @Override
  252. public String getPathTranslated() {
  253. return null;
  254. }
  255. @Override
  256. public String getContextPath() {
  257. return null;
  258. }
  259. @Override
  260. public String getQueryString() {
  261. return null;
  262. }
  263. @Override
  264. public String getRemoteUser() {
  265. return null;
  266. }
  267. @Override
  268. public boolean isUserInRole(String role) {
  269. if(role != null && "admin".equals(role)) {
  270. return true;
  271. }
  272. return false;
  273. }
  274. @Override
  275. public Principal getUserPrincipal() {
  276. return new Principal(){
  277. @Override
  278. public String getName() {
  279. return "sunnyjim";
  280. }
  281. };
  282. }
  283. @Override
  284. public String getRequestedSessionId() {
  285. return null;
  286. }
  287. @Override
  288. public String getRequestURI() {
  289. return null;
  290. }
  291. @Override
  292. public StringBuffer getRequestURL() {
  293. return null;
  294. }
  295. @Override
  296. public String getServletPath() {
  297. return null;
  298. }
  299. @Override
  300. public HttpSession getSession(boolean create) {
  301. return null;
  302. }
  303. final Map<String, Object> sessionAttributes = new HashMap<String, Object>();
  304. @Override
  305. public HttpSession getSession() {
  306. return new HttpSession() {
  307. @Override
  308. public long getCreationTime() {
  309. return 0;
  310. }
  311. @Override
  312. public String getId() {
  313. return null;
  314. }
  315. @Override
  316. public long getLastAccessedTime() {
  317. return 0;
  318. }
  319. @Override
  320. public ServletContext getServletContext() {
  321. return null;
  322. }
  323. @Override
  324. public void setMaxInactiveInterval(int interval) {
  325. }
  326. @Override
  327. public int getMaxInactiveInterval() {
  328. return 0;
  329. }
  330. @Override
  331. public HttpSessionContext getSessionContext() {
  332. return null;
  333. }
  334. @Override
  335. public Object getAttribute(String name) {
  336. return sessionAttributes.get(name);
  337. }
  338. @Override
  339. public Object getValue(String name) {
  340. return null;
  341. }
  342. @Override
  343. public Enumeration<String> getAttributeNames() {
  344. return Collections.enumeration(sessionAttributes.keySet());
  345. }
  346. @Override
  347. public String[] getValueNames() {
  348. return null;
  349. }
  350. @Override
  351. public void setAttribute(String name,
  352. Object value) {
  353. }
  354. @Override
  355. public void putValue(String name, Object value) {
  356. }
  357. @Override
  358. public void removeAttribute(String name) {
  359. }
  360. @Override
  361. public void removeValue(String name) {
  362. }
  363. @Override
  364. public void invalidate() {
  365. }
  366. @Override
  367. public boolean isNew() {
  368. return false;
  369. }
  370. };
  371. }
  372. @Override
  373. public String changeSessionId() {
  374. return null;
  375. }
  376. @Override
  377. public boolean isRequestedSessionIdValid() {
  378. return false;
  379. }
  380. @Override
  381. public boolean isRequestedSessionIdFromCookie() {
  382. return false;
  383. }
  384. @Override
  385. public boolean isRequestedSessionIdFromURL() {
  386. return false;
  387. }
  388. @Override
  389. public boolean isRequestedSessionIdFromUrl() {
  390. return false;
  391. }
  392. @Override
  393. public boolean authenticate(HttpServletResponse response)
  394. throws IOException, ServletException {
  395. return false;
  396. }
  397. @Override
  398. public void login(String username, String password)
  399. throws ServletException {
  400. }
  401. @Override
  402. public void logout() throws ServletException {
  403. }
  404. @Override
  405. public Collection<Part> getParts() throws IOException,
  406. ServletException {
  407. return null;
  408. }
  409. @Override
  410. public Part getPart(String name) throws IOException,
  411. ServletException {
  412. return null;
  413. }
  414. @Override
  415. public <T extends HttpUpgradeHandler> T upgrade(
  416. Class<T> handlerClass) throws IOException,
  417. ServletException {
  418. return null;
  419. }
  420. }
  421. HashMap<String, Object> settings = new HashMap<String, Object>();
  422. MemorySettings getSettings() {
  423. return new MemorySettings(settings);
  424. }
  425. IAuthenticationManager newAuthenticationManager() {
  426. XssFilter xssFilter = new AllowXssFilter();
  427. RuntimeManager runtime = new RuntimeManager(getSettings(), xssFilter, GitBlitSuite.BASEFOLDER).start();
  428. users = new UserManager(runtime, null).start();
  429. final Map<String, UserModel> virtualUsers = new HashMap<String, UserModel>();
  430. users.setUserService(new IUserService() {
  431. @Override
  432. public void setup(IRuntimeManager runtimeManager) {
  433. }
  434. @Override
  435. public String getCookie(UserModel model) {
  436. return null;
  437. }
  438. @Override
  439. public UserModel getUserModel(char[] cookie) {
  440. return null;
  441. }
  442. @Override
  443. public UserModel getUserModel(String username) {
  444. return virtualUsers.get(username);
  445. }
  446. @Override
  447. public boolean updateUserModel(UserModel model) {
  448. virtualUsers.put(model.username, model);
  449. return true;
  450. }
  451. @Override
  452. public boolean updateUserModels(Collection<UserModel> models) {
  453. return false;
  454. }
  455. @Override
  456. public boolean updateUserModel(String username, UserModel model) {
  457. virtualUsers.put(username, model);
  458. return true;
  459. }
  460. @Override
  461. public boolean deleteUserModel(UserModel model) {
  462. return false;
  463. }
  464. @Override
  465. public boolean deleteUser(String username) {
  466. return false;
  467. }
  468. @Override
  469. public List<String> getAllUsernames() {
  470. return null;
  471. }
  472. @Override
  473. public List<UserModel> getAllUsers() {
  474. return null;
  475. }
  476. @Override
  477. public List<String> getAllTeamNames() {
  478. return null;
  479. }
  480. @Override
  481. public List<TeamModel> getAllTeams() {
  482. return null;
  483. }
  484. @Override
  485. public List<String> getTeamNamesForRepositoryRole(String role) {
  486. return null;
  487. }
  488. @Override
  489. public TeamModel getTeamModel(String teamname) {
  490. return null;
  491. }
  492. @Override
  493. public boolean updateTeamModel(TeamModel model) {
  494. return false;
  495. }
  496. @Override
  497. public boolean updateTeamModels(Collection<TeamModel> models) {
  498. return false;
  499. }
  500. @Override
  501. public boolean updateTeamModel(String teamname, TeamModel model) {
  502. return false;
  503. }
  504. @Override
  505. public boolean deleteTeamModel(TeamModel model) {
  506. return false;
  507. }
  508. @Override
  509. public boolean deleteTeam(String teamname) {
  510. return false;
  511. }
  512. @Override
  513. public List<String> getUsernamesForRepositoryRole(String role) {
  514. return null;
  515. }
  516. @Override
  517. public boolean renameRepositoryRole(String oldRole,
  518. String newRole) {
  519. return false;
  520. }
  521. @Override
  522. public boolean deleteRepositoryRole(String role) {
  523. return false;
  524. }
  525. });
  526. AuthenticationManager auth = new AuthenticationManager(runtime, users).start();
  527. return auth;
  528. }
  529. @Test
  530. public void testAuthenticate() throws Exception {
  531. IAuthenticationManager auth = newAuthenticationManager();
  532. UserModel user = new UserModel("sunnyjim");
  533. user.password = "password";
  534. users.updateUserModel(user);
  535. assertNotNull(auth.authenticate(user.username, user.password.toCharArray(), null));
  536. user.disabled = true;
  537. users.updateUserModel(user);
  538. assertNull(auth.authenticate(user.username, user.password.toCharArray(), null));
  539. users.deleteUserModel(user);
  540. }
  541. @Test
  542. public void testAuthenticateUpgradePlaintext() throws Exception {
  543. IAuthenticationManager auth = newAuthenticationManager();
  544. UserModel user = new UserModel("sunnyjim");
  545. user.password = "password";
  546. users.updateUserModel(user);
  547. assertNotNull(auth.authenticate(user.username, user.password.toCharArray(), null));
  548. // validate that plaintext password was automatically updated to hashed one
  549. assertTrue(user.password.startsWith(PasswordHash.getDefaultType().name() + ":"));
  550. }
  551. @Test
  552. public void testAuthenticateUpgradeMD5() throws Exception {
  553. IAuthenticationManager auth = newAuthenticationManager();
  554. UserModel user = new UserModel("sunnyjim");
  555. user.password = "MD5:5F4DCC3B5AA765D61D8327DEB882CF99";
  556. users.updateUserModel(user);
  557. assertNotNull(auth.authenticate(user.username, "password".toCharArray(), null));
  558. // validate that MD5 password was automatically updated to hashed one
  559. assertTrue(user.password.startsWith(PasswordHash.getDefaultType().name() + ":"));
  560. }
  561. @Test
  562. public void testContenairAuthenticate() throws Exception {
  563. settings.put(Keys.realm.container.autoCreateAccounts, "true");
  564. settings.put(Keys.realm.container.autoAccounts.displayName, "displayName");
  565. settings.put(Keys.realm.container.autoAccounts.emailAddress, "emailAddress");
  566. settings.put(Keys.realm.container.autoAccounts.adminRole, "admin");
  567. settings.put(Keys.realm.container.autoAccounts.locale, "locale");
  568. DummyHttpServletRequest request = new DummyHttpServletRequest();
  569. request.sessionAttributes.put("displayName", "Sunny Jim");
  570. request.sessionAttributes.put("emailAddress", "Jim.Sunny@gitblit.com");
  571. request.sessionAttributes.put("locale", "it");
  572. IAuthenticationManager auth = newAuthenticationManager();
  573. UserModel user = auth.authenticate(request);
  574. assertTrue(user.canAdmin);
  575. assertEquals("Sunny Jim", user.displayName);
  576. assertEquals("Jim.Sunny@gitblit.com", user.emailAddress);
  577. assertEquals(Locale.ITALIAN, user.getPreferences().getLocale());
  578. }
  579. @Test
  580. public void testContenairAuthenticateEmpty() throws Exception {
  581. settings.put(Keys.realm.container.autoCreateAccounts, "true");
  582. settings.put(Keys.realm.container.autoAccounts.displayName, "displayName");
  583. settings.put(Keys.realm.container.autoAccounts.emailAddress, "emailAddress");
  584. settings.put(Keys.realm.container.autoAccounts.adminRole, "notAdmin");
  585. DummyHttpServletRequest request = new DummyHttpServletRequest();
  586. IAuthenticationManager auth = newAuthenticationManager();
  587. UserModel user = auth.authenticate(request);
  588. assertFalse(user.canAdmin);
  589. assertEquals("sunnyjim", user.displayName);
  590. assertNull(user.emailAddress);
  591. assertNull(user.getPreferences().getLocale());
  592. }
  593. }