You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2019/11/26 11:21:59 UTC

[qpid-broker-j] 01/03: QPID-8374: [Broker-J][ACL] Allow case insensitive mapping of group members to groups in existing GroupProvider

This is an automated email from the ASF dual-hosted git repository.

orudyy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-broker-j.git

commit 005ba4184de60a02824038648f3584332f861de1
Author: Stanislav Khomytskyi <Re...@protonmail.com>
AuthorDate: Mon Nov 18 17:18:59 2019 +0100

    QPID-8374: [Broker-J][ACL] Allow case insensitive mapping of group members to groups in existing GroupProvider
---
 ...oupProvider.java => AbstractGroupProvider.java} |  25 +-
 .../apache/qpid/server/model/GroupProvider.java    |   5 +-
 .../model/adapter/FileBasedGroupProviderImpl.java  |  13 +-
 .../server/security/group/FileGroupDatabase.java   |  91 +++--
 .../server/security/group/GroupProviderImpl.java   |  18 +-
 ...oundryDashboardManagementGroupProviderImpl.java |   6 +-
 .../FileGroupDatabaseCaseInsensitiveTest.java      | 409 +++++++++++++++++++++
 .../security/group/FileGroupDatabaseTest.java      | 331 ++++++++---------
 .../server/security/group/GroupProviderUtil.java   |  80 ++++
 .../src/main/java/resources/addGroupProvider.html  |  22 +-
 .../java/resources/js/qpid/management/Broker.js    |  13 +-
 .../resources/js/qpid/management/GroupProvider.js  |  11 +-
 .../src/main/java/resources/showGroupProvider.html |  16 +-
 13 files changed, 793 insertions(+), 247 deletions(-)

diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java b/broker-core/src/main/java/org/apache/qpid/server/model/AbstractGroupProvider.java
similarity index 60%
copy from broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
copy to broker-core/src/main/java/org/apache/qpid/server/model/AbstractGroupProvider.java
index 23ea1d6..00f97a8 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/AbstractGroupProvider.java
@@ -1,4 +1,5 @@
 /*
+ *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -19,11 +20,25 @@
  */
 package org.apache.qpid.server.model;
 
-import java.security.Principal;
-import java.util.Set;
+import java.util.Map;
 
-@ManagedObject
-public interface GroupProvider<X extends GroupProvider<X>> extends ConfiguredObject<X>
+public abstract class AbstractGroupProvider<X extends AbstractGroupProvider<X>>
+        extends AbstractConfiguredObject<X> implements GroupProvider<X>
 {
-    Set<Principal> getGroupPrincipalsForUser(Principal userPrincipal);
+    private final Container<?> _container;
+
+    @ManagedAttributeField
+    private boolean _caseSensitive;
+
+    protected AbstractGroupProvider(Container<?> container, Map<String, Object> attributes)
+    {
+        super(container, attributes);
+        _container = container;
+    }
+
+    @Override
+    public boolean isCaseSensitive()
+    {
+        return _caseSensitive;
+    }
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java b/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
index 23ea1d6..1dfa3dd 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
@@ -26,4 +26,7 @@ import java.util.Set;
 public interface GroupProvider<X extends GroupProvider<X>> extends ConfiguredObject<X>
 {
     Set<Principal> getGroupPrincipalsForUser(Principal userPrincipal);
-}
+
+    @ManagedAttribute(defaultValue = "true", description = "Allow to choose CaseSensitive or CaseInsensitive search of Groups and Users")
+    boolean isCaseSensitive();
+}
\ No newline at end of file
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java b/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
index f592c76..f08ed53 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
@@ -63,6 +63,9 @@ public class FileBasedGroupProviderImpl
     private FileGroupDatabase _groupDatabase;
 
     @ManagedAttributeField
+    private boolean _caseSensitive;
+
+    @ManagedAttributeField
     private String _path;
 
     @ManagedObjectFactoryConstructor
@@ -106,7 +109,7 @@ public class FileBasedGroupProviderImpl
     protected void onOpen()
     {
         super.onOpen();
-        FileGroupDatabase groupDatabase = new FileGroupDatabase();
+        FileGroupDatabase groupDatabase = new FileGroupDatabase(isCaseSensitive());
         try
         {
             groupDatabase.setGroupFile(getPath());
@@ -176,7 +179,7 @@ public class FileBasedGroupProviderImpl
                 throw new IllegalConfigurationException(String.format("Cannot read groups file '%s'. Please check permissions.", _path));
             }
 
-            FileGroupDatabase groupDatabase = new FileGroupDatabase();
+            FileGroupDatabase groupDatabase = new FileGroupDatabase(isCaseSensitive());
             try
             {
                 groupDatabase.setGroupFile(_path);
@@ -309,6 +312,12 @@ public class FileBasedGroupProviderImpl
         }
     }
 
