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.

LdapUserServiceTest.java 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /*
  2. * Copyright 2012 John Crygier
  3. * Copyright 2012 gitblit.com
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. package com.gitblit.tests;
  18. import static org.junit.Assert.assertEquals;
  19. import static org.junit.Assert.assertNotNull;
  20. import static org.junit.Assert.assertNull;
  21. import static org.junit.Assert.assertTrue;
  22. import java.util.HashMap;
  23. import java.util.Map;
  24. import org.junit.Before;
  25. import org.junit.BeforeClass;
  26. import org.junit.Test;
  27. import com.gitblit.LdapUserService;
  28. import com.gitblit.models.UserModel;
  29. import com.gitblit.tests.mock.MemorySettings;
  30. import com.unboundid.ldap.listener.InMemoryDirectoryServer;
  31. import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig;
  32. import com.unboundid.ldap.listener.InMemoryListenerConfig;
  33. import com.unboundid.ldif.LDIFReader;
  34. /**
  35. * An Integration test for LDAP that tests going against an in-memory UnboundID
  36. * LDAP server.
  37. *
  38. * @author jcrygier
  39. *
  40. */
  41. public class LdapUserServiceTest {
  42. private LdapUserService ldapUserService;
  43. static int ldapPort = 1389;
  44. @BeforeClass
  45. public static void createInMemoryLdapServer() throws Exception {
  46. InMemoryDirectoryServerConfig config = new InMemoryDirectoryServerConfig("dc=MyDomain");
  47. config.addAdditionalBindCredentials("cn=Directory Manager", "password");
  48. config.setListenerConfigs(InMemoryListenerConfig.createLDAPConfig("default", ldapPort));
  49. config.setSchema(null);
  50. InMemoryDirectoryServer ds = new InMemoryDirectoryServer(config);
  51. ds.importFromLDIF(true, new LDIFReader(LdapUserServiceTest.class.getResourceAsStream("resources/ldapUserServiceSampleData.ldif")));
  52. ds.startListening();
  53. }
  54. @Before
  55. public void createLdapUserService() {
  56. ldapUserService = new LdapUserService();
  57. ldapUserService.setup(getSettings());
  58. }
  59. private MemorySettings getSettings() {
  60. Map<String, Object> backingMap = new HashMap<String, Object>();
  61. backingMap.put("realm.ldap.server", "ldap://localhost:" + ldapPort);
  62. backingMap.put("realm.ldap.domain", "");
  63. backingMap.put("realm.ldap.username", "cn=Directory Manager");
  64. backingMap.put("realm.ldap.password", "password");
  65. backingMap.put("realm.ldap.backingUserService", "users.conf");
  66. backingMap.put("realm.ldap.maintainTeams", "true");
  67. backingMap.put("realm.ldap.accountBase", "OU=Users,OU=UserControl,OU=MyOrganization,DC=MyDomain");
  68. backingMap.put("realm.ldap.accountPattern", "(&(objectClass=person)(sAMAccountName=${username}))");
  69. backingMap.put("realm.ldap.groupBase", "OU=Groups,OU=UserControl,OU=MyOrganization,DC=MyDomain");
  70. backingMap.put("realm.ldap.groupPattern", "(&(objectClass=group)(member=${dn}))");
  71. backingMap.put("realm.ldap.admins", "UserThree @Git_Admins \"@Git Admins\"");
  72. backingMap.put("realm.ldap.displayName", "displayName");
  73. backingMap.put("realm.ldap.email", "email");
  74. MemorySettings ms = new MemorySettings(backingMap);
  75. return ms;
  76. }
  77. @Test
  78. public void testAuthenticate() {
  79. UserModel userOneModel = ldapUserService.authenticate("UserOne", "userOnePassword".toCharArray());
  80. assertNotNull(userOneModel);
  81. assertNotNull(userOneModel.getTeam("git_admins"));
  82. assertNotNull(userOneModel.getTeam("git_users"));
  83. assertTrue(userOneModel.canAdmin);
  84. UserModel userOneModelFailedAuth = ldapUserService.authenticate("UserOne", "userTwoPassword".toCharArray());
  85. assertNull(userOneModelFailedAuth);
  86. UserModel userTwoModel = ldapUserService.authenticate("UserTwo", "userTwoPassword".toCharArray());
  87. assertNotNull(userTwoModel);
  88. assertNotNull(userTwoModel.getTeam("git_users"));
  89. assertNull(userTwoModel.getTeam("git_admins"));
  90. assertNotNull(userTwoModel.getTeam("git admins"));
  91. assertTrue(userTwoModel.canAdmin);
  92. UserModel userThreeModel = ldapUserService.authenticate("UserThree", "userThreePassword".toCharArray());
  93. assertNotNull(userThreeModel);
  94. assertNotNull(userThreeModel.getTeam("git_users"));
  95. assertNull(userThreeModel.getTeam("git_admins"));
  96. assertTrue(userThreeModel.canAdmin);
  97. }
  98. @Test
  99. public void testDisplayName() {
  100. UserModel userOneModel = ldapUserService.authenticate("UserOne", "userOnePassword".toCharArray());
  101. assertNotNull(userOneModel);
  102. assertEquals("User One", userOneModel.displayName);
  103. // Test more complicated scenarios - concat
  104. MemorySettings ms = getSettings();
  105. ms.put("realm.ldap.displayName", "${personalTitle}. ${givenName} ${surname}");
  106. ldapUserService = new LdapUserService();
  107. ldapUserService.setup(ms);
  108. userOneModel = ldapUserService.authenticate("UserOne", "userOnePassword".toCharArray());
  109. assertNotNull(userOneModel);
  110. assertEquals("Mr. User One", userOneModel.displayName);
  111. }
  112. @Test
  113. public void testEmail() {
  114. UserModel userOneModel = ldapUserService.authenticate("UserOne", "userOnePassword".toCharArray());
  115. assertNotNull(userOneModel);
  116. assertEquals("userone@gitblit.com", userOneModel.emailAddress);
  117. // Test more complicated scenarios - concat
  118. MemorySettings ms = getSettings();
  119. ms.put("realm.ldap.email", "${givenName}.${surname}@gitblit.com");
  120. ldapUserService = new LdapUserService();
  121. ldapUserService.setup(ms);
  122. userOneModel = ldapUserService.authenticate("UserOne", "userOnePassword".toCharArray());
  123. assertNotNull(userOneModel);
  124. assertEquals("User.One@gitblit.com", userOneModel.emailAddress);
  125. }
  126. @Test
  127. public void testLdapInjection() {
  128. // Inject so "(&(objectClass=person)(sAMAccountName=${username}))" becomes "(&(objectClass=person)(sAMAccountName=*)(userPassword=userOnePassword))"
  129. // Thus searching by password
  130. UserModel userOneModel = ldapUserService.authenticate("*)(userPassword=userOnePassword", "userOnePassword".toCharArray());
  131. assertNull(userOneModel);
  132. }
  133. }