summaryrefslogtreecommitdiff
path: root/qpid/java/broker-plugins/management-http/src
diff options
context:
space:
mode:
authorAlex Rudyy <orudyy@apache.org>2013-03-11 18:29:45 +0000
committerAlex Rudyy <orudyy@apache.org>2013-03-11 18:29:45 +0000
commit66de8678fb2ab2af8dc5b6d653402b1efd70779b (patch)
tree11e91fd6e6305e3b008d87bccbd81d1d8e29a15c /qpid/java/broker-plugins/management-http/src
parent8f8a9146dbb5a7116ecd24c1003bd200623a7e03 (diff)
downloadqpid-python-66de8678fb2ab2af8dc5b6d653402b1efd70779b.tar.gz
QPID-4638: Add UI to add/delete/update authentication providers into java broker web management console
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1455273 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java/broker-plugins/management-http/src')
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java2
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/Action.java32
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java109
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/action/ListAuthenticationProviderAttributes.java76
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/addAuthenticationProvider.html38
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js5
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js79
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js50
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAuthenticationProvider.js268
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js19
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/showAuthProvider.html3
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/showBroker.html7
12 files changed, 663 insertions, 25 deletions
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
index 903d322508..5f281504e9 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
@@ -36,6 +36,7 @@ import org.apache.qpid.server.logging.messages.ManagementConsoleMessages;
import org.apache.qpid.server.management.plugin.servlet.DefinedFileServlet;
import org.apache.qpid.server.management.plugin.servlet.FileServlet;
import org.apache.qpid.server.management.plugin.servlet.rest.AbstractServlet;
+import org.apache.qpid.server.management.plugin.servlet.rest.HelperServlet;
import org.apache.qpid.server.management.plugin.servlet.rest.LogRecordsServlet;
import org.apache.qpid.server.management.plugin.servlet.rest.LogoutServlet;
import org.apache.qpid.server.management.plugin.servlet.rest.MessageContentServlet;
@@ -303,6 +304,7 @@ public class HttpManagement extends AbstractPluginAdapter
root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.json");
root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.txt");
root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.xsl");
+ root.addServlet(new ServletHolder(new HelperServlet()), "/rest/helper");
final SessionManager sessionManager = root.getSessionHandler().getSessionManager();
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/Action.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/Action.java
new file mode 100644
index 0000000000..3241a7560e
--- /dev/null
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/Action.java
@@ -0,0 +1,32 @@
+/*
+ * 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.management.plugin.servlet.rest;
+
+import java.util.Map;
+
+import org.apache.qpid.server.model.Broker;
+
+
+public interface Action
+{
+ String getName();
+ Object perform(Map<String, Object> request, Broker broker);
+}
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java
new file mode 100644
index 0000000000..fa82632dc1
--- /dev/null
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java
@@ -0,0 +1,109 @@
+/*
+ * 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.management.plugin.servlet.rest;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.qpid.server.management.plugin.servlet.rest.action.ListAuthenticationProviderAttributes;
+import org.apache.qpid.server.model.Broker;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
+
+public class HelperServlet extends AbstractServlet
+{
+ private static final String PARAM_ACTION = "action";
+
+ private Map<String, Action> _actions;
+ private ObjectMapper _mapper;
+
+ public HelperServlet()
+ {
+ _mapper = new ObjectMapper();
+ _mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
+ _actions = new HashMap<String, Action>();
+ Action listProviderAttributes = new ListAuthenticationProviderAttributes();
+ _actions.put(listProviderAttributes.getName(), listProviderAttributes);
+ }
+
+ @Override
+ protected void doGetWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws ServletException,
+ IOException
+ {
+ perform(request, response);
+ }
+
+ @Override
+ protected void doPostWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws ServletException,
+ IOException
+ {
+ perform(request, response);
+ }
+
+ private void perform(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ String actionName = request.getParameter(PARAM_ACTION);
+ Action action = _actions.get(actionName);
+ if (action == null)
+ {
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+
+ Map<String, Object> parameters = new HashMap<String, Object>();
+ @SuppressWarnings("unchecked")
+ Enumeration<String> names = request.getParameterNames();
+ while (names.hasMoreElements())
+ {
+ String name = (String) names.nextElement();
+ String[] values = request.getParameterValues(name);
+ if (values.length == 1)
+ {
+ parameters.put(name, values[0]);
+ }
+ else
+ {
+ parameters.put(name, values);
+ }
+ }
+
+ Object output = action.perform(parameters, (Broker) getServletContext().getAttribute(ATTR_BROKER));
+ if (output == null)
+ {
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+ response.setContentType("application/json");
+ final Writer writer = new BufferedWriter(response.getWriter());
+ _mapper.writeValue(writer, output);
+
+ response.setStatus(HttpServletResponse.SC_OK);
+
+ }
+}
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/action/ListAuthenticationProviderAttributes.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/action/ListAuthenticationProviderAttributes.java
new file mode 100644
index 0000000000..5c629587e0
--- /dev/null
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/action/ListAuthenticationProviderAttributes.java
@@ -0,0 +1,76 @@
+/*
+ * 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.management.plugin.servlet.rest.action;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.qpid.server.management.plugin.servlet.rest.Action;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.plugin.AuthenticationManagerFactory;
+import org.apache.qpid.server.plugin.QpidServiceLoader;
+
+public class ListAuthenticationProviderAttributes implements Action
+{
+ private static final String ATTRIBUTES = "attributes";
+ private static final String DESCRIPTIONS = "descriptions";
+ private Map<String, AuthenticationManagerFactory> _factories;
+
+ public ListAuthenticationProviderAttributes()
+ {
+ _factories = new TreeMap<String, AuthenticationManagerFactory>();
+ Iterable<AuthenticationManagerFactory> factories = new QpidServiceLoader<AuthenticationManagerFactory>()
+ .instancesOf(AuthenticationManagerFactory.class);
+ for (AuthenticationManagerFactory factory : factories)
+ {
+ _factories.put(factory.getType(), factory);
+ }
+ }
+
+ @Override
+ public String getName()
+ {
+ return ListAuthenticationProviderAttributes.class.getSimpleName();
+ }
+
+ @Override
+ public Object perform(Map<String, Object> request, Broker broker)
+ {
+ Map<String, Object> attributes = new TreeMap<String, Object>();
+ for (String providerType : _factories.keySet())
+ {
+ AuthenticationManagerFactory factory = _factories.get(providerType);
+
+ Map<String, Object> data = new HashMap<String, Object>();
+ data.put(ATTRIBUTES, factory.getAttributeNames());
+ Map<String, String> resources = factory.getAttributeDescriptions();
+ if (resources != null)
+ {
+ data.put(DESCRIPTIONS, resources);
+ }
+
+ attributes.put(factory.getType(), data);
+ }
+ return attributes;
+ }
+
+}
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/addAuthenticationProvider.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/addAuthenticationProvider.html
new file mode 100644
index 0000000000..f164ece082
--- /dev/null
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/addAuthenticationProvider.html
@@ -0,0 +1,38 @@
+<!--
+ ~ 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="dijitHidden">
+ <div data-dojo-type="dijit.Dialog" style="width:600px;" data-dojo-props="title:'Authentication Provider'" id="addAuthenticationProvider">
+ <form id="formAddAuthenticationProvider" method="post" dojoType="dijit.form.Form">
+ <table class="tableContainer-table tableContainer-table-horiz" width="100%" cellspacing="1">
+ <tr>
+ <td class="tableContainer-labelCell" style="width: 300px;">Type*:</td>
+ <td class="tableContainer-valueCell"><div id="addAuthenticationProvider.selectAuthenticationProviderDiv"></div></td>
+ </tr>
+ <tr>
+ <td class="tableContainer-labelCell" style="width: 300px;">Name*:</td>
+ <td class="tableContainer-valueCell"><input type="text" required="true" name="name"
+ id="formAddAuthenticationProvider.name" placeholder="Name"
+ dojoType="dijit.form.ValidationTextBox" missingMessage="A name must be supplied" /></div></td>
+ </tr>
+ </table>
+ <input type="hidden" id="formAddAuthenticationProvider.id" name="id"/>
+ <div id="addAuthenticationProvider.fieldSets"></div>
+ <!-- submit buttons -->
+ <input type="submit" value="Save Authentication Provider" label="Save Authentication Provider" dojoType="dijit.form.Button" />
+ </form>
+ </div>
+</div>
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
index 5557c37a2c..e7554e6d9f 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
@@ -117,5 +117,10 @@ define(["dojo/_base/xhr"],
}
}
+ util.isProviderManagingUsers = function(type)
+ {
+ return (type === "PlainPasswordFileAuthenticationProvider" || type === "Base64MD5PasswordFileAuthenticationProvider");
+ };
+
return util;
}); \ No newline at end of file
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js
index 4273ed5b41..0d97eb3a07 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js
@@ -27,10 +27,14 @@ define(["dojo/_base/xhr",
"qpid/common/util",
"qpid/common/UpdatableStore",
"dojox/grid/EnhancedGrid",
+ "qpid/management/addAuthenticationProvider",
+ "dojo/_base/event",
+ "dijit/registry",
+ "dojo/dom-style",
"dojox/grid/enhanced/plugins/Pagination",
"dojox/grid/enhanced/plugins/IndirectSelection",
"dojo/domReady!"],
- function (xhr, parser, query, connect, properties, updater, util, UpdatableStore, EnhancedGrid) {
+ function (xhr, parser, query, connect, properties, updater, util, UpdatableStore, EnhancedGrid, addAuthenticationProvider, event, registry, domStyle) {
function AuthenticationProvider(name, parent, controller) {
this.name = name;
@@ -55,29 +59,68 @@ define(["dojo/_base/xhr",
contentPane.containerNode.innerHTML = data;
parser.parse(contentPane.containerNode);
- that.authProviderAdapter = new AuthProviderUpdater(contentPane.containerNode, that.modelObj, that.controller);
+ that.authProviderUpdater = new AuthProviderUpdater(contentPane.containerNode, that.modelObj, that.controller, that);
- updater.add( that.authProviderAdapter );
+ updater.add( that.authProviderUpdater );
- that.authProviderAdapter.update();
+ that.authProviderUpdater.update();
+ var editButton = query(".editAuthenticationProviderButton", contentPane.containerNode)[0];
+ var editWidget = registry.byNode(editButton);
+ connect.connect(editWidget, "onClick",
+ function(evt){
+ event.stop(evt);
+ addAuthenticationProvider.show(that.name);
+ });
+
+ var deleteButton = query(".deleteAuthenticationProviderButton", contentPane.containerNode)[0];
+ var deleteWidget = registry.byNode(deleteButton);
+ connect.connect(deleteWidget, "onClick",
+ function(evt){
+ event.stop(evt);
+ that.deleteAuthenticationProvider();
+ });
}});
};
AuthenticationProvider.prototype.close = function() {
- updater.remove( this.authProviderAdapter );
+ updater.remove( this.authProviderUpdater);
+ if (this.authProviderUpdater.details)
+ {
+ updater.remove(this.authProviderUpdater.details.authDatabaseUpdater);
+ }
+ };
+
+ AuthenticationProvider.prototype.deleteAuthenticationProvider = function() {
+ if(confirm("Are you sure you want to delete authentication provider '" + this.name + "'?")) {
+ var query = "rest/authenticationprovider/" +encodeURIComponent(this.name);
+ this.success = true
+ var that = this;
+ xhr.del({url: query, sync: true, handleAs: "json"}).then(
+ function(data) {
+ that.close();
+ that.contentPane.onClose()
+ that.controller.tabContainer.removeChild(that.contentPane);
+ that.contentPane.destroyRecursive();
+ },
+ function(error) {that.success = false; that.failureReason = error;});
+ if(!this.success ) {
+ alert("Error:" + this.failureReason);
+ }
+ }
};
- function AuthProviderUpdater(node, authProviderObj, controller)
+ function AuthProviderUpdater(node, authProviderObj, controller, authenticationProvider)
{
this.controller = controller;
this.name = query(".name", node)[0];
this.type = query(".type", node)[0];
+ this.authenticationProvider = authenticationProvider;
/*this.state = dom.byId("state");
this.durable = dom.byId("durable");
this.lifetimePolicy = dom.byId("lifetimePolicy");
*/
- this.query = "rest/authenticationprovider/"+encodeURIComponent(authProviderObj.name);
+ this.query = "rest/authenticationprovider/" + encodeURIComponent(authProviderObj.name);
var that = this;
@@ -90,20 +133,28 @@ define(["dojo/_base/xhr",
that.updateHeader();
- require(["qpid/management/authenticationprovider/"+that.authProviderData.category],
- function(SpecificProvider) {
- that.details = new SpecificProvider(node, authProviderObj, controller);
- that.details.update();
- });
-
+ var editButton = query(".editAuthenticationProviderButton", node)[0];
+ var editWidget = registry.byNode(editButton);
+ var hideEdit = (that.authProviderData.type === 'AnonymousAuthenticationManager' || that.authProviderData.type === 'ExternalAuthenticationManager')
+ domStyle.set(editWidget.domNode, "display", hideEdit ? "none": "");
+
+ if (util.isProviderManagingUsers(that.authProviderData.type))
+ {
+ require(["qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager"],
+ function(PrincipalDatabaseAuthenticationManager) {
+ that.details = new PrincipalDatabaseAuthenticationManager(node, data[0], controller, that);
+ that.details.update();
+ });
+ }
});
}
AuthProviderUpdater.prototype.updateHeader = function()
{
+ this.authenticationProvider.name = this.authProviderData[ "name" ]
this.name.innerHTML = this.authProviderData[ "name" ];
- this.type.innerHTML = this.authProviderData[ "authenticationProviderType" ];
+ this.type.innerHTML = this.authProviderData[ "type" ];
/* this.state.innerHTML = this.brokerData[ "state" ];
this.durable.innerHTML = this.brokerData[ "durable" ];
this.lifetimePolicy.innerHTML = this.brokerData[ "lifetimePolicy" ];
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
index dcf6711073..9b4e7aa3f9 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
@@ -27,10 +27,12 @@ define(["dojo/_base/xhr",
"qpid/common/util",
"qpid/common/UpdatableStore",
"dojox/grid/EnhancedGrid",
+ "dijit/registry",
+ "qpid/management/addAuthenticationProvider",
"dojox/grid/enhanced/plugins/Pagination",
"dojox/grid/enhanced/plugins/IndirectSelection",
"dojo/domReady!"],
- function (xhr, parser, query, connect, properties, updater, util, UpdatableStore, EnhancedGrid) {
+ function (xhr, parser, query, connect, properties, updater, util, UpdatableStore, EnhancedGrid, registry, addAuthenticationProvider) {
function Broker(name, parent, controller) {
this.name = name;
@@ -62,6 +64,20 @@ define(["dojo/_base/xhr",
that.brokerUpdater.update();
+ var addProviderButton = query(".addAuthenticationProvider", contentPane.containerNode)[0];
+ connect.connect(registry.byNode(addProviderButton), "onClick", function(evt){ addAuthenticationProvider.show(); });
+
+ var deleteProviderButton = query(".deleteAuthenticationProvider", contentPane.containerNode)[0];
+ connect.connect(registry.byNode(deleteProviderButton), "onClick",
+ function(evt){
+ util.deleteGridSelections(
+ that.brokerUpdater,
+ that.brokerUpdater.authenticationProvidersGrid.grid,
+ "rest/authenticationprovider",
+ "Are you sure you want to delete authentication provider");
+ }
+ );
+
}});
};
@@ -121,6 +137,36 @@ define(["dojo/_base/xhr",
});
});
+ var gridProperties = {
+ keepSelection: true,
+ plugins: {
+ indirectSelection: true
+ }};
+
+ that.authenticationProvidersGrid =
+ new UpdatableStore(that.brokerData.authenticationproviders, query(".broker-authentication-providers")[0],
+ [ { name: "Name", field: "name", width: "100%"},
+ { name: "Type", field: "type", width: "300px"},
+ { name: "User Management", field: "type", width: "200px",
+ formatter: function(val){
+ return "<input type='radio' disabled='disabled' "+(util.isProviderManagingUsers(val)?"checked='checked'": "")+" />";
+ }
+ },
+ { name: "Default", field: "name", width: "100px",
+ formatter: function(val){
+ return "<input type='radio' disabled='disabled' "+(val == that.brokerData.defaultAuthenticationProvider ? "checked='checked'": "")+" />";
+ }
+ }
+ ], 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("authenticationprovider", name, brokerObj);
+ });
+ }, gridProperties, EnhancedGrid);
+
});
xhr.get({url: "rest/logrecords", sync: properties.useSyncGet, handleAs: "json"})
@@ -186,7 +232,7 @@ define(["dojo/_base/xhr",
that.portsGrid.update(that.brokerData.ports);
-
+ that.authenticationProvidersGrid.update(that.brokerData.authenticationproviders);
});
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAuthenticationProvider.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAuthenticationProvider.js
new file mode 100644
index 0000000000..decc7fa0b3
--- /dev/null
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAuthenticationProvider.js
@@ -0,0 +1,268 @@
+/*
+ *
+ * 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/dom-construct",
+ "dojo/_base/window",
+ "dijit/registry",
+ "dojo/parser",
+ "dojo/_base/array",
+ "dojo/_base/event",
+ 'dojo/_base/json',
+ "dojo/store/Memory",
+ "dijit/form/FilteringSelect",
+ "dojo/_base/connect",
+ "dojo/dom-style",
+ /* dojox/ validate resources */
+ "dojox/validate/us", "dojox/validate/web",
+ /* basic dijit classes */
+ "dijit/Dialog",
+ "dijit/form/CheckBox", "dijit/form/Textarea",
+ "dijit/form/TextBox",
+ "dijit/form/ValidationTextBox",
+ "dijit/form/Button",
+ "dijit/form/Form",
+ /* basic dojox classes */
+ "dojox/form/BusyButton", "dojox/form/CheckedMultiSelect",
+ "dojox/layout/TableContainer",
+ "dojo/domReady!"],
+ function (xhr, dom, construct, win, registry, parser, array, event, json, Memory, FilteringSelect, connect, domStyle) {
+
+ var addAuthenticationProvider = {};
+
+ var node = construct.create("div", null, win.body(), "last");
+
+ var convertToAuthenticationProvider = function convertToAuthenticationProvider(formValues)
+ {
+ var newProvider = {};
+
+ newProvider.name = dijit.byId("formAddAuthenticationProvider.name").value;
+ newProvider.type = dijit.byId("authenticationProviderType").value;
+ var id = dojo.byId("formAddAuthenticationProvider.id").value;
+ if (id)
+ {
+ newProvider.id = id;
+ }
+ for(var propName in formValues)
+ {
+ if(formValues.hasOwnProperty(propName))
+ {
+ if(formValues[ propName ] !== "") {
+ newProvider[ propName ] = formValues[propName];
+ }
+
+ }
+ }
+ return newProvider;
+ }
+
+ var showFieldSets = function showFieldSets(providerType, fieldSets)
+ {
+ for(var key in fieldSets)
+ {
+ var layout = fieldSets[key];
+ var disabled = key != providerType;
+ var displayValue = key == providerType ? "block" : "none";
+ var widgets = layout.getDescendants();
+ array.forEach(widgets, function(widget)
+ {
+ widget.set("disabled", disabled);
+ });
+
+ domStyle.set(fieldSets[key].domNode, "display", displayValue);
+ }
+ if (fieldSets[providerType])
+ {
+ fieldSets[providerType].getParent().resize();
+ }
+ }
+
+ var getAuthenticationProviderWidgetId = function getAuthenticationProviderWidgetId(providerType, attribute)
+ {
+ return "ap_" + providerType + "Field" + attribute;
+ }
+
+ var loadProviderAndDisplayForm = function loadProviderAndDisplayForm(providerName, dialog)
+ {
+ if (providerName)
+ {
+ xhr.get({
+ url: "rest/authenticationprovider/" + encodeURIComponent(providerName),
+ handleAs: "json"
+ }).then(
+ function(data) {
+ var provider = data[0];
+ var providerType = provider.type;
+ var nameField = dijit.byId("formAddAuthenticationProvider.name");
+ nameField.set("value", provider.name);
+ nameField.set("disabled", true);
+ dialog.providerChooser.set("value", providerType);
+ dialog.providerChooser.set("disabled", true);
+ dojo.byId("formAddAuthenticationProvider.id").value=provider.id;
+ for(var attribute in provider)
+ {
+ if (provider.hasOwnProperty(attribute))
+ {
+ var widject = dijit.byId(getAuthenticationProviderWidgetId(providerType, attribute));
+ if (widject)
+ {
+ widject.set("value", provider[attribute]);
+ }
+ }
+ }
+ registry.byId("addAuthenticationProvider").show();
+ });
+ }
+ else
+ {
+ registry.byId("addAuthenticationProvider").show();
+ }
+ }
+
+ xhr.get({url: "addAuthenticationProvider.html",
+ sync: true,
+ load: function(data) {
+ var theForm;
+ node.innerHTML = data;
+ addAuthenticationProvider.dialogNode = dom.byId("addAuthenticationProvider");
+ parser.instantiate([addAuthenticationProvider.dialogNode]);
+ theForm = registry.byId("formAddAuthenticationProvider");
+ theForm.on("submit", function(e) {
+
+ event.stop(e);
+ if(theForm.validate()){
+
+ var newAuthenticationManager = convertToAuthenticationProvider(theForm.getValues());
+ var that = this;
+
+ xhr.put({url: "rest/authenticationprovider/" + encodeURIComponent(newAuthenticationManager.name),
+ sync: true, handleAs: "json",
+ headers: { "Content-Type": "application/json"},
+ putData: json.toJson(newAuthenticationManager),
+ load: function(x) {that.success = true; },
+ error: function(error) {that.success = false; that.failureReason = error;}});
+
+ if(this.success === true)
+ {
+ registry.byId("addAuthenticationProvider").hide();
+ }
+ else
+ {
+ alert("Error:" + this.failureReason);
+ }
+ return false;
+ }else{
+ alert('Form contains invalid data. Please correct first');
+ return false;
+ }
+ });
+ }});
+
+ addAuthenticationProvider.show = function(providerName) {
+ var that = this;
+ registry.byId("formAddAuthenticationProvider").reset();
+ dojo.byId("formAddAuthenticationProvider.id").value="";
+ registry.byId("formAddAuthenticationProvider.name").set("disabled", false);
+ if (this.providerChooser)
+ {
+ this.providerChooser.set("disabled", false);
+ }
+
+ if (!that.hasOwnProperty("providerFieldSets"))
+ {
+ xhr.get({
+ url: "rest/helper?action=ListAuthenticationProviderAttributes",
+ handleAs: "json"
+ }).then(
+ function(data) {
+ var providers = [];
+ var providerIndex = 0;
+ that.providerFieldSetsContainer = dom.byId("addAuthenticationProvider.fieldSets");
+ that.providerFieldSets = [];
+
+ for (var providerType in data) {
+ if (data.hasOwnProperty(providerType)) {
+ providers[providerIndex++] = {id: providerType, name: providerType};
+
+ var attributes = data[providerType].attributes;
+ var resources = data[providerType].descriptions;
+ var layout = new dojox.layout.TableContainer( {
+ id: providerType + "FieldSet",
+ cols: 1,
+ "labelWidth": "300",
+ showLabels: true,
+ orientation: "horiz"
+ });
+ for(var i=0; i < attributes.length; i++) {
+ if ("type" == attributes[i])
+ {
+ continue;
+ }
+ var labelValue = attributes[i];
+ if (resources && resources[attributes[i]])
+ {
+ labelValue = resources[attributes[i]];
+ }
+ var text = new dijit.form.TextBox({
+ label: labelValue + ":",
+ id: getAuthenticationProviderWidgetId(providerType, attributes[i]),
+ name: attributes[i]
+ });
+ layout.addChild(text);
+ }
+ layout.placeAt("addAuthenticationProvider.fieldSets");
+ that.providerFieldSets[providerType]=layout;
+ layout.startup();
+ }
+ }
+
+ var providersStore = new Memory({ data: providers });
+ if(that.providerChooser) {
+ that.providerChooser.destroy( false );
+ }
+
+ var providersDiv = dom.byId("addAuthenticationProvider.selectAuthenticationProviderDiv");
+ var input = construct.create("input", {id: "addAuthenticationProviderType"}, providersDiv);
+
+ that.providerChooser = new FilteringSelect({ id: "authenticationProviderType",
+ name: "type",
+ store: providersStore,
+ searchAttr: "name"}, input);
+ connect.connect(that.providerChooser, "onChange",
+ function(event)
+ {
+ showFieldSets(that.providerChooser.value, that.providerFieldSets);
+ }
+ );
+ var providerType = providers[0].name;
+ that.providerChooser.set("value", providerType);
+ showFieldSets(providerType, that.providerFieldSets);
+ loadProviderAndDisplayForm(providerName, that)
+ });
+ }
+ else
+ {
+ loadProviderAndDisplayForm(providerName, that);
+ }
+ }
+
+ return addAuthenticationProvider;
+ }); \ No newline at end of file
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js
index 8e5ac862bd..0a607c71d4 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js
@@ -44,7 +44,7 @@ define(["dojo/_base/xhr",
"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) {
+ function DatabaseAuthManager(containerNode, authProviderObj, controller, authenticationManagerUpdater) {
var node = construct.create("div", null, containerNode, "last");
var that = this;
this.name = authProviderObj.name;
@@ -55,8 +55,7 @@ define(["dojo/_base/xhr",
parser.parse(node);
- that.authDatabaseUpdater= new AuthProviderUpdater(node, authProviderObj, controller);
-
+ that.authDatabaseUpdater= new AuthProviderUpdater(node, authProviderObj, controller, authenticationManagerUpdater);
updater.add( that.authDatabaseUpdater);
that.authDatabaseUpdater.update();
@@ -73,17 +72,18 @@ define(["dojo/_base/xhr",
updater.remove( this.authDatabaseUpdater );
};
- function AuthProviderUpdater(node, authProviderObj, controller)
+ function AuthProviderUpdater(node, authProviderObj, controller, authenticationManagerUpdater)
{
this.controller = controller;
- this.query = "rest/authenticationprovider/"+encodeURIComponent(authProviderObj.name);
+ this.query = "rest/authenticationprovider?id="+encodeURIComponent(authProviderObj.id);
this.name = authProviderObj.name;
+ this.authenticationManagerUpdater = authenticationManagerUpdater;
var that = this;
xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"})
.then(function(data) {
that.authProviderData = data[0];
-
+ that.name = data[0].name
util.flattenStatistics( that.authProviderData );
var userDiv = query(".users")[0];
@@ -116,13 +116,13 @@ define(["dojo/_base/xhr",
theItem = this.getItem(idx);
var name = obj.dataStore.getValue(theItem,"name");
var id = obj.dataStore.getValue(theItem,"id");
- setPassword.show(authProviderObj.name, {name: name, id: id});
+ setPassword.show(that.name, {name: name, id: id});
});
}, gridProperties, EnhancedGrid);
var addUserButton = query(".addUserButton", node)[0];
- connect.connect(registry.byNode(addUserButton), "onClick", function(evt){ addUser.show(authProviderObj.name) });
+ connect.connect(registry.byNode(addUserButton), "onClick", function(evt){ addUser.show(that.name) });
var deleteMessagesButton = query(".deleteUserButton", node)[0];
var deleteWidget = registry.byNode(deleteMessagesButton);
@@ -176,10 +176,13 @@ define(["dojo/_base/xhr",
xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"})
.then(function(data) {
that.authProviderData = data[0];
+ that.name = data[0].name
util.flattenStatistics( that.authProviderData );
that.usersGrid.update(that.authProviderData.users);
+ that.authenticationManagerUpdater.authProviderData = data[0];
+ that.authenticationManagerUpdater.updateHeader();
});
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/showAuthProvider.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/showAuthProvider.html
index c5d4e48a75..bea5db2829 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/showAuthProvider.html
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/showAuthProvider.html
@@ -22,4 +22,7 @@
<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>
+ <br/>
+ <button data-dojo-type="dijit.form.Button" class="editAuthenticationProviderButton">Edit</button>
+ <button data-dojo-type="dijit.form.Button" class="deleteAuthenticationProviderButton">Delete</button>
</div> \ No newline at end of file
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/showBroker.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/showBroker.html
index f8d80faba8..f656124a2a 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/showBroker.html
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/showBroker.html
@@ -36,7 +36,12 @@
<div class="broker-ports"></div>
</div>
<br/>
-
+ <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Authentication Providers'">
+ <div class="broker-authentication-providers"></div>
+ <button data-dojo-type="dijit.form.Button" class="addAuthenticationProvider">Add Provider</button>
+ <button data-dojo-type="dijit.form.Button" class="deleteAuthenticationProvider">Delete Provider</button>
+ </div>
+ <br/>
<div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Log File', open: false">
<div class="broker-logfile"></div>
</div>