diff options
| author | Alex Rudyy <orudyy@apache.org> | 2013-03-11 18:29:45 +0000 |
|---|---|---|
| committer | Alex Rudyy <orudyy@apache.org> | 2013-03-11 18:29:45 +0000 |
| commit | 66de8678fb2ab2af8dc5b6d653402b1efd70779b (patch) | |
| tree | 11e91fd6e6305e3b008d87bccbd81d1d8e29a15c /qpid/java/broker-plugins/management-http/src | |
| parent | 8f8a9146dbb5a7116ecd24c1003bd200623a7e03 (diff) | |
| download | qpid-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')
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> |