+    @Override
+    public boolean isCaseSensitive()
+    {
+        return _caseSensitive;
+    }
+
     private class GroupAdapter extends AbstractConfiguredObject<GroupAdapter> implements Group<GroupAdapter>
     {
         public GroupAdapter(Map<String, Object> attributes)
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/group/FileGroupDatabase.java b/broker-core/src/main/java/org/apache/qpid/server/security/group/FileGroupDatabase.java
index 90efc5f..0e9a608 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/group/FileGroupDatabase.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/group/FileGroupDatabase.java
@@ -42,7 +42,7 @@ import org.apache.qpid.server.util.ServerScopedRuntimeException;
 
 /**
  * A group database that reads/writes the following file format:
- *
+ * <p>
  * group1.users=user1,user2
  * group2.users=user2,user3
  */
@@ -50,9 +50,20 @@ public class FileGroupDatabase implements GroupDatabase
 {
     private static final Logger LOGGER = LoggerFactory.getLogger(FileGroupDatabase.class);
 
-    private Map<String, Set<String>> _groupToUserMap = new ConcurrentHashMap<String, Set<String>>();
-    private Map<String, Set<String>> _userToGroupMap = new ConcurrentHashMap<String, Set<String>>();
+    private final Map<String, Set<String>> _groupToUserMap;
+    private final Map<String, Set<String>> _userToGroupMap;
     private String _groupFile;
+    private final boolean _caseSensitive;
+
+    /**
+     * @param caseSensitive provides information if search of Users and Groups is CaseSensitive or CaseInsensitive;
+     */
+    public FileGroupDatabase(boolean caseSensitive)
+    {
+        this._caseSensitive = caseSensitive;
+        _groupToUserMap = new ConcurrentHashMap<>();
+        _userToGroupMap = new ConcurrentHashMap<>();
+    }
 
     @Override
     public Set<String> getAllGroups()
@@ -66,8 +77,7 @@ public class FileGroupDatabase implements GroupDatabase
 
         if (!file.canRead())
         {
-            throw new FileNotFoundException(groupFile
-                    + " cannot be found or is not readable");
+            throw new FileNotFoundException(groupFile + " cannot be found or is not readable");
         }
 
         readGroupFile(groupFile);
@@ -82,7 +92,7 @@ public class FileGroupDatabase implements GroupDatabase
             return Collections.emptySet();
         }
 
-        Set<String> set = _groupToUserMap.get(group);
+        Set<String> set = _groupToUserMap.get(keySearch(_groupToUserMap.keySet(), group));
         if (set == null)
         {
             return Collections.emptySet();
@@ -96,21 +106,25 @@ public class FileGroupDatabase implements GroupDatabase
     @Override
     public synchronized void addUserToGroup(String user, String group)
     {
-        Set<String> users = _groupToUserMap.get(group);
+        Set<String> users = _groupToUserMap.get(keySearch(_groupToUserMap.keySet(), group));
         if (users == null)
         {
-            throw new IllegalArgumentException("Group " + group + " does not exist so could not add " + user + " to it");
+            throw new IllegalArgumentException("Group "
+                                               + group
+                                               + " does not exist so could not add "
+                                               + user
+                                               + " to it");
         }
 
-        users.add(user);
+        users.add(keySearch(users, user));
 
-        Set<String> groups = _userToGroupMap.get(user);
+        Set<String> groups = _userToGroupMap.get(keySearch(_userToGroupMap.keySet(), user));
         if (groups == null)
         {
             groups = new ConcurrentSkipListSet<String>();
             _userToGroupMap.put(user, groups);
         }
-        groups.add(group);
+        groups.add(keySearch(_groupToUserMap.keySet(), group));
 
         update();
     }
@@ -118,18 +132,22 @@ public class FileGroupDatabase implements GroupDatabase
     @Override
     public synchronized void removeUserFromGroup(String user, String group)
     {
-        Set<String> users = _groupToUserMap.get(group);
+        Set<String> users = _groupToUserMap.get(keySearch(_groupToUserMap.keySet(), group));
         if (users == null)
         {
-            throw new IllegalArgumentException("Group " + group + " does not exist so could not remove " + user + " from it");
+            throw new IllegalArgumentException("Group "
+                                               + group
+                                               + " does not exist so could not remove "
+                                               + user
+                                               + " from it");
         }
 
-        users.remove(user);
+        users.remove(keySearch(users, user));
 
-        Set<String> groups = _userToGroupMap.get(user);
+        Set<String> groups = _userToGroupMap.get(keySearch(_userToGroupMap.keySet(), user));
         if (groups != null)
         {
-            groups.remove(group);
+            groups.remove(keySearch(groups, group));
         }
 
         update();
@@ -138,13 +156,13 @@ public class FileGroupDatabase implements GroupDatabase
     @Override
     public Set<String> getGroupsForUser(String user)
     {
-        if(user == null)
+        if (user == null)
         {
             LOGGER.warn("Requested group set for null user. Returning empty set.");
             return Collections.emptySet();
         }
 
-        Set<String> groups = _userToGroupMap.get(user);
+        Set<String> groups = _userToGroupMap.get(keySearch(_userToGroupMap.keySet(), user));
         if (groups == null)
         {
             return Collections.emptySet();
@@ -167,10 +185,10 @@ public class FileGroupDatabase implements GroupDatabase
     @Override
     public synchronized void removeGroup(String group)
     {
-        _groupToUserMap.remove(group);
+        _groupToUserMap.remove(keySearch(_groupToUserMap.keySet(), group));
         for (Set<String> groupsForUser : _userToGroupMap.values())
         {
-            groupsForUser.remove(group);
+            groupsForUser.remove(keySearch(groupsForUser, group));
         }
 
         update();
@@ -186,7 +204,7 @@ public class FileGroupDatabase implements GroupDatabase
             }
             catch (IOException e)
             {
-                throw new ServerScopedRuntimeException("Unable to persist change to file " + _groupFile,e);
+                throw new ServerScopedRuntimeException("Unable to persist change to file " + _groupFile, e);
             }
         }
     }
@@ -197,7 +215,8 @@ public class FileGroupDatabase implements GroupDatabase
         _groupToUserMap.clear();
         _userToGroupMap.clear();
         Properties propertiesFile = new Properties();
-        try (FileInputStream fileInputStream = new FileInputStream(groupFile)) {
+        try (FileInputStream fileInputStream = new FileInputStream(groupFile))
+        {
             propertiesFile.load(fileInputStream);
         }
 
@@ -214,7 +233,7 @@ public class FileGroupDatabase implements GroupDatabase
 
             for (String userName : userSet)
             {
-                Set<String> groupsForThisUser = _userToGroupMap.get(userName);
+                Set<String> groupsForThisUser = _userToGroupMap.get(keySearch(_userToGroupMap.keySet(), userName));
 
                 if (groupsForThisUser == null)
                 {
@@ -233,20 +252,19 @@ public class FileGroupDatabase implements GroupDatabase
 
         for (String group : _groupToUserMap.keySet())
         {
-            Set<String> users = _groupToUserMap.get(group);
+            Set<String> users = _groupToUserMap.get(keySearch(_groupToUserMap.keySet(), group));
             final String userList = Joiner.on(",").useForNull("").join(users);
 
             propertiesFile.setProperty(group + ".users", userList);
         }
 
-
         new FileHelper().writeFileSafely(new File(groupFile).toPath(), new BaseAction<File, IOException>()
         {
             @Override
             public void performAction(File file) throws IOException
             {
                 String comment = "Written " + new Date();
-                try(FileOutputStream fileOutputStream = new FileOutputStream(file))
+                try (FileOutputStream fileOutputStream = new FileOutputStream(file))
                 {
                     propertiesFile.store(fileOutputStream, comment);
                 }
@@ -258,10 +276,9 @@ public class FileGroupDatabase implements GroupDatabase
     {
         if (!propertyName.endsWith(".users"))
         {
-            throw new IllegalArgumentException(
-                    "Invalid definition with name '"
-                            + propertyName
-                            + "'. Group definitions must end with suffix '.users'");
+            throw new IllegalArgumentException("Invalid definition with name '"
+                                               + propertyName
+                                               + "'. Group definitions must end with suffix '.users'");
         }
     }
 
@@ -280,4 +297,18 @@ public class FileGroupDatabase implements GroupDatabase
         return userSet;
     }
 
+    private String keySearch(Set<String> set, String requiredKey)
+    {
+        if (!_caseSensitive)
+        {
+            for (String key : set)
+            {
+                if (key.equalsIgnoreCase(requiredKey))
+                {
+                    return key;
+                }
+            }
+        }
+        return requiredKey;
+    }
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java b/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java
index dfd55da..352104d 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java
@@ -29,7 +29,7 @@ import java.util.Set;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 
-import org.apache.qpid.server.model.AbstractConfiguredObject;
+import org.apache.qpid.server.model.AbstractGroupProvider;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Container;
 import org.apache.qpid.server.model.Group;
@@ -42,17 +42,16 @@ import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.StateTransition;
 
 @ManagedObject(category = false, type = GroupProviderImpl.CONFIG_TYPE)
-public class GroupProviderImpl extends AbstractConfiguredObject<GroupProviderImpl> implements GroupProvider<GroupProviderImpl>, GroupManagingGroupProvider
+public class GroupProviderImpl extends AbstractGroupProvider<GroupProviderImpl>
+        implements GroupProvider<GroupProviderImpl>, GroupManagingGroupProvider
 {
 
     public static final String CONFIG_TYPE = "ManagedGroupProvider";
-    private final Container<?> _container;
 
     @ManagedObjectFactoryConstructor
     public GroupProviderImpl(Map<String, Object> attributes, Container<?> container)
     {
         super(container, attributes);
-        _container = container;
     }
 
 
@@ -62,11 +61,11 @@ public class GroupProviderImpl extends AbstractConfiguredObject<GroupProviderImp
         Set<Principal> principals = new HashSet<>();
 
         final Collection<Group> groups = getChildren(Group.class);
-        for(Group<?> group : groups)
+        for (Group<?> group : groups)
         {
-            for(GroupMember<?> member : group.getChildren(GroupMember.class))
+            for (GroupMember<?> member : group.getChildren(GroupMember.class))
             {
-                if(member.getName().equals(userPrincipal.getName()))
+                if (member.getName().equals(userPrincipal.getName()))
                 {
                     principals.add(new GroupPrincipal(group.getName(), this));
                 }
@@ -79,10 +78,9 @@ public class GroupProviderImpl extends AbstractConfiguredObject<GroupProviderImp
     protected <C extends ConfiguredObject> ListenableFuture<C> addChildAsync(final Class<C> childClass,
                                                                              final Map<String, Object> attributes)
     {
-        if(childClass == Group.class)
+        if (childClass == Group.class)
         {
             return getObjectFactory().createAsync(childClass, attributes, this);
-
         }
         else
         {
@@ -90,7 +88,7 @@ public class GroupProviderImpl extends AbstractConfiguredObject<GroupProviderImp
         }
     }
 
-    @StateTransition( currentState = { State.UNINITIALIZED, State.QUIESCED, State.ERRORED }, desiredState = State.ACTIVE )
+    @StateTransition(currentState = {State.UNINITIALIZED, State.QUIESCED, State.ERRORED}, desiredState = State.ACTIVE)
     private ListenableFuture<Void> activate()
     {
         setState(State.ACTIVE);
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/group/cloudfoundry/CloudFoundryDashboardManagementGroupProviderImpl.java b/broker-core/src/main/java/org/apache/qpid/server/security/group/cloudfoundry/CloudFoundryDashboardManagementGroupProviderImpl.java
index 88659b5..99e3212 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/group/cloudfoundry/CloudFoundryDashboardManagementGroupProviderImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/group/cloudfoundry/CloudFoundryDashboardManagementGroupProviderImpl.java
@@ -49,7 +49,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
-import org.apache.qpid.server.model.AbstractConfiguredObject;
+import org.apache.qpid.server.model.AbstractGroupProvider;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Container;
 import org.apache.qpid.server.model.ManagedAttributeField;
@@ -70,14 +70,13 @@ import org.apache.qpid.server.util.ServerScopedRuntimeException;
  * See the CloudFoundry docs for more information:
  * http://docs.cloudfoundry.org/services/dashboard-sso.html#checking-user-permissions
  */
-public class CloudFoundryDashboardManagementGroupProviderImpl extends AbstractConfiguredObject<CloudFoundryDashboardManagementGroupProviderImpl>
+public class CloudFoundryDashboardManagementGroupProviderImpl extends AbstractGroupProvider<CloudFoundryDashboardManagementGroupProviderImpl>
         implements CloudFoundryDashboardManagementGroupProvider<CloudFoundryDashboardManagementGroupProviderImpl>
 {
     private static final Logger LOGGER = LoggerFactory.getLogger(CloudFoundryDashboardManagementGroupProviderImpl.class);
     private static final String UTF8 = StandardCharsets.UTF_8.name();
 
     private final ObjectMapper _objectMapper = new ObjectMapper();
-    private final Container<?> _container;
 
     @ManagedAttributeField
     private URI _cloudFoundryEndpointURI;
@@ -99,7 +98,6 @@ public class CloudFoundryDashboardManagementGroupProviderImpl extends AbstractCo
     public CloudFoundryDashboardManagementGroupProviderImpl(Map<String, Object> attributes, Container<?> container)
     {
         super(container, attributes);
-        _container = container;
     }
 
     @Override
diff --git a/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseCaseInsensitiveTest.java b/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseCaseInsensitiveTest.java
new file mode 100644
index 0000000..d393c3a
--- /dev/null
+++ b/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseCaseInsensitiveTest.java
@@ -0,0 +1,409 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.security.group;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Set;
+
+import org.junit.After;
+import org.junit.Test;
+
+import org.apache.qpid.test.utils.UnitTestBase;
+
+public class FileGroupDatabaseCaseInsensitiveTest extends UnitTestBase
+{
+    private static final String USER1 = "user1";
+    private static final String USER2 = "user2";
+    private static final String USER3 = "user3";
+
+    private static final String MY_GROUP = "myGroup";
+    private static final String MY_GROUP2 = "myGroup2";
+    private static final String MY_GROUP1 = "myGroup1";
+
+    private static final boolean CASE_SENSITIVE = false;
+    private static final FileGroupDatabase FILE_GROUP_DATABASE = new FileGroupDatabase(CASE_SENSITIVE);
+    private static final GroupProviderUtil UTIL;
+    private static final String GROUP_FILE;
+
+    static
+    {
+        try
+        {
+            UTIL = new GroupProviderUtil(FILE_GROUP_DATABASE);
+            GROUP_FILE = UTIL.getGroupFile();
+        }
+        catch (IOException e)
+        {
+           throw new RuntimeException(e);
+        }
+    }
+
+    @Test
+    public void testGetUsersInGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2,user3");
+        FILE_GROUP_DATABASE.setGroupFile(GROUP_FILE);
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        assertNotNull(users);
+        assertEquals(3, users.size());
+        Set<String> users2 = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertNotNull(users2);
+        assertEquals(3, users2.size());
+        Set<String> users3 = FILE_GROUP_DATABASE.getUsersInGroup("MyGrouP");
+        assertNotNull(users3);
+        assertEquals(3, users3.size());
+    }
+
+    @Test
+    public void testDuplicateUsersInGroupAreConflatedCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user1,user3,user1");
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertNotNull(users);
+        assertEquals(2, users.size());
+    }
+
+    @Test
+    public void testGetUsersWithEmptyGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "");
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertNotNull(users);
+        assertTrue(users.isEmpty());
+    }
+
+    @Test
+    public void testGetGroupPrincipalsForUserWhenUserBelongsToOneGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        FILE_GROUP_DATABASE.setGroupFile(GROUP_FILE);
+
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        assertEquals(1, groups.size());
+        assertTrue(groups.contains(MY_GROUP));
+
+        Set<String> groups2 = FILE_GROUP_DATABASE.getGroupsForUser("User2");
+        assertEquals(1, groups2.size());
+        assertTrue(groups2.contains(MY_GROUP));
+    }
+
+    @Test
+    public void testGetGroupPrincipalsForUserWhenUserBelongsToTwoGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2",
+                                  "myGroup1.users", "user1,user3",
+                                  "myGroup2.users", "user2,user3");
+        FILE_GROUP_DATABASE.setGroupFile(GROUP_FILE);
+
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        assertEquals(2, groups.size());
+        assertTrue(groups.contains(MY_GROUP));
+        assertTrue(groups.contains(MY_GROUP1));
+
+        Set<String> groups2 = FILE_GROUP_DATABASE.getGroupsForUser("User2");
+        assertEquals(2, groups2.size());
+        assertTrue(groups2.contains(MY_GROUP));
+        assertTrue(groups2.contains(MY_GROUP2));
+    }
+
+    @Test
+    public void testGetGroupPrincipalsForUserWhenUserAddedToGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", USER2);
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        assertEquals(1, groups.size());
+        assertTrue(groups.contains(MY_GROUP1));
+
+        FILE_GROUP_DATABASE.addUserToGroup(USER1, MY_GROUP2.toUpperCase());
+
+        groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        assertEquals(2, groups.size());
+        assertTrue(groups.contains(MY_GROUP1));
+        assertTrue(groups.contains(MY_GROUP2));
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP2.toUpperCase());
+        assertEquals(2, users.size());
+        assertTrue(users.contains(USER1));
+        assertTrue(users.contains(USER2));
+    }
+
+    @Test
+    public void testGetGroupPrincipalsForUserWhenUserRemovedFromGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user2");
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(2, groups.size());
+        assertTrue(groups.contains(MY_GROUP1));
+        assertTrue(groups.contains(MY_GROUP2));
+
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP2);
+
+        groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(1, groups.size());
+        assertTrue(groups.contains(MY_GROUP1));
+    }
+
+    @Test
+    public void testGetGroupPrincipalsForUserWhenUserAddedToGroupTheyAreAlreadyInCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", USER1);
+        FILE_GROUP_DATABASE.addUserToGroup(USER1, MY_GROUP);
+
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+
+        assertEquals(1, groups.size());
+        assertTrue(groups.contains(MY_GROUP));
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertEquals(1, users.size());
+        assertTrue(users.contains(USER1));
+    }
+
+    @Test
+    public void testGetGroupPrincipalsForUserWhenUserNotKnownCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER3.toUpperCase());
+        assertTrue(groups.isEmpty());
+    }
+
+    @Test
+    public void testGetGroupPrincipalsForNullUserCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile();
+        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(null).isEmpty());
+    }
+
+    @Test
+    public void testAddUserToExistingGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertNotNull(users);
+        assertEquals(2, users.size());
+
+        FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
+
+        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertNotNull(users);
+        assertEquals(3, users.size());
+    }
+
+    @Test
+    public void testAddUserToEmptyGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "");
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertNotNull(users);
+        assertTrue(users.isEmpty());
+
+        FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP.toUpperCase());
+
+        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        assertNotNull(users);
+        assertEquals(1, users.size());
+    }
+
+    @Test
+    public void testAddUserToNonExistentGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile();
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertNotNull(users);
+        assertTrue(users.isEmpty());
+
+        try
+        {
+            FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
+            fail("Expected exception not thrown");
+        }
+        catch (IllegalArgumentException e)
+        {
+            // pass
+        }
+
+        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        assertNotNull(users);
+        assertTrue(users.isEmpty());
+    }
+
+    @Test
+    public void testRemoveUserFromExistingGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertNotNull(users);
+        assertEquals(2, users.size());
+
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER2.toUpperCase(), MY_GROUP.toUpperCase());
+
+        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        assertNotNull(users);
+        assertEquals(1, users.size());
+    }
+
+    @Test
+    public void testRemoveUserFromNonexistentGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile();
+
+        try
+        {
+            FILE_GROUP_DATABASE.removeUserFromGroup(USER1.toUpperCase(), MY_GROUP);
+            fail("Expected exception not thrown");
+        }
+        catch (IllegalArgumentException e)
+        {
+            // pass
+        }
+
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase()).isEmpty());
+    }
+
+    @Test
+    public void testRemoveUserFromGroupTwiceCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", USER1);
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).contains(USER1));
+
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP.toUpperCase());
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).isEmpty());
+
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER1.toUpperCase(), MY_GROUP);
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).isEmpty());
+    }
+
+    @Test
+    public void testAddUserPersistedToFileCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertEquals(2, users.size());
+
+        FILE_GROUP_DATABASE.addUserToGroup(USER3.toUpperCase(), MY_GROUP);
+        assertEquals(3, users.size());
+
+        FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        newGroupDatabase.setGroupFile(GROUP_FILE);
+
+        Set<String> newUsers = newGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertEquals(users.size(), newUsers.size());
+    }
+
+    @Test
+    public void testRemoveUserPersistedToFileCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertEquals(2, users.size());
+
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER2.toUpperCase(), MY_GROUP);
+        assertEquals(1, users.size());
+
+        FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        newGroupDatabase.setGroupFile(GROUP_FILE);
+
+        Set<String> newUsers = newGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertEquals(users.size(), newUsers.size());
+    }
+
+    @Test
+    public void testCreateGroupPersistedToFileCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile();
+
+        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertTrue(groups.isEmpty());
+
+        FILE_GROUP_DATABASE.createGroup(MY_GROUP);
+
+        groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertEquals(1, groups.size());
+        assertTrue(groups.contains(MY_GROUP));
+
+        FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        newGroupDatabase.setGroupFile(GROUP_FILE);
+
+        Set<String> newGroups = newGroupDatabase.getAllGroups();
+        assertEquals(1, newGroups.size());
+        assertTrue(newGroups.contains(MY_GROUP));
+    }
+
+    @Test
+    public void testRemoveGroupPersistedToFileCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user2");
+
+        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertEquals(2, groups.size());
+
+        Set<String> groupsForUser1 = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        assertEquals(2, groupsForUser1.size());
+
+        FILE_GROUP_DATABASE.removeGroup(MY_GROUP1.toUpperCase());
+
+        groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertEquals(1, groups.size());
+        assertTrue(groups.contains(MY_GROUP2));
+
+        groupsForUser1 = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        assertEquals(1, groupsForUser1.size());
+
+        FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        newGroupDatabase.setGroupFile(GROUP_FILE);
+
+        Set<String> newGroups = newGroupDatabase.getAllGroups();
+        assertEquals(1, newGroups.size());
+        assertTrue(newGroups.contains(MY_GROUP2));
+
+        Set<String> newGroupsForUser1 = newGroupDatabase.getGroupsForUser(USER1.toUpperCase());
+        assertEquals(1, newGroupsForUser1.size());
+        assertTrue(newGroupsForUser1.contains(MY_GROUP2));
+    }
+
+    @After
+    public void tearDown() throws Exception
+    {
+
+        if (GROUP_FILE != null)
+        {
+            File groupFile = new File(GROUP_FILE);
+            if (groupFile.exists())
+            {
+                groupFile.delete();
+            }
+        }
+    }
+}
diff --git a/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseTest.java b/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseTest.java
index a9fb9ab..408fa7d 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseTest.java
@@ -26,13 +26,10 @@ import static org.junit.Assert.fail;
 
 import java.io.File;
 import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
 import java.io.IOException;
