You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2012/06/22 17:53:59 UTC
svn commit: r1352938 - in
/qpid/branches/java-config-and-management/qpid/java:
broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/
broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/re...
Author: rgodfrey
Date: Fri Jun 22 15:53:57 2012
New Revision: 1352938
URL: http://svn.apache.org/viewvc?rev=1352938&view=rev
Log:
QPID-3999 : Add user management to web console
Added:
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/addUser.html
- copied, changed from r1352496, qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/addExchange.html
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/showPrincipalDatabaseAuthenticationManager.html
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/AuthenticationProvider.js
- copied, changed from r1352496, qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/authenticationprovider/
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/showAuthProvider.html
qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java
Modified:
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/Management.java
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/controller.js
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/treeView.js
qpid/branches/java-config-and-management/qpid/java/broker-web/src/main/resources/WEB-INF/web.xml
qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java
qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java
qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java
Modified: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/Management.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/Management.java?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/Management.java (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/Management.java Fri Jun 22 15:53:57 2012
@@ -92,6 +92,8 @@ public class Management
addRestServlet(root, "broker", socketAddress);
addRestServlet(root, "virtualhost", socketAddress, VirtualHost.class);
+ addRestServlet(root, "authenticationprovider", socketAddress, AuthenticationProvider.class);
+ addRestServlet(root, "user", socketAddress, AuthenticationProvider.class, User.class);
addRestServlet(root, "exchange", socketAddress, VirtualHost.class, Exchange.class);
addRestServlet(root, "queue", socketAddress, VirtualHost.class, Queue.class);
addRestServlet(root, "connection", socketAddress, VirtualHost.class, Connection.class);
Modified: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java Fri Jun 22 15:53:57 2012
@@ -3,16 +3,19 @@ package org.apache.qpid.server.managemen
import java.io.IOException;
import java.io.PrintWriter;
import java.net.SocketAddress;
+import java.security.AccessControlException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
@@ -22,6 +25,7 @@ import org.apache.qpid.AMQSecurityExcept
import org.apache.qpid.server.model.Broker;
import org.apache.qpid.server.model.ConfiguredObject;
import org.apache.qpid.server.model.Model;
+import org.apache.qpid.server.model.State;
import org.apache.qpid.server.model.Statistics;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
@@ -50,6 +54,10 @@ public class RestServlet extends Abstrac
private static final String HIERARCHY_INIT_PARAMETER = "hierarchy";
public static final String DEPTH_PARAM = "depth";
+ public static final String SORT_PARAM = "sort";
+
+ public static final Set<String> RESERVED_PARAMS = new HashSet<String>(Arrays.asList(DEPTH_PARAM, SORT_PARAM));
+
private Class<? extends ConfiguredObject>[] _hierarchy;
private volatile boolean initializationRequired = false;
@@ -214,7 +222,47 @@ public class RestServlet extends Abstrac
}
}
- return parents;
+ return filter(parents, request);
+ }
+
+ private Collection<ConfiguredObject> filter(Collection<ConfiguredObject> objects, HttpServletRequest request)
+ {
+
+
+ Map<String, Collection<String>> filters = new HashMap<String, Collection<String>>();
+
+ for(String param : (Collection<String>) Collections.list(request.getParameterNames()))
+ {
+ if(!RESERVED_PARAMS.contains(param))
+ {
+ filters.put(param, Arrays.asList(request.getParameterValues(param)));
+ }
+ }
+
+ if(filters.isEmpty())
+ {
+ return objects;
+ }
+
+ Collection<ConfiguredObject> filteredObj = new ArrayList<ConfiguredObject>(objects);
+
+ Iterator<ConfiguredObject> iter = filteredObj.iterator();
+
+ while(iter.hasNext())
+ {
+ ConfiguredObject obj = iter.next();
+ for(Map.Entry<String, Collection<String>> entry : filters.entrySet())
+ {
+ Object value = obj.getAttribute(entry.getKey());
+ if(!entry.getValue().contains(String.valueOf(value)))
+ {
+ iter.remove();
+ }
+ }
+
+ }
+
+ return filteredObj;
}
private Collection<? extends ConfiguredObject> getAncestors(Class<? extends ConfiguredObject> childType,
@@ -369,7 +417,6 @@ public class RestServlet extends Abstrac
response.setContentType("application/json");
ObjectMapper mapper = new ObjectMapper();
-
@SuppressWarnings("unchecked")
Map<String,Object> providedObject = mapper.readValue(request.getInputStream(), LinkedHashMap.class);
@@ -463,7 +510,6 @@ public class RestServlet extends Abstrac
}
ConfiguredObject theParent = parents.remove(0);
ConfiguredObject[] otherParents = parents.toArray(new ConfiguredObject[parents.size()]);
-
try
{
theParent.createChild(objClass, providedObject, otherParents);
@@ -491,4 +537,28 @@ public class RestServlet extends Abstrac
}
}
+ @Override
+ protected void onDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ response.setContentType("application/json");
+ response.setStatus(HttpServletResponse.SC_OK);
+
+ response.setHeader("Cache-Control","no-cache");
+ response.setHeader("Pragma","no-cache");
+ response.setDateHeader ("Expires", 0);
+ try
+ {
+ Collection<ConfiguredObject> allObjects = getObjects(request);
+ for(ConfiguredObject o : allObjects)
+ {
+ o.setDesiredState(o.getActualState(), State.DELETED);
+ }
+
+ response.setStatus(HttpServletResponse.SC_OK);
+ }
+ catch(RuntimeException e)
+ {
+ setResponseStatus(response, e);
+ }
+ }
}
Copied: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/addUser.html (from r1352496, qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/addExchange.html)
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/addUser.html?p2=qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/addUser.html&p1=qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/addExchange.html&r1=1352496&r2=1352938&rev=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/addExchange.html (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/addUser.html Fri Jun 22 15:53:57 2012
@@ -19,34 +19,23 @@
-
-->
<div class="dijitHidden">
- <div data-dojo-type="dijit.Dialog" style="width:600px;" data-dojo-props="title:'Add Exchange'" id="addExchange">
- <form id="formAddExchange" method="post" dojoType="dijit.form.Form">
+ <div data-dojo-type="dijit.Dialog" style="width:600px;" data-dojo-props="title:'Add User'" id="addUser">
+ <form id="formAddUser" method="post" dojoType="dijit.form.Form">
<table cellpadding="0" cellspacing="2">
<tr>
- <td valign="top"><strong>Exchange Name*: </strong></td>
- <td><input type="text" required="true" name="name" id="formAddExchange.name" placeholder="Exchange Name"
+ <td valign="top"><strong>User Name*: </strong></td>
+ <td><input type="text" required="true" name="name" id="formAddUser.name" placeholder="User Name"
dojoType="dijit.form.ValidationTextBox" missingMessage="A name must be supplied" /></td>
</tr>
<tr>
- <td valign="top"><strong>Durable? </strong></td>
- <td><input type="checkbox" name="durable" id="formAddExchange.durable" value="durable" checked="checked" dojoType="dijit.form.CheckBox" /></td>
- </tr>
- <tr>
- <td valign="top"><strong>Exchange Type: </strong></td>
- <td>
- <select name="type" id="formAddExchange.type" dojoType="dijit.form.FilteringSelect">
- <option value="direct">direct</option>
- <option value="topic">topic</option>
- <option value="headers">headers</option>
- <option value="fanout">fanout</option>
- </select>
- </td>
+ <td valign="top"><strong>Password*</strong></td>
+ <td><input type="password" required="true" name="password" id="formAddUser.password" dojoType="dijit.form.ValidationTextBox"/></td>
</tr>
</table>
<br/>
<!-- submit buttons -->
- <input type="submit" value="Create Exchange" label="Create Exchange" dojoType="dijit.form.Button" />
+ <input type="submit" value="Create User" label="Create User" dojoType="dijit.form.Button" />
</form>
</div>
Added: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/showPrincipalDatabaseAuthenticationManager.html
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/showPrincipalDatabaseAuthenticationManager.html?rev=1352938&view=auto
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/showPrincipalDatabaseAuthenticationManager.html (added)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/showPrincipalDatabaseAuthenticationManager.html Fri Jun 22 15:53:57 2012
@@ -0,0 +1,29 @@
+<!--
+ -
+ - 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.
+ -
+ -->
+<div class="PrincipalDatabaseAuthenticationManager">
+ <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Users'">
+ <div class="users"></div>
+ <button data-dojo-type="dijit.form.Button" class="addUserButton">Add User</button>
+ <button data-dojo-type="dijit.form.Button" class="deleteUserButton">Delete Users</button>
+
+ </div>
+
+</div>
Copied: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/AuthenticationProvider.js (from r1352496, qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js)
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/AuthenticationProvider.js?p2=qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/AuthenticationProvider.js&p1=qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js&r1=1352496&r2=1352938&rev=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/AuthenticationProvider.js Fri Jun 22 15:53:57 2012
@@ -32,174 +32,91 @@ define(["dojo/_base/xhr",
"dojo/domReady!"],
function (xhr, parser, query, connect, properties, updater, util, UpdatableStore, EnhancedGrid) {
- function Broker(name, parent, controller) {
+ function AuthenticationProvider(name, parent, controller) {
this.name = name;
this.controller = controller;
- this.modelObj = { type: "broker", name: name };
+ this.modelObj = { type: "authenticationprovider", name: name };
if(parent) {
this.modelObj.parent = {};
this.modelObj.parent[ parent.type] = parent;
}
}
- Broker.prototype.getTitle = function()
- {
- return "Broker";
+ AuthenticationProvider.prototype.getTitle = function() {
+ return "AuthenticationProvider";
};
- Broker.prototype.open = function(contentPane) {
+ AuthenticationProvider.prototype.open = function(contentPane) {
var that = this;
this.contentPane = contentPane;
- xhr.get({url: "showBroker.html",
+ xhr.get({url: "showAuthProvider.html",
sync: true,
load: function(data) {
contentPane.containerNode.innerHTML = data;
parser.parse(contentPane.containerNode);
- that.brokerUpdater = new BrokerUpdater(contentPane.containerNode, that.modelObj, that.controller);
+ that.authProviderAdapter = new AuthProviderUpdater(contentPane.containerNode, that.modelObj, that.controller);
- updater.add( that.brokerUpdater );
+ updater.add( that.authProviderAdapter );
- that.brokerUpdater.update();
+ that.authProviderAdapter.update();
}});
};
- Broker.prototype.close = function() {
- updater.remove( this.brokerUpdater );
+ AuthenticationProvider.prototype.close = function() {
+ updater.remove( this.authProviderAdapter );
};
- function BrokerUpdater(node, brokerObj, controller)
+ function AuthProviderUpdater(node, authProviderObj, controller)
{
this.controller = controller;
- this.name = query(".broker-name", node)[0];
+ this.name = query(".name", node)[0];
/*this.state = dom.byId("state");
this.durable = dom.byId("durable");
this.lifetimePolicy = dom.byId("lifetimePolicy");
*/
- this.query = "rest/broker";
+ this.query = "rest/authenticationprovider/"+encodeURIComponent(authProviderObj.name);
var that = this;
xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"})
.then(function(data)
{
- that.brokerData = data[0];
+ that.authProviderData = data[0];
- util.flattenStatistics( that.brokerData );
+ util.flattenStatistics( that.authProviderData );
that.updateHeader();
- that.vhostsGrid =
- new UpdatableStore(that.brokerData.vhosts, query(".broker-virtualhosts")[0],
- [ { name: "Virtual Host", field: "name", width: "120px"},
- { name: "Connections", field: "connectionCount", width: "80px"},
- { name: "Queues", field: "queueCount", width: "80px"},
- { name: "Exchanges", field: "exchangeCount", width: "100%"}
- ], function(obj) {
- connect.connect(obj.grid, "onRowDblClick", obj.grid,
- function(evt){
- var idx = evt.rowIndex,
- theItem = this.getItem(idx);
- var name = obj.dataStore.getValue(theItem,"name");
- that.controller.show("virtualhost", name, brokerObj);
- });
- });
-
- that.portsGrid =
- new UpdatableStore(that.brokerData.ports, query(".broker-ports")[0],
- [ { name: "Address", field: "bindingAddress", width: "70px"},
- { name: "Port", field: "port", width: "70px"},
- { name: "Transports", field: "transports", width: "150px"},
- { name: "Protocols", field: "protocols", width: "100%"}
- ], function(obj) {
- connect.connect(obj.grid, "onRowDblClick", obj.grid,
- function(evt){
- var idx = evt.rowIndex,
- theItem = this.getItem(idx);
- var name = obj.dataStore.getValue(theItem,"name");
- that.controller.show("port", name, brokerObj);
- });
- });
-
- });
- xhr.get({url: "rest/logrecords", sync: properties.useSyncGet, handleAs: "json"})
- .then(function(data)
- {
- that.logData = data;
+ require(["qpid/management/authenticationprovider/"+that.authProviderData.type],
+ function(SpecificProvider) {
+ that.details = new SpecificProvider(node, authProviderObj, controller);
+ that.details.update();
+ });
- var gridProperties = {
- height: 400,
- plugins: {
- pagination: {
- pageSizes: ["10", "25", "50", "100"],
- description: true,
- sizeSwitch: true,
- pageStepper: true,
- gotoButton: true,
- maxPageStep: 4,
- position: "bottom"
- }
- }};
-
-
- that.logfileGrid =
- new UpdatableStore(that.logData, query(".broker-logfile")[0],
- [ { name: "Timestamp", field: "timestamp", width: "200px",
- formatter: function(val) {
- var d = new Date(0);
- d.setUTCSeconds(val/1000);
-
- return d.toLocaleString();
- }},
- { name: "Level", field: "level", width: "60px"},
- { name: "Logger", field: "logger", width: "280px"},
- { name: "Thread", field: "thread", width: "120px"},
- { name: "Log Message", field: "message", width: "100%"}
-
- ], null, gridProperties, EnhancedGrid);
});
+
}
- BrokerUpdater.prototype.updateHeader = function()
+ AuthProviderUpdater.prototype.updateHeader = function()
{
- this.name.innerHTML = this.brokerData[ "name" ];
+ this.name.innerHTML = this.authProviderData[ "name" ];
/* this.state.innerHTML = this.brokerData[ "state" ];
this.durable.innerHTML = this.brokerData[ "durable" ];
this.lifetimePolicy.innerHTML = this.brokerData[ "lifetimePolicy" ];
*/
};
- BrokerUpdater.prototype.update = function()
+ AuthProviderUpdater.prototype.update = function()
{
var that = this;
- xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"}).then(function(data)
- {
- that.brokerData = data[0];
- util.flattenStatistics( that.brokerData );
-
- that.updateHeader();
-
- that.vhostsGrid.update(that.brokerData.virtualhosts);
-
- that.portsGrid.update(that.brokerData.ports);
-
-
- });
-
-
- xhr.get({url: "rest/logrecords", sync: properties.useSyncGet, handleAs: "json"})
- .then(function(data)
- {
- that.logData = data;
- that.logfileGrid.update(that.logData);
- });
};
- return Broker;
- });
\ No newline at end of file
+ return AuthenticationProvider;
+ });
Modified: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js Fri Jun 22 15:53:57 2012
@@ -84,9 +84,9 @@ define(["dojo/_base/xhr",
xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"})
.then(function(data)
{
- that.brokerData = data[0];
+ that.brokerData= data[0];
- util.flattenStatistics( that.brokerData );
+ util.flattenStatistics( that.brokerData);
that.updateHeader();
that.vhostsGrid =
@@ -202,4 +202,4 @@ define(["dojo/_base/xhr",
return Broker;
- });
\ No newline at end of file
+ });
Added: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js?rev=1352938&view=auto
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js (added)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js Fri Jun 22 15:53:57 2012
@@ -0,0 +1,260 @@
+/*
+ *
+ * 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.
+ *
+ */
+define(["dojo/_base/xhr",
+ "dojo/dom",
+ "dojo/parser",
+ "dojo/query",
+ "dojo/dom-construct",
+ "dojo/_base/connect",
+ "dojo/_base/window",
+ "dojo/_base/event",
+ "dojo/_base/json",
+ "dijit/registry",
+ "qpid/common/util",
+ "qpid/common/properties",
+ "qpid/common/updater",
+ "qpid/common/UpdatableStore",
+ "dojox/grid/EnhancedGrid",
+ "dojox/grid/enhanced/plugins/Pagination",
+ "dojox/grid/enhanced/plugins/IndirectSelection",
+ "dojox/validate/us", "dojox/validate/web",
+ "dijit/Dialog",
+ "dijit/form/TextBox",
+ "dijit/form/ValidationTextBox",
+ "dijit/form/TimeTextBox", "dijit/form/Button",
+ "dijit/form/Form",
+ "dijit/form/DateTextBox",
+ "dojo/domReady!"],
+ function (xhr, dom, parser, query, construct, connect, win, event, json, registry, util, properties, updater, UpdatableStore, EnhancedGrid) {
+ function DatabaseAuthManager(containerNode, authProviderObj, controller) {
+ var node = construct.create("div", null, containerNode, "last");
+ var that = this;
+ this.name = authProviderObj.name;
+ xhr.get({url: "authenticationprovider/showPrincipalDatabaseAuthenticationManager.html",
+ sync: true,
+ load: function(data) {
+ node.innerHTML = data;
+ parser.parse(node);
+
+
+ that.authDatabaseUpdater= new AuthProviderUpdater(node, authProviderObj, controller);
+
+ updater.add( that.authDatabaseUpdater);
+
+ that.authDatabaseUpdater.update();
+
+
+ }});
+ }
+
+ DatabaseAuthManager.prototype.update = function() {
+ this.authDatabaseUpdater.update();
+ };
+
+ DatabaseAuthManager.prototype.close = function() {
+ updater.remove( this.authDatabaseUpdater );
+ };
+
+ function AuthProviderUpdater(node, authProviderObj, controller)
+ {
+ this.controller = controller;
+ this.query = "rest/authenticationprovider/"+encodeURIComponent(authProviderObj.name);
+ this.name = authProviderObj.name;
+ var that = this;
+
+ xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"})
+ .then(function(data) {
+ that.authProviderData = data[0];
+
+ util.flattenStatistics( that.authProviderData );
+
+ var userDiv = query(".users")[0];
+
+ var gridProperties = {
+ height: 400,
+ keepSelection: true,
+ plugins: {
+ pagination: {
+ pageSizes: ["10", "25", "50", "100"],
+ description: true,
+ sizeSwitch: true,
+ pageStepper: true,
+ gotoButton: true,
+ maxPageStep: 4,
+ position: "bottom"
+ },
+ indirectSelection: true
+
+ }};
+
+
+ that.usersGrid =
+ new UpdatableStore(that.authProviderData.users, userDiv,
+ [ { name: "User Name", field: "name", width: "100%" }
+ ], function(obj) {
+ connect.connect(obj.grid, "onRowDblClick", obj.grid,
+ function(evt){
+ var idx = evt.rowIndex,
+ theItem = this.getItem(idx);
+ var name = obj.dataStore.getValue(theItem,"name");
+ that.controller.show("virtualhost", name, brokerObj);
+ });
+ }, gridProperties, EnhancedGrid);
+
+
+ var addUserButton = query(".addUserButton", node)[0];
+ connect.connect(registry.byNode(addUserButton), "onClick", function(evt){ addUser.show(authProviderObj.name) });
+
+ var deleteMessagesButton = query(".deleteUserButton", node)[0];
+ var deleteWidget = registry.byNode(deleteMessagesButton);
+ connect.connect(deleteWidget, "onClick",
+ function(evt){
+ event.stop(evt);
+ that.deleteUsers();
+ });
+ });
+ }
+
+ AuthProviderUpdater.prototype.deleteUsers = function()
+ {
+ var grid = this.usersGrid.grid;
+ var data = grid.selection.getSelected();
+ if(data.length) {
+ var that = this;
+ if(confirm("Delete " + data.length + " users?")) {
+ var i, queryParam;
+ for(i = 0; i<data.length; i++) {
+ if(queryParam) {
+ queryParam += "&";
+ } else {
+ queryParam = "?";
+ }
+
+ queryParam += "id=" + data[i].id;
+ }
+ var query = "rest/user/"+ encodeURIComponent(that.name)
+ + queryParam;
+ that.success = true
+ xhr.del({url: query, sync: true, handleAs: "json"}).then(
+ function(data) {
+ grid.setQuery({id: "*"});
+ grid.selection.deselectAll();
+ that.update();
+ },
+ function(error) {that.success = false; that.failureReason = error;});
+ if(!that.success ) {
+ alert("Error:" + this.failureReason);
+ }
+ }
+}
+ };
+
+ AuthProviderUpdater.prototype.update = function()
+ {
+
+ var that = this;
+
+ xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"})
+ .then(function(data) {
+ that.authProviderData = data[0];
+ util.flattenStatistics( that.authProviderData );
+
+ that.usersGrid.update(that.authProviderData.users);
+
+ });
+
+
+ };
+
+ var addUser = {};
+
+ var node = construct.create("div", null, win.body(), "last");
+
+ var convertToUser = function convertToUser(formValues) {
+ var newUser = {};
+ newUser.name = formValues.name;
+ for(var propName in formValues)
+ {
+ if(formValues.hasOwnProperty(propName)) {
+ if(formValues[ propName ] !== "") {
+ newUser[ propName ] = formValues[propName];
+ }
+ }
+ }
+
+ return newUser;
+ };
+
+
+ xhr.get({url: "authenticationprovider/addUser.html",
+ sync: true,
+ load: function(data) {
+ var theForm;
+ node.innerHTML = data;
+ addUser.dialogNode = dom.byId("addUser");
+ parser.instantiate([addUser.dialogNode]);
+
+ var that = this;
+
+ theForm = registry.byId("formAddUser");
+ theForm.on("submit", function(e) {
+
+ event.stop(e);
+ if(theForm.validate()){
+
+ var newUser = convertToUser(theForm.getValues());
+
+
+ var url = "rest/user/"+encodeURIComponent(addUser.authProvider) +
+ "/"+encodeURIComponent(newUser.name);
+
+ xhr.put({url: url, sync: true, handleAs: "json",
+ headers: { "Content-Type": "application/json"},
+ putData: json.toJson(newUser),
+ load: function(x) {that.success = true; },
+ error: function(error) {that.success = false; that.failureReason = error;}});
+
+ if(this.success === true) {
+ registry.byId("addUser").hide();
+ } else {
+ alert("Error:" + this.failureReason);
+ }
+
+ return false;
+
+
+ }else{
+ alert('Form contains invalid data. Please correct first');
+ return false;
+ }
+
+ });
+ }});
+
+ addUser.show = function(authProvider) {
+ addUser.authProvider = authProvider;
+ registry.byId("formAddUser").reset();
+ registry.byId("addUser").show();
+ };
+
+
+ return DatabaseAuthManager;
+ });
Modified: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/controller.js
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/controller.js?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/controller.js (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/controller.js Fri Jun 22 15:53:57 2012
@@ -26,12 +26,14 @@ define(["dojo/dom",
"qpid/management/Exchange",
"qpid/management/Queue",
"qpid/management/Connection",
+ "qpid/management/AuthenticationProvider",
"dojo/ready",
"dojo/domReady!"],
- function (dom, registry, ContentPane, Broker, VirtualHost, Exchange, Queue, Connection, ready) {
+ function (dom, registry, ContentPane, Broker, VirtualHost, Exchange, Queue, Connection, AuthProvider, ready) {
var controller = {};
- var constructors = { broker: Broker, virtualhost: VirtualHost, exchange: Exchange, queue: Queue, connection: Connection };
+ var constructors = { broker: Broker, virtualhost: VirtualHost, exchange: Exchange,
+ queue: Queue, connection: Connection, authenticationprovider: AuthProvider };
var tabDiv = dom.byId("managedViews");
Modified: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/treeView.js
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/treeView.js?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/treeView.js (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/treeView.js Fri Jun 22 15:53:57 2012
@@ -271,9 +271,12 @@ define(["dojo/_base/xhr",
controller.show("connection", details.connection, { type: "virtualhost", name: details.virtualhost, parent: {broker: {type:"broker", name:""}}});
} else if (details.type == 'port') {
controller.show("port", details.port, { type: "virtualhost", name: details.virtualhost, parent: {broker: {type:"broker", name:""}}});
+ } else if (details.type == 'authenticationprovider') {
+ controller.show("authenticationprovider", details.authenticationprovider, {broker: {type:"broker", name:""}});
}
+
};
TreeViewModel.prototype.update = function () {
Added: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/showAuthProvider.html
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/showAuthProvider.html?rev=1352938&view=auto
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/showAuthProvider.html (added)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/showAuthProvider.html Fri Jun 22 15:53:57 2012
@@ -0,0 +1,25 @@
+<!--
+ -
+ - 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.
+ -
+ -->
+<div class="authorizationProvider">
+ <span style="">Name:</span><span class="name" style="position:absolute; left:6em"></span>
+ <br/>
+ <span style="">Type:</span><span class="type" style="position:absolute; left:6em"></span>
+</div>
\ No newline at end of file
Modified: qpid/branches/java-config-and-management/qpid/java/broker-web/src/main/resources/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-web/src/main/resources/WEB-INF/web.xml?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-web/src/main/resources/WEB-INF/web.xml (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-web/src/main/resources/WEB-INF/web.xml Fri Jun 22 15:53:57 2012
@@ -54,6 +54,16 @@ xsi:schemaLocation="http://java.sun.com/
</servlet>
<servlet>
+ <display-name>AuthenticationProviderRestServlet</display-name>
+ <servlet-name>AuthenticationProviderRestServlet</servlet-name>
+ <servlet-class>org.apache.qpid.server.management.plugin.servlet.rest.RestServlet</servlet-class>
+ <init-param>
+ <param-name>hierarchy</param-name>
+ <param-value>AuthenticationProvider</param-value>
+ </init-param>
+ </servlet>
+
+ <servlet>
<display-name>ExchangeRestServlet</display-name>
<servlet-name>ExchangeRestServlet</servlet-name>
<servlet-class>org.apache.qpid.server.management.plugin.servlet.rest.RestServlet</servlet-class>
@@ -164,6 +174,11 @@ xsi:schemaLocation="http://java.sun.com/
</servlet-mapping>
<servlet-mapping>
+ <servlet-name>AuthenticationProviderRestServlet</servlet-name>
+ <url-pattern>/rest/authenticationprovider/*</url-pattern>
+ </servlet-mapping>
+
+ <servlet-mapping>
<servlet-name>ExchangeRestServlet</servlet-name>
<url-pattern>/rest/exchange/*</url-pattern>
</servlet-mapping>
Modified: qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java Fri Jun 22 15:53:57 2012
@@ -20,10 +20,36 @@
*/
package org.apache.qpid.server.model;
+import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
public interface AuthenticationProvider extends ConfiguredObject
{
+
+ public static final String ID = "id";
+ public static final String DESCRIPTION = "description";
+ public static final String NAME = "name";
+ public static final String STATE = "state";
+ public static final String DURABLE = "durable";
+ public static final String LIFETIME_POLICY = "lifetimePolicy";
+ public static final String TIME_TO_LIVE = "timeToLive";
+ public static final String CREATED = "created";
+ public static final String UPDATED = "updated";
+ public static final String TYPE = "type";
+
+ public static final Collection<String> AVAILABLE_ATTRIBUTES =
+ Collections.unmodifiableList(
+ Arrays.asList(ID,
+ NAME,
+ DESCRIPTION,
+ STATE,
+ DURABLE,
+ LIFETIME_POLICY,
+ TIME_TO_LIVE,
+ CREATED,
+ UPDATED,
+ TYPE));
//children
Collection<VirtualHostAlias> getVirtualHostPortBindings();
}
Modified: qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java Fri Jun 22 15:53:57 2012
@@ -66,6 +66,8 @@ public class Model
addRelationship(VirtualHost.class, Connection.class);
addRelationship(VirtualHost.class, VirtualHostAlias.class);
+ addRelationship(AuthenticationProvider.class, User.class);
+
addRelationship(Connection.class, Session.class);
addRelationship(Exchange.class, Binding.class);
Added: qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java?rev=1352938&view=auto
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java (added)
+++ qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java Fri Jun 22 15:53:57 2012
@@ -0,0 +1,59 @@
+/*
+ *
+ * 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.model;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+
+public interface User extends ConfiguredObject
+{
+ String CREATED = "created";
+ String DURABLE = "durable";
+ String ID = "id";
+ String LIFETIME_POLICY = "lifetimePolicy";
+ String NAME = "name";
+ String STATE = "state";
+ String TIME_TO_LIVE = "timeToLive";
+ String UPDATED = "updated";
+ String PASSWORD = "password";
+
+ // Attributes
+ public static final Collection<String> AVAILABLE_ATTRIBUTES =
+ Collections.unmodifiableList(
+ Arrays.asList(
+ ID,
+ NAME,
+ STATE,
+ DURABLE,
+ LIFETIME_POLICY,
+ TIME_TO_LIVE,
+ CREATED,
+ UPDATED,
+ PASSWORD
+ ));
+
+ public String getPassword();
+
+ public void setPassword(String password);
+
+}
Modified: qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java Fri Jun 22 15:53:57 2012
@@ -22,18 +22,17 @@ package org.apache.qpid.server.model.ada
import java.security.AccessControlException;
import java.security.Principal;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import javax.security.auth.login.AccountNotFoundException;
-import org.apache.qpid.server.model.AuthenticationProvider;
-import org.apache.qpid.server.model.ConfiguredObject;
-import org.apache.qpid.server.model.LifetimePolicy;
-import org.apache.qpid.server.model.PasswordCredentialManagingAuthenticationProvider;
-import org.apache.qpid.server.model.State;
-import org.apache.qpid.server.model.Statistics;
-import org.apache.qpid.server.model.VirtualHostAlias;
+import org.apache.qpid.server.model.*;
+import org.apache.qpid.server.model.User;
+import org.apache.qpid.server.registry.ApplicationRegistry;
+import org.apache.qpid.server.security.access.Operation;
import org.apache.qpid.server.security.auth.database.PrincipalDatabase;
import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
import org.apache.qpid.server.security.auth.manager.PrincipalDatabaseAuthenticationManager;
@@ -134,6 +133,54 @@ public abstract class AuthenticationProv
}
@Override
+ public Collection<String> getAttributeNames()
+ {
+ return AuthenticationProvider.AVAILABLE_ATTRIBUTES;
+ }
+
+ @Override
+ public Object getAttribute(String name)
+ {
+ if(TYPE.equals(name))
+ {
+ return _authManager.getClass().getSimpleName();
+ }
+ else if(CREATED.equals(name))
+ {
+ // TODO
+ }
+ else if(DURABLE.equals(name))
+ {
+ return true;
+ }
+ else if(ID.equals(name))
+ {
+ return getId();
+ }
+ else if(LIFETIME_POLICY.equals(name))
+ {
+ return LifetimePolicy.PERMANENT;
+ }
+ else if(NAME.equals(name))
+ {
+ return getName();
+ }
+ else if(STATE.equals(name))
+ {
+ return State.ACTIVE; // TODO
+ }
+ else if(TIME_TO_LIVE.equals(name))
+ {
+ // TODO
+ }
+ else if(UPDATED.equals(name))
+ {
+ // TODO
+ }
+ return super.getAttribute(name); //To change body of overridden methods use File | Settings | File Templates.
+ }
+
+ @Override
public <C extends ConfiguredObject> Collection<C> getChildren(Class<C> clazz)
{
return null; //To change body of implemented methods use File | Settings | File Templates.
@@ -175,7 +222,22 @@ public abstract class AuthenticationProv
@Override
public void deleteUser(String username) throws AccountNotFoundException
{
- getPrincipalDatabase().deletePrincipal(new UsernamePrincipal(username));
+ if(getSecurityManager().authoriseMethod(Operation.DELETE,
+ "UserManagement",
+ "deleteUser"))
+ {
+
+ getPrincipalDatabase().deletePrincipal(new UsernamePrincipal(username));
+ }
+ else
+ {
+ throw new AccessControlException("Cannot delete user " + username);
+ }
+ }
+
+ private org.apache.qpid.server.security.SecurityManager getSecurityManager()
+ {
+ return ApplicationRegistry.getInstance().getSecurityManager();
}
private PrincipalDatabase getPrincipalDatabase()
@@ -200,5 +262,212 @@ public abstract class AuthenticationProv
}
return users;
}
+
+ @Override
+ public <C extends ConfiguredObject> C createChild(Class<C> childClass,
+ Map<String, Object> attributes,
+ ConfiguredObject... otherParents)
+ {
+ if(childClass == User.class)
+ {
+ Principal p = new UsernamePrincipal((String) attributes.get("name"));
+ if(getSecurityManager().authoriseMethod(Operation.UPDATE, "UserManagement", "createUser"))
+ {
+ if(getPrincipalDatabase().createPrincipal(p, ((String)attributes.get("password")).toCharArray()))
+ {
+ return (C) new PrincipalAdapter(p);
+ }
+ }
+ else
+ {
+ throw new AccessControlException("Do not have permission to create a new user");
+ }
+
+ }
+
+ return super.createChild(childClass, attributes, otherParents);
+ }
+
+ @Override
+ public <C extends ConfiguredObject> Collection<C> getChildren(Class<C> clazz)
+ {
+ if(clazz == User.class)
+ {
+ List<Principal> users = getPrincipalDatabase().getUsers();
+ Collection<User> principals = new ArrayList<User>(users.size());
+ for(Principal user : users)
+ {
+ principals.add(new PrincipalAdapter(user));
+ }
+ return (Collection<C>) Collections.unmodifiableCollection(principals);
+ }
+ else
+ {
+ return super.getChildren(clazz);
+ }
+ }
+
+ private class PrincipalAdapter extends AbstractAdapter implements User
+ {
+ private final Principal _user;
+
+
+ public PrincipalAdapter(Principal user)
+ {
+ super(PrincipalDatabaseAuthenticationManagerAdapter.this.getName(), user.getName());
+ _user = user;
+
+ }
+
+ @Override
+ public String getPassword()
+ {
+ return null;
+ }
+
+ @Override
+ public void setPassword(String password)
+ {
+ try
+ {
+ PrincipalDatabaseAuthenticationManagerAdapter.this.setPassword(_user.getName(), password);
+ }
+ catch (AccountNotFoundException e)
+ {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ @Override
+ public String getName()
+ {
+ return _user.getName();
+ }
+
+ @Override
+ public String setName(String currentName, String desiredName)
+ throws IllegalStateException, AccessControlException
+ {
+ throw new IllegalStateException("Names cannot be updated");
+ }
+
+ @Override
+ public State getActualState()
+ {
+ return State.ACTIVE;
+ }
+
+ @Override
+ public boolean isDurable()
+ {
+ return true;
+ }
+
+ @Override
+ public void setDurable(boolean durable)
+ throws IllegalStateException, AccessControlException, IllegalArgumentException
+ {
+ throw new IllegalStateException("Durability cannot be updated");
+ }
+
+ @Override
+ public LifetimePolicy getLifetimePolicy()
+ {
+ return LifetimePolicy.PERMANENT;
+ }
+
+ @Override
+ public LifetimePolicy setLifetimePolicy(LifetimePolicy expected, LifetimePolicy desired)
+ throws IllegalStateException, AccessControlException, IllegalArgumentException
+ {
+ throw new IllegalStateException("LifetimePolicy cannot be updated");
+ }
+
+ @Override
+ public long getTimeToLive()
+ {
+ return 0;
+ }
+
+ @Override
+ public long setTimeToLive(long expected, long desired)
+ throws IllegalStateException, AccessControlException, IllegalArgumentException
+ {
+ throw new IllegalStateException("ttl cannot be updated");
+ }
+
+ @Override
+ public Statistics getStatistics()
+ {
+ return NoStatistics.getInstance();
+ }
+
+ @Override
+ public <C extends ConfiguredObject> Collection<C> getChildren(Class<C> clazz)
+ {
+ return null;
+ }
+
+ @Override
+ public <C extends ConfiguredObject> C createChild(Class<C> childClass,
+ Map<String, Object> attributes,
+ ConfiguredObject... otherParents)
+ {
+ return null;
+ }
+
+ @Override
+ public Collection<String> getAttributeNames()
+ {
+ return User.AVAILABLE_ATTRIBUTES;
+ }
+
+ @Override
+ public Object getAttribute(String name)
+ {
+ if(ID.equals(name))
+ {
+ return getId();
+ }
+ else if(NAME.equals(name))
+ {
+ return getName();
+ }
+ return super.getAttribute(name); //To change body of overridden methods use File | Settings | File Templates.
+ }
+
+ @Override
+ public Object setAttribute(String name, Object expected, Object desired)
+ throws IllegalStateException, AccessControlException, IllegalArgumentException
+ {
+ if(name.equals(PASSWORD))
+ {
+ setPassword((String)desired);
+ }
+ return super.setAttribute(name,
+ expected,
+ desired);
+ }
+
+ @Override
+ public State setDesiredState(State currentState, State desiredState)
+ throws IllegalStateTransitionException, AccessControlException
+ {
+ if(desiredState == State.DELETED)
+ {
+ try
+ {
+ deleteUser(_user.getName());
+ }
+ catch (AccountNotFoundException e)
+ {
+ // TODO - log?
+ }
+ return State.DELETED;
+ }
+ return super.setDesiredState(currentState,
+ desiredState); //To change body of overridden methods use File | Settings | File Templates.
+ }
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org