]> source.dussan.org Git - gitblit.git/commitdiff
Load empty groups as empty teams from ldap, when ldap user
authorAlfred Schmid <A.Schmid@ff-muenchen.de>
Mon, 3 Feb 2014 09:01:04 +0000 (10:01 +0100)
committerJames Moger <james.moger@gitblit.com>
Wed, 19 Feb 2014 16:04:16 +0000 (11:04 -0500)
synchronization is enabled.

src/main/distrib/data/gitblit.properties
src/main/java/com/gitblit/auth/LdapAuthProvider.java
src/test/java/com/gitblit/tests/LdapAuthenticationTest.java
src/test/resources/ldap/addgroup.ldif [new file with mode: 0644]

index bd0efd9e7fe5b3bd3a1234ff3e27ee3072e4378e..3297d2549af04bde0d35d7c69ad0390dfac3f122 100644 (file)
@@ -1460,6 +1460,14 @@ realm.ldap.groupBase = OU=Groups,OU=UserControl,OU=MyOrganization,DC=MyDomain
 # SINCE 1.0.0\r
 realm.ldap.groupMemberPattern = (&(objectClass=group)(member=${dn}))\r
 \r
+# Filter criteria for empty LDAP groups\r
+#\r
+# Query pattern to use when searching for an empty team. This may be any valid \r
+# LDAP query expression, including the standard (&) and (|) operators.\r
+#\r
+# SINCE 1.4.0\r
+realm.ldap.groupEmptyMemberPattern = (&(objectClass=group)(!(member=*)))\r
+\r
 # LDAP users or groups that should be given administrator privileges.\r
 #\r
 # Teams are specified with a leading '@' character.  Groups with spaces in the\r
@@ -1516,6 +1524,7 @@ realm.ldap.synchronizeUsers.enable = false
 # default: 5 MINUTES\r
 #\r
 # RESTART REQUIRED\r
+# SINCE 1.4.0\r
 realm.ldap.synchronizeUsers.ldapSyncPeriod = 5 MINUTES\r
 \r
 # Defines whether to delete non-existent LDAP users from the backing user service\r
index 1ec273a9d2722d53884d84856cc235a30197fed6..b20845957ed2ad2ae34f9504933e681b00ec1280 100644 (file)
@@ -152,6 +152,9 @@ public class LdapAuthProvider extends UsernamePasswordAuthenticationProvider {
                                 userManager.updateTeamModels(userTeams.values());
                             }
                         }
+                        if (!supportsTeamMembershipChanges()) {
+                               getEmptyTeamsFromLdap(ldapConnection);
+                        }
                         lastLdapUserSync.set(System.currentTimeMillis());
                     } finally {
                         ldapConnection.close();
@@ -435,6 +438,27 @@ public class LdapAuthProvider extends UsernamePasswordAuthenticationProvider {
                }
        }
 
+       private void getEmptyTeamsFromLdap(LDAPConnection ldapConnection) {
+               String groupBase = settings.getString(Keys.realm.ldap.groupBase, "");
+               String groupMemberPattern = settings.getString(Keys.realm.ldap.groupEmptyMemberPattern, "(&(objectClass=group)(!(member=*)))");
+
+               SearchResult teamMembershipResult = doSearch(ldapConnection, groupBase, true, groupMemberPattern, null);
+               if (teamMembershipResult != null && teamMembershipResult.getEntryCount() > 0) {
+                       for (int i = 0; i < teamMembershipResult.getEntryCount(); i++) {
+                               SearchResultEntry teamEntry = teamMembershipResult.getSearchEntries().get(i);
+                               if (!teamEntry.hasAttribute("member")) {
+                                       String teamName = teamEntry.getAttribute("cn").getValue();
+       
+                                       TeamModel teamModel = userManager.getTeamModel(teamName);
+                                       if (teamModel == null) {
+                                               teamModel = createTeamFromLdap(teamEntry);
+                                               userManager.updateTeamModel(teamModel);
+                                       }
+                               }
+                       }
+               }
+       }
+
        private TeamModel createTeamFromLdap(SearchResultEntry teamEntry) {
                TeamModel answer = new TeamModel(teamEntry.getAttributeValue("cn"));
                answer.accountType = getAccountType();
index ce3615e0a7404ba6f7e69964bc9650d9d4293f69..670dde0082290a18d703056df5fa5355992d0758 100644 (file)
@@ -34,6 +34,7 @@ import com.gitblit.auth.LdapAuthProvider;
 import com.gitblit.manager.IUserManager;
 import com.gitblit.manager.RuntimeManager;
 import com.gitblit.manager.UserManager;
+import com.gitblit.models.TeamModel;
 import com.gitblit.models.UserModel;
 import com.gitblit.tests.mock.MemorySettings;
 import com.unboundid.ldap.listener.InMemoryDirectoryServer;
@@ -208,6 +209,23 @@ public class LdapAuthenticationTest extends GitblitUnitTest {
                assertEquals("Number of ldap users in gitblit user model", 6, countLdapUsersInUserManager());
        }
 
+       @Test
+       public void addingGroupsInLdapShouldNotUpdateGitBlitUsersAndGroups() throws Exception {
+               settings.put("realm.ldap.ldapCachePeriod", "0 MINUTES");
+               ds.addEntries(LDIFReader.readEntries(RESOURCE_DIR + "addgroup.ldif"));
+               ldap.synchronizeWithLdapService();
+               assertEquals("Number of ldap groups in gitblit team model", 0, countLdapTeamsInUserManager());
+       }
+
+       @Test
+       public void addingGroupsInLdapShouldUpdateGitBlitUsersAndGroups() throws Exception {
+               settings.put("realm.ldap.synchronizeUsers.enable", "true");
+               settings.put("realm.ldap.ldapCachePeriod", "0 MINUTES");
+               ds.addEntries(LDIFReader.readEntries(RESOURCE_DIR + "addgroup.ldif"));
+               ldap.synchronizeWithLdapService();
+               assertEquals("Number of ldap groups in gitblit team model", 1, countLdapTeamsInUserManager());
+       }
+
        private int countLdapUsersInUserManager() {
                int ldapAccountCount = 0;
                for (UserModel userModel : userManager.getAllUsers()) {
@@ -218,4 +236,14 @@ public class LdapAuthenticationTest extends GitblitUnitTest {
                return ldapAccountCount;
        }
 
+       private int countLdapTeamsInUserManager() {
+               int ldapAccountCount = 0;
+               for (TeamModel teamModel : userManager.getAllTeams()) {
+                       if (AccountType.LDAP.equals(teamModel.accountType)) {
+                               ldapAccountCount++;
+                       }
+               }
+               return ldapAccountCount;
+       }
+
 }
diff --git a/src/test/resources/ldap/addgroup.ldif b/src/test/resources/ldap/addgroup.ldif
new file mode 100644 (file)
index 0000000..665df31
--- /dev/null
@@ -0,0 +1,5 @@
+dn: CN=Git_Group_Without_Members,OU=Groups,OU=UserControl,OU=MyOrganization,DC=MyDomain
+objectClass: top
+objectClass: group
+cn: Git_Group_Without_Members
+sAMAccountName: Git_Group_Without_Members