-import java.util.Properties;
 import java.util.Set;
 
 import org.junit.After;
-import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.qpid.test.utils.UnitTestBase;
@@ -47,26 +44,41 @@ public class FileGroupDatabaseTest extends UnitTestBase
     private static final String MY_GROUP2 = "myGroup2";
     private static final String MY_GROUP1 = "myGroup1";
 
-    private FileGroupDatabase _groupDatabase = new FileGroupDatabase();
-    private String _groupFile;
+    private static final boolean CASE_SENSITIVE = true;
+    private static final FileGroupDatabase FILE_GROUP_DATABASE = new FileGroupDatabase(CASE_SENSITIVE);
+    private static final GroupProviderUtil UTIL;
+    private static final String GROUP_FILE;
+
+    static
+    {
+        try
+        {
+            UTIL = new GroupProviderUtil(FILE_GROUP_DATABASE);
+            GROUP_FILE = UTIL.getGroupFile();
+        }
+        catch (IOException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
 
     @Test
     public void testGetAllGroups() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", USER1);
+        UTIL.writeAndSetGroupFile("myGroup.users", USER1);
 
-        Set<String> groups = _groupDatabase.getAllGroups();
-        assertEquals((long) 1, (long) groups.size());
+        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP));
     }
 
     @Test
     public void testGetAllGroupsWhenGroupFileEmpty() throws Exception
     {
-        _groupDatabase.setGroupFile(_groupFile);
+        FILE_GROUP_DATABASE.setGroupFile(UTIL.createEmptyTestGroupFile());
 
-        Set<String> groups = _groupDatabase.getAllGroups();
-        assertEquals((long) 0, (long) groups.size());
+        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertTrue(groups.isEmpty());
     }
 
     @Test
