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