From 3d699cb14d6c891338567c562f7fe8d81e318b1c Mon Sep 17 00:00:00 2001 From: unknown <jcrygier@JCrygier-W520.int.aonesolutions.us> Date: Tue, 24 Apr 2012 08:48:39 -0400 Subject: [PATCH] Allow for admin teams with spaces in their name. --- src/com/gitblit/utils/StringUtils.java | 32 +++++++++------- src/com/gitblit/LdapUserService.java | 22 +++++----- tests/com/gitblit/tests/resources/ldapUserServiceSampleData.ldif | 8 ++++ tests/com/gitblit/tests/StringUtilsTest.java | 25 +++++++++--- tests/com/gitblit/tests/LdapUserServiceTest.java | 5 +- 5 files changed, 58 insertions(+), 34 deletions(-) diff --git a/src/com/gitblit/LdapUserService.java b/src/com/gitblit/LdapUserService.java index 9fcef9d..86b6136 100644 --- a/src/com/gitblit/LdapUserService.java +++ b/src/com/gitblit/LdapUserService.java @@ -20,6 +20,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.security.GeneralSecurityException; +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -174,17 +175,16 @@ } private void setAdminAttribute(UserModel user) { - String adminString = settings.getString(Keys.realm.ldap_admins, ""); - String[] admins = adminString.split(" "); - user.canAdmin = false; - for (String admin : admins) { - if (admin.startsWith("@")) { // Team - if (user.getTeam(admin.substring(1)) != null) - user.canAdmin = true; - } else - if (user.getName().equalsIgnoreCase(admin)) - user.canAdmin = true; - } + user.canAdmin = false; + List<String> admins = settings.getStrings(Keys.realm.ldap_admins); + for (String admin : admins) { + if (admin.startsWith("@")) { // Team + if (user.getTeam(admin.substring(1)) != null) + user.canAdmin = true; + } else + if (user.getName().equalsIgnoreCase(admin)) + user.canAdmin = true; + } } private void getTeamsFromLdap(LDAPConnection ldapConnection, String simpleUsername, SearchResultEntry loggingInUser, UserModel user) { diff --git a/src/com/gitblit/utils/StringUtils.java b/src/com/gitblit/utils/StringUtils.java index 0460ac9..2c35724 100644 --- a/src/com/gitblit/utils/StringUtils.java +++ b/src/com/gitblit/utils/StringUtils.java @@ -327,20 +327,24 @@ * @return list of strings */ public static List<String> getStringsFromValue(String value, String separator) { - List<String> strings = new ArrayList<String>(); - try { - String[] chunks = value.split(separator); - for (String chunk : chunks) { - chunk = chunk.trim(); - if (chunk.length() > 0) { - strings.add(chunk); - } - } - } catch (PatternSyntaxException e) { - throw new RuntimeException(e); - } - return strings; - } + List<String> strings = new ArrayList<String>(); + try { + String[] chunks = value.split(separator + "(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); + for (String chunk : chunks) { + chunk = chunk.trim(); + if (chunk.length() > 0) { + if (chunk.charAt(0) == '"' && chunk.charAt(chunk.length() - 1) == '"') { + // strip double quotes + chunk = chunk.substring(1, chunk.length() - 1).trim(); + } + strings.add(chunk); + } + } + } catch (PatternSyntaxException e) { + throw new RuntimeException(e); + } + return strings; + } /** * Validates that a name is composed of letters, digits, or limited other diff --git a/tests/com/gitblit/tests/LdapUserServiceTest.java b/tests/com/gitblit/tests/LdapUserServiceTest.java index 777d86c..43af24f 100644 --- a/tests/com/gitblit/tests/LdapUserServiceTest.java +++ b/tests/com/gitblit/tests/LdapUserServiceTest.java @@ -69,7 +69,7 @@ backingMap.put("realm.ldap.accountPattern", "(&(objectClass=person)(sAMAccountName=${username}))"); backingMap.put("realm.ldap.groupBase", "OU=Groups,OU=UserControl,OU=MyOrganization,DC=MyDomain"); backingMap.put("realm.ldap.groupPattern", "(&(objectClass=group)(member=${dn}))"); - backingMap.put("realm.ldap.admins", "UserThree @Git_Admins"); + backingMap.put("realm.ldap.admins", "UserThree @Git_Admins \"@Git Admins\""); MemorySettings ms = new MemorySettings(backingMap); @@ -92,7 +92,8 @@ assertNotNull(userTwoModel); assertNotNull(userTwoModel.getTeam("git_users")); assertNull(userTwoModel.getTeam("git_admins")); - assertFalse(userTwoModel.canAdmin); + assertNotNull(userTwoModel.getTeam("git admins")); + assertTrue(userTwoModel.canAdmin); UserModel userThreeModel = ldapUserService.authenticate("UserThree", "userThreePassword".toCharArray()); assertNotNull(userThreeModel); diff --git a/tests/com/gitblit/tests/StringUtilsTest.java b/tests/com/gitblit/tests/StringUtilsTest.java index 2e00fa3..91bfa67 100644 --- a/tests/com/gitblit/tests/StringUtilsTest.java +++ b/tests/com/gitblit/tests/StringUtilsTest.java @@ -112,13 +112,24 @@ @Test public void testStringsFromValue() throws Exception { - List<String> strings = StringUtils.getStringsFromValue("A B C D"); - assertEquals(4, strings.size()); - assertEquals("A", strings.get(0)); - assertEquals("B", strings.get(1)); - assertEquals("C", strings.get(2)); - assertEquals("D", strings.get(3)); - } + List<String> strings = StringUtils.getStringsFromValue("\"A A \" B \"C C\" D \"\" \"E\""); + assertEquals(6, strings.size()); + assertEquals("A A", strings.get(0)); + assertEquals("B", strings.get(1)); + assertEquals("C C", strings.get(2)); + assertEquals("D", strings.get(3)); + assertEquals("", strings.get(4)); + assertEquals("E", strings.get(5)); + + strings = StringUtils.getStringsFromValue("\"A A \", B, \"C C\", D, \"\", \"E\"", ","); + assertEquals(6, strings.size()); + assertEquals("A A", strings.get(0)); + assertEquals("B", strings.get(1)); + assertEquals("C C", strings.get(2)); + assertEquals("D", strings.get(3)); + assertEquals("", strings.get(4)); + assertEquals("E", strings.get(5)); + } @Test public void testStringsFromValue2() throws Exception { diff --git a/tests/com/gitblit/tests/resources/ldapUserServiceSampleData.ldif b/tests/com/gitblit/tests/resources/ldapUserServiceSampleData.ldif index 22d6869..84ee243 100644 --- a/tests/com/gitblit/tests/resources/ldapUserServiceSampleData.ldif +++ b/tests/com/gitblit/tests/resources/ldapUserServiceSampleData.ldif @@ -25,6 +25,13 @@ sAMAccountName: Git_Admins member: CN=UserOne,OU=US,OU=Users,OU=UserControl,OU=MyOrganization,DC=MyDomain +dn: CN=Git Admins,OU=Groups,OU=UserControl,OU=MyOrganization,DC=MyDomain +objectClass: top +objectClass: group +cn: Git Admins +sAMAccountName: Git_Admins_With_Space +member: CN=UserTwo,OU=US,OU=Users,OU=UserControl,OU=MyOrganization,DC=MyDomain + dn: CN=Git_Users,OU=Groups,OU=UserControl,OU=MyOrganization,DC=MyDomain objectClass: top objectClass: group @@ -64,6 +71,7 @@ sAMAccountName: UserTwo userPassword: userTwoPassword memberOf: CN=Git_Users,OU=Groups,OU=UserControl,OU=MyOrganization,DC=MyDomain +memberOf: CN=Git Admins,OU=Groups,OU=UserControl,OU=MyOrganization,DC=MyDomain dn: CN=UserThree,OU=Canada,OU=Users,OU=UserControl,OU=MyOrganization,DC=MyDomain objectClass: user -- Gitblit v1.9.1