@@ -74,7 +86,7 @@ public class FileGroupDatabaseTest extends UnitTestBase
     {
         try
         {
-            _groupDatabase.setGroupFile("/not/a/file");
+            FILE_GROUP_DATABASE.setGroupFile("/not/a/file");
             fail("Exception not thrown");
         }
         catch (FileNotFoundException fnfe)
@@ -86,11 +98,11 @@ public class FileGroupDatabaseTest extends UnitTestBase
     @Test
     public void testInvalidFormat() throws Exception
     {
-        writeGroupFile("name.notvalid", USER1);
+        UTIL.writeGroupFile("name.notvalid", USER1);
 
         try
         {
-            _groupDatabase.setGroupFile(_groupFile);
+            FILE_GROUP_DATABASE.setGroupFile(GROUP_FILE);
             fail("Exception not thrown");
         }
         catch (IllegalArgumentException gde)
@@ -102,31 +114,31 @@ public class FileGroupDatabaseTest extends UnitTestBase
     @Test
     public void testGetUsersInGroup() throws Exception
     {
-        writeGroupFile("myGroup.users", "user1,user2,user3");
+        UTIL.writeGroupFile("myGroup.users", "user1,user2,user3");
 
-        _groupDatabase.setGroupFile(_groupFile);
+        FILE_GROUP_DATABASE.setGroupFile(GROUP_FILE);
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 3, (long) users.size());
+        assertEquals(3, users.size());
     }
 
     @Test
     public void testDuplicateUsersInGroupAreConflated() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "user1,user1,user3,user1");
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user1,user3,user1");
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 2, (long) users.size());
+        assertEquals(2, users.size());
     }
 
     @Test
     public void testGetUsersWithEmptyGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "");
