summaryrefslogtreecommitdiff
path: root/qpid/java/broker-plugins
diff options
context:
space:
mode:
authorAlex Rudyy <orudyy@apache.org>2015-01-29 09:30:58 +0000
committerAlex Rudyy <orudyy@apache.org>2015-01-29 09:30:58 +0000
commit119b5b63a4d508e4acf8ee5f67bd91df214a268f (patch)
tree68154895c8efa7ae0114c2f935e749a838d2a008 /qpid/java/broker-plugins
parente860a568e040c2b6a1ebfd6035cc77fdc3933473 (diff)
downloadqpid-python-119b5b63a4d508e4acf8ee5f67bd91df214a268f.tar.gz
QPID-6346: [Java Broker] Add UI for uploading of pem/der keys and certificates for non-java keystores/truststores into web management console
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655560 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java/broker-plugins')
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addStore.js1
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavakeystore/add.js162
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavakeystore/show.js42
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/add.js162
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/show.js66
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavakeystore/add.html153
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavakeystore/show.html35
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavatruststore/add.html67
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavatruststore/show.html31
9 files changed, 719 insertions, 0 deletions
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addStore.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addStore.js
index 98068f2376..c6ce218530 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addStore.js
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addStore.js
@@ -90,6 +90,7 @@ define(["dojo/_base/lang",
}
this.storeName.set("disabled", effectiveData == null ? false : true);
this.storeType.set("disabled", effectiveData == null ? false : true);
+ this.dialog.set("title", effectiveData == null ? "Add Key Store" : "Edit Key Store - " + effectiveData.name)
this.dialog.show();
},
_initFields:function(data)
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavakeystore/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavakeystore/add.js
new file mode 100644
index 0000000000..7488ad93d6
--- /dev/null
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavakeystore/add.js
@@ -0,0 +1,162 @@
+/*
+ *
+ * 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/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/common/util", "qpid/common/metadata"],
+ function (dom, query, array, registry, util, metadata)
+ {
+ var addKeyStore =
+ {
+ init: function()
+ {
+ },
+ show: function(data)
+ {
+ var that=this;
+ util.parseHtmlIntoDiv(data.containerNode, "store/nonjavakeystore/add.html");
+
+ this.keyStoreOldBrowserWarning = dom.byId("addStore.oldBrowserWarning");
+ this.addButton = data.parent.addButton;
+ this.containerNode = data.containerNode;
+
+ if (!window.FileReader)
+ {
+ this.keyStoreOldBrowserWarning.innerHTML = "File upload requires a more recent browser with HTML5 support";
+ this.keyStoreOldBrowserWarning.className = this.keyStoreOldBrowserWarning.className.replace("hidden", "");
+ }
+
+ this._initUploadFields("privateKey", "private key");
+ this._initUploadFields("certificate", "certificate");
+ this._initUploadFields("intermediateCertificate", "intermediate certificate");
+ },
+ _initUploadFields: function(fieldName, description)
+ {
+ var that=this;
+ this[fieldName] = registry.byId("addStore." + fieldName);
+ this[fieldName + "UploadFields"] = dom.byId("addStore." + fieldName +"UploadFields");
+ this[fieldName + "UploadContainer"] = dom.byId("addStore." + fieldName + "UploadContainer");
+ this[fieldName + "UploadStatusContainer"] = dom.byId("addStore." + fieldName + "UploadStatusContainer");
+ this[fieldName + "File"] = registry.byId("addStore." + fieldName + "File");
+ this[fieldName + "FileClearButton"] = registry.byId("addStore." + fieldName + "FileClearButton");
+
+ // field to submit
+ this[fieldName + "Url"] = registry.byId("addStore." + fieldName + "Url");
+
+ if (window.FileReader)
+ {
+ this[fieldName + "Reader"] = new FileReader();
+ this[fieldName + "Reader"].onload = function(evt) {that._uploadFileComplete(evt, fieldName);};
+ this[fieldName + "Reader"].onerror = function(ex) {console.error("Failed to load " + description + " file", ex);};
+ this[fieldName + "File"].on("change", function(selected){that._fileChanged(selected, fieldName)});
+ this[fieldName + "FileClearButton"].on("click", function(event){that._fileClearButtonClicked(event, fieldName)});
+ }
+ else
+ {
+ // Fall back for IE8/9 which do not support FileReader
+ this[fieldName + "UploadFields"].style.display = "none";
+ }
+
+ this[fieldName].on("blur", function(){that._pathChanged(fieldName)});
+ },
+ _fileChanged: function (evt, fieldName)
+ {
+ var file = this[fieldName + "File"].domNode.children[0].files[0];
+
+ this[fieldName + "UploadContainer"].innerHTML = file.name;
+ this[fieldName + "UploadStatusContainer"].className = "loadingIcon";
+
+ console.log("Beginning to read file " + file.name + " for " + fieldName );
+ this[fieldName + "Reader"].readAsDataURL(file);
+ },
+ _uploadFileComplete: function(evt, fieldName)
+ {
+ var reader = evt.target;
+ var result = reader.result;
+ console.log(fieldName + " file read complete, contents " + result);
+
+ this[fieldName + "UploadStatusContainer"].className = "loadedIcon";
+
+ this[fieldName].set("value", "");
+ this[fieldName].setDisabled(true);
+ this[fieldName].set("required", false);
+
+ this[fieldName + "FileClearButton"].setDisabled(false);
+
+ this[fieldName + "Url"].set("value", result);
+ },
+ _fileClearButtonClicked: function(event, fieldName)
+ {
+ this[fieldName + "File"].reset();
+ this[fieldName + "UploadStatusContainer"].className = "";
+ this[fieldName + "UploadContainer"].innerHTML = "";
+ this[fieldName].set("required", true);
+ this[fieldName].setDisabled(false);
+ this[fieldName + "FileClearButton"].setDisabled(true);
+
+ this[fieldName + "Url"].set("value", "");
+ },
+ _pathChanged: function(fieldName)
+ {
+ var serverPathValue = this[fieldName].get("value");
+ this[fieldName + "Url"].set("value", serverPathValue);
+ },
+ update: function(effectiveData)
+ {
+ var attributes = metadata.getMetaData("KeyStore", "NonJavaKeyStore").attributes;
+ var widgets = registry.findWidgets(this.containerNode);
+ var that=this;
+ array.forEach(widgets, function(item)
+ {
+ var name = item.id.replace("addStore.","");
+ var val = effectiveData[name];
+ item.set("value", val);
+
+ if (name.indexOf("Url") != -1)
+ {
+ var isDataUrl = val && val.indexOf("data:") == 0;
+ var fieldName = name.substring(0, name.length - 3);
+ if (isDataUrl)
+ {
+ that[fieldName + "UploadStatusContainer"].className = "loadedIcon";
+ that[fieldName + "UploadContainer"].innerHTML = "uploaded.jks";
+ that[fieldName].setDisabled(true);
+ that[fieldName].set("required", false);
+ that[fieldName + "FileClearButton"].setDisabled(false);
+ }
+ else
+ {
+ that[fieldName].set("value", val);
+ }
+ }
+ });
+
+ }
+ };
+
+ try
+ {
+ addKeyStore.init();
+ }
+ catch(e)
+ {
+ console.warn(e);
+ }
+ return addKeyStore;
+ }
+);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavakeystore/show.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavakeystore/show.js
new file mode 100644
index 0000000000..1985410e57
--- /dev/null
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavakeystore/show.js
@@ -0,0 +1,42 @@
+/*
+ * 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(["qpid/common/util", "qpid/common/metadata", "dojo/domReady!"],
+ function (util, metadata)
+ {
+
+ function NonJavaKeyStore(data)
+ {
+ this.fields = [];
+ var attributes = metadata.getMetaData("KeyStore", "NonJavaKeyStore").attributes;
+ for(var name in attributes)
+ {
+ this.fields.push(name);
+ }
+ util.buildUI(data.containerNode, data.parent, "store/nonjavakeystore/show.html", this.fields, this);
+ }
+
+ NonJavaKeyStore.prototype.update = function(data)
+ {
+ util.updateUI(data, this.fields, this);
+ }
+
+ return NonJavaKeyStore;
+ }
+);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/add.js
new file mode 100644
index 0000000000..2cff365f60
--- /dev/null
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/add.js
@@ -0,0 +1,162 @@
+/*
+ *
+ * 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/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/common/util", "qpid/common/metadata"],
+ function (dom, query, array, registry, util, metadata)
+ {
+ var addKeyStore =
+ {
+ init: function()
+ {
+ },
+ show: function(data)
+ {
+ var that=this;
+ util.parseHtmlIntoDiv(data.containerNode, "store/nonjavatruststore/add.html");
+
+ this.keyStoreOldBrowserWarning = dom.byId("addStore.oldBrowserWarning");
+ this.addButton = data.parent.addButton;
+ this.containerNode = data.containerNode;
+
+ if (!window.FileReader)
+ {
+ this.keyStoreOldBrowserWarning.innerHTML = "File upload requires a more recent browser with HTML5 support";
+ this.keyStoreOldBrowserWarning.className = this.keyStoreOldBrowserWarning.className.replace("hidden", "");
+ }
+
+ this._initUploadFields("certificates", "certificates");
+ },
+ _initUploadFields: function(fieldName, description)
+ {
+ var that=this;
+ this[fieldName] = registry.byId("addStore." + fieldName);
+ this[fieldName + "UploadFields"] = dom.byId("addStore." + fieldName +"UploadFields");
+ this[fieldName + "UploadContainer"] = dom.byId("addStore." + fieldName + "UploadContainer");
+ this[fieldName + "UploadStatusContainer"] = dom.byId("addStore." + fieldName + "UploadStatusContainer");
+ this[fieldName + "File"] = registry.byId("addStore." + fieldName + "File");
+ this[fieldName + "FileClearButton"] = registry.byId("addStore." + fieldName + "FileClearButton");
+
+ // field to submit
+ this[fieldName + "Url"] = registry.byId("addStore." + fieldName + "Url");
+
+ if (window.FileReader)
+ {
+ this[fieldName + "Reader"] = new FileReader();
+ this[fieldName + "Reader"].onload = function(evt) {that._uploadFileComplete(evt, fieldName);};
+ this[fieldName + "Reader"].onerror = function(ex) {console.error("Failed to load " + description + " file", ex);};
+ this[fieldName + "File"].on("change", function(selected){that._fileChanged(selected, fieldName)});
+ this[fieldName + "FileClearButton"].on("click", function(event){that._fileClearButtonClicked(event, fieldName)});
+ }
+ else
+ {
+ // Fall back for IE8/9 which do not support FileReader
+ this[fieldName + "UploadFields"].style.display = "none";
+ }
+
+ this[fieldName].on("blur", function(){that._pathChanged(fieldName)});
+ },
+ _fileChanged: function (evt, fieldName)
+ {
+ var file = this[fieldName + "File"].domNode.children[0].files[0];
+
+ this[fieldName + "UploadContainer"].innerHTML = file.name;
+ this[fieldName + "UploadStatusContainer"].className = "loadingIcon";
+
+ console.log("Beginning to read file " + file.name + " for " + fieldName );
+ this[fieldName + "Reader"].readAsDataURL(file);
+ },
+ _uploadFileComplete: function(evt, fieldName)
+ {
+ var reader = evt.target;
+ var result = reader.result;
+ console.log(fieldName + " file read complete, contents " + result);
+
+ // it is not clear the purpose of this operation
+ //this.addButton.setDisabled(false);
+ this[fieldName + "UploadStatusContainer"].className = "loadedIcon";
+
+ this[fieldName].set("value", "");
+ this[fieldName].setDisabled(true);
+ this[fieldName].set("required", false);
+
+ this[fieldName + "FileClearButton"].setDisabled(false);
+
+ this[fieldName + "Url"].set("value", result);
+ },
+ _fileClearButtonClicked: function(event, fieldName)
+ {
+ this[fieldName + "File"].reset();
+ this[fieldName + "UploadStatusContainer"].className = "";
+ this[fieldName + "UploadContainer"].innerHTML = "";
+ this[fieldName].set("required", true);
+ this[fieldName].setDisabled(false);
+ this[fieldName + "FileClearButton"].setDisabled(true);
+
+ this[fieldName + "Url"].set("value", "");
+ },
+ _pathChanged: function(fieldName)
+ {
+ var serverPathValue = this[fieldName].get("value");
+ this[fieldName + "Url"].set("value", serverPathValue);
+ },
+ update: function(effectiveData)
+ {
+ var attributes = metadata.getMetaData("TrustStore", "NonJavaTrustStore").attributes;
+ var widgets = registry.findWidgets(this.containerNode);
+ var that=this;
+ array.forEach(widgets, function(item)
+ {
+ var name = item.id.replace("addStore.","");
+ var val = effectiveData[name];
+ item.set("value", val);
+
+ if (name.indexOf("Url") != -1)
+ {
+ var isDataUrl = val && val.indexOf("data:") == 0;
+ var fieldName = name.substring(0, name.length - 3);
+ if (isDataUrl)
+ {
+ that[fieldName + "UploadStatusContainer"].className = "loadedIcon";
+ that[fieldName + "UploadContainer"].innerHTML = "uploaded.jks";
+ that[fieldName].setDisabled(true);
+ that[fieldName].set("required", false);
+ that[fieldName + "FileClearButton"].setDisabled(false);
+ }
+ else
+ {
+ that[fieldName].set("value", val);
+ }
+ }
+ });
+
+ }
+ };
+
+ try
+ {
+ addKeyStore.init();
+ }
+ catch(e)
+ {
+ console.warn(e);
+ }
+ return addKeyStore;
+ }
+);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/show.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/show.js
new file mode 100644
index 0000000000..ac210ea4be
--- /dev/null
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/show.js
@@ -0,0 +1,66 @@
+/*
+ * 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/query",
+ "qpid/common/util",
+ "qpid/common/metadata",
+ "dojox/grid/DataGrid",
+ "qpid/common/UpdatableStore",
+ "qpid/management/UserPreferences",
+ "dojo/domReady!"],
+ function (query, util, metadata, DataGrid, UpdatableStore, UserPreferences)
+ {
+
+
+ function NonJavaTrustStore(data)
+ {
+ this.fields = [];
+ var attributes = metadata.getMetaData("TrustStore", "NonJavaTrustStore").attributes;
+ for(var name in attributes)
+ {
+ this.fields.push(name);
+ }
+ util.buildUI(data.containerNode, data.parent, "store/nonjavatruststore/show.html", this.fields, this);
+ var gridNode = query(".details", data.containerNode)[0]
+ this.detailsGrid = new UpdatableStore([],
+ gridNode,
+ [
+ { name: 'Subject', field: 'SUBJECT_NAME', width: '25%' },
+ { name: 'Issuer', field: 'ISSUER_NAME', width: '25%' },
+ { name: 'Valid from', field: 'VALID_START', width: '25%', formatter: function(value){ return value ? UserPreferences.formatDateTime(value) : "";}},
+ { name: 'Valid to', field: 'VALID_END', width: '25%', formatter: function(value){ return value ? UserPreferences.formatDateTime(value) : "";}}
+ ]);
+ }
+
+ NonJavaTrustStore.prototype.update = function(data)
+ {
+ util.updateUI(data, this.fields, this);
+ var details = data.certificateDetails;
+ for(var i=0; i < details.length; i++)
+ {
+ details[i].id = details[i].SUBJECT_NAME + "_" + details[i].ISSUER_NAME + "_" + details[i].VALID_START + "_" + details[i].VALID_END;
+ }
+ this.detailsGrid.grid.beginUpdate();
+ this.detailsGrid.update(details);
+ this.detailsGrid.grid.endUpdate();
+ }
+
+ return NonJavaTrustStore;
+ }
+);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavakeystore/add.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavakeystore/add.html
new file mode 100644
index 0000000000..5272537bdf
--- /dev/null
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavakeystore/add.html
@@ -0,0 +1,153 @@
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+
+<div>
+ <div id="addStore.oldBrowserWarning" class="infoMessage hidden clear"></div>
+
+ <div class="clear">
+ <div id="addStore.privateKeyLabel" class="formLabel-labelCell tableContainer-labelCell">Private Key URL or Path*:</div>
+ <div class="formLabel-controlCell tableContainer-valueCell">
+ <input type="text" id="addStore.privateKey"
+ data-dojo-type="dijit/form/ValidationTextBox"
+ data-dojo-props="
+ name: 'privateKey',
+ placeHolder: 'Private key URL or path to file on server',
+ required: true,
+ excluded: true,
+ promptMessage: 'Location of the private key',
+ title: 'Enter private key URL or path to file containing private key in DER or PEM format'" />
+
+ <!-- Hidden and used purely for form submission -->
+ <input type="hidden" id="addStore.privateKeyUrl"
+ data-dojo-type="dijit/form/ValidationTextBox"
+ data-dojo-props="
+ name: 'privateKeyUrl',
+ required: true" />
+
+
+ <div id="addStore.privateKeyUploadFields" class="clear">
+
+ <div class="alignLeft" >
+ <span id="addStore.privateKeyUploadContainer" class="infoMessage"></span>
+ <span id="addStore.privateKeyUploadStatusContainer"></span>
+ </div>
+
+ <div class="alignRight">
+ <input type="file" id="addStore.privateKeyFile"
+ multiple="false"
+ data-dojo-type="dojox/form/Uploader"
+ data-dojo-props="label: 'Upload'"/>
+ <button id="addStore.privateKeyFileClearButton"
+ data-dojo-type="dijit/form/Button"
+ data-dojo-props="label: 'Clear',
+ disabled: true">
+ </button>
+ </div>
+ <div class="clear"></div>
+ </div>
+ </div>
+ </div>
+
+ <div class="clear">
+ <div id="addStore.serverPathLabel" class="formLabel-labelCell tableContainer-labelCell">Certificate URL or Path*:</div>
+ <div class="formLabel-controlCell tableContainer-valueCell">
+ <input type="text" id="addStore.certificate"
+ data-dojo-type="dijit/form/ValidationTextBox"
+ data-dojo-props="
+ name: 'certificate',
+ placeHolder: 'Certificate URL or path to certificate file on server',
+ required: true,
+ excluded: true,
+ promptMessage: 'Location of the certificate',
+ title: 'Enter certificate URL or path to file containing certificate in DER or PEM format'" />
+
+ <!-- Hidden and used purely for form submission -->
+ <input type="hidden" id="addStore.certificateUrl"
+ data-dojo-type="dijit/form/ValidationTextBox"
+ data-dojo-props="
+ name: 'certificateUrl',
+ required: true" />
+
+
+ <div id="addStore.certificateUploadFields">
+ <div class="alignLeft">
+ <span id="addStore.certificateUploadContainer" class="infoMessage"></span>
+ <span id="addStore.certificateUploadStatusContainer"></span>
+ </div>
+
+ <div class="alignRight">
+ <input type="file" id="addStore.certificateFile"
+ multiple="false"
+ data-dojo-type="dojox/form/Uploader"
+ data-dojo-props="label: 'Upload'"/>
+ <button id="addStore.certificateFileClearButton"
+ data-dojo-type="dijit/form/Button"
+ data-dojo-props="label: 'Clear',
+ disabled: true">
+ </button>
+ </div>
+ <div class="clear"></div>
+ </div>
+ </div>
+ </div>
+
+ <div class="clear">
+ <div id="addStore.intermediateCertificateLabel" class="formLabel-labelCell tableContainer-labelCell">Intermediate Certificate URL or Path:</div>
+ <div class="formLabel-controlCell tableContainer-valueCell">
+ <input type="text" id="addStore.intermediateCertificate"
+ data-dojo-type="dijit/form/ValidationTextBox"
+ data-dojo-props="
+ name: 'intermediateCertificate',
+ placeHolder: 'Intermediate certificate URL or path to file on server',
+ required: false,
+ excluded: true,
+ promptMessage: 'Location of the intermediate certificate',
+ title: 'Enter intermediate certificate URL or path to file containing certificate in format DER or PEM'" />
+
+ <!-- Hidden and used purely for form submission -->
+ <input type="hidden" id="addStore.intermediateCertificateUrl"
+ data-dojo-type="dijit/form/ValidationTextBox"
+ data-dojo-props="
+ name: 'intermediateCertificateUrl',
+ required: false" />
+ </div>
+
+ <div id="addStore.intermediateCertificateUploadFields">
+ <div class="alignLeft">
+ <span id="addStore.intermediateCertificateUploadContainer" class="infoMessage"></span>
+ <span id="addStore.intermediateCertificateUploadStatusContainer"></span>
+ </div>
+
+ <div class="alignRight">
+ <input type="file" id="addStore.intermediateCertificateFile"
+ multiple="false"
+ data-dojo-type="dojox/form/Uploader"
+ data-dojo-props="label: 'Upload'"/>
+ <button id="addStore.intermediateCertificateFileClearButton"
+ data-dojo-type="dijit/form/Button"
+ data-dojo-props="label: 'Clear',
+ disabled: true">
+ </button>
+ </div>
+ <div class="clear"></div>
+ </div>
+ </div>
+
+</div>
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavakeystore/show.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavakeystore/show.html
new file mode 100644
index 0000000000..e0dd896d7b
--- /dev/null
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavakeystore/show.html
@@ -0,0 +1,35 @@
+<!--
+ ~ 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>
+ <div class="clear privateKeyUrlContainer">
+ <div class="formLabel-labelCell">Private Key:</div>
+ <div ><span class="privateKeyUrl" ></span></div>
+ </div>
+ <div class="clear certificateUrlContainer">
+ <div class="formLabel-labelCell">Certificate:</div>
+ <div><span class="certificateUrl" ></span></div>
+ </div>
+ <div class="clear intermediateCertificateUrlContainer">
+ <div class="formLabel-labelCell">Intermediate Certificate:</div>
+ <div><span class="intermediateCertificateUrl" ></span></div>
+ </div>
+ <div class="clear"></div>
+</div>
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavatruststore/add.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavatruststore/add.html
new file mode 100644
index 0000000000..9de25877cb
--- /dev/null
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavatruststore/add.html
@@ -0,0 +1,67 @@
+<!--
+ ~ 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>
+ <div id="addStore.oldBrowserWarning" class="infoMessage hidden clear"></div>
+
+ <div class="clear">
+ <div id="addStore.certificatesLabel" class="formLabel-labelCell tableContainer-labelCell">Certificate URL or Path*:</div>
+ <div class="formLabel-controlCell tableContainer-valueCell">
+ <input type="text" id="addStore.certificates"
+ data-dojo-type="dijit/form/ValidationTextBox"
+ data-dojo-props="
+ name: 'certificates',
+ placeHolder: 'Certificate URL or path to certificate file on server',
+ required: true,
+ excluded: true,
+ promptMessage: 'Location of the certificate',
+ title: 'Enter certificate URL or path to file containing certificate in DER or PEM format'" />
+
+ <!-- Hidden and used purely for form submission -->
+ <input type="hidden" id="addStore.certificatesUrl"
+ data-dojo-type="dijit/form/ValidationTextBox"
+ data-dojo-props="
+ name: 'certificatesUrl',
+ required: true" />
+
+
+ <div id="addStore.certificatesUploadFields">
+ <div class="alignLeft">
+ <span id="addStore.certificatesUploadContainer" class="infoMessage"></span>
+ <span id="addStore.certificatesUploadStatusContainer"></span>
+ </div>
+
+ <div class="alignRight">
+ <input type="file" id="addStore.certificatesFile"
+ multiple="false"
+ data-dojo-type="dojox/form/Uploader"
+ data-dojo-props="label: 'Upload'"/>
+ <button id="addStore.certificatesFileClearButton"
+ data-dojo-type="dijit/form/Button"
+ data-dojo-props="label: 'Clear',
+ disabled: true">
+ </button>
+ </div>
+ <div class="clear"></div>
+ </div>
+ </div>
+ </div>
+
+</div>
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavatruststore/show.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavatruststore/show.html
new file mode 100644
index 0000000000..b45f457e41
--- /dev/null
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavatruststore/show.html
@@ -0,0 +1,31 @@
+<!--
+ ~ 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>
+ <div class="clear certificatesUrlContainer">
+ <div class="formLabel-labelCell">Certificate:</div>
+ <div><span class="certificatesUrl" ></span></div>
+ </div>
+ <div class="clear"></div>
+ <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Certificate details'" class="detailsGridPanel">
+ <div class="details"></div>
+ </div>
+ <div></div>
+</div>
+