diff options
2 files changed, 158 insertions, 0 deletions
diff --git a/java/broker/src/main/java/org/apache/qpid/server/security/access/management/AMQUserManagementMBean.java b/java/broker/src/main/java/org/apache/qpid/server/security/access/management/AMQUserManagementMBean.java index a8ae03cc5d..32ec3a3bbc 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/security/access/management/AMQUserManagementMBean.java +++ b/java/broker/src/main/java/org/apache/qpid/server/security/access/management/AMQUserManagementMBean.java @@ -441,7 +441,12 @@ public class AMQUserManagementMBean extends AMQManagedObject implements UserMana private String getCurrentJMXUser() { AccessControlContext acc = AccessController.getContext(); + Subject subject = Subject.getSubject(acc); + if (subject == null) + { + return "Unknown user, authentication Subject was null"; + } // Retrieve JMXPrincipal from Subject Set<JMXPrincipal> principals = subject.getPrincipals(JMXPrincipal.class); diff --git a/java/broker/src/test/java/org/apache/qpid/server/security/access/management/AMQUserManagementMBeanTest.java b/java/broker/src/test/java/org/apache/qpid/server/security/access/management/AMQUserManagementMBeanTest.java new file mode 100644 index 0000000000..ab001d0b9a --- /dev/null +++ b/java/broker/src/test/java/org/apache/qpid/server/security/access/management/AMQUserManagementMBeanTest.java @@ -0,0 +1,153 @@ +/* + * + * 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.access.management; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +import org.apache.qpid.server.security.auth.database.Base64MD5PasswordFilePrincipalDatabase; + +import junit.framework.TestCase; + +public class AMQUserManagementMBeanTest extends TestCase { + + private Base64MD5PasswordFilePrincipalDatabase _database; + private AMQUserManagementMBean _amqumMBean; + + private static final String _QPID_HOME = System.getProperty("QPID_HOME"); + + private static final String USERNAME = "testuser"; + private static final String PASSWORD = "password"; + private static final String JMXRIGHTS = "admin"; + private static final String TEMP_PASSWORD_FILE_NAME = "tempPasswordFile.tmp"; + private static final String TEMP_JMXACCESS_FILE_NAME = "tempJMXAccessFile.tmp"; + + @Override + protected void setUp() throws Exception { + + assertNotNull("QPID_HOME not set", _QPID_HOME); + + _database = new Base64MD5PasswordFilePrincipalDatabase(); + _amqumMBean = new AMQUserManagementMBean(); + } + + @Override + protected void tearDown() throws Exception { + + File testFile = new File(_QPID_HOME + File.separator + TEMP_JMXACCESS_FILE_NAME + ".tmp"); + if (testFile.exists()) + { + testFile.delete(); + } + + testFile = new File(_QPID_HOME + File.separator + TEMP_JMXACCESS_FILE_NAME + ".old"); + if (testFile.exists()) + { + testFile.delete(); + } + + testFile = new File(_QPID_HOME + File.separator + TEMP_PASSWORD_FILE_NAME + ".tmp"); + if (testFile.exists()) + { + testFile.delete(); + } + + testFile = new File(_QPID_HOME + File.separator + TEMP_PASSWORD_FILE_NAME + ".old"); + if (testFile.exists()) + { + testFile.delete(); + } + } + + public void testDeleteUser() { + + loadTestPasswordFile(); + loadTestAccessFile(); + + boolean deleted = false; + + try{ + deleted = _amqumMBean.deleteUser(USERNAME); + } + catch(Exception e){ + fail("Unable to delete user: " + e.getMessage()); + } + + assertTrue(deleted); + } + + + + // ============================ Utility methods ========================= + + private void loadTestPasswordFile() + { + try{ + File tempPasswordFile = new File(_QPID_HOME + File.separator + TEMP_PASSWORD_FILE_NAME); + if (tempPasswordFile.exists()) + { + tempPasswordFile.delete(); + } + tempPasswordFile.deleteOnExit(); + + BufferedWriter passwordWriter = new BufferedWriter(new FileWriter(tempPasswordFile)); + passwordWriter.write(USERNAME + ":" + PASSWORD); + passwordWriter.newLine(); + passwordWriter.flush(); + + + _database.setPasswordFile(tempPasswordFile.toString()); + _amqumMBean.setPrincipalDatabase(_database); + } + catch (IOException e) + { + fail("Unable to create test password file: " + e.getMessage()); + } + } + + private void loadTestAccessFile() + { + try{ + File tempAccessFile = new File(_QPID_HOME + File.separator + TEMP_JMXACCESS_FILE_NAME); + if (tempAccessFile.exists()) + { + tempAccessFile.delete(); + } + tempAccessFile.deleteOnExit(); + + BufferedWriter accessWriter = new BufferedWriter(new FileWriter(tempAccessFile)); + accessWriter.write(USERNAME + "=" + JMXRIGHTS); + accessWriter.newLine(); + accessWriter.flush(); + + + _amqumMBean.setAccessFile(tempAccessFile.toString()); + } + catch (Exception e) + { + fail("Unable to create test access file: " + e.getMessage()); + } + } + +} |