+        UTIL.writeAndSetGroupFile("myGroup.users", "");
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertTrue(users.isEmpty());
     }
@@ -134,9 +146,9 @@ public class FileGroupDatabaseTest extends UnitTestBase
     @Test
     public void testGetUsersInNonExistentGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "user1,user2,user3");
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2,user3");
 
-        Set<String> users = _groupDatabase.getUsersInGroup("groupDoesntExist");
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup("groupDoesntExist");
         assertNotNull(users);
         assertTrue(users.isEmpty());
     }
@@ -144,26 +156,25 @@ public class FileGroupDatabaseTest extends UnitTestBase
     @Test
     public void testGetUsersInNullGroup() throws Exception
     {
-        writeAndSetGroupFile();
-        assertTrue(_groupDatabase.getUsersInGroup(null).isEmpty());
+        UTIL.writeAndSetGroupFile();
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(null).isEmpty());
     }
 
     @Test
     public void testGetGroupPrincipalsForUserWhenUserBelongsToOneGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "user1,user2");
-        Set<String> groups = _groupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 1, (long) groups.size());
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP));
     }
 
     @Test
     public void testGetGroupPrincipalsForUserWhenUserBelongsToTwoGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup1.users", "user1,user2",
-                             "myGroup2.users", "user1,user3");
-        Set<String> groups = _groupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 2, (long) groups.size());
+        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user3");
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(2, groups.size());
         assertTrue(groups.contains(MY_GROUP1));
         assertTrue(groups.contains(MY_GROUP2));
     }
@@ -171,21 +182,21 @@ public class FileGroupDatabaseTest extends UnitTestBase
     @Test
     public void testGetGroupPrincipalsForUserWhenUserAddedToGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup1.users", "user1,user2",
-                             "myGroup2.users", USER2);
-        Set<String> groups = _groupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 1, (long) groups.size());
+        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", USER2);
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP1));
 
-        _groupDatabase.addUserToGroup(USER1, MY_GROUP2);
+        FILE_GROUP_DATABASE.addUserToGroup(USER1, MY_GROUP2);
 
-        groups = _groupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 2, (long) groups.size());
+        groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(2, groups.size());
+        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase()).isEmpty());
         assertTrue(groups.contains(MY_GROUP1));
         assertTrue(groups.contains(MY_GROUP2));
 
-        Set<String> users =  _groupDatabase.getUsersInGroup(MY_GROUP2);
-        assertEquals((long) 2, (long) users.size());
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP2);
+        assertEquals(2, users.size());
         assertTrue(users.contains(USER1));
         assertTrue(users.contains(USER2));
     }
@@ -193,298 +204,258 @@ public class FileGroupDatabaseTest extends UnitTestBase
     @Test
     public void testGetGroupPrincipalsForUserWhenUserRemovedFromGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup1.users", "user1,user2",
-                             "myGroup2.users", "user1,user2");
-        Set<String> groups = _groupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 2, (long) groups.size());
+        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user2");
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(2, groups.size());
         assertTrue(groups.contains(MY_GROUP1));
         assertTrue(groups.contains(MY_GROUP2));
 
-        _groupDatabase.removeUserFromGroup(USER1, MY_GROUP2);
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP2);
 
-        groups = _groupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 1, (long) groups.size());
+        groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP1));
+        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase()).isEmpty());
     }
 
     @Test
     public void testGetGroupPrincipalsForUserWhenUserAddedToGroupTheyAreAlreadyIn() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", USER1);
-        _groupDatabase.addUserToGroup(USER1, MY_GROUP);
+        UTIL.writeAndSetGroupFile("myGroup.users", USER1);
+        FILE_GROUP_DATABASE.addUserToGroup(USER1, MY_GROUP);
 
-        Set<String> groups = _groupDatabase.getGroupsForUser(USER1);
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
 
-        assertEquals((long) 1, (long) groups.size());
+        assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP));
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
-        assertEquals((long) 1, (long) users.size());
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        assertEquals(1, users.size());
         assertTrue(users.contains(USER1));
+        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(MY_GROUP.toUpperCase()).isEmpty());
     }
 
     @Test
     public void testGetGroupPrincipalsForUserWhenUserNotKnown() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "user1,user2");
-        Set<String> groups = _groupDatabase.getGroupsForUser(USER3);
-        assertEquals((long) 0, (long) groups.size());
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER3);
+        assertTrue(groups.isEmpty());
     }
 
     @Test
     public void testGetGroupPrincipalsForNullUser() throws Exception
     {
-        writeAndSetGroupFile();
-        assertTrue(_groupDatabase.getGroupsForUser(null).isEmpty());
+        UTIL.writeAndSetGroupFile();
+        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(null).isEmpty());
     }
 
     @Test
     public void testAddUserToExistingGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "user1,user2");
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 2, (long) users.size());
+        assertEquals(2, users.size());
 
-        _groupDatabase.addUserToGroup(USER3, MY_GROUP);
+        FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
 
-        users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 3, (long) users.size());
+        assertEquals(3, users.size());
+        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(MY_GROUP.toUpperCase()).isEmpty());
     }
 
     @Test
     public void testAddUserToEmptyGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "");
+        UTIL.writeAndSetGroupFile("myGroup.users", "");
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 0, (long) users.size());
+        assertTrue(users.isEmpty());
 
-        _groupDatabase.addUserToGroup(USER3, MY_GROUP);
+        FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
 
-        users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 1, (long) users.size());
+        assertEquals(1, users.size());
+        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(MY_GROUP.toUpperCase()).isEmpty());
     }
 
     @Test
     public void testAddUserToNonExistentGroup() throws Exception
     {
-        writeAndSetGroupFile();
+        UTIL.writeAndSetGroupFile();
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 0, (long) users.size());
+        assertTrue(users.isEmpty());
 
         try
         {
-            _groupDatabase.addUserToGroup(USER3, MY_GROUP);
+            FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
             fail("Expected exception not thrown");
         }
-        catch(IllegalArgumentException e)
+        catch (IllegalArgumentException e)
         {
             // pass
         }
 
-        users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 0, (long) users.size());
+        assertTrue(users.isEmpty());
     }
 
     @Test
     public void testRemoveUserFromExistingGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "user1,user2");
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 2, (long) users.size());
+        assertEquals(2, users.size());
 
-        _groupDatabase.removeUserFromGroup(USER2, MY_GROUP);
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER2, MY_GROUP);
 
-        users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 1, (long) users.size());
+        assertEquals(1, users.size());
     }
 
     @Test
     public void testRemoveUserFromNonexistentGroup() throws Exception
     {
-        writeAndSetGroupFile();
+        UTIL.writeAndSetGroupFile();
 
         try
         {
-            _groupDatabase.removeUserFromGroup(USER1, MY_GROUP);
+            FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP);
             fail("Expected exception not thrown");
         }
-        catch(IllegalArgumentException e)
+        catch (IllegalArgumentException e)
         {
             // pass
         }
 
-        assertTrue(_groupDatabase.getUsersInGroup(MY_GROUP).isEmpty());
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).isEmpty());
     }
 
     @Test
     public void testRemoveUserFromGroupTwice() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", USER1);
-        assertTrue(_groupDatabase.getUsersInGroup(MY_GROUP).contains(USER1));
+        UTIL.writeAndSetGroupFile("myGroup.users", USER1);
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).contains(USER1));
 
-        _groupDatabase.removeUserFromGroup(USER1, MY_GROUP);
-        assertTrue(_groupDatabase.getUsersInGroup(MY_GROUP).isEmpty());
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP);
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).isEmpty());
 
-        _groupDatabase.removeUserFromGroup(USER1, MY_GROUP);
-        assertTrue(_groupDatabase.getUsersInGroup(MY_GROUP).isEmpty());
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP);
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).isEmpty());
     }
 
     @Test
     public void testAddUserPersistedToFile() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "user1,user2");
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
-        assertEquals((long) 2, (long) users.size());
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        assertEquals(2, users.size());
 
-        _groupDatabase.addUserToGroup(USER3, MY_GROUP);
-        assertEquals((long) 3, (long) users.size());
+        FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
+        assertEquals(3, users.size());
 
-        FileGroupDatabase newGroupDatabase = new FileGroupDatabase();
-        newGroupDatabase.setGroupFile(_groupFile);
+        FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        newGroupDatabase.setGroupFile(GROUP_FILE);
 
         Set<String> newUsers = newGroupDatabase.getUsersInGroup(MY_GROUP);
-        assertEquals((long) users.size(), (long) newUsers.size());
+        assertEquals(users.size(), newUsers.size());
     }
 
     @Test
     public void testRemoveUserPersistedToFile() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "user1,user2");
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
-        assertEquals((long) 2, (long) users.size());
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        assertEquals(2, users.size());
 
-        _groupDatabase.removeUserFromGroup(USER2, MY_GROUP);
-        assertEquals((long) 1, (long) users.size());
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER2, MY_GROUP);
+        assertEquals(1, users.size());
 
-        FileGroupDatabase newGroupDatabase = new FileGroupDatabase();
-        newGroupDatabase.setGroupFile(_groupFile);
+        FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        newGroupDatabase.setGroupFile(GROUP_FILE);
 
         Set<String> newUsers = newGroupDatabase.getUsersInGroup(MY_GROUP);
-        assertEquals((long) users.size(), (long) newUsers.size());
+        assertEquals(users.size(), newUsers.size());
     }
 
     @Test
     public void testCreateGroupPersistedToFile() throws Exception
     {
-        writeAndSetGroupFile();
+        UTIL.writeAndSetGroupFile();
 
-        Set<String> groups = _groupDatabase.getAllGroups();
-        assertEquals((long) 0, (long) groups.size());
+        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertTrue(groups.isEmpty());
 
-        _groupDatabase.createGroup(MY_GROUP);
+        FILE_GROUP_DATABASE.createGroup(MY_GROUP);
 
-        groups = _groupDatabase.getAllGroups();
-        assertEquals((long) 1, (long) groups.size());
+        groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP));
 
-        FileGroupDatabase newGroupDatabase = new FileGroupDatabase();
-        newGroupDatabase.setGroupFile(_groupFile);
+        FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        newGroupDatabase.setGroupFile(GROUP_FILE);
 
         Set<String> newGroups = newGroupDatabase.getAllGroups();
-        assertEquals((long) 1, (long) newGroups.size());
+        assertEquals(1, newGroups.size());
         assertTrue(newGroups.contains(MY_GROUP));
     }
 
     @Test
     public void testRemoveGroupPersistedToFile() throws Exception
     {
-        writeAndSetGroupFile("myGroup1.users", "user1,user2",
-                             "myGroup2.users", "user1,user2");
+        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user2");
 
-        Set<String> groups = _groupDatabase.getAllGroups();
-        assertEquals((long) 2, (long) groups.size());
+        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertEquals(2, groups.size());
 
-        Set<String> groupsForUser1 = _groupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 2, (long) groupsForUser1.size());
+        Set<String> groupsForUser1 = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(2, groupsForUser1.size());
 
-        _groupDatabase.removeGroup(MY_GROUP1);
+        FILE_GROUP_DATABASE.removeGroup(MY_GROUP1);
 
-        groups = _groupDatabase.getAllGroups();
-        assertEquals((long) 1, (long) groups.size());
+        groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP2));
 
-        groupsForUser1 = _groupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 1, (long) groupsForUser1.size());
+        groupsForUser1 = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(1, groupsForUser1.size());
 
-        FileGroupDatabase newGroupDatabase = new FileGroupDatabase();
-        newGroupDatabase.setGroupFile(_groupFile);
+        FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        newGroupDatabase.setGroupFile(GROUP_FILE);
 
         Set<String> newGroups = newGroupDatabase.getAllGroups();
-        assertEquals((long) 1, (long) newGroups.size());
+        assertEquals(1, newGroups.size());
         assertTrue(newGroups.contains(MY_GROUP2));
 
         Set<String> newGroupsForUser1 = newGroupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 1, (long) newGroupsForUser1.size());
+        assertEquals(1, newGroupsForUser1.size());
         assertTrue(newGroupsForUser1.contains(MY_GROUP2));
     }
 
-    @Before
-    public void setUp() throws Exception
-    {
-        _groupFile = createEmptyTestGroupFile();
-    }
-
-    private void writeAndSetGroupFile(String... groupAndUsers) throws Exception
-    {
-        writeGroupFile(groupAndUsers);
-        _groupDatabase.setGroupFile(_groupFile);
-    }
-
-    private void writeGroupFile(String... groupAndUsers) throws Exception
-    {
-        if (groupAndUsers.length % 2 != 0)
-        {
-            throw new IllegalArgumentException("Number of groupAndUsers must be even");
-        }
-
-        Properties props = new Properties();
-        for (int i = 0 ; i < groupAndUsers.length; i=i+2)
-        {
-            String group = groupAndUsers[i];
-            String users = groupAndUsers[i+1];
-            props.put(group, users);
-        }
-
-        try(FileOutputStream fileOutputStream = new FileOutputStream(_groupFile))
-        {
-            props.store(fileOutputStream, "test group file");
-        }
-    }
-
-    private String createEmptyTestGroupFile() throws IOException
-    {
-        File tmpGroupFile = File.createTempFile("groups", "grp");
-        tmpGroupFile.deleteOnExit();
-
-        return tmpGroupFile.getAbsolutePath();
-    }
-
     @After
     public void tearDown() throws Exception
     {
 
-        if (_groupFile != null)
+        if (GROUP_FILE != null)
         {
-            File groupFile = new File(_groupFile);
+            File groupFile = new File(GROUP_FILE);
             if (groupFile.exists())
             {
                 groupFile.delete();
             }
         }
     }
-
 }
diff --git a/broker-core/src/test/java/org/apache/qpid/server/security/group/GroupProviderUtil.java b/broker-core/src/test/java/org/apache/qpid/server/security/group/GroupProviderUtil.java
new file mode 100644
index 0000000..8d40e50
--- /dev/null
+++ b/broker-core/src/test/java/org/apache/qpid/server/security/group/GroupProviderUtil.java
@@ -0,0 +1,80 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.security.group;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+class GroupProviderUtil
+{
+
+    private final FileGroupDatabase _groupDatabase;
+    private final String _groupFile;
+
+    GroupProviderUtil(FileGroupDatabase groupDatabase) throws IOException
+    {
+        this._groupDatabase = groupDatabase;
+        this._groupFile = createEmptyTestGroupFile();
+    }
+
+    void writeAndSetGroupFile(String... groupAndUsers)
+            throws Exception
+    {
+        writeGroupFile(groupAndUsers);
+        _groupDatabase.setGroupFile(_groupFile);
+    }
+
+    void writeGroupFile(String... groupAndUsers) throws Exception
+    {
+        if (groupAndUsers.length % 2 != 0)
+        {
+            throw new IllegalArgumentException("Number of groupAndUsers must be even");
+        }
+
+        Properties props = new Properties();
+        for (int i = 0; i < groupAndUsers.length; i = i + 2)
+        {
+            String group = groupAndUsers[i];
+            String users = groupAndUsers[i + 1];
+            props.put(group, users);
+        }
+
+        try (FileOutputStream fileOutputStream = new FileOutputStream(_groupFile))
+        {
+            props.store(fileOutputStream, "test group file");
+        }
+    }
+
+    String createEmptyTestGroupFile() throws IOException
+    {
+        File tmpGroupFile = File.createTempFile("groups", "grp");
+        tmpGroupFile.deleteOnExit();
+
+        return tmpGroupFile.getAbsolutePath();
+    }
+
+    String getGroupFile()
+    {
+        return _groupFile;
+    }
+}
diff --git a/broker-plugins/management-http/src/main/java/resources/addGroupProvider.html b/broker-plugins/management-http/src/main/java/resources/addGroupProvider.html
index e8ded67..03dc091 100644
--- a/broker-plugins/management-http/src/main/java/resources/addGroupProvider.html
+++ b/broker-plugins/management-http/src/main/java/resources/addGroupProvider.html
@@ -32,7 +32,7 @@
                               placeHolder: 'group provider name',
                               required: true,
                               promptMessage: 'Name of group provider, must be unique',
-                              title: 'Enter a unique group provider name per broker'" />
+                              title: 'Enter a unique group provider name per broker'"/>
                         </div>
                     </div>
                     <div class="clear">
@@ -50,6 +50,20 @@
                         </div>
                     </div>
                     <div class="clear">
+                        <div class="formLabel-labelCell">Case Sensitive Group Search:</div>
+                        <div class="tableContainer-valueCell formLabel-controlCell">
+                            <input type="checkbox" id="addGroupProvider.caseSensitive" checked="checked" value="on"
+                                   data-dojo-type="dijit/form/CheckBox"
+                                   data-dojo-props="
+                            name: 'caseSensitive',
+                            checked: true,
+                            required: false,
+                            placeHolder: 'group provider caseSensitive',
+                            searchAttr: 'caseSensitive',
+                            title: 'Case Sensitive/Insensitive Search'"/>
+                        </div>
+                    </div>
+                    <div class="clear">
                         <div id="addGroupProvider.typeFields"></div>
                     </div>
                     <div class="editorPanel clear"
@@ -66,8 +80,10 @@
         </div>
 
         <div class="dijitDialogPaneActionBar qpidDialogPaneActionBar">
-            <button data-dojo-type="dijit/form/Button" id="addGroupProvider.addButton" data-dojo-props="label: 'Save'" type="submit"></button>
-            <button data-dojo-type="dijit/form/Button" id="addGroupProvider.cancelButton" data-dojo-props="label: 'Cancel'" ></button>
+            <button data-dojo-type="dijit/form/Button" id="addGroupProvider.addButton" data-dojo-props="label: 'Save'"
+                    type="submit"></button>
+            <button data-dojo-type="dijit/form/Button" id="addGroupProvider.cancelButton"
+                    data-dojo-props="label: 'Cancel'"></button>
         </div>
     </div>
 </div>
diff --git a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
index 80e113c..ac57fab 100644
--- a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
+++ b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
@@ -820,11 +820,19 @@ define(["dojo/parser",
                 }, {
                     name: "State",
                     field: "state",
-                    width: "30%"
+                    width: "20%"
                 }, {
                     name: "Type",
                     field: "type",
-                    width: "30%"
+                    width: "20%"
+                }, {
+                    name: "Case Sensitive Group Search",
+                    field: "caseSensitive",
+                    width: "20%",
+                    formatter: function (val)
+                    {
+                        return "<input type='checkbox' disabled='disabled'" + (val ? "checked='checked'" : "") + " />";
+                    }
                 }], function (obj)
                 {
                     connect.connect(obj.grid, "onRowDblClick", obj.grid, function (evt)
@@ -934,7 +942,6 @@ define(["dojo/parser",
             }
         };
 
-        
         BrokerUpdater.prototype.update = function (callback)
         {
             if (!this.contentPane.selected && !callback)
diff --git a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js
index c247bf6..9862246 100644
--- a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js
+++ b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js
@@ -146,8 +146,8 @@ define(["dojo/parser",
         GroupProvider.prototype.deleteGroupProvider = function ()
         {
             var warnMessage = "";
-            if (this.groupProviderUpdater.groupProviderData && this.groupProviderUpdater.groupProviderData.type.indexOf(
-                    "File") != -1)
+            if (this.groupProviderUpdater.groupProviderData &&
+                this.groupProviderUpdater.groupProviderData.type.indexOf("File") !== -1)
             {
                 warnMessage = "NOTE: provider deletion will also remove the group file on disk.\n\n";
             }
@@ -158,7 +158,7 @@ define(["dojo/parser",
                     .then(function (data)
                     {
                         that.close();
-                        that.contentPane.onClose()
+                        that.contentPane.onClose();
                         that.controller.tabContainer.removeChild(that.contentPane);
                         that.contentPane.destroyRecursive();
                     }, util.xhrErrorHandler);
@@ -170,7 +170,7 @@ define(["dojo/parser",
             addGroupProvider.show(this.controller.management,
                 this.modelObj,
                 this.groupProviderUpdater.groupProviderData);
-        }
+        };
 
         function GroupProviderUpdater(groupProviderTab)
         {
@@ -185,6 +185,7 @@ define(["dojo/parser",
             this.name = query(".name", node)[0];
             this.type = query(".type", node)[0];
             this.state = query(".state", node)[0];
+            this.caseSensitive = query(".caseSensitive", node)[0];
             this.managedInterfaces = {};
             this.details = null;
         }
@@ -194,6 +195,8 @@ define(["dojo/parser",
             this.name.innerHTML = entities.encode(String(this.groupProviderData["name"]));
             this.type.innerHTML = entities.encode(String(this.groupProviderData["type"]));
             this.state.innerHTML = entities.encode(String(this.groupProviderData["state"]));
+            this.caseSensitive.innerHTML = "<input type='checkbox' disabled='disabled'" +
+                                           (this.groupProviderData["caseSensitive"] ? "checked='checked'" : "") + " />";
         };
 
         GroupProviderUpdater.prototype.update = function (callback)
diff --git a/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html b/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html
index a451fec..de3b84f 100644
--- a/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html
+++ b/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html
@@ -22,23 +22,29 @@
     <div class="groupProvider" data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Group Provider', open: true">
         <div class="clear">
             <div class="formLabel-labelCell">Name:</div>
-            <div class="name"></div>
+            <div class="formValue-valueCell name"></div>
         </div>
         <div class="clear">
             <div class="formLabel-labelCell">Type:</div>
-            <div class="type"></div>
+            <div class="formValue-valueCell type"></div>
         </div>
         <div class="clear">
             <div class="formLabel-labelCell">State:</div>
-            <div class="state"></div>
+            <div class="formValue-valueCell state"></div>
+        </div>
+        <div class="clear">
+            <div class="formLabel-labelCell">Case Sensitive Group Search:</div>
+            <div class="formValue-valueCell caseSensitive"></div>
         </div>
         <div class="clear"></div>
 
         <div class="providerDetails"></div>
         <br/>
         <div class="dijitDialogPaneActionBar">
-            <input class="editGroupProviderButton" type="button" value="Edit" label="Edit" data-dojo-type="dijit.form.Button"/>
-            <input class="deleteGroupProviderButton" type="button" value="Delete" label="Delete" data-dojo-type="dijit.form.Button" />
+            <input class="editGroupProviderButton" type="button" value="Edit" label="Edit"
+                   data-dojo-type="dijit.form.Button"/>
+            <input class="deleteGroupProviderButton" type="button" value="Delete" label="Delete"
+                   data-dojo-type="dijit.form.Button"/>
         </div>
     </div>
 </div>


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org