From 82eb2c565e5d0a65d2e19ac4f884df5f430a8d22 Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Tue, 27 Jan 2015 16:04:13 +0000 Subject: QPID-6337: [Java Broker] Upgrade Dojo version to 1.10.3 git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655067 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/java/broker-plugins/management-http/pom.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-plugins/management-http/pom.xml b/qpid/java/broker-plugins/management-http/pom.xml index 47066874ed..50ff3e20f3 100644 --- a/qpid/java/broker-plugins/management-http/pom.xml +++ b/qpid/java/broker-plugins/management-http/pom.xml @@ -29,6 +29,10 @@ Qpid HTTP Management Broker Plug-in HTTP Management broker plug-in + + 1.10.3 + + org.apache.qpid @@ -84,6 +88,7 @@ org.dojotoolkit dojo ${dojo-version} + distribution zip @@ -124,7 +129,7 @@ it gets picked up when using classpath wildcard expansion, which only collects .jar files --> - dojo-${dojo-version}.zip + dojo-${dojo-version}-distribution.zip -- cgit v1.2.1 From 18471caa60a353ace6cebf4d175579a3c7228467 Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Tue, 27 Jan 2015 16:04:31 +0000 Subject: QPID-6337: Fix javascript error occuring in IE8 after dojo upgrade git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655068 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/main/java/resources/js/qpid/common/metadata.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js index c62ba5d5d4..1520cb8f7a 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js @@ -29,7 +29,7 @@ define(["dojo/_base/xhr", _init: function () { var that = this; - xhr.get({sync: true, handleAs: "json", url: "service/metadata", load: function(metadata){that._onMetadata(metadata)}}); + xhr.get({sync: true, handleAs: "json", url: "service/metadata", load: function(data){that._onMetadata(data)}}); }, _onMetadata: function (metadata) { @@ -68,7 +68,8 @@ define(["dojo/_base/xhr", }, implementsManagedInterface: function (category, type, managedInterfaceName) { - return this.getMetaData(category, type).managedInterfaces.indexOf(managedInterfaceName) >= 0; + var managedInterfaces = this.getMetaData(category, type).managedInterfaces; + return array.indexOf(managedInterfaces, managedInterfaceName) >= 0 ; }, validChildTypes: function (category, type, childCategory) { -- cgit v1.2.1 From 5853d2d3c8261f30590ee1b0406d9a2422ede00b Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Tue, 27 Jan 2015 16:04:58 +0000 Subject: QPID-6337: Fix renediring of dialog action bar git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655071 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/main/java/resources/addAccessControlProvider.html | 2 +- .../src/main/java/resources/addAuthenticationProvider.html | 2 +- .../management-http/src/main/java/resources/addBinding.html | 2 +- .../management-http/src/main/java/resources/addExchange.html | 2 +- .../management-http/src/main/java/resources/addPort.html | 2 +- .../src/main/java/resources/addPreferencesProvider.html | 2 +- .../management-http/src/main/java/resources/addQueue.html | 2 +- .../management-http/src/main/java/resources/addStore.html | 2 +- .../src/main/java/resources/addVirtualHostNodeAndVirtualHost.html | 2 +- .../management-http/src/main/java/resources/css/common.css | 8 ++++++++ .../management-http/src/main/java/resources/editBroker.html | 2 +- .../management-http/src/main/java/resources/editQueue.html | 2 +- .../management-http/src/main/java/resources/editVirtualHost.html | 2 +- .../src/main/java/resources/editVirtualHostNode.html | 2 +- .../src/main/java/resources/grid/showColumnDefDialog.html | 2 +- .../src/main/java/resources/grid/showRowNumberLimitDialog.html | 2 +- .../management-http/src/main/java/resources/index.html | 2 +- .../management-http/src/main/java/resources/login.html | 2 +- .../src/main/java/resources/logs/showLogFileDownloadDialog.html | 2 +- .../management-http/src/main/java/resources/showPreferences.html | 4 ++-- 20 files changed, 28 insertions(+), 20 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/addAccessControlProvider.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/addAccessControlProvider.html index 07a0c4cf83..64f8078314 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/addAccessControlProvider.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/addAccessControlProvider.html @@ -58,7 +58,7 @@ -
+
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 index cf38cd425c..5a565e72e3 100644 --- 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 @@ -56,7 +56,7 @@
-
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/addBinding.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/addBinding.html index 1b30c6ddcc..d4ac5877cb 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/addBinding.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/addBinding.html @@ -56,7 +56,7 @@
-
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/addExchange.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/addExchange.html index 77d5ed0bc1..25e9752392 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/addExchange.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/addExchange.html @@ -66,7 +66,7 @@
-
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/addPort.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/addPort.html index c76a230382..b787e701ec 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/addPort.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/addPort.html @@ -234,7 +234,7 @@
-
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/addPreferencesProvider.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/addPreferencesProvider.html index e850f5ac7f..e3984e1ae2 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/addPreferencesProvider.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/addPreferencesProvider.html @@ -19,7 +19,7 @@
-
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/addQueue.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/addQueue.html index 042d6d7ad7..61f0de22d8 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/addQueue.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/addQueue.html @@ -334,7 +334,7 @@
-
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/addStore.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/addStore.html index dd6e7a3d38..a1903d456e 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/addStore.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/addStore.html @@ -58,7 +58,7 @@
-
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/addVirtualHostNodeAndVirtualHost.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/addVirtualHostNodeAndVirtualHost.html index 383c782d60..a2ee2c1b4b 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/addVirtualHostNodeAndVirtualHost.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/addVirtualHostNodeAndVirtualHost.html @@ -128,7 +128,7 @@
-
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/css/common.css b/qpid/java/broker-plugins/management-http/src/main/java/resources/css/common.css index a18562fa1a..ec31709987 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/css/common.css +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/css/common.css @@ -329,3 +329,11 @@ div .messages { max-height: 140px; overflow: auto; } + +.qpidDialogPaneActionBar +{ + margin-left:-10px; + margin-right:-10px; + margin-bottom:-10px; + margin-top:5px; +} \ No newline at end of file diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/editBroker.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/editBroker.html index 85ca617c10..993a2c7505 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/editBroker.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/editBroker.html @@ -109,7 +109,7 @@
-
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/editQueue.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/editQueue.html index aff2b5dfa5..e7b33ed6f9 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/editQueue.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/editQueue.html @@ -289,7 +289,7 @@
-
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHost.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHost.html index f4826016ec..8e03dfdd17 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHost.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHost.html @@ -127,7 +127,7 @@
-
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHostNode.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHostNode.html index 46e76c31f0..cee18f7185 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHostNode.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/editVirtualHostNode.html @@ -44,7 +44,7 @@
-
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/grid/showColumnDefDialog.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/grid/showColumnDefDialog.html index 5b6b8ad774..535b9a1fe5 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/grid/showColumnDefDialog.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/grid/showColumnDefDialog.html @@ -23,7 +23,7 @@
Select columns to display:
-
+
-
+
-
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/login.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/login.html index aaa2855bd2..6e7f05e41b 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/login.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/login.html @@ -104,7 +104,7 @@
-
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/logs/showLogFileDownloadDialog.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/logs/showLogFileDownloadDialog.html index bc633d059a..d48682a566 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/logs/showLogFileDownloadDialog.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/logs/showLogFileDownloadDialog.html @@ -23,7 +23,7 @@
Select log files to download
-
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/showPreferences.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/showPreferences.html index 2695d8f099..8dff5132bd 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/showPreferences.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/showPreferences.html @@ -40,7 +40,7 @@
-
+
@@ -70,7 +70,7 @@ -
+
-- cgit v1.2.1 From 971b6ce109b19231bb0514b45a343ced822dd404 Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Tue, 27 Jan 2015 19:36:48 +0000 Subject: QPID-6339 : Use variable interpolation for help url and initial virtual host config git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655125 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/qpid/server/model/VirtualHostNode.java | 5 +++++ qpid/java/broker-core/src/main/resources/initial-config.json | 2 +- qpid/java/broker-core/src/main/resources/system.properties | 2 +- .../server/management/plugin/HttpManagementConfiguration.java | 4 ++++ .../broker/src/main/java/org/apache/qpid/server/Main.java | 11 ++++++++--- 5 files changed, 19 insertions(+), 5 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostNode.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostNode.java index ce1022c2d9..fa35e725c9 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostNode.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostNode.java @@ -27,6 +27,11 @@ import org.apache.qpid.server.store.DurableConfigurationStore; @ManagedObject(category=true, managesChildren=false) public interface VirtualHostNode> extends ConfiguredObject { + String QPID_INITIAL_CONFIG_VIRTUALHOST_CONFIG_VAR = "qpid.initial_config_virtualhost_config"; + @ManagedContextDefault(name = QPID_INITIAL_CONFIG_VIRTUALHOST_CONFIG_VAR) + String DEFAULT_INITIAL_CONFIG_VIRTUALHOST_CONFIG_VAR = "{ \"type\" : \"DERBY\" }"; + + String VIRTUALHOST_INITIAL_CONFIGURATION = "virtualHostInitialConfiguration"; String VIRTUALHOST_BLUEPRINT_CONTEXT_VAR = "virtualhostBlueprint"; diff --git a/qpid/java/broker-core/src/main/resources/initial-config.json b/qpid/java/broker-core/src/main/resources/initial-config.json index 012cdc9017..12411fc436 100644 --- a/qpid/java/broker-core/src/main/resources/initial-config.json +++ b/qpid/java/broker-core/src/main/resources/initial-config.json @@ -65,7 +65,7 @@ "virtualhostnodes" : [ { "name" : "default", "type" : "JSON", - "virtualHostInitialConfiguration" : "{ \"type\" : \"DERBY\" }" + "virtualHostInitialConfiguration" : "${qpid.initial_config_virtualhost_config}" } ], "plugins" : [ { "type" : "MANAGEMENT-HTTP", diff --git a/qpid/java/broker-core/src/main/resources/system.properties b/qpid/java/broker-core/src/main/resources/system.properties index 6559636f75..661b0cba77 100644 --- a/qpid/java/broker-core/src/main/resources/system.properties +++ b/qpid/java/broker-core/src/main/resources/system.properties @@ -17,4 +17,4 @@ # under the License. # -qpid.helpURL = http://qpid.apache.org/releases/qpid-${project.version}/java-broker/book + diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementConfiguration.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementConfiguration.java index 445ce996ef..018b23daaf 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementConfiguration.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementConfiguration.java @@ -45,6 +45,10 @@ public interface HttpManagementConfiguration propertyNames = new HashSet<>(props.stringPropertyNames()); propertyNames.removeAll(System.getProperties().stringPropertyNames()); - for(String propName : propertyNames) + for (String propName : propertyNames) { System.setProperty(propName, props.getProperty(propName)); } + } private void copyInitialConfigFile(final BrokerOptions options, final File destinationFile) -- cgit v1.2.1 From be30b3ccba38b91f3842a80e83bd483665030aa2 Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Tue, 27 Jan 2015 19:47:49 +0000 Subject: QPID-6339 : Use variable interpolation for help url and initial virtual host config git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655138 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/qpid/common/QpidProperties.java | 26 +++++++++++++--------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java b/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java index cdd44d3443..74219f216e 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java @@ -20,14 +20,14 @@ */ package org.apache.qpid.common; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.io.InputStream; import java.util.Map; import java.util.Properties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * QpidProperties captures the project name, version number, and source code repository revision number from a properties * file which is generated as part of the build process. Normally, the name and version number are pulled from the module @@ -76,10 +76,11 @@ public class QpidProperties /** Holds the source code revision. */ private static String buildVersion = DEFAULT; + private static final Properties properties = new Properties(); + // Loads the values from the version properties file. static { - Properties props = new Properties(); try { @@ -90,12 +91,12 @@ public class QpidProperties } else { - props.load(propertyStream); + properties.load(propertyStream); if (_logger.isDebugEnabled()) { _logger.debug("Dumping QpidProperties"); - for (Map.Entry entry : props.entrySet()) + for (Map.Entry entry : properties.entrySet()) { _logger.debug("Property: " + entry.getKey() + " Value: " + entry.getValue()); } @@ -103,11 +104,11 @@ public class QpidProperties _logger.debug("End of property dump"); } - productName = readPropertyValue(props, PRODUCT_NAME_PROPERTY); - String versionSuffix = (String) props.get(RELEASE_VERSION_SUFFIX); - String version = readPropertyValue(props, RELEASE_VERSION_PROPERTY); + productName = readPropertyValue(properties, PRODUCT_NAME_PROPERTY); + String versionSuffix = (String) properties.get(RELEASE_VERSION_SUFFIX); + String version = readPropertyValue(properties, RELEASE_VERSION_PROPERTY); releaseVersion = versionSuffix == null || "".equals(versionSuffix) ? version : version + ";" + versionSuffix; - buildVersion = readPropertyValue(props, BUILD_VERSION_PROPERTY); + buildVersion = readPropertyValue(properties, BUILD_VERSION_PROPERTY); } } catch (IOException e) @@ -117,6 +118,11 @@ public class QpidProperties } } + public static Properties asProperties() + { + return new Properties(properties); + } + /** * Gets the product name. * -- cgit v1.2.1 From d1b8f6e25ceaa628fd4f1c97847f5fb557032f7f Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Tue, 27 Jan 2015 20:14:14 +0000 Subject: QPID-6340 : Allow defaults for system properties to be overridden from a properties file git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655142 13f79535-47bb-0310-9956-ffa450edef68 --- .../qpid/configuration/ClientProperties.java | 55 ++++++++++++++++++++++ .../qpid/configuration/CommonProperties.java | 54 +++++++++++++++++++++ 2 files changed, 109 insertions(+) (limited to 'qpid/java') diff --git a/qpid/java/common/src/main/java/org/apache/qpid/configuration/ClientProperties.java b/qpid/java/common/src/main/java/org/apache/qpid/configuration/ClientProperties.java index 86f5ddeeed..89e4c3ccdd 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/configuration/ClientProperties.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/configuration/ClientProperties.java @@ -18,6 +18,17 @@ package org.apache.qpid.configuration; +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashSet; +import java.util.Properties; +import java.util.Set; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * This class centralized the Qpid client properties. * @@ -25,6 +36,8 @@ package org.apache.qpid.configuration; */ public class ClientProperties { + private static final Logger LOGGER = LoggerFactory.getLogger(ClientProperties.class); + /** * Currently with Qpid it is not possible to change the client ID. * If one is not specified upon connection construction, an id is generated automatically. @@ -292,6 +305,48 @@ public class ClientProperties */ public static final String QPID_USE_LEGACY_GETQUEUEDEPTH_BEHAVIOUR = "qpid.use_legacy_getqueuedepth_behavior"; + static + { + // force load of common properties + Class commonPropertiesClass = CommonProperties.class; + + Properties props = new Properties(); + String initialProperties = System.getProperty("qpid.client_properties_file"); + URL initialPropertiesLocation = null; + try + { + if (initialProperties == null) + { + initialPropertiesLocation = ClientProperties.class.getClassLoader().getResource("qpid-client.properties"); + } + else + { + initialPropertiesLocation = (new File(initialProperties)).toURI().toURL(); + } + + if (initialPropertiesLocation != null) + { + props.load(initialPropertiesLocation.openStream()); + } + } + catch (MalformedURLException e) + { + LOGGER.warn("Could not open client properties file '"+initialProperties+"'.", e); + } + catch (IOException e) + { + LOGGER.warn("Could not open client properties file '" + initialPropertiesLocation + "'.", e); + } + + Set propertyNames = new HashSet<>(props.stringPropertyNames()); + propertyNames.removeAll(System.getProperties().stringPropertyNames()); + for (String propName : propertyNames) + { + System.setProperty(propName, props.getProperty(propName)); + } + + } + private ClientProperties() { //No instances diff --git a/qpid/java/common/src/main/java/org/apache/qpid/configuration/CommonProperties.java b/qpid/java/common/src/main/java/org/apache/qpid/configuration/CommonProperties.java index 6bae93a1b8..a052a02748 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/configuration/CommonProperties.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/configuration/CommonProperties.java @@ -20,6 +20,19 @@ */ package org.apache.qpid.configuration; +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashSet; +import java.util.Properties; +import java.util.Set; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.qpid.common.QpidProperties; + /** * Centralised record of Qpid common properties. * @@ -27,6 +40,8 @@ package org.apache.qpid.configuration; */ public class CommonProperties { + private static final Logger LOGGER = LoggerFactory.getLogger(CommonProperties.class); + /** * The timeout used by the IO layer for timeouts such as send timeout in IoSender, and the close timeout for IoSender and IoReceiver */ @@ -36,6 +51,45 @@ public class CommonProperties public static final String HANDSHAKE_TIMEOUT_PROP_NAME = "qpid.handshake_timeout"; public static final int HANDSHAKE_TIMEOUT_DEFAULT = 2; + static + { + + Properties props = new Properties(QpidProperties.asProperties()); + String initialProperties = System.getProperty("qpid.common_properties_file"); + URL initialPropertiesLocation = null; + try + { + if (initialProperties == null) + { + initialPropertiesLocation = CommonProperties.class.getClassLoader().getResource("qpid-common.properties"); + } + else + { + initialPropertiesLocation = (new File(initialProperties)).toURI().toURL(); + } + + if (initialPropertiesLocation != null) + { + props.load(initialPropertiesLocation.openStream()); + } + } + catch (MalformedURLException e) + { + LOGGER.warn("Could not open common properties file '"+initialProperties+"'.", e); + } + catch (IOException e) + { + LOGGER.warn("Could not open common properties file '" + initialPropertiesLocation + "'.", e); + } + + Set propertyNames = new HashSet<>(props.stringPropertyNames()); + propertyNames.removeAll(System.getProperties().stringPropertyNames()); + for (String propName : propertyNames) + { + System.setProperty(propName, props.getProperty(propName)); + } + + } private CommonProperties() { -- cgit v1.2.1 From c8fd56202be79d5a1c4bc0c27552072fe6d0b580 Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Tue, 27 Jan 2015 20:39:01 +0000 Subject: QPID-6331 : Allow AMQP 1.0 message content to be evicted to disk git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655154 13f79535-47bb-0310-9956-ffa450edef68 --- .../qpid/server/protocol/v1_0/Message_1_0.java | 46 +++++++++++++++------- 1 file changed, 32 insertions(+), 14 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Message_1_0.java b/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Message_1_0.java index 36796851e0..18f5ba9e2e 100644 --- a/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Message_1_0.java +++ b/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Message_1_0.java @@ -21,23 +21,42 @@ package org.apache.qpid.server.protocol.v1_0; +import java.lang.ref.SoftReference; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; + import org.apache.qpid.server.message.AbstractServerMessageImpl; import org.apache.qpid.server.store.StoredMessage; public class Message_1_0 extends AbstractServerMessageImpl { - private List _fragments; + private volatile SoftReference> _fragmentsRef; private long _arrivalTime; + private final long _size; public Message_1_0(final StoredMessage storedMessage) { super(storedMessage, null); - _fragments = restoreFragments(storedMessage); + final List fragments = restoreFragments(getStoredMessage()); + _fragmentsRef = new SoftReference<>(fragments); + _size = calculateSize(fragments); + } + + private long calculateSize(final List fragments) + { + + long size = 0l; + if(fragments != null) + { + for(ByteBuffer buf : fragments) + { + size += buf.remaining(); + } + } + return size; } private static List restoreFragments(StoredMessage storedMessage) @@ -65,7 +84,8 @@ public class Message_1_0 extends AbstractServerMessageImpl(fragments); + _size = calculateSize(fragments); _arrivalTime = System.currentTimeMillis(); } @@ -94,16 +114,7 @@ public class Message_1_0 extends AbstractServerMessageImpl getFragments() { - return _fragments; + + List fragments = _fragmentsRef.get(); + if(fragments == null) + { + fragments = restoreFragments(getStoredMessage()); + _fragmentsRef = new SoftReference<>(fragments); + } + return fragments; } } -- cgit v1.2.1 From dd4f19afa2a6fa19bb365d9416e824bacdb63b3f Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Tue, 27 Jan 2015 21:17:48 +0000 Subject: QPID-6341 : Enchacements to the meta data model git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655160 13f79535-47bb-0310-9956-ffa450edef68 --- .../server/model/ConfiguredAutomatedAttribute.java | 6 +++ .../server/model/ConfiguredDerivedAttribute.java | 6 +++ .../server/model/ConfiguredObjectAttribute.java | 2 + .../apache/qpid/server/model/DerivedAttribute.java | 2 +- .../apache/qpid/server/model/ManagedAttribute.java | 1 + .../apache/qpid/server/model/ManagedObject.java | 2 + .../rest/ConfiguredObjectToMapConverter.java | 50 +++++++++++------- .../plugin/servlet/rest/MetaDataServlet.java | 13 +++++ .../plugin/servlet/rest/RestServlet.java | 26 ++++++---- .../rest/ConfiguredObjectToMapConverterTest.java | 59 ++++++++++++++++++---- 10 files changed, 129 insertions(+), 38 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredAutomatedAttribute.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredAutomatedAttribute.java index 24a62de61c..f65688fea7 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredAutomatedAttribute.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredAutomatedAttribute.java @@ -123,6 +123,12 @@ public class ConfiguredAutomatedAttribute extend return _annotation.persist(); } + @Override + public boolean isOversized() + { + return _annotation.oversize(); + } + public String getDescription() { return _annotation.description(); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredDerivedAttribute.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredDerivedAttribute.java index 9495c1ff84..9a53553c86 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredDerivedAttribute.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredDerivedAttribute.java @@ -54,6 +54,12 @@ public class ConfiguredDerivedAttribute extends return _annotation.persist(); } + @Override + public boolean isOversized() + { + return _annotation.oversize(); + } + public String getDescription() { return _annotation.description(); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectAttribute.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectAttribute.java index 1d1c736cd3..f03a036191 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectAttribute.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectAttribute.java @@ -43,6 +43,8 @@ public abstract class ConfiguredObjectAttribute e public abstract boolean isPersisted(); + public abstract boolean isOversized(); + public abstract String getDescription(); public T convert(final Object value, C object) diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/DerivedAttribute.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/DerivedAttribute.java index 57fc5b365e..e5c17a17e4 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/DerivedAttribute.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/DerivedAttribute.java @@ -31,5 +31,5 @@ public @interface DerivedAttribute boolean secure() default false; boolean persist() default false; String description() default ""; - + boolean oversize() default false; } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java index d8b36f487c..75c349d9c0 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java @@ -35,4 +35,5 @@ public @interface ManagedAttribute String defaultValue() default ""; String description() default ""; String[] validValues() default {}; + boolean oversize() default false; } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedObject.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedObject.java index 483ddd478d..66a5508ec6 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedObject.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedObject.java @@ -37,4 +37,6 @@ public @interface ManagedObject String type() default ""; String validChildTypes() default ""; boolean register() default true; + String description() default ""; + boolean deprecated() default false; } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java index 7d86bd3c8c..24fb272186 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java @@ -50,27 +50,20 @@ public class ConfiguredObjectToMapConverter ConfiguredObject.LAST_UPDATED_BY, ConfiguredObject.LAST_UPDATED_TIME)); - public Map convertObjectToMap(final ConfiguredObject confObject, - Class clazz, - int depth, - final boolean useActualValues, - final boolean includeSystemContext, - final boolean extractAsConfig) - { - return convertObjectToMap(confObject, clazz, depth, useActualValues, false, includeSystemContext, extractAsConfig); - } - public Map convertObjectToMap(final ConfiguredObject confObject, Class clazz, int depth, final boolean useActualValues, final boolean inheritedActuals, final boolean includeSystemContext, - final boolean extractAsConfig) + final boolean extractAsConfig, + final int oversizeThreshold + ) { Map object = new LinkedHashMap<>(); - incorporateAttributesIntoMap(confObject, object, useActualValues, inheritedActuals, includeSystemContext, extractAsConfig); + incorporateAttributesIntoMap(confObject, object, useActualValues, inheritedActuals, includeSystemContext, + extractAsConfig, oversizeThreshold); if(!extractAsConfig) { incorporateStatisticsIntoMap(confObject, object); @@ -78,7 +71,8 @@ public class ConfiguredObjectToMapConverter if(depth > 0) { - incorporateChildrenIntoMap(confObject, clazz, depth, object, useActualValues, inheritedActuals, includeSystemContext, extractAsConfig); + incorporateChildrenIntoMap(confObject, clazz, depth, object, useActualValues, inheritedActuals, + includeSystemContext, extractAsConfig, oversizeThreshold); } return object; } @@ -90,7 +84,8 @@ public class ConfiguredObjectToMapConverter final boolean useActualValues, final boolean inheritedActuals, final boolean includeSystemContext, - final boolean extractAsConfig) + final boolean extractAsConfig, + final int oversizeThreshold) { // if extracting as config add a fake attribute for each secondary parent if(extractAsConfig && confObject.getModel().getParentTypes(confObject.getCategoryClass()).size()>1) @@ -160,7 +155,26 @@ public class ConfiguredObjectToMapConverter } else if (value != null) { - object.put(name, value); + ConfiguredObjectAttribute attribute = confObject.getModel() + .getTypeRegistry() + .getAttributeTypes(confObject.getClass()) + .get(name); + if(attribute.isOversized() && !extractAsConfig) + { + String valueString = String.valueOf(value); + if(valueString.length() > oversizeThreshold) + { + object.put(name, String.valueOf(value).substring(0,oversizeThreshold-4) + "..."); + } + else + { + object.put(name, value); + } + } + else + { + object.put(name, value); + } } else if (extractAsConfig) { @@ -220,7 +234,8 @@ public class ConfiguredObjectToMapConverter final boolean useActualValues, final boolean inheritedActuals, final boolean includeSystemContext, - final boolean extractAsConfig) + final boolean extractAsConfig, + final int oversizeThreshold) { List> childTypes = new ArrayList<>(confObject.getModel().getChildTypes(clazz)); @@ -262,7 +277,8 @@ public class ConfiguredObjectToMapConverter useActualValues, inheritedActuals, includeSystemContext, - extractAsConfig)); + extractAsConfig, + oversizeThreshold)); } } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java index 01dd873aa5..9b384cd36f 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java @@ -43,6 +43,7 @@ import org.apache.qpid.server.model.ConfiguredAutomatedAttribute; import org.apache.qpid.server.model.ConfiguredObject; import org.apache.qpid.server.model.ConfiguredObjectAttribute; import org.apache.qpid.server.model.ConfiguredObjectTypeRegistry; +import org.apache.qpid.server.model.ManagedObject; import org.apache.qpid.server.model.Model; public class MetaDataServlet extends AbstractServlet @@ -103,6 +104,18 @@ public class MetaDataServlet extends AbstractServlet typeDetails.put("attributes", processAttributes(type)); typeDetails.put("managedInterfaces", getManagedInterfaces(type)); typeDetails.put("validChildTypes", getValidChildTypes(type)); + ManagedObject annotation = type.getAnnotation(ManagedObject.class); + if(annotation != null) + { + if(annotation.deprecated()) + { + typeDetails.put("deprecated",true); + } + if(!"".equals(annotation.description() ) ) + { + typeDetails.put("description", annotation.description()); + } + } return typeDetails; } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java index 71ec6e786f..1ed0741a8e 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java @@ -56,6 +56,7 @@ public class RestServlet extends AbstractServlet private static final String HIERARCHY_INIT_PARAMETER = "hierarchy"; public static final String DEPTH_PARAM = "depth"; + public static final String OVERSIZE_PARAM = "oversize"; public static final String ACTUALS_PARAM = "actuals"; public static final String SORT_PARAM = "sort"; public static final String INCLUDE_SYS_CONTEXT_PARAM = "includeSysContext"; @@ -71,6 +72,7 @@ public class RestServlet extends AbstractServlet public static final Set RESERVED_PARAMS = new HashSet<>(Arrays.asList(DEPTH_PARAM, SORT_PARAM, + OVERSIZE_PARAM, ACTUALS_PARAM, INCLUDE_SYS_CONTEXT_PARAM, EXTRACT_INITIAL_CONFIG_PARAM, @@ -345,17 +347,20 @@ public class RestServlet extends AbstractServlet boolean actuals; boolean includeSystemContext; boolean inheritedActuals; + int oversizeThreshold; if(extractInitialConfig) { depth = Integer.MAX_VALUE; + oversizeThreshold = Integer.MAX_VALUE; actuals = true; includeSystemContext = false; inheritedActuals = false; } else { - depth = getDepthParameterFromRequest(request); + depth = getIntParameterFromRequest(request, DEPTH_PARAM, 1); + oversizeThreshold = getIntParameterFromRequest(request, OVERSIZE_PARAM, 120); actuals = getBooleanParameterFromRequest(request, ACTUALS_PARAM); includeSystemContext = getBooleanParameterFromRequest(request, INCLUDE_SYS_CONTEXT_PARAM); inheritedActuals = getBooleanParameterFromRequest(request, INHERITED_ACTUALS_PARAM); @@ -364,8 +369,9 @@ public class RestServlet extends AbstractServlet List> output = new ArrayList<>(); for(ConfiguredObject configuredObject : allObjects) { + output.add(_objectConverter.convertObjectToMap(configuredObject, getConfiguredClass(), - depth, actuals, inheritedActuals, includeSystemContext, extractInitialConfig)); + depth, actuals, inheritedActuals, includeSystemContext, extractInitialConfig, oversizeThreshold)); } @@ -679,22 +685,24 @@ public class RestServlet extends AbstractServlet response.setDateHeader ("Expires", 0); } - private int getDepthParameterFromRequest(HttpServletRequest request) + private int getIntParameterFromRequest(final HttpServletRequest request, + final String paramName, + final int defaultValue) { - int depth = 1; - final String depthString = request.getParameter(DEPTH_PARAM); - if(depthString!=null) + int intValue = defaultValue; + final String stringValue = request.getParameter(paramName); + if(stringValue!=null) { try { - depth = Integer.parseInt(depthString); + intValue = Integer.parseInt(stringValue); } catch (NumberFormatException e) { - LOGGER.warn("Could not parse " + depthString + " as integer"); + LOGGER.warn("Could not parse " + stringValue + " as integer for parameter " + paramName); } } - return depth; + return intValue; } private boolean getBooleanParameterFromRequest(HttpServletRequest request, final String paramName) diff --git a/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java index ac595154bb..f22135ef61 100644 --- a/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java +++ b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java @@ -57,8 +57,14 @@ public class ConfiguredObjectToMapConverterTest extends TestCase when(_configuredObject.getStatistics()).thenReturn(Collections.singletonMap(statisticName, (Number) statisticValue)); - Map resultMap = _converter.convertObjectToMap(_configuredObject, ConfiguredObject.class, 0, - false, false, false); + Map resultMap = _converter.convertObjectToMap(_configuredObject, + ConfiguredObject.class, + 0, + false, + false, + false, + false, + 120); Map statsAsMap = (Map) resultMap.get(STATISTICS_MAP_KEY); assertNotNull("Statistics should be part of map", statsAsMap); assertEquals("Unexpected number of statistics", 1, statsAsMap.size()); @@ -71,8 +77,14 @@ public class ConfiguredObjectToMapConverterTest extends TestCase final String attributeValue = "value"; configureMockToReturnOneAttribute(_configuredObject, attributeName, attributeValue); - Map resultMap = _converter.convertObjectToMap(_configuredObject, ConfiguredObject.class, 0, - false, false, false); + Map resultMap = _converter.convertObjectToMap(_configuredObject, + ConfiguredObject.class, + 0, + false, + false, + false, + false, + 120); assertEquals("Unexpected number of attributes", 1, resultMap.size()); assertEquals("Unexpected attribute value", attributeValue, resultMap.get(attributeName)); } @@ -89,8 +101,14 @@ public class ConfiguredObjectToMapConverterTest extends TestCase configureMockToReturnOneAttribute(_configuredObject, attributeName, attributeValue); - Map resultMap = _converter.convertObjectToMap(_configuredObject, ConfiguredObject.class, 0, - false, false, false); + Map resultMap = _converter.convertObjectToMap(_configuredObject, + ConfiguredObject.class, + 0, + false, + false, + false, + false, + 120); assertEquals("Unexpected number of attributes", 1, resultMap.size()); assertEquals("Unexpected attribute value", "attributeConfiguredObjectName", resultMap.get(attributeName)); } @@ -108,8 +126,14 @@ public class ConfiguredObjectToMapConverterTest extends TestCase configureMockToReturnOneAttribute(mockChild, childAttributeName, childAttributeValue); when(_configuredObject.getChildren(TestChild.class)).thenReturn(Arrays.asList(mockChild)); - Map resultMap = _converter.convertObjectToMap(_configuredObject, ConfiguredObject.class, 1, - false, false, false); + Map resultMap = _converter.convertObjectToMap(_configuredObject, + ConfiguredObject.class, + 1, + false, + false, + false, + false, + 120); assertEquals("Unexpected parent map size", 1, resultMap.size()); final List> childList = (List>) resultMap.get("testchilds"); @@ -146,8 +170,14 @@ public class ConfiguredObjectToMapConverterTest extends TestCase when(_configuredObject.getChildren(TestChild.class)).thenReturn(Arrays.asList(mockChild)); - Map resultMap = _converter.convertObjectToMap(_configuredObject, ConfiguredObject.class, 1, true, - false, false); + Map resultMap = _converter.convertObjectToMap(_configuredObject, + ConfiguredObject.class, + 1, + true, + false, + false, + false, + 120); assertEquals("Unexpected parent map size", 2, resultMap.size()); assertEquals("Incorrect context", resultMap.get(ConfiguredObject.CONTEXT), actualContext); List> childList = (List>) resultMap.get("testchilds"); @@ -158,7 +188,14 @@ public class ConfiguredObjectToMapConverterTest extends TestCase assertEquals("Unexpected child attribute value", childActualAttributeValue, childMap.get(childAttributeName)); - resultMap = _converter.convertObjectToMap(_configuredObject, ConfiguredObject.class, 1, false, false, false); + resultMap = _converter.convertObjectToMap(_configuredObject, + ConfiguredObject.class, + 1, + false, + false, + false, + false, + 120); assertEquals("Unexpected parent map size", 2, resultMap.size()); Map inheritedContext = new HashMap<>(); inheritedContext.put("key","value"); -- cgit v1.2.1 From 5adf702b6e2c66ad0f7098ed53fcbc7dd568b2d2 Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Tue, 27 Jan 2015 22:23:04 +0000 Subject: QPID-6341 : Fix test git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655180 13f79535-47bb-0310-9956-ffa450edef68 --- .../servlet/rest/ConfiguredObjectToMapConverterTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'qpid/java') diff --git a/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java index f22135ef61..8687330d49 100644 --- a/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java +++ b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java @@ -20,6 +20,7 @@ package org.apache.qpid.server.management.plugin.servlet.rest; import static org.apache.qpid.server.management.plugin.servlet.rest.ConfiguredObjectToMapConverter.STATISTICS_MAP_KEY; +import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; @@ -37,6 +38,8 @@ import java.util.Set; import junit.framework.TestCase; import org.apache.qpid.server.model.ConfiguredObject; +import org.apache.qpid.server.model.ConfiguredObjectAttribute; +import org.apache.qpid.server.model.ConfiguredObjectTypeRegistry; import org.apache.qpid.server.model.Model; public class ConfiguredObjectToMapConverterTest extends TestCase @@ -75,6 +78,8 @@ public class ConfiguredObjectToMapConverterTest extends TestCase { final String attributeName = "attribute"; final String attributeValue = "value"; + Model model = createTestModel(); + when(_configuredObject.getModel()).thenReturn(model); configureMockToReturnOneAttribute(_configuredObject, attributeName, attributeValue); Map resultMap = _converter.convertObjectToMap(_configuredObject, @@ -217,6 +222,11 @@ public class ConfiguredObjectToMapConverterTest extends TestCase final List> list = new ArrayList>(); list.add(TestChild.class); when(model.getChildTypes(ConfiguredObject.class)).thenReturn(list); + final ConfiguredObjectTypeRegistry typeRegistry = mock(ConfiguredObjectTypeRegistry.class); + final Map> attrTypes = mock(Map.class); + when(attrTypes.get(any(String.class))).thenReturn(mock(ConfiguredObjectAttribute.class)); + when(typeRegistry.getAttributeTypes(any(Class.class))).thenReturn(attrTypes); + when(model.getTypeRegistry()).thenReturn(typeRegistry); return model; } -- cgit v1.2.1 From 60089dfd1a12303822b3f82816905f0a29a6a746 Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Tue, 27 Jan 2015 22:59:46 +0000 Subject: QPID-6342 : Fail fast when commands sent in wrong order git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655186 13f79535-47bb-0310-9956-ffa450edef68 --- .../server/protocol/v0_8/AMQProtocolEngine.java | 45 +++++++++++++-- .../protocol/v0_8/InternalTestProtocolSession.java | 6 ++ .../java/org/apache/qpid/codec/ServerDecoder.java | 64 +++++++++++----------- 3 files changed, 79 insertions(+), 36 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java b/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java index 4212505d75..3783cd70ac 100644 --- a/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java +++ b/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java @@ -96,6 +96,16 @@ public class AMQProtocolEngine implements ServerProtocolEngine, AMQConnectionModel, ServerMethodProcessor { + enum ConnectionState + { + INIT, + AWAIT_START_OK, + AWAIT_SECURE_OK, + AWAIT_TUNE_OK, + AWAIT_OPEN, + OPEN + } + private static final Logger _logger = Logger.getLogger(AMQProtocolEngine.class); // to save boxing the channelId and looking up in a map... cache in an array the low numbered @@ -123,6 +133,8 @@ public class AMQProtocolEngine implements ServerProtocolEngine, private final AMQChannel[] _cachedChannels = new AMQChannel[CHANNEL_CACHE_SIZE + 1]; + private ConnectionState _state = ConnectionState.INIT; + /** * The channels that the latest call to {@link #received(ByteBuffer)} applied to. * Used so we know which channels we need to call {@link AMQChannel#receivedComplete()} @@ -469,16 +481,15 @@ public class AMQProtocolEngine implements ServerProtocolEngine, serverProperties, mechanisms.getBytes(), locales.getBytes()); - _sender.send(asByteBuffer(responseBody.generateFrame(0))); - _sender.flush(); + writeFrame(responseBody.generateFrame(0)); + _state = ConnectionState.AWAIT_START_OK; } catch (AMQException e) { _logger.info("Received unsupported protocol initiation for protocol version: " + getProtocolVersion()); - _sender.send(asByteBuffer(new ProtocolInitiation(ProtocolVersion.getLatestSupportedVersion()))); - _sender.flush(); + writeFrame(new ProtocolInitiation(ProtocolVersion.getLatestSupportedVersion())); } } @@ -1467,6 +1478,7 @@ public class AMQProtocolEngine implements ServerProtocolEngine, { _logger.debug("RECV[" + channelId + "] ChannelOpen"); } + assertState(ConnectionState.OPEN); // Protect the broker against out of order frame request. if (_virtualHost == null) @@ -1503,6 +1515,15 @@ public class AMQProtocolEngine implements ServerProtocolEngine, } } + void assertState(final ConnectionState requiredState) + { + if(_state != requiredState) + { + closeConnection(AMQConstant.COMMAND_INVALID, "Command Invalid", 0); + + } + } + @Override public void receiveConnectionOpen(AMQShortString virtualHostName, AMQShortString capabilities, @@ -1555,6 +1576,7 @@ public class AMQProtocolEngine implements ServerProtocolEngine, AMQMethodBody responseBody = methodRegistry.createConnectionOpenOkBody(virtualHostName); writeFrame(responseBody.generateFrame(0)); + _state = ConnectionState.OPEN; } catch (AccessControlException e) { @@ -1625,6 +1647,8 @@ public class AMQProtocolEngine implements ServerProtocolEngine, _logger.debug("RECV ConnectionSecureOk[ response: ******** ] "); } + assertState(ConnectionState.AWAIT_SECURE_OK); + Broker broker = getBroker(); SubjectCreator subjectCreator = getSubjectCreator(); @@ -1665,6 +1689,7 @@ public class AMQProtocolEngine implements ServerProtocolEngine, frameMax, broker.getConnection_heartBeatDelay()); writeFrame(tuneBody.generateFrame(0)); + _state = ConnectionState.AWAIT_TUNE_OK; setAuthorizedSubject(authResult.getSubject()); disposeSaslServer(); break; @@ -1713,6 +1738,8 @@ public class AMQProtocolEngine implements ServerProtocolEngine, + " ]"); } + assertState(ConnectionState.AWAIT_START_OK); + Broker broker = getBroker(); _logger.info("SASL Mechanism selected: " + mechanism); @@ -1774,11 +1801,14 @@ public class AMQProtocolEngine implements ServerProtocolEngine, frameMax, broker.getConnection_heartBeatDelay()); writeFrame(tuneBody.generateFrame(0)); + _state = ConnectionState.AWAIT_TUNE_OK; break; case CONTINUE: ConnectionSecureBody secureBody = methodRegistry.createConnectionSecureBody(authResult.getChallenge()); writeFrame(secureBody.generateFrame(0)); + + _state = ConnectionState.AWAIT_SECURE_OK; } } } @@ -1797,6 +1827,8 @@ public class AMQProtocolEngine implements ServerProtocolEngine, _logger.debug("RECV ConnectionTuneOk[" +" channelMax: " + channelMax + " frameMax: " + frameMax + " heartbeat: " + heartbeat + " ]"); } + assertState(ConnectionState.AWAIT_TUNE_OK); + initHeartbeats(heartbeat); int brokerFrameMax = getBroker().getContextValue(Integer.class, Broker.BROKER_FRAME_SIZE); @@ -1828,7 +1860,10 @@ public class AMQProtocolEngine implements ServerProtocolEngine, setMaximumNumberOfChannels( ((channelMax == 0l) || (channelMax > 0xFFFFL)) ? 0xFFFFL : channelMax); + } + _state = ConnectionState.AWAIT_OPEN; + } public int getBinaryDataLimit() @@ -1928,6 +1963,8 @@ public class AMQProtocolEngine implements ServerProtocolEngine, @Override public ServerChannelMethodProcessor getChannelMethodProcessor(final int channelId) { + assertState(ConnectionState.OPEN); + ServerChannelMethodProcessor channelMethodProcessor = getChannel(channelId); if(channelMethodProcessor == null) { diff --git a/qpid/java/broker-plugins/amqp-0-8-protocol/src/test/java/org/apache/qpid/server/protocol/v0_8/InternalTestProtocolSession.java b/qpid/java/broker-plugins/amqp-0-8-protocol/src/test/java/org/apache/qpid/server/protocol/v0_8/InternalTestProtocolSession.java index 7407890b58..6c6b746cf2 100644 --- a/qpid/java/broker-plugins/amqp-0-8-protocol/src/test/java/org/apache/qpid/server/protocol/v0_8/InternalTestProtocolSession.java +++ b/qpid/java/broker-plugins/amqp-0-8-protocol/src/test/java/org/apache/qpid/server/protocol/v0_8/InternalTestProtocolSession.java @@ -275,6 +275,12 @@ public class InternalTestProtocolSession extends AMQProtocolEngine implements Pr } } + void assertState(final ConnectionState requiredState) + { + // no-op + } + + private static final AtomicInteger portNumber = new AtomicInteger(0); private static class TestNetworkConnection implements NetworkConnection diff --git a/qpid/java/common/src/main/java/org/apache/qpid/codec/ServerDecoder.java b/qpid/java/common/src/main/java/org/apache/qpid/codec/ServerDecoder.java index 32a45da60c..deed32346f 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/codec/ServerDecoder.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/codec/ServerDecoder.java @@ -42,7 +42,6 @@ public class ServerDecoder extends AMQDecoder methodProcessor = getMethodProcessor(); - ServerChannelMethodProcessor channelMethodProcessor = methodProcessor.getChannelMethodProcessor(channelId); final int classAndMethod = in.readInt(); int classId = classAndMethod >> 16; int methodId = classAndMethod & 0xFFFF; @@ -115,116 +114,117 @@ public class ServerDecoder extends AMQDecoder Date: Wed, 28 Jan 2015 09:14:20 +0000 Subject: QPID-6343: [Java Broker] Upgrade Apache Derby dependency to 10.11.1.1 git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655244 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/java/pom.xml | 1 + 1 file changed, 1 insertion(+) (limited to 'qpid/java') diff --git a/qpid/java/pom.xml b/qpid/java/pom.xml index 6e0cde4434..2ef2223177 100644 --- a/qpid/java/pom.xml +++ b/qpid/java/pom.xml @@ -74,6 +74,7 @@ $ @ 5.0.104 + 10.11.1.1 -- cgit v1.2.1 From 8aee348935e03db6b183a04a0a4525f4b2a9b7de Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Wed, 28 Jan 2015 20:34:16 +0000 Subject: QPID-6345 : Allow enabled cipher suites to be configured git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655457 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/qpid/server/model/Port.java | 12 +++ .../qpid/server/model/port/AbstractPort.java | 18 ++++ .../protocol/MultiVersionProtocolEngine.java | 1 + .../qpid/server/transport/TCPandSSLTransport.java | 20 ++++- .../server/management/plugin/HttpManagement.java | 11 +++ .../qpid/server/jmx/JMXManagedObjectRegistry.java | 2 +- .../server/jmx/QpidSslRMIServerSocketFactory.java | 13 ++- .../transport/NetworkTransportConfiguration.java | 11 ++- .../transport/network/io/IoNetworkTransport.java | 1 + .../transport/network/security/ssl/SSLUtil.java | 97 ++++++++++++++++++---- 10 files changed, 162 insertions(+), 24 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java index 24528b9a4e..7318a58640 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java @@ -60,6 +60,18 @@ public interface Port> extends ConfiguredObject @ManagedAttribute Collection getTrustStores(); + @ManagedContextDefault(name = "qpid.port.enabledCipherSuites" ) + String DEFAULT_ENABLED_CIPHER_SUITES="[]"; + + @ManagedAttribute( defaultValue = "${qpid.port.enabledCipherSuites}") + Collection getEnabledCipherSuites(); + + @ManagedContextDefault(name = "qpid.port.disabledCipherSuites" ) + String DEFAULT_DISABLED_CIPHER_SUITES="[]"; + + @ManagedAttribute( defaultValue = "${qpid.port.disabledCipherSuites}") + Collection getDisabledCipherSuites(); + Collection getConnections(); void start(); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java index 6d8e65cd17..21827ffe58 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java @@ -66,6 +66,12 @@ abstract public class AbstractPort> extends AbstractCo @ManagedAttributeField private Set _protocols; + @ManagedAttributeField + private Collection _enabledCipherSuites; + + @ManagedAttributeField + private Collection _disabledCipherSuites; + public AbstractPort(Map attributes, Broker broker) { @@ -277,6 +283,18 @@ abstract public class AbstractPort> extends AbstractCo } } + @Override + public Collection getEnabledCipherSuites() + { + return _enabledCipherSuites; + } + + @Override + public Collection getDisabledCipherSuites() + { + return _disabledCipherSuites; + } + @Override public KeyStore getKeyStore() { diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngine.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngine.java index dd5e01ebc5..49c0812f4a 100755 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngine.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngine.java @@ -502,6 +502,7 @@ public class MultiVersionProtocolEngine implements ServerProtocolEngine _engine = _sslContext.createSSLEngine(); _engine.setUseClientMode(false); SSLUtil.removeSSLv3Support(_engine); + SSLUtil.updateEnabledCipherSuites(_engine, _port.getEnabledCipherSuites(), _port.getDisabledCipherSuites()); if(_needClientAuth) { diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/transport/TCPandSSLTransport.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/transport/TCPandSSLTransport.java index b1f6b84b72..8f7a267771 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/transport/TCPandSSLTransport.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/transport/TCPandSSLTransport.java @@ -23,12 +23,12 @@ package org.apache.qpid.server.transport; import static org.apache.qpid.transport.ConnectionSettings.WILDCARD_ADDRESS; import java.net.InetSocketAddress; +import java.util.Collection; import java.util.Set; import javax.net.ssl.SSLContext; import org.apache.qpid.server.model.Broker; -import org.apache.qpid.server.model.Port; import org.apache.qpid.server.model.Protocol; import org.apache.qpid.server.model.Transport; import org.apache.qpid.server.model.port.AmqpPort; @@ -114,6 +114,18 @@ class TCPandSSLTransport implements AcceptingTransport return _port.getWantClientAuth(); } + @Override + public Collection getEnabledCipherSuites() + { + return _port.getEnabledCipherSuites(); + } + + @Override + public Collection getDisabledCipherSuites() + { + return _port.getDisabledCipherSuites(); + } + @Override public boolean needClientAuth() { @@ -121,19 +133,19 @@ class TCPandSSLTransport implements AcceptingTransport } @Override - public Boolean getTcpNoDelay() + public boolean getTcpNoDelay() { return _port.isTcpNoDelay(); } @Override - public Integer getSendBufferSize() + public int getSendBufferSize() { return _port.getSendBufferSize(); } @Override - public Integer getReceiveBufferSize() + public int getReceiveBufferSize() { return _port.getReceiveBufferSize(); } 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 7b3e06f7fe..75f4e59242 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 @@ -352,6 +352,17 @@ public class HttpManagement extends AbstractPluginAdapter implem } SslContextFactory factory = new SslContextFactory(); factory.addExcludeProtocols(SSLUtil.SSLV3_PROTOCOL); + + if(port.getDisabledCipherSuites() != null) + { + factory.addExcludeCipherSuites(port.getDisabledCipherSuites().toArray(new String[port.getDisabledCipherSuites().size()])); + } + + if(port.getEnabledCipherSuites() != null && !port.getEnabledCipherSuites().isEmpty()) + { + factory.setIncludeCipherSuites(port.getEnabledCipherSuites().toArray(new String[port.getEnabledCipherSuites().size()])); + } + boolean needClientCert = port.getNeedClientAuth() || port.getWantClientAuth(); if (needClientCert && trustStores.isEmpty()) diff --git a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java index 78eba66158..8fc1ea1d8e 100644 --- a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java +++ b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java @@ -146,7 +146,7 @@ public class JMXManagedObjectRegistry implements ManagedObjectRegistry //create the SSL RMI socket factories csf = new SslRMIClientSocketFactory(); - ssf = new QpidSslRMIServerSocketFactory(sslContext); + ssf = new QpidSslRMIServerSocketFactory(sslContext,_connectorPort.getEnabledCipherSuites(), _connectorPort.getDisabledCipherSuites()); } else { diff --git a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/QpidSslRMIServerSocketFactory.java b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/QpidSslRMIServerSocketFactory.java index 5c15a40427..8af9d87672 100644 --- a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/QpidSslRMIServerSocketFactory.java +++ b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/QpidSslRMIServerSocketFactory.java @@ -24,6 +24,7 @@ import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; +import java.util.Collection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; @@ -35,6 +36,8 @@ import org.apache.qpid.transport.network.security.ssl.SSLUtil; public class QpidSslRMIServerSocketFactory extends SslRMIServerSocketFactory { private final SSLContext _sslContext; + private final Collection _enabledCipherSuites; + private final Collection _disabledCipherSuites; /** * SslRMIServerSocketFactory which creates the ServerSocket using the @@ -43,9 +46,12 @@ public class QpidSslRMIServerSocketFactory extends SslRMIServerSocketFactory * key store. * * @param sslContext previously created sslContext using the desired key store. - * @throws NullPointerException if the provided {@link SSLContext} is null. + * @param enabledCipherSuites + *@param disabledCipherSuites @throws NullPointerException if the provided {@link SSLContext} is null. */ - public QpidSslRMIServerSocketFactory(SSLContext sslContext) throws NullPointerException + public QpidSslRMIServerSocketFactory(SSLContext sslContext, + final Collection enabledCipherSuites, + final Collection disabledCipherSuites) throws NullPointerException { super(); @@ -55,6 +61,8 @@ public class QpidSslRMIServerSocketFactory extends SslRMIServerSocketFactory } _sslContext = sslContext; + _enabledCipherSuites = enabledCipherSuites; + _disabledCipherSuites = disabledCipherSuites; //TODO: settings + implementation for SSL client auth, updating equals and hashCode appropriately. } @@ -77,6 +85,7 @@ public class QpidSslRMIServerSocketFactory extends SslRMIServerSocketFactory true); sslSocket.setUseClientMode(false); SSLUtil.removeSSLv3Support(sslSocket); + SSLUtil.updateEnabledCipherSuites(sslSocket, _enabledCipherSuites, _disabledCipherSuites); return sslSocket; } }; diff --git a/qpid/java/common/src/main/java/org/apache/qpid/transport/NetworkTransportConfiguration.java b/qpid/java/common/src/main/java/org/apache/qpid/transport/NetworkTransportConfiguration.java index 12f8d801dc..7af3b7af39 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/transport/NetworkTransportConfiguration.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/transport/NetworkTransportConfiguration.java @@ -21,6 +21,7 @@ package org.apache.qpid.transport; import java.net.InetSocketAddress; +import java.util.Collection; /** * This interface provides a means for NetworkDrivers to configure TCP options such as incoming and outgoing @@ -30,17 +31,21 @@ import java.net.InetSocketAddress; public interface NetworkTransportConfiguration { // Taken from Socket - Boolean getTcpNoDelay(); + boolean getTcpNoDelay(); // The amount of memory in bytes to allocate to the incoming buffer - Integer getReceiveBufferSize(); + int getReceiveBufferSize(); // The amount of memory in bytes to allocate to the outgoing buffer - Integer getSendBufferSize(); + int getSendBufferSize(); InetSocketAddress getAddress(); boolean needClientAuth(); boolean wantClientAuth(); + + Collection getEnabledCipherSuites(); + + Collection getDisabledCipherSuites(); } diff --git a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoNetworkTransport.java b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoNetworkTransport.java index e5bc9fa977..b7998ab8d9 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoNetworkTransport.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoNetworkTransport.java @@ -190,6 +190,7 @@ public class IoNetworkTransport implements OutgoingNetworkTransport, IncomingNet SSLServerSocket sslServerSocket = (SSLServerSocket) _serverSocket; SSLUtil.removeSSLv3Support(sslServerSocket); + SSLUtil.updateEnabledCipherSuites(sslServerSocket, config.getEnabledCipherSuites(), config.getDisabledCipherSuites()); if(config.needClientAuth()) { diff --git a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLUtil.java b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLUtil.java index b6ae2ab4a3..67dde84440 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLUtil.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLUtil.java @@ -24,6 +24,9 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; import java.net.URL; import java.security.GeneralSecurityException; import java.security.KeyStore; @@ -33,7 +36,10 @@ import java.security.cert.CertificateParsingException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; @@ -266,7 +272,35 @@ public class SSLUtil return ks; } - public static void removeSSLv3Support(final SSLEngine engine) + private static interface SSLEntity + { + String[] getEnabledCipherSuites(); + + void setEnabledCipherSuites(String[] strings); + + String[] getEnabledProtocols(); + + void setEnabledProtocols(String[] protocols); + + String[] getSupportedCipherSuites(); + + String[] getSupportedProtocols(); + } + + private static SSLEntity asSSLEntity(final Object object, final Class clazz) + { + return (SSLEntity) Proxy.newProxyInstance(SSLEntity.class.getClassLoader(), new Class[] { SSLEntity.class }, new InvocationHandler() + { + @Override + public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable + { + Method delegateMethod = clazz.getMethod(method.getName(), method.getParameterTypes()); + return delegateMethod.invoke(object, args); + } + }) ; + } + + private static void removeSSLv3Support(final SSLEntity engine) { List enabledProtocols = Arrays.asList(engine.getEnabledProtocols()); if(enabledProtocols.contains(SSLV3_PROTOCOL)) @@ -277,26 +311,61 @@ public class SSLUtil } } - public static void removeSSLv3Support(final SSLSocket socket) + public static void removeSSLv3Support(final SSLEngine engine) { - List enabledProtocols = Arrays.asList(socket.getEnabledProtocols()); - if(enabledProtocols.contains(SSLV3_PROTOCOL)) - { - List allowedProtocols = new ArrayList<>(enabledProtocols); - allowedProtocols.remove(SSLV3_PROTOCOL); - socket.setEnabledProtocols(allowedProtocols.toArray(new String[allowedProtocols.size()])); - } + removeSSLv3Support(asSSLEntity(engine, SSLEngine.class)); } + public static void removeSSLv3Support(final SSLSocket socket) + { + removeSSLv3Support(asSSLEntity(socket, SSLSocket.class)); + } public static void removeSSLv3Support(final SSLServerSocket socket) { - List enabledProtocols = Arrays.asList(socket.getEnabledProtocols()); - if(enabledProtocols.contains(SSLV3_PROTOCOL)) + removeSSLv3Support(asSSLEntity(socket, SSLServerSocket.class)); + } + + private static void updateEnabledCipherSuites(final SSLEntity entity, + final Collection enabledCipherSuites, + final Collection disabledCipherSuites) + { + if(enabledCipherSuites != null && !enabledCipherSuites.isEmpty()) { - List allowedProtocols = new ArrayList<>(enabledProtocols); - allowedProtocols.remove(SSLV3_PROTOCOL); - socket.setEnabledProtocols(allowedProtocols.toArray(new String[allowedProtocols.size()])); + final Set supportedSuites = + new HashSet<>(Arrays.asList(entity.getSupportedCipherSuites())); + supportedSuites.retainAll(enabledCipherSuites); + entity.setEnabledCipherSuites(supportedSuites.toArray(new String[supportedSuites.size()])); + } + + if(disabledCipherSuites != null && !disabledCipherSuites.isEmpty()) + { + final Set enabledSuites = new HashSet<>(Arrays.asList(entity.getEnabledCipherSuites())); + enabledSuites.removeAll(disabledCipherSuites); + entity.setEnabledCipherSuites(enabledSuites.toArray(new String[enabledSuites.size()])); } + + } + + + public static void updateEnabledCipherSuites(final SSLEngine engine, + final Collection enabledCipherSuites, + final Collection disabledCipherSuites) + { + updateEnabledCipherSuites(asSSLEntity(engine, SSLEngine.class), enabledCipherSuites, disabledCipherSuites); + } + + public static void updateEnabledCipherSuites(final SSLServerSocket socket, + final Collection enabledCipherSuites, + final Collection disabledCipherSuites) + { + updateEnabledCipherSuites(asSSLEntity(socket, SSLServerSocket.class), enabledCipherSuites, disabledCipherSuites); + } + + public static void updateEnabledCipherSuites(final SSLSocket socket, + final Collection enabledCipherSuites, + final Collection disabledCipherSuites) + { + updateEnabledCipherSuites(asSSLEntity(socket, SSLSocket.class), enabledCipherSuites, disabledCipherSuites); } } -- cgit v1.2.1 From e860a568e040c2b6a1ebfd6035cc77fdc3933473 Mon Sep 17 00:00:00 2001 From: Keith Wall Date: Wed, 28 Jan 2015 22:13:26 +0000 Subject: QPID-6336: Add extra logging to help understand occasional SSLTest failure showing on slow CI box git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655485 13f79535-47bb-0310-9956-ffa450edef68 --- .../common/src/main/java/org/apache/qpid/transport/Connection.java | 5 +++++ .../systests/src/test/java/org/apache/qpid/client/ssl/SSLTest.java | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'qpid/java') diff --git a/qpid/java/common/src/main/java/org/apache/qpid/transport/Connection.java b/qpid/java/common/src/main/java/org/apache/qpid/transport/Connection.java index e33e007f6e..890aeda11b 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/transport/Connection.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/transport/Connection.java @@ -537,6 +537,11 @@ public class Connection extends ConnectionInvoker connectionLost.set(true); synchronized (lock) { + if(log.isDebugEnabled()) + { + log.debug("exception: %s state : %s", e.getMessage(), state); + } + switch (state) { case OPENING: diff --git a/qpid/java/systests/src/test/java/org/apache/qpid/client/ssl/SSLTest.java b/qpid/java/systests/src/test/java/org/apache/qpid/client/ssl/SSLTest.java index 7c82ea8e55..72dea9b18b 100644 --- a/qpid/java/systests/src/test/java/org/apache/qpid/client/ssl/SSLTest.java +++ b/qpid/java/systests/src/test/java/org/apache/qpid/client/ssl/SSLTest.java @@ -112,7 +112,9 @@ public class SSLTest extends QpidBrokerTestCase } catch (JMSException e) { - assertTrue("Unexpected exception message", e.getMessage().contains("Unrecognized SSL message, plaintext connection?")); + // PASS + assertTrue("Unexpected exception message : " + e.getMessage(), + e.getMessage().contains("Unrecognized SSL message, plaintext connection?")); } } } -- cgit v1.2.1 From 119b5b63a4d508e4acf8ee5f67bd91df214a268f Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Thu, 29 Jan 2015 09:30:58 +0000 Subject: 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 --- .../java/resources/js/qpid/management/addStore.js | 1 + .../qpid/management/store/nonjavakeystore/add.js | 162 +++++++++++++++++++++ .../qpid/management/store/nonjavakeystore/show.js | 42 ++++++ .../qpid/management/store/nonjavatruststore/add.js | 162 +++++++++++++++++++++ .../management/store/nonjavatruststore/show.js | 66 +++++++++ .../java/resources/store/nonjavakeystore/add.html | 153 +++++++++++++++++++ .../java/resources/store/nonjavakeystore/show.html | 35 +++++ .../resources/store/nonjavatruststore/add.html | 67 +++++++++ .../resources/store/nonjavatruststore/show.html | 31 ++++ 9 files changed, 719 insertions(+) create mode 100644 qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavakeystore/add.js create mode 100644 qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavakeystore/show.js create mode 100644 qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/add.js create mode 100644 qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/nonjavatruststore/show.js create mode 100644 qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavakeystore/add.html create mode 100644 qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavakeystore/show.html create mode 100644 qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavatruststore/add.html create mode 100644 qpid/java/broker-plugins/management-http/src/main/java/resources/store/nonjavatruststore/show.html (limited to 'qpid/java') 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 @@ + + + +
+ + +
+
Private Key URL or Path*:
+
+ + + + + + +
+ +
+ + +
+ +
+ + +
+
+
+
+
+ +
+
Certificate URL or Path*:
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
+
+ +
+
Intermediate Certificate URL or Path:
+
+ + + + +
+ +
+
+ + +
+ +
+ + +
+
+
+
+ +
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 @@ + + +
+
+
Private Key:
+
+
+
+
Certificate:
+
+
+
+
Intermediate Certificate:
+
+
+
+
+ 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 @@ + + + +
+ + +
+
Certificate URL or Path*:
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
+
+ +
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 @@ + + +
+
+
Certificate:
+
+
+
+
+
+
+
+
+ -- cgit v1.2.1 From b0b8d4f3dd7e0fd371e9e94499776b10b7918499 Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Thu, 29 Jan 2015 20:57:38 +0000 Subject: [JMS AMQP 1.0 Client] Add ability to change the SSL Protocol/Provider used to create the SSLContext git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655858 13f79535-47bb-0310-9956-ffa450edef68 --- .../amqp_1_0/jms/impl/ConnectionFactoryImpl.java | 41 +++++++++++++++- .../org/apache/qpid/amqp_1_0/client/SSLUtil.java | 57 ++++++++++++++++++++-- 2 files changed, 94 insertions(+), 4 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java index 90b3298c3a..cf80bb3bd5 100644 --- a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java +++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java @@ -67,6 +67,8 @@ public class ConnectionFactoryImpl implements ConnectionFactory, TopicConnection private String _trustStorePath; private String _trustStorePassword; private SSLContext _sslContext; + private String _sslProtocol; + private String _sslProvider; public ConnectionFactoryImpl(final String host, @@ -163,7 +165,9 @@ public class ConnectionFactoryImpl implements ConnectionFactory, TopicConnection KeyManagerFactory.getDefaultAlgorithm(), _trustStorePath,_trustStorePassword, KeyStore.getDefaultType(), - TrustManagerFactory.getDefaultAlgorithm()); + TrustManagerFactory.getDefaultAlgorithm(), + _sslProtocol, + _sslProvider); if(username == null && _keyStoreCertAlias != null) { X509Certificate[] certs = SSLUtil.getClientCertificates(_keyStoreCertAlias, @@ -220,6 +224,16 @@ public class ConnectionFactoryImpl implements ConnectionFactory, TopicConnection _keyStorePassword = keyStorePassword; } + public void setSslProtocol(final String sslProtocol) + { + _sslProtocol = sslProtocol; + } + + public void setSslProvider(final String sslProvider) + { + _sslProvider = sslProvider; + } + public void setKeyStoreCertAlias(final String keyStoreCertAlias) { _keyStoreCertAlias = keyStoreCertAlias; @@ -252,6 +266,8 @@ public class ConnectionFactoryImpl implements ConnectionFactory, TopicConnection public String keyStorePath; public String keyStorePassword; public String keyStoreCertAlias; + public String sslProvider; + public String sslProtocol; } @@ -388,7 +404,22 @@ public class ConnectionFactoryImpl implements ConnectionFactory, TopicConnection { options.keyStoreCertAlias = value; } + }, + new OptionSetter("ssl-provider","") + { + public void setOption(final ConnectionOptions options, final String value) throws MalformedURLException + { + options.sslProvider = value; + } + }, + new OptionSetter("ssl-protocol","") + { + public void setOption(final ConnectionOptions options, final String value) throws MalformedURLException + { + options.sslProtocol = value; + } } + }; public static ConnectionFactoryImpl createFromURL(final String urlString) throws MalformedURLException @@ -496,6 +527,14 @@ public class ConnectionFactoryImpl implements ConnectionFactory, TopicConnection { connectionFactory.setTrustStorePassword(options.trustStorePassword); } + if (options.sslProvider != null) + { + connectionFactory.setSslProvider(options.sslProvider); + } + if (options.sslProtocol != null) + { + connectionFactory.setSslProtocol(options.sslProtocol); + } return connectionFactory; diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SSLUtil.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SSLUtil.java index 225293c42e..64ab59e6b3 100644 --- a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SSLUtil.java +++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SSLUtil.java @@ -27,12 +27,15 @@ import java.io.InputStream; import java.net.Socket; import java.security.GeneralSecurityException; import java.security.KeyStore; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; import java.security.Principal; import java.security.PrivateKey; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.logging.Logger; import javax.net.ssl.KeyManager; import javax.net.ssl.KeyManagerFactory; @@ -48,6 +51,10 @@ public class SSLUtil public static final String TRANSPORT_LAYER_SECURITY_CODE = "TLS"; public static final String SSLV3_PROTOCOL = "SSLv3"; + + private static final Logger LOGGER = Logger.getLogger(SSLUtil.class.getName()); + + public static SSLContext buildSslContext(final String certAlias, final String keyStorePath, final String keyStoreType, @@ -56,11 +63,13 @@ public class SSLUtil final String trustStorePath, final String trustStorePassword, final String trustStoreType, - final String trustManagerFactoryAlgorithm) throws GeneralSecurityException, IOException + final String trustManagerFactoryAlgorithm, + final String sslProtocol, + final String sslProvider) throws GeneralSecurityException, IOException { - final SSLContext sslContext = SSLContext - .getInstance(TRANSPORT_LAYER_SECURITY_CODE); + + SSLContext sslContext = getSslContext(sslProtocol, sslProvider); final TrustManager[] trustManagers; final KeyManager[] keyManagers; @@ -109,6 +118,48 @@ public class SSLUtil return sslContext; } + private static SSLContext getSslContext(final String sslProtocol, final String sslProvider) throws NoSuchAlgorithmException + { + + final String sslProviderName = System.getProperty("qpid.ssl.provider", sslProvider); + final String sslProtocolName = System.getProperty("qpid.ssl.protocol", sslProtocol); + + SSLContext sslContext = null; + if(sslProviderName != null && sslProtocolName != null) + { + try + { + sslContext = SSLContext.getInstance(sslProtocolName, sslProviderName); + } + catch(NoSuchProviderException e) + { + LOGGER.info("Unknown SSL Context Provider '"+ sslProviderName + "' will use the default"); + } + catch (NoSuchAlgorithmException e) + { + LOGGER.info("Unknown SSL protocol '" + sslProtocolName + + "' when using the provider '" + sslProviderName + "' will use the default provider"); + } + } + if(sslContext == null && sslProtocolName != null) + { + try + { + sslContext = SSLContext.getInstance(sslProtocolName); + } + catch(NoSuchAlgorithmException e) + { + LOGGER.info("Unknown SSL protocol '" + sslProtocolName + + "' will use '"+TRANSPORT_LAYER_SECURITY_CODE+"'"); + } + } + if(sslContext == null) + { + sslContext = SSLContext.getInstance(TRANSPORT_LAYER_SECURITY_CODE); + } + return sslContext; + } + public static X509Certificate[] getClientCertificates(final String alias, final String keyStorePath, final String keyStorePassword, -- cgit v1.2.1 From 54b214dc8fd8087466cec5ee2dadaa60e797a49c Mon Sep 17 00:00:00 2001 From: Keith Wall Date: Thu, 29 Jan 2015 22:13:14 +0000 Subject: QPID-6350: [Java Client] Preserve original connection exception git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655877 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/main/java/org/apache/qpid/transport/Connection.java | 10 +++++----- .../qpid/transport/network/security/ssl/SSLReceiver.java | 5 ++++- 2 files changed, 9 insertions(+), 6 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/common/src/main/java/org/apache/qpid/transport/Connection.java b/qpid/java/common/src/main/java/org/apache/qpid/transport/Connection.java index 890aeda11b..245f12ad0b 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/transport/Connection.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/transport/Connection.java @@ -537,16 +537,16 @@ public class Connection extends ConnectionInvoker connectionLost.set(true); synchronized (lock) { - if(log.isDebugEnabled()) - { - log.debug("exception: %s state : %s", e.getMessage(), state); - } + log.error(e, "exception: %s", e.getMessage()); switch (state) { case OPENING: case CLOSING: - error = e; + if (error == null) + { + error = e; + } lock.notifyAll(); return; } diff --git a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java index 1bbf166d82..8e1395aa83 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java @@ -187,7 +187,10 @@ public class SSLReceiver implements Receiver } catch(SSLException e) { - log.error(e, "Error caught in SSLReceiver"); + if (log.isDebugEnabled()) + { + log.debug(e, "Error caught in SSLReceiver"); + } _sslStatus.setSslErrorFlag(); synchronized(_sslStatus.getSslLock()) { -- cgit v1.2.1 From b4d09a6ec40150e13ecb116c24a68150077a325a Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Fri, 30 Jan 2015 10:12:07 +0000 Subject: QPID-6346: [Java Broker] Encapsulate duplicate UI for uploading of broker resources into widget and use the widget in keystores and truststore UI git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655974 13f79535-47bb-0310-9956-ffa450edef68 --- .../main/java/resources/common/ResourceWidget.html | 48 ++++++ .../resources/js/qpid/common/FormWidgetMixin.js | 102 ++++++++++++ .../resources/js/qpid/common/ResourceWidget.js | 173 +++++++++++++++++++++ .../java/resources/js/qpid/management/addStore.js | 2 +- .../js/qpid/management/store/filekeystore/add.js | 96 ++---------- .../js/qpid/management/store/filetruststore/add.js | 94 ++--------- .../qpid/management/store/nonjavakeystore/add.js | 96 +----------- .../qpid/management/store/nonjavatruststore/add.js | 92 ----------- .../java/resources/store/filekeystore/add.html | 34 +--- .../java/resources/store/filetruststore/add.html | 31 +--- .../java/resources/store/nonjavakeystore/add.html | 117 ++------------ .../resources/store/nonjavatruststore/add.html | 35 +---- 12 files changed, 371 insertions(+), 549 deletions(-) create mode 100644 qpid/java/broker-plugins/management-http/src/main/java/resources/common/ResourceWidget.html create mode 100644 qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/FormWidgetMixin.js create mode 100644 qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ResourceWidget.js (limited to 'qpid/java') diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/common/ResourceWidget.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/common/ResourceWidget.html new file mode 100644 index 0000000000..e47fa6ca6d --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/common/ResourceWidget.html @@ -0,0 +1,48 @@ + + + diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/FormWidgetMixin.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/FormWidgetMixin.js new file mode 100644 index 0000000000..11160e9608 --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/FormWidgetMixin.js @@ -0,0 +1,102 @@ +/* + * + * 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/declare"], function(declare) +{ + return declare("qpid.common.FormWidgetMixin", null, + { + name: "", + value: "", + _onChangeActive: false, + + compare: function(val1, val2) + { + if(typeof val1 == "number" && typeof val2 == "number") + { + return (isNaN(val1) && isNaN(val2)) ? 0 : val1 - val2; + } + else if(val1 > val2) + { + return 1; + } + else if(val1 < val2) + { + return -1; + } + else + { + return 0; + } + }, + onChange: function() + { + }, + _setValueAttr: function(newValue, priorityChange) + { + this._handleOnChange(newValue, priorityChange); + }, + _handleOnChange: function(newValue, priorityChange) + { + this._set("value", newValue); + if(this._lastValueReported == undefined && (priorityChange === null || !this._onChangeActive)) + { + this._resetValue = this._lastValueReported = newValue; + } + this._pendingOnChange = this._pendingOnChange || (typeof newValue != typeof this._lastValueReported) + || (this.compare(newValue, this._lastValueReported) != 0); + if(( priorityChange || priorityChange === undefined) && this._pendingOnChange) + { + this._lastValueReported = newValue; + this._pendingOnChange = false; + if(this._onChangeActive) + { + if(this._onChangeHandle) + { + this._onChangeHandle.remove(); + } + this._onChangeHandle = this.defer(function() { this._onChangeHandle = null; this.onChange(newValue); }); + } + } + }, + create: function() + { + this.inherited(arguments); + this._onChangeActive = true; + }, + destroy: function() + { + if(this._onChangeHandle) + { + this._onChangeHandle.remove(); + this.onChange(this._lastValueReported); + } + this.inherited(arguments); + }, + undo: function() + { + this._setValueAttr(this._lastValueReported, false); + }, + reset: function() + { + this._hasBeenBlurred = false; + this._setValueAttr(this._resetValue, true); + } + }); +}); \ No newline at end of file diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ResourceWidget.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ResourceWidget.js new file mode 100644 index 0000000000..0082c7524f --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ResourceWidget.js @@ -0,0 +1,173 @@ +/* + * + * 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/declare", + "dojo/_base/array", + "dojo/_base/lang", + "qpid/common/util", + "dijit/_Widget", + "dijit/_TemplatedMixin", + "dijit/_WidgetsInTemplateMixin", + "qpid/common/FormWidgetMixin", + "dojo/text!common/ResourceWidget.html", + "dojox/html/entities", + "dojox/form/Uploader", + "dijit/form/Button", + "dijit/form/ValidationTextBox", + "dojox/validate/us", + "dojox/validate/web", + "dojo/domReady!"], +function (declare, array, lang, util, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, FormWidgetMixin, template, entities) +{ + + return declare("qpid.common.ResourceWidget", [_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, FormWidgetMixin], + { + templateString: template, + fileReaderSupported: window.FileReader ? true : false, + displayWarningWhenFileReaderUnsupported: false, + isDebug: false, + + buildRendering: function() + { + //Strip out the apache comment header from the template html as comments unsupported. + this.templateString = this.templateString.replace(//g, ""); + this.inherited(arguments); + }, + postCreate: function() + { + this.inherited(arguments); + + if(this._resetValue === undefined) + { + this._lastValueReported = this._resetValue = this.value; + } + + var that = this; + + if (this.fileReaderSupported) + { + this.fileReader= new FileReader(); + this.fileReader.onload = function(evt) {that._uploadFileComplete(evt);}; + this.fileReader.onerror = function(ex) {console.error("Failed to load file for " + this.name, ex);}; + this.uploader.on("change", function(selected){that._fileChanged(selected)}); + this.clearButton.on("click", function(event){that._fileClearButtonClicked(event)}); + } + else + { + // Fall back for IE8/9 which do not support FileReader + this.uploadFields.style.display = "none"; + if (displayWarningWhenFileReaderUnsupported) + { + this.unsupportedWarning.className = this.unsupportedWarning.className.replace("hidden", ""); + } + } + this.resourceLocation.on("blur", function(){that._pathChanged()}); + this._originalValue = arguments.value; + if (this.placeHolder) + { + this.resourceLocation.set("placeHolder", this.placeHolder); + } + if (this.promptMessage) + { + this.resourceLocation.set("promptMessage", this.promptMessage); + } + if (this.title) + { + this.resourceLocation.set("title", this.title); + } + this.uploadData.style.display = "none"; + }, + startup: function() + { + if (this.fileReaderSupported) + { + this.uploader.startup(); + } + }, + _fileChanged: function (evt) + { + var file = this.uploader.domNode.children[0].files[0]; + this.selectedFileName = file.name; + this.selectedFile.innerHTML = file.name; + this.selectedFileStatus.className = "loadingIcon"; + if (this.isDebug) + { + this._log("Beginning to read file " + file.name + " for " + this.name); + } + this.fileReader.readAsDataURL(file); + }, + _uploadFileComplete: function(evt) + { + var reader = evt.target; + var result = reader.result; + if (this.isDebug) + { + this._log(this.name + " file read complete, contents " + result); + } + this.set("value", result); + }, + _fileClearButtonClicked: function(event) + { + this.uploader.reset(); + this.set("value", this._resetValue); + }, + _pathChanged: function() + { + var serverPathValue = this.resourceLocation.get("value") || this._resetValue; + this.set("value", serverPathValue); + }, + _setValueAttr: function(newValue, priorityChange) + { + var isDataUrl = newValue && newValue.indexOf("data:") == 0; + if (isDataUrl) + { + this.uploadData.style.display = "block"; + this.selectedFileStatus.className = "loadedIcon"; + this.selectedFile.innerHTML = this.selectedFileName || "uploaded data"; + this.resourceLocation.set("value", ""); + this.resourceLocation.setDisabled(true); + this.resourceLocation.set("required", false); + this.clearButton.setDisabled(false); + this.selectedFileStatus.className = "loadedIcon"; + } + else + { + this.resourceLocation.set("value", newValue); + this.selectedFileName = null; + this.selectedFileStatus.className = ""; + this.selectedFile.innerHTML = ""; + this.resourceLocation.set("required", true); + this.resourceLocation.setDisabled(false); + this.clearButton.setDisabled(true); + this.uploadData.style.display = "none"; + } + this.inherited(arguments); + }, + _log: function(message) + { + if (this.isDebug) + { + console.log(message); + } + } + } + ); +}); 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 c6ce218530..5a42f12870 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 @@ -80,11 +80,11 @@ define(["dojo/_base/lang", }, show: function(effectiveData) { + this.effectiveData = effectiveData; this.storeForm.reset(); if (effectiveData) { - this.effectiveData = effectiveData; this._destroyTypeFields(this.containerNode); this._initFields(effectiveData); } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filekeystore/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filekeystore/add.js index b158b9e051..feb7da1864 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filekeystore/add.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filekeystore/add.js @@ -25,8 +25,6 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm { init: function() { - // Readers are HTML5 - this.reader = window.FileReader ? new FileReader() : undefined; }, show: function(data) { @@ -34,79 +32,16 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm util.parseHtmlIntoDiv(data.containerNode, "store/filekeystore/add.html"); this.containerNode = data.containerNode; - this.keyStoreServerPath = registry.byId("addStore.serverPath"); - this.keyStoreUploadFields = dom.byId("addStore.uploadFields"); - this.keyStoreSelectedFileContainer = dom.byId("addStore.selectedFile"); - this.keyStoreSelectedFileStatusContainer = dom.byId("addStore.selectedFileStatus"); - this.keyStoreFile = registry.byId("addStore.file"); - this.keyStoreFileClearButton = registry.byId("addStore.fileClearButton"); - this.keyStoreOldBrowserWarning = dom.byId("addStore.oldBrowserWarning"); - //Only submitted field - this.keyStorePath = registry.byId("addStore.path"); + this.keyStoreOldBrowserWarning = dom.byId("addStore.oldBrowserWarning"); this.addButton = data.parent.addButton; - if (this.reader) - { - this.reader.onload = function(evt) {that._keyStoreUploadFileComplete(evt);}; - this.reader.onerror = function(ex) {console.error("Failed to load key store file", ex);}; - this.keyStoreFile.on("change", function(selected){that._keyStoreFileChanged(selected)}); - this.keyStoreFileClearButton.on("click", function(event){that._keyStoreFileClearButtonClicked(event)}); - } - else + if (!window.FileReader) { - // Fall back for IE8/9 which do not support FileReader - this.keyStoreUploadFields.style.display = "none"; this.keyStoreOldBrowserWarning.innerHTML = "File upload requires a more recent browser with HTML5 support"; this.keyStoreOldBrowserWarning.className = this.keyStoreOldBrowserWarning.className.replace("hidden", ""); } - - this.keyStoreServerPath.on("blur", function(){that._keyStoreServerPathChanged()}); - }, - _keyStoreFileChanged: function (evt) - { - // We only ever expect a single file - var file = this.keyStoreFile.domNode.children[0].files[0]; - - this.addButton.setDisabled(true); - this.keyStoreSelectedFileContainer.innerHTML = file.name; - this.keyStoreSelectedFileStatusContainer.className = "loadingIcon"; - - console.log("Beginning to read key store file " + file.name); - this.reader.readAsDataURL(file); - }, - _keyStoreUploadFileComplete: function(evt) - { - var reader = evt.target; - var result = reader.result; - console.log("Key store file read complete, contents " + result); - this.addButton.setDisabled(false); - this.keyStoreSelectedFileStatusContainer.className = "loadedIcon"; - - this.keyStoreServerPath.set("value", ""); - this.keyStoreServerPath.setDisabled(true); - this.keyStoreServerPath.set("required", false); - - this.keyStoreFileClearButton.setDisabled(false); - - this.keyStorePath.set("value", result); - }, - _keyStoreFileClearButtonClicked: function(event) - { - this.keyStoreFile.reset(); - this.keyStoreSelectedFileStatusContainer.className = ""; - this.keyStoreSelectedFileContainer.innerHTML = ""; - this.keyStoreServerPath.set("required", true); - this.keyStoreServerPath.setDisabled(false); - this.keyStoreFileClearButton.setDisabled(true); - - this.keyStorePath.set("value", ""); - }, - _keyStoreServerPathChanged: function() - { - var serverPathValue = this.keyStoreServerPath.get("value"); - this.keyStorePath.set("value", serverPathValue); }, update: function(effectiveData) { @@ -115,27 +50,18 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm array.forEach(widgets, function(item) { var name = item.id.replace("addStore.",""); - if (name in attributes && item.type != "password") + if (name in attributes ) { - item.set("value", effectiveData[name]); + if (item.type != "password") + { + item.set("value", effectiveData[name]); + } + else + { + item.set("required", effectiveData?false:true); + } } }); - - var keyStorePathValue = effectiveData["path"]; - var isDataUrl = keyStorePathValue.indexOf("data:") == 0; - - if (isDataUrl) - { - this.keyStoreSelectedFileStatusContainer.className = "loadedIcon"; - this.keyStoreSelectedFileContainer.innerHTML = "uploaded.jks"; - this.keyStoreServerPath.setDisabled(true); - this.keyStoreServerPath.set("required", false); - this.keyStoreFileClearButton.setDisabled(false); - } - else - { - this.keyStoreServerPath.set("value", keyStorePathValue); - } } }; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filetruststore/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filetruststore/add.js index 9d113a9d9e..b55affb33b 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filetruststore/add.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filetruststore/add.js @@ -25,8 +25,6 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm { init: function() { - // Readers are HTML5 - this.reader = window.FileReader ? new FileReader() : undefined; }, show: function(data) { @@ -34,79 +32,17 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm util.parseHtmlIntoDiv(data.containerNode, "store/filetruststore/add.html"); this.containerNode = data.containerNode; - this.keyStoreServerPath = registry.byId("addStore.serverPath"); - this.keyStoreUploadFields = dom.byId("addStore.uploadFields"); - this.keyStoreSelectedFileContainer = dom.byId("addStore.selectedFile"); - this.keyStoreSelectedFileStatusContainer = dom.byId("addStore.selectedFileStatus"); - this.keyStoreFile = registry.byId("addStore.file"); - this.keyStoreFileClearButton = registry.byId("addStore.fileClearButton"); - this.keyStoreOldBrowserWarning = dom.byId("addStore.oldBrowserWarning"); - //Only submitted field - this.keyStorePath = registry.byId("addStore.path"); + this.keyStoreOldBrowserWarning = dom.byId("addStore.oldBrowserWarning"); this.addButton = data.parent.addButton; - if (this.reader) - { - this.reader.onload = function(evt) {that._keyStoreUploadFileComplete(evt);}; - this.reader.onerror = function(ex) {console.error("Failed to load trust store file", ex);}; - this.keyStoreFile.on("change", function(selected){that._keyStoreFileChanged(selected)}); - this.keyStoreFileClearButton.on("click", function(event){that._keyStoreFileClearButtonClicked(event)}); - } - else + if (!window.FileReader) { // Fall back for IE8/9 which do not support FileReader - this.keyStoreUploadFields.style.display = "none"; this.keyStoreOldBrowserWarning.innerHTML = "File upload requires a more recent browser with HTML5 support"; this.keyStoreOldBrowserWarning.className = this.keyStoreOldBrowserWarning.className.replace("hidden", ""); } - - this.keyStoreServerPath.on("blur", function(){that._keyStoreServerPathChanged()}); - }, - _keyStoreFileChanged: function (evt) - { - // We only ever expect a single file - var file = this.keyStoreFile.domNode.children[0].files[0]; - - this.addButton.setDisabled(true); - this.keyStoreSelectedFileContainer.innerHTML = file.name; - this.keyStoreSelectedFileStatusContainer.className = "loadingIcon"; - - console.log("Beginning to read trust store file " + file.name); - this.reader.readAsDataURL(file); - }, - _keyStoreUploadFileComplete: function(evt) - { - var reader = evt.target; - var result = reader.result; - console.log("Trust store file read complete, contents " + result); - this.addButton.setDisabled(false); - this.keyStoreSelectedFileStatusContainer.className = "loadedIcon"; - - this.keyStoreServerPath.set("value", ""); - this.keyStoreServerPath.setDisabled(true); - this.keyStoreServerPath.set("required", false); - - this.keyStoreFileClearButton.setDisabled(false); - - this.keyStorePath.set("value", result); - }, - _keyStoreFileClearButtonClicked: function(event) - { - this.keyStoreFile.reset(); - this.keyStoreSelectedFileStatusContainer.className = ""; - this.keyStoreSelectedFileContainer.innerHTML = ""; - this.keyStoreServerPath.set("required", true); - this.keyStoreServerPath.setDisabled(false); - this.keyStoreFileClearButton.setDisabled(true); - - this.keyStorePath.set("value", ""); - }, - _keyStoreServerPathChanged: function() - { - var serverPathValue = this.keyStoreServerPath.get("value"); - this.keyStorePath.set("value", serverPathValue); }, update: function(effectiveData) { @@ -115,27 +51,19 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm array.forEach(widgets, function(item) { var name = item.id.replace("addStore.",""); - if (name in attributes && item.type != "password") + if (name in attributes ) { - item.set("value", effectiveData[name]); + if (item.type != "password") + { + item.set("value", effectiveData[name]); + } + else + { + item.set("required", effectiveData?false:true); + } } }); - var keyStorePathValue = effectiveData["path"]; - var isDataUrl = keyStorePathValue.indexOf("data:") == 0; - - if (isDataUrl) - { - this.keyStoreSelectedFileStatusContainer.className = "loadedIcon"; - this.keyStoreSelectedFileContainer.innerHTML = "uploaded.jks"; - this.keyStoreServerPath.setDisabled(true); - this.keyStoreServerPath.set("required", false); - this.keyStoreFileClearButton.setDisabled(false); - } - else - { - this.keyStoreServerPath.set("value", keyStorePathValue); - } } }; 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 index 7488ad93d6..989af03832 100644 --- 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 @@ -18,7 +18,7 @@ * under the License. * */ -define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/common/util", "qpid/common/metadata"], +define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/common/util", "qpid/common/metadata", "qpid/common/ResourceWidget"], function (dom, query, array, registry, util, metadata) { var addKeyStore = @@ -40,81 +40,6 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm 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) { @@ -126,26 +51,7 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm 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); - } - } }); - } }; 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 index 2cff365f60..15926d1832 100644 --- 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 @@ -40,81 +40,6 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm 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) { @@ -127,23 +52,6 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm 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); - } - } }); } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/store/filekeystore/add.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/store/filekeystore/add.html index 1732688ba7..2356accbd4 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/store/filekeystore/add.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/store/filekeystore/add.html @@ -22,42 +22,14 @@
Server path or upload*:
- - - - -
- -
-
-
- - -
- -
- - -
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/store/filetruststore/add.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/store/filetruststore/add.html index 36180d8a39..4fbf9f953a 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/store/filetruststore/add.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/store/filetruststore/add.html @@ -22,39 +22,14 @@
Server path or upload*:
- - - -
-
-
-
- - -
-
- - -
Password*:
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 index 5272537bdf..f7ae4d3f76 100644 --- 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 @@ -22,132 +22,45 @@
-
Private Key URL or Path*:
+
Private Key*:
- - - - - -
- -
- - -
- -
- - -
-
-
-
Certificate URL or Path*:
+
Certificate*:
- - - - - - -
-
- - -
- -
- - -
-
-
-
Intermediate Certificate URL or Path:
+
Intermediate Certificate(s):
- - - - -
- -
-
- - -
- -
- - -
-
+ placeHolder: 'Intermediate certificates URL or path to file on server', + required: false, + promptMessage: 'Location of the intermediate certificates', + title: 'Enter URL containing intermediate certificates or path to file with certificates in format DER or PEM'" />
-
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 index 9de25877cb..ba5aee0444 100644 --- 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 @@ -24,43 +24,14 @@
Certificate URL or Path*:
- - - - - - -
-
- - -
- -
- - -
-
-
-- cgit v1.2.1 From 0c774a3384905c988cdf3ef09214ff53f5865995 Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Fri, 30 Jan 2015 10:12:16 +0000 Subject: QPID-6351: [Java Broker] Remove provider name from edit UI, remove button 'Add Preferences Provider' from Authentication provider tab and fix disabled preferences provider fields in Add Authentication provider dialog git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655975 13f79535-47bb-0310-9956-ffa450edef68 --- .../js/qpid/management/AuthenticationProvider.js | 22 +--------------------- .../js/qpid/management/PreferencesProvider.js | 2 -- .../qpid/management/addAuthenticationProvider.js | 4 +++- .../preferencesprovider/PreferencesProviderForm.js | 4 ++++ .../preferencesProviderForm.html | 2 +- .../src/main/java/resources/showAuthProvider.html | 1 - .../java/resources/showPreferencesProvider.html | 4 ---- 7 files changed, 9 insertions(+), 30 deletions(-) (limited to 'qpid/java') 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 161ce4f83c..8545d2da75 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 @@ -33,12 +33,11 @@ define(["dojo/_base/xhr", "dojo/dom-style", "dojox/html/entities", "dojo/dom", - "qpid/management/addPreferencesProvider", "qpid/management/PreferencesProvider", "qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager", "dojo/domReady!"], function (xhr, parser, query, connect, properties, updater, util, UpdatableStore, EnhancedGrid, - addAuthenticationProvider, event, registry, domStyle, entities, dom, addPreferencesProvider, PreferencesProvider, PrincipalDatabaseAuthenticationManager) { + addAuthenticationProvider, event, registry, domStyle, entities, dom, PreferencesProvider, PrincipalDatabaseAuthenticationManager) { function AuthenticationProvider(name, parent, controller) { this.name = name; @@ -79,14 +78,6 @@ define(["dojo/_base/xhr", that.deleteAuthenticationProvider(); }); - var addPreferencesProviderButton = query(".addPreferencesProviderButton", contentPane.containerNode)[0]; - var addPreferencesProviderWidget = registry.byNode(addPreferencesProviderButton); - connect.connect(addPreferencesProviderWidget, "onClick", - function(evt){ - event.stop(evt); - that.addPreferencesProvider(); - }); - authProviderUpdater.update(); if (util.isProviderManagingUsers(authProviderUpdater.authProviderData.type)) { @@ -136,14 +127,6 @@ define(["dojo/_base/xhr", } }; - AuthenticationProvider.prototype.addPreferencesProvider = function() { - if (this.authProviderUpdater && this.authProviderUpdater.authProviderData - && (!this.authProviderUpdater.authProviderData.preferencesproviders - || !this.authProviderUpdater.authProviderData.preferencesproviders[0])){ - addPreferencesProvider.show(this.name); - } - }; - function AuthProviderUpdater(node, authProviderObj, controller, authenticationProvider) { this.controller = controller; @@ -154,7 +137,6 @@ define(["dojo/_base/xhr", this.preferencesProviderType=dom.byId("preferencesProviderType"); this.preferencesProviderName=dom.byId("preferencesProviderName"); this.preferencesProviderState=dom.byId("preferencesProviderState"); - this.addPreferencesProviderButton = query(".addPreferencesProviderButton", node)[0]; this.editPreferencesProviderButton = query(".editPreferencesProviderButton", node)[0]; this.deletePreferencesProviderButton = query(".deletePreferencesProviderButton", node)[0]; this.preferencesProviderAttributes = dom.byId("preferencesProviderAttributes") @@ -169,7 +151,6 @@ this.authenticationProviderDetailsContainer = query(".authenticationProviderDeta { if (preferencesProviderData) { - this.addPreferencesProviderButton.style.display = 'none'; if (!this.preferencesProvider) { var preferencesProvider =new PreferencesProvider(preferencesProviderData.name, this.authProviderData); @@ -184,7 +165,6 @@ this.authenticationProviderDetailsContainer = query(".authenticationProviderDeta { this.preferencesProvider.update(null); } - this.addPreferencesProviderButton.style.display = 'inline'; } }; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/PreferencesProvider.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/PreferencesProvider.js index 35ccbf9cae..0d40669823 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/PreferencesProvider.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/PreferencesProvider.js @@ -56,7 +56,6 @@ define(["dojo/_base/xhr", that.containerNode = node; that.parentObject = parentObject; that.preferencesProviderType=query(".preferencesProviderType", node)[0]; - that.preferencesProviderName=query(".preferencesProviderName", node)[0]; that.preferencesProviderState=query(".preferencesProviderState", node)[0]; that.editPreferencesProviderButton = query(".editPreferencesProviderButton", node)[0]; that.deletePreferencesProviderButton = query(".deletePreferencesProviderButton", node)[0]; @@ -137,7 +136,6 @@ define(["dojo/_base/xhr", this.editPreferencesProviderButton.style.display = 'inline'; this.deletePreferencesProviderButton.style.display = 'inline'; this.preferencesProviderType.innerHTML = entities.encode(String(data.type)); - this.preferencesProviderName.innerHTML = entities.encode(String(data.name)); this.preferencesProviderState.innerHTML = entities.encode(String(data.state)); if (!this.details) { 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 index e05fc7582d..1b38c257fb 100644 --- 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 @@ -60,6 +60,7 @@ define(["dojo/_base/xhr", this.authenticationProviderName = registry.byId("addAuthenticationProvider.name"); this.authenticationProviderName.set("regExpGen", util.nameOrContextVarRegexp); + this.authenticationProviderName.on("change", function(newValue){that.preferencesProviderForm.preferencesProviderNameWidget.set("value",newValue);}); this.dialog = registry.byId("addAuthenticationProvider"); this.addButton = registry.byId("addAuthenticationProvider.addButton"); @@ -102,7 +103,7 @@ define(["dojo/_base/xhr", this.initialData = actualData; this.effectiveData = effectiveData; this.authenticationProviderType.set("value", actualData.type); - this.authenticationProviderName.set("value", actualData.name); + this.authenticationProviderType.set("disabled", true); this.authenticationProviderName.set("disabled", true); if (actualData.preferencesproviders && actualData.preferencesproviders[0]) @@ -113,6 +114,7 @@ define(["dojo/_base/xhr", { this.preferencesProviderForm.reset(); } + this.authenticationProviderName.set("value", actualData.name); } else { diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/PreferencesProviderForm.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/PreferencesProviderForm.js index 5eaaa89242..96c336ff2c 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/PreferencesProviderForm.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/PreferencesProviderForm.js @@ -193,6 +193,10 @@ function (util, metadata, xhr, declare, array, domConstruct, win, query, json, _ { this.reset(); } + else + { + this._toggleWidgets(this.preferencesProviderTypeWidget.value); + } }, }); }); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/preferencesprovider/preferencesProviderForm.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/preferencesprovider/preferencesProviderForm.html index 979b3abe8d..b995d4e8dd 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/preferencesprovider/preferencesProviderForm.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/preferencesprovider/preferencesProviderForm.html @@ -23,7 +23,7 @@
Preferences Provider -
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/showPreferencesProvider.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/showPreferencesProvider.html index 5d14aace76..49eb355ff3 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/showPreferencesProvider.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/showPreferencesProvider.html @@ -24,10 +24,6 @@
Type:
-
-
Name:
-
-
State:
-- cgit v1.2.1 From 2e61366ced5d8126426c14ff08c7c7b38cca659b Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Fri, 30 Jan 2015 16:49:52 +0000 Subject: QPID-6346: Fix setting of required flag on ResourceWidget git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1656054 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/main/java/resources/js/qpid/common/ResourceWidget.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ResourceWidget.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ResourceWidget.js index 0082c7524f..7b1663ac5d 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ResourceWidget.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ResourceWidget.js @@ -93,6 +93,7 @@ function (declare, array, lang, util, _WidgetBase, _TemplatedMixin, _WidgetsInTe { this.resourceLocation.set("title", this.title); } + this.resourceLocation.set("required", this.required ? true : false); this.uploadData.style.display = "none"; }, startup: function() @@ -154,7 +155,7 @@ function (declare, array, lang, util, _WidgetBase, _TemplatedMixin, _WidgetsInTe this.selectedFileName = null; this.selectedFileStatus.className = ""; this.selectedFile.innerHTML = ""; - this.resourceLocation.set("required", true); + this.resourceLocation.set("required", this.required ? true : false); this.resourceLocation.setDisabled(false); this.clearButton.setDisabled(true); this.uploadData.style.display = "none"; -- cgit v1.2.1 From e15a326b853e12c34144e27ec313415b0a8242f9 Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Fri, 30 Jan 2015 16:49:59 +0000 Subject: QPID-6346: Display subject and certificate validity period for non java keystores git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1656055 13f79535-47bb-0310-9956-ffa450edef68 --- .../qpid/management/store/nonjavakeystore/show.js | 27 ++++++++++++++++++---- .../java/resources/store/nonjavakeystore/show.html | 12 ++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) (limited to 'qpid/java') 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 index 1985410e57..292169e93c 100644 --- 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 @@ -17,24 +17,43 @@ * under the License. */ -define(["qpid/common/util", "qpid/common/metadata", "dojo/domReady!"], - function (util, metadata) +define(["qpid/common/util", "qpid/common/metadata", "qpid/management/UserPreferences", "dojox/html/entities", "dojo/domReady!"], + function (util, metadata, UserPreferences, entities) { + function toDate(value) + { + return value ? entities.encode(String(UserPreferences.formatDateTime(value))) : ""; + } + + var dateFields = ["certificateValidEnd","certificateValidStart"]; + function NonJavaKeyStore(data) { this.fields = []; var attributes = metadata.getMetaData("KeyStore", "NonJavaKeyStore").attributes; for(var name in attributes) { - this.fields.push(name); + if (dateFields.indexOf(name) == -1) + { + this.fields.push(name); + } } - util.buildUI(data.containerNode, data.parent, "store/nonjavakeystore/show.html", this.fields, this); + var allFields = this.fields.concat(dateFields); + util.buildUI(data.containerNode, data.parent, "store/nonjavakeystore/show.html",allFields, this); } NonJavaKeyStore.prototype.update = function(data) { util.updateUI(data, this.fields, this); + if (data) + { + for(var idx in dateFields) + { + var name = dateFields[idx]; + this[name].innerHTML = toDate(data[name]); + } + } } return NonJavaKeyStore; 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 index e0dd896d7b..51ebd06012 100644 --- 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 @@ -30,6 +30,18 @@
Intermediate Certificate:
+
+
Subject:
+
+
+
+
Certificate valid to:
+
+
+
+
Certificate valid from:
+
+
-- cgit v1.2.1 From 5e05fa8c493ac30f80f6998ad928025136b32d5e Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Sat, 31 Jan 2015 01:30:10 +0000 Subject: QPID-6346: Create keystore/trustore tab UI only once git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1656131 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/resources/js/qpid/management/KeyStore.js | 13 +++++++---- .../resources/js/qpid/management/TrustStore.js | 26 +++++++++++++--------- 2 files changed, 24 insertions(+), 15 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/KeyStore.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/KeyStore.js index 6cb9ad727d..0f23053c2d 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/KeyStore.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/KeyStore.js @@ -54,10 +54,8 @@ define(["dojo/dom", parser.parse(contentPane.containerNode); that.keyStoreUpdater = new KeyStoreUpdater(contentPane.containerNode, that.modelObj, that.controller, that.url); - - updater.add( that.keyStoreUpdater ); - that.keyStoreUpdater.update(); + updater.add( that.keyStoreUpdater ); var deleteKeyStoreButton = query(".deleteStoreButton", contentPane.containerNode)[0]; var node = registry.byNode(deleteKeyStoreButton); @@ -132,13 +130,20 @@ define(["dojo/dom", that.keyStoreData = data[0]; that.updateHeader(); - require(["qpid/management/store/" + encodeURIComponent(that.keyStoreData.type.toLowerCase()) + "/show"], + if (that.details) + { + that.details.update(that.keyStoreData); + } + else + { + require(["qpid/management/store/" + encodeURIComponent(that.keyStoreData.type.toLowerCase()) + "/show"], function(DetailsUI) { that.details = new DetailsUI({containerNode:that.keyStoreDetailsContainer, parent: that}); that.details.update(that.keyStoreData); } ); + } }); }; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/TrustStore.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/TrustStore.js index f3fa06ccba..82e2b204f9 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/TrustStore.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/TrustStore.js @@ -54,10 +54,8 @@ define(["dojo/dom", parser.parse(contentPane.containerNode); that.keyStoreUpdater = new KeyStoreUpdater(contentPane.containerNode, that.modelObj, that.controller, that.url); - - updater.add( that.keyStoreUpdater ); - that.keyStoreUpdater.update(); + updater.add( that.keyStoreUpdater ); var deleteTrustStoreButton = query(".deleteStoreButton", contentPane.containerNode)[0]; var node = registry.byNode(deleteTrustStoreButton); @@ -129,14 +127,20 @@ define(["dojo/dom", { that.trustStoreData = data[0]; that.updateHeader(); - - require(["qpid/management/store/" + encodeURIComponent(that.trustStoreData.type.toLowerCase()) + "/show"], - function(DetailsUI) - { - that.details = new DetailsUI({containerNode:that.keyStoreDetailsContainer, parent: that}); - that.details.update(that.trustStoreData); - } - ); + if (that.details) + { + that.details.update(that.trustStoreData); + } + else + { + require(["qpid/management/store/" + encodeURIComponent(that.trustStoreData.type.toLowerCase()) + "/show"], + function(DetailsUI) + { + that.details = new DetailsUI({containerNode:that.keyStoreDetailsContainer, parent: that}); + that.details.update(that.trustStoreData); + } + ); + } }); }; -- cgit v1.2.1 From 82e0493a76c0ab34bb949e010dfe64f8dc8dba66 Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Sat, 31 Jan 2015 12:02:43 +0000 Subject: QPID-6349 : [JMS AMQP 1.0 Client] Add ability to change the SSL enabled protocols used on the SSLSocket git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1656188 13f79535-47bb-0310-9956-ffa450edef68 --- .../amqp_1_0/jms/impl/ConnectionFactoryImpl.java | 224 +++++++++++++++-- .../qpid/amqp_1_0/jms/impl/ConnectionImpl.java | 23 +- .../client/websocket/WebSocketProvider.java | 5 +- .../apache/qpid/amqp_1_0/client/Connection.java | 28 ++- .../apache/qpid/amqp_1_0/client/SSLOptions.java | 79 ++++++ .../org/apache/qpid/amqp_1_0/client/SSLUtil.java | 7 +- .../qpid/amqp_1_0/client/TCPTransportProvider.java | 273 +++++++++++++++++++++ .../client/TCPTransportProviderFactory.java | 2 +- .../qpid/amqp_1_0/client/TCPTransportProvier.java | 246 ------------------- .../qpid/amqp_1_0/client/TransportProvider.java | 1 + 10 files changed, 610 insertions(+), 278 deletions(-) create mode 100644 qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SSLOptions.java create mode 100644 qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProvider.java delete mode 100644 qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProvier.java (limited to 'qpid/java') diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java index cf80bb3bd5..3bf9efd3d9 100644 --- a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java +++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java @@ -40,6 +40,7 @@ import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManagerFactory; +import org.apache.qpid.amqp_1_0.client.SSLOptions; import org.apache.qpid.amqp_1_0.client.SSLUtil; import org.apache.qpid.amqp_1_0.jms.ConnectionFactory; @@ -66,9 +67,15 @@ public class ConnectionFactoryImpl implements ConnectionFactory, TopicConnection private String _keyStoreCertAlias; private String _trustStorePath; private String _trustStorePassword; + private String _sslContextProtocol; + private String _sslContextProvider; + private String _sslEnabledProtocols; + private String _sslDisabledProtocols; + + + private SSLContext _sslContext; - private String _sslProtocol; - private String _sslProvider; + private SSLOptions _sslOptions; public ConnectionFactoryImpl(final String host, @@ -166,8 +173,9 @@ public class ConnectionFactoryImpl implements ConnectionFactory, TopicConnection _trustStorePath,_trustStorePassword, KeyStore.getDefaultType(), TrustManagerFactory.getDefaultAlgorithm(), - _sslProtocol, - _sslProvider); + _sslContextProtocol, + _sslContextProvider + ); if(username == null && _keyStoreCertAlias != null) { X509Certificate[] certs = SSLUtil.getClientCertificates(_keyStoreCertAlias, @@ -202,6 +210,7 @@ public class ConnectionFactoryImpl implements ConnectionFactory, TopicConnection connection.setTopicPrefix(_topicPrefix); connection.setUseBinaryMessageId(_useBinaryMessageId); connection.setSyncPublish(_syncPublish); + connection.setSslOptions(_sslOptions); if(_maxPrefetch != 0) { connection.setMaxPrefetch(_maxPrefetch); @@ -224,14 +233,14 @@ public class ConnectionFactoryImpl implements ConnectionFactory, TopicConnection _keyStorePassword = keyStorePassword; } - public void setSslProtocol(final String sslProtocol) + public void setSslContextProtocol(final String sslContextProtocol) { - _sslProtocol = sslProtocol; + _sslContextProtocol = sslContextProtocol; } - public void setSslProvider(final String sslProvider) + public void setSslContextProvider(final String sslContextProvider) { - _sslProvider = sslProvider; + _sslContextProvider = sslContextProvider; } public void setKeyStoreCertAlias(final String keyStoreCertAlias) @@ -266,8 +275,10 @@ public class ConnectionFactoryImpl implements ConnectionFactory, TopicConnection public String keyStorePath; public String keyStorePassword; public String keyStoreCertAlias; - public String sslProvider; - public String sslProtocol; + public String sslContextProvider; + public String sslContextProtocol; + public String sslEnabledProtocols; + public String sslDisabledProtocols; } @@ -405,18 +416,32 @@ public class ConnectionFactoryImpl implements ConnectionFactory, TopicConnection options.keyStoreCertAlias = value; } }, - new OptionSetter("ssl-provider","") + new OptionSetter("ssl-context-provider","") + { + public void setOption(final ConnectionOptions options, final String value) throws MalformedURLException + { + options.sslContextProvider = value; + } + }, + new OptionSetter("ssl-context-protocol","") { public void setOption(final ConnectionOptions options, final String value) throws MalformedURLException { - options.sslProvider = value; + options.sslContextProtocol = value; } }, - new OptionSetter("ssl-protocol","") + new OptionSetter("ssl-enabled-protocols","") { public void setOption(final ConnectionOptions options, final String value) throws MalformedURLException { - options.sslProtocol = value; + options.sslEnabledProtocols = value; + } + }, + new OptionSetter("ssl-disabled-protocols","") + { + public void setOption(final ConnectionOptions options, final String value) throws MalformedURLException + { + options.sslDisabledProtocols = value; } } @@ -527,13 +552,21 @@ public class ConnectionFactoryImpl implements ConnectionFactory, TopicConnection { connectionFactory.setTrustStorePassword(options.trustStorePassword); } - if (options.sslProvider != null) + if (options.sslContextProvider != null) + { + connectionFactory.setSslContextProvider(options.sslContextProvider); + } + if (options.sslContextProtocol != null) { - connectionFactory.setSslProvider(options.sslProvider); + connectionFactory.setSslContextProtocol(options.sslContextProtocol); } - if (options.sslProtocol != null) + if (options.sslEnabledProtocols != null) { - connectionFactory.setSslProtocol(options.sslProtocol); + connectionFactory.setSslEnabledProtocols(options.sslEnabledProtocols); + } + if (options.sslDisabledProtocols != null) + { + connectionFactory.setSslDisabledProtocols(options.sslDisabledProtocols); } return connectionFactory; @@ -598,5 +631,160 @@ public class ConnectionFactoryImpl implements ConnectionFactory, TopicConnection _syncPublish = syncPublish; } + public String getSslContextProvider() + { + return _sslContextProvider; + } + + public String getSslContextProtocol() + { + return _sslContextProtocol; + } + + public String getTrustStorePassword() + { + return _trustStorePassword; + } + + public String getTrustStorePath() + { + return _trustStorePath; + } + + public String getKeyStoreCertAlias() + { + return _keyStoreCertAlias; + } + + public String getKeyStorePassword() + { + return _keyStorePassword; + } + + public String getKeyStorePath() + { + return _keyStorePath; + } + + public int getMaxPrefetch() + { + return _maxPrefetch; + } + + public int getMaxSessions() + { + return _maxSessions; + } + + public Boolean getSyncPublish() + { + return _syncPublish; + } + + public boolean isUseBinaryMessageId() + { + return _useBinaryMessageId; + } + + public boolean isSsl() + { + return _ssl; + } + + public String getRemoteHost() + { + return _remoteHost; + } + + public String getClientId() + { + return _clientId; + } + + public String getPassword() + { + return _password; + } + + public String getUsername() + { + return _username; + } + + public int getPort() + { + return _port; + } + + public String getHost() + { + return _host; + } + + public String getProtocol() + { + return _protocol; + } + + public void setHost(final String host) + { + _host = host; + } + + public void setPort(final int port) + { + _port = port; + } + + public void setUsername(final String username) + { + _username = username; + } + + public void setPassword(final String password) + { + _password = password; + } + + public void setClientId(final String clientId) + { + _clientId = clientId; + } + public void setRemoteHost(final String remoteHost) + { + _remoteHost = remoteHost; + } + + public void setSsl(final boolean ssl) + { + _ssl = ssl; + } + + public void setMaxSessions(final int maxSessions) + { + _maxSessions = maxSessions; + } + + public String getSslEnabledProtocols() + { + return _sslEnabledProtocols; + } + + public void setSslEnabledProtocols(final String sslEnabledProtocols) + { + _sslEnabledProtocols = sslEnabledProtocols; + _sslOptions = new SSLOptions(_sslEnabledProtocols, _sslDisabledProtocols); + } + + public String getSslDisabledProtocols() + { + return _sslDisabledProtocols; + } + + public void setSslDisabledProtocols(final String sslDisabledProtocols) + { + _sslDisabledProtocols = sslDisabledProtocols; + _sslOptions = new SSLOptions(_sslEnabledProtocols, _sslDisabledProtocols); + } } diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java index 9722286d41..ca3d3dfbcd 100644 --- a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java +++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java @@ -41,6 +41,7 @@ import javax.net.ssl.SSLContext; import org.apache.qpid.amqp_1_0.client.ConnectionErrorException; import org.apache.qpid.amqp_1_0.client.ConnectionException; +import org.apache.qpid.amqp_1_0.client.SSLOptions; import org.apache.qpid.amqp_1_0.jms.Connection; import org.apache.qpid.amqp_1_0.jms.ConnectionMetaData; import org.apache.qpid.amqp_1_0.jms.Session; @@ -77,11 +78,7 @@ public class ConnectionImpl implements Connection, QueueConnection, TopicConnect private Boolean _syncPublish; private int _maxSessions; private int _maxPrefetch; - - public void setMaxPrefetch(final int maxPrefetch) - { - _maxPrefetch = maxPrefetch; - } + private SSLOptions _sslOptions; private static enum State { @@ -175,6 +172,7 @@ public class ConnectionImpl implements Connection, QueueConnection, TopicConnect { _conn = new org.apache.qpid.amqp_1_0.client.Connection(_protocol, _host, _port, _username, _password, container, _remoteHost, _sslContext, + _sslOptions, _maxSessions - 1); _conn.setConnectionErrorTask(new ConnectionErrorTask()); // TODO - retrieve negotiated AMQP version @@ -674,6 +672,21 @@ public class ConnectionImpl implements Connection, QueueConnection, TopicConnect return _syncPublish; } + public void setMaxPrefetch(final int maxPrefetch) + { + _maxPrefetch = maxPrefetch; + } + + public void setSslOptions(final SSLOptions sslOptions) + { + _sslOptions = sslOptions; + } + + public SSLOptions getSslOptions() + { + return _sslOptions; + } + private class ConnectionErrorTask implements Runnable { diff --git a/qpid/java/amqp-1-0-client-websocket/src/main/java/org/apache/qpid/amqp_1_0/client/websocket/WebSocketProvider.java b/qpid/java/amqp-1-0-client-websocket/src/main/java/org/apache/qpid/amqp_1_0/client/websocket/WebSocketProvider.java index af871d2bc4..8df20d495c 100644 --- a/qpid/java/amqp-1-0-client-websocket/src/main/java/org/apache/qpid/amqp_1_0/client/websocket/WebSocketProvider.java +++ b/qpid/java/amqp-1-0-client-websocket/src/main/java/org/apache/qpid/amqp_1_0/client/websocket/WebSocketProvider.java @@ -33,6 +33,7 @@ import org.eclipse.jetty.websocket.WebSocketClient; import org.eclipse.jetty.websocket.WebSocketClientFactory; import org.apache.qpid.amqp_1_0.client.ConnectionException; +import org.apache.qpid.amqp_1_0.client.SSLOptions; import org.apache.qpid.amqp_1_0.client.SSLUtil; import org.apache.qpid.amqp_1_0.client.TransportProvider; import org.apache.qpid.amqp_1_0.codec.FrameWriter; @@ -111,7 +112,9 @@ class WebSocketProvider implements TransportProvider public void connect(final ConnectionEndpoint conn, final String address, final int port, - final SSLContext sslContext, final ExceptionHandler exceptionHandler) throws ConnectionException + final SSLContext sslContext, + final SSLOptions sslOptions, + final ExceptionHandler exceptionHandler) throws ConnectionException { try diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Connection.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Connection.java index 9319d4ddff..69b4939070 100644 --- a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Connection.java +++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Connection.java @@ -148,11 +148,27 @@ public class Connection implements ExceptionHandler final String remoteHost, final SSLContext sslContext, final int channelMax) throws ConnectionException + { + this(protocol, address, port, username, password,container,remoteHost,sslContext, + null, channelMax); + } + + public Connection(final String protocol, + final String address, + final int port, + final String username, + final String password, + final Container container, + final String remoteHost, + final SSLContext sslContext, + final SSLOptions sslOptions, + final int channelMax) throws ConnectionException { this(protocol, address, port, username, password, MAX_FRAME_SIZE,container,remoteHost,sslContext, - channelMax); + sslOptions, channelMax); } + public Connection(final String address, final int port, final String username, @@ -163,7 +179,11 @@ public class Connection implements ExceptionHandler boolean ssl, int channelMax) throws ConnectionException { - this(ssl?"amqp":"amqps",address,port,username,password,maxFrameSize,container,remoteHostname,getSslContext(ssl),channelMax); + this(ssl?"amqp":"amqps",address,port,username,password,maxFrameSize,container, + remoteHostname, + getSslContext(ssl), + null, + channelMax); } private static SSLContext getSslContext(final boolean ssl) throws ConnectionException @@ -187,7 +207,7 @@ public class Connection implements ExceptionHandler final Container container, final String remoteHostname, SSLContext sslContext, - int channelMax) throws ConnectionException + final SSLOptions sslOptions, int channelMax) throws ConnectionException { _address = address; @@ -255,7 +275,7 @@ public class Connection implements ExceptionHandler TransportProvider transportProvider = getTransportProvider(protocol); - transportProvider.connect(_conn,address,port, sslContext, this); + transportProvider.connect(_conn,address,port, sslContext, sslOptions, this); try diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SSLOptions.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SSLOptions.java new file mode 100644 index 0000000000..1558b2043b --- /dev/null +++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SSLOptions.java @@ -0,0 +1,79 @@ +/* + * + * 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.amqp_1_0.client; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class SSLOptions +{ + private final List _enabledProtocols; + private final List _disabledProtocols; + + public SSLOptions(String enabledProtocols, String disabledProtocols) + { + if(enabledProtocols == null) + { + enabledProtocols = System.getProperty("qpid.ssl.enabledProtocols"); + } + + if(disabledProtocols == null) + { + disabledProtocols = System.getProperty("qpid.ssl.disabledProtocols", SSLUtil.SSLV3_PROTOCOL); + } + + if(enabledProtocols == null) + { + _enabledProtocols = null; + } + else + { + _enabledProtocols = Collections.unmodifiableList(Arrays.asList(enabledProtocols.split(","))); + } + + if(disabledProtocols == null) + { + _disabledProtocols = null; + } + else + { + _disabledProtocols = Collections.unmodifiableList(Arrays.asList(disabledProtocols.split(","))); + } + } + + public SSLOptions(final List enabledProtocols, final List disabledProtocols) + { + this._enabledProtocols = enabledProtocols == null ? Collections.emptyList() : Collections.unmodifiableList(new ArrayList<>(enabledProtocols)); + this._disabledProtocols = disabledProtocols == null ? Collections.emptyList() : Collections.unmodifiableList(new ArrayList<>(disabledProtocols)); + } + + public List getEnabledProtocols() + { + return _enabledProtocols; + } + + public List getDisabledProtocols() + { + return _disabledProtocols; + } +} diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SSLUtil.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SSLUtil.java index 64ab59e6b3..7bcf796fa9 100644 --- a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SSLUtil.java +++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SSLUtil.java @@ -118,11 +118,12 @@ public class SSLUtil return sslContext; } - private static SSLContext getSslContext(final String sslProtocol, final String sslProvider) throws NoSuchAlgorithmException + private static SSLContext getSslContext(final String sslProtocol, + final String sslProvider) throws NoSuchAlgorithmException { - final String sslProviderName = System.getProperty("qpid.ssl.provider", sslProvider); - final String sslProtocolName = System.getProperty("qpid.ssl.protocol", sslProtocol); + final String sslProviderName = sslProvider != null ? sslProvider : System.getProperty("qpid.ssl.contextProvider"); + final String sslProtocolName = sslProtocol != null ? sslProtocol : System.getProperty("qpid.ssl.contextProtocol", TRANSPORT_LAYER_SECURITY_CODE); SSLContext sslContext = null; if(sslProviderName != null && sslProtocolName != null) diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProvider.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProvider.java new file mode 100644 index 0000000000..855d619081 --- /dev/null +++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProvider.java @@ -0,0 +1,273 @@ +/* + * + * 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.amqp_1_0.client; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import java.net.SocketTimeoutException; +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.atomic.AtomicLong; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; + +import org.apache.qpid.amqp_1_0.framing.ConnectionHandler; +import org.apache.qpid.amqp_1_0.framing.ExceptionHandler; +import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint; +import org.apache.qpid.amqp_1_0.type.FrameBody; +import org.apache.qpid.amqp_1_0.type.SaslFrameBody; + +class TCPTransportProvider implements TransportProvider +{ + private static final Logger RAW_LOGGER = Logger.getLogger("RAW"); + + private Socket _socket; + private final String _transport; + + // Defines read socket timeout in milliseconds. A value of 0 means that the socket + // read will block forever. Default value is set to 10000, which is 10 seconds. + private int _readTimeout = Integer.getInteger("qpid.connection_read_timeout", 10000); + + // Defines the max idle read timeout in milliseconds before the connection is closed down in + // the event of a SocketTimeoutException. A value of -1L will disable idle read timeout checking. + // Default value is set to -1L, which means disable idle read checks. + private long _readIdleTimeout = Long.getLong("qpid.connection_read_idle_timeout", -1L); + private final AtomicLong _threadNameIndex = new AtomicLong(); + + public TCPTransportProvider(final String transport) + { + _transport = transport; + } + + @Override + public void connect(final ConnectionEndpoint conn, + final String address, + final int port, + final SSLContext sslContext, + final SSLOptions sslOptions, final ExceptionHandler exceptionHandler) throws ConnectionException + { + try + { + if(sslContext != null) + { + final SSLSocketFactory socketFactory = sslContext.getSocketFactory(); + SSLSocket sslSocket = (SSLSocket) socketFactory.createSocket(address, port); + if(sslOptions == null) + { + SSLUtil.removeSSLv3Support(sslSocket); + } + else + { + final List enabledProtocols = sslOptions.getEnabledProtocols(); + final List disabledProtocols = sslOptions.getDisabledProtocols(); + + if(enabledProtocols != null && !enabledProtocols.isEmpty()) + { + final Set supportedSuites = + new HashSet<>(Arrays.asList(sslSocket.getSupportedProtocols())); + supportedSuites.retainAll(enabledProtocols); + sslSocket.setEnabledProtocols(supportedSuites.toArray(new String[supportedSuites.size()])); + } + + if(disabledProtocols != null && !disabledProtocols.isEmpty()) + { + final Set enabledSuites = new HashSet<>(Arrays.asList(sslSocket.getEnabledProtocols())); + enabledSuites.removeAll(disabledProtocols); + sslSocket.setEnabledProtocols(enabledSuites.toArray(new String[enabledSuites.size()])); + } + } + sslSocket.startHandshake(); + conn.setExternalPrincipal(sslSocket.getSession().getLocalPrincipal()); + _socket=sslSocket; + } + else + { + _socket = new Socket(address, port); + } + // set socket read timeout + _socket.setSoTimeout(_readTimeout); + + conn.setRemoteAddress(_socket.getRemoteSocketAddress()); + + ConnectionHandler.FrameOutput out = new ConnectionHandler.FrameOutput(conn); + + ConnectionHandler.BytesSource src; + + if(conn.requiresSASL()) + { + ConnectionHandler.FrameOutput saslOut = new ConnectionHandler.FrameOutput(conn); + + src = new ConnectionHandler.SequentialBytesSource(new ConnectionHandler.HeaderBytesSource(conn, (byte)'A', + (byte)'M', + (byte)'Q', + (byte)'P', + (byte)3, + (byte)1, + (byte)0, + (byte)0), + new ConnectionHandler.FrameToBytesSourceAdapter(saslOut.asFrameSource(),conn.getDescribedTypeRegistry()), + new ConnectionHandler.HeaderBytesSource(conn, (byte)'A', + (byte)'M', + (byte)'Q', + (byte)'P', + (byte)0, + (byte)1, + (byte)0, + (byte)0), + new ConnectionHandler.FrameToBytesSourceAdapter(out.asFrameSource(),conn.getDescribedTypeRegistry()) + ); + + conn.setSaslFrameOutput(saslOut); + } + else + { + src = new ConnectionHandler.SequentialBytesSource(new ConnectionHandler.HeaderBytesSource(conn,(byte)'A', + (byte)'M', + (byte)'Q', + (byte)'P', + (byte)0, + (byte)1, + (byte)0, + (byte)0), + new ConnectionHandler.FrameToBytesSourceAdapter(out.asFrameSource(),conn.getDescribedTypeRegistry()) + ); + } + + + final OutputStream outputStream = _socket.getOutputStream(); + ConnectionHandler.BytesOutputHandler outputHandler = + new ConnectionHandler.BytesOutputHandler(outputStream, src, conn, exceptionHandler); + long threadIndex = _threadNameIndex.getAndIncrement(); + Thread outputThread = new Thread(outputHandler, "QpidConnectionOutputThread-"+threadIndex); + + outputThread.setDaemon(true); + outputThread.start(); + conn.setFrameOutputHandler(out); + + + final ConnectionHandler handler = new ConnectionHandler(conn); + final InputStream inputStream = _socket.getInputStream(); + + Thread inputThread = new Thread(new Runnable() + { + + public void run() + { + try + { + doRead(conn, handler, inputStream); + } + finally + { + if(conn.closedForInput() && conn.closedForOutput()) + { + close(); + } + } + } + },"QpidConnectionInputThread-"+threadIndex); + + inputThread.setDaemon(true); + inputThread.start(); + + } + catch (IOException e) + { + throw new ConnectionException(e); + } + } + + @Override + public void close() + { + try + { + _socket.close(); + } + catch (IOException e) + { + RAW_LOGGER.log(Level.WARNING, "Unexpected Error during TCPTransportProvider socket close", e); + } + } + + private void doRead(final ConnectionEndpoint conn, final ConnectionHandler handler, final InputStream inputStream) + { + byte[] buf = new byte[2<<15]; + + + try + { + int read; + boolean done = false; + long lastReadTime = System.currentTimeMillis(); + while(!handler.isDone()) + { + try + { + read = inputStream.read(buf); + if(read == -1) + { + break; + } + lastReadTime = System.currentTimeMillis(); + + ByteBuffer bbuf = ByteBuffer.wrap(buf, 0, read); + while(bbuf.hasRemaining() && !handler.isDone()) + { + handler.parse(bbuf); + } + + } + catch(SocketTimeoutException e) + { + // Note that a SocketTimeoutException could only occur if _readTimeout > 0. + // Only perform idle read timeout checking if _readIdleTimeout is greater than -1 + if(_readIdleTimeout > -1 && (System.currentTimeMillis() - lastReadTime >= _readIdleTimeout)){ + // break out of while loop and close down connection + break; + } + } + } + if(!handler.isDone()) + { + conn.inputClosed(); + if(conn.getConnectionEventListener() != null) + { + conn.getConnectionEventListener().closeReceived(); + } + } + } + catch (IOException e) + { + conn.inputClosed(); + e.printStackTrace(); + } + } +} diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProviderFactory.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProviderFactory.java index 2327a3860a..a29bbcd232 100644 --- a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProviderFactory.java +++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProviderFactory.java @@ -34,6 +34,6 @@ public class TCPTransportProviderFactory implements TransportProviderFactory @Override public TransportProvider getProvider(final String transport) { - return new TCPTransportProvier(transport); + return new TCPTransportProvider(transport); } } diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProvier.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProvier.java deleted file mode 100644 index 720f12dc0d..0000000000 --- a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProvier.java +++ /dev/null @@ -1,246 +0,0 @@ -/* - * - * 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.amqp_1_0.client; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.Socket; -import java.net.SocketTimeoutException; -import java.nio.ByteBuffer; -import java.util.concurrent.atomic.AtomicLong; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; - -import org.apache.qpid.amqp_1_0.framing.ConnectionHandler; -import org.apache.qpid.amqp_1_0.framing.ExceptionHandler; -import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint; -import org.apache.qpid.amqp_1_0.type.FrameBody; -import org.apache.qpid.amqp_1_0.type.SaslFrameBody; - -class TCPTransportProvier implements TransportProvider -{ - private static final Logger RAW_LOGGER = Logger.getLogger("RAW"); - - private Socket _socket; - private final String _transport; - - // Defines read socket timeout in milliseconds. A value of 0 means that the socket - // read will block forever. Default value is set to 10000, which is 10 seconds. - private int _readTimeout = Integer.getInteger("qpid.connection_read_timeout", 10000); - - // Defines the max idle read timeout in milliseconds before the connection is closed down in - // the event of a SocketTimeoutException. A value of -1L will disable idle read timeout checking. - // Default value is set to -1L, which means disable idle read checks. - private long _readIdleTimeout = Long.getLong("qpid.connection_read_idle_timeout", -1L); - private final AtomicLong _threadNameIndex = new AtomicLong(); - - public TCPTransportProvier(final String transport) - { - _transport = transport; - } - - @Override - public void connect(final ConnectionEndpoint conn, - final String address, - final int port, - final SSLContext sslContext, - final ExceptionHandler exceptionHandler) throws ConnectionException - { - try - { - if(sslContext != null) - { - final SSLSocketFactory socketFactory = sslContext.getSocketFactory(); - SSLSocket sslSocket = (SSLSocket) socketFactory.createSocket(address, port); - SSLUtil.removeSSLv3Support(sslSocket); - sslSocket.startHandshake(); - conn.setExternalPrincipal(sslSocket.getSession().getLocalPrincipal()); - _socket=sslSocket; - } - else - { - _socket = new Socket(address, port); - } - // set socket read timeout - _socket.setSoTimeout(_readTimeout); - - conn.setRemoteAddress(_socket.getRemoteSocketAddress()); - - ConnectionHandler.FrameOutput out = new ConnectionHandler.FrameOutput(conn); - - ConnectionHandler.BytesSource src; - - if(conn.requiresSASL()) - { - ConnectionHandler.FrameOutput saslOut = new ConnectionHandler.FrameOutput(conn); - - src = new ConnectionHandler.SequentialBytesSource(new ConnectionHandler.HeaderBytesSource(conn, (byte)'A', - (byte)'M', - (byte)'Q', - (byte)'P', - (byte)3, - (byte)1, - (byte)0, - (byte)0), - new ConnectionHandler.FrameToBytesSourceAdapter(saslOut.asFrameSource(),conn.getDescribedTypeRegistry()), - new ConnectionHandler.HeaderBytesSource(conn, (byte)'A', - (byte)'M', - (byte)'Q', - (byte)'P', - (byte)0, - (byte)1, - (byte)0, - (byte)0), - new ConnectionHandler.FrameToBytesSourceAdapter(out.asFrameSource(),conn.getDescribedTypeRegistry()) - ); - - conn.setSaslFrameOutput(saslOut); - } - else - { - src = new ConnectionHandler.SequentialBytesSource(new ConnectionHandler.HeaderBytesSource(conn,(byte)'A', - (byte)'M', - (byte)'Q', - (byte)'P', - (byte)0, - (byte)1, - (byte)0, - (byte)0), - new ConnectionHandler.FrameToBytesSourceAdapter(out.asFrameSource(),conn.getDescribedTypeRegistry()) - ); - } - - - final OutputStream outputStream = _socket.getOutputStream(); - ConnectionHandler.BytesOutputHandler outputHandler = - new ConnectionHandler.BytesOutputHandler(outputStream, src, conn, exceptionHandler); - long threadIndex = _threadNameIndex.getAndIncrement(); - Thread outputThread = new Thread(outputHandler, "QpidConnectionOutputThread-"+threadIndex); - - outputThread.setDaemon(true); - outputThread.start(); - conn.setFrameOutputHandler(out); - - - final ConnectionHandler handler = new ConnectionHandler(conn); - final InputStream inputStream = _socket.getInputStream(); - - Thread inputThread = new Thread(new Runnable() - { - - public void run() - { - try - { - doRead(conn, handler, inputStream); - } - finally - { - if(conn.closedForInput() && conn.closedForOutput()) - { - close(); - } - } - } - },"QpidConnectionInputThread-"+threadIndex); - - inputThread.setDaemon(true); - inputThread.start(); - - } - catch (IOException e) - { - throw new ConnectionException(e); - } - } - - @Override - public void close() - { - try - { - _socket.close(); - } - catch (IOException e) - { - RAW_LOGGER.log(Level.WARNING, "Unexpected Error during TCPTransportProvider socket close", e); - } - } - - private void doRead(final ConnectionEndpoint conn, final ConnectionHandler handler, final InputStream inputStream) - { - byte[] buf = new byte[2<<15]; - - - try - { - int read; - boolean done = false; - long lastReadTime = System.currentTimeMillis(); - while(!handler.isDone()) - { - try - { - read = inputStream.read(buf); - if(read == -1) - { - break; - } - lastReadTime = System.currentTimeMillis(); - - ByteBuffer bbuf = ByteBuffer.wrap(buf, 0, read); - while(bbuf.hasRemaining() && !handler.isDone()) - { - handler.parse(bbuf); - } - - } - catch(SocketTimeoutException e) - { - // Note that a SocketTimeoutException could only occur if _readTimeout > 0. - // Only perform idle read timeout checking if _readIdleTimeout is greater than -1 - if(_readIdleTimeout > -1 && (System.currentTimeMillis() - lastReadTime >= _readIdleTimeout)){ - // break out of while loop and close down connection - break; - } - } - } - if(!handler.isDone()) - { - conn.inputClosed(); - if(conn.getConnectionEventListener() != null) - { - conn.getConnectionEventListener().closeReceived(); - } - } - } - catch (IOException e) - { - conn.inputClosed(); - e.printStackTrace(); - } - } -} diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TransportProvider.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TransportProvider.java index 71628679f8..e8ea53b451 100644 --- a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TransportProvider.java +++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TransportProvider.java @@ -31,6 +31,7 @@ public interface TransportProvider String address, int port, SSLContext sslContext, + final SSLOptions sslOptions, ExceptionHandler exceptionHandler) throws ConnectionException; void close(); -- cgit v1.2.1 From 61753c78d5b7551a53b614a093e2e5483af4289b Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Mon, 2 Feb 2015 14:43:34 +0000 Subject: QPID-6346: Improve field labels and prompt messages in UI for non java keystores/truststores, display timezone for certificate start/end time git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1656477 13f79535-47bb-0310-9956-ffa450edef68 --- .../qpid/management/store/nonjavakeystore/show.js | 2 +- .../management/store/nonjavatruststore/show.js | 7 ++++--- .../java/resources/store/nonjavakeystore/add.html | 24 +++++++++++----------- .../resources/store/nonjavatruststore/add.html | 8 ++++---- 4 files changed, 21 insertions(+), 20 deletions(-) (limited to 'qpid/java') 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 index 292169e93c..c31b020e3e 100644 --- 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 @@ -23,7 +23,7 @@ define(["qpid/common/util", "qpid/common/metadata", "qpid/management/UserPrefere function toDate(value) { - return value ? entities.encode(String(UserPreferences.formatDateTime(value))) : ""; + return value ? entities.encode(String(UserPreferences.formatDateTime(value, {addOffset: true, appendTimeZone: true}))) : ""; } var dateFields = ["certificateValidEnd","certificateValidStart"]; 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 index ac210ea4be..89b0b5d88f 100644 --- 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 @@ -37,14 +37,15 @@ define(["dojo/query", this.fields.push(name); } util.buildUI(data.containerNode, data.parent, "store/nonjavatruststore/show.html", this.fields, this); - var gridNode = query(".details", data.containerNode)[0] + var gridNode = query(".details", data.containerNode)[0]; + var dateTimeFormatter = function(value){ return value ? UserPreferences.formatDateTime(value, {addOffset: true, appendTimeZone: true}) : "";}; 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) : "";}} + { name: 'Valid from', field: 'VALID_START', width: '25%', formatter: dateTimeFormatter }, + { name: 'Valid to', field: 'VALID_END', width: '25%', formatter: dateTimeFormatter} ]); } 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 index f7ae4d3f76..b7af1c6b47 100644 --- 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 @@ -22,45 +22,45 @@
-
Private Key*:
+
Private Key (Server path or upload)*:
+ promptMessage: 'Enter broker server path to file containing unencrypted private key in DER or PEM format', + title: 'Enter broker server path to file containing unencrypted private key in DER or PEM format'" />
-
Certificate*:
+
Certificate (Server path or upload)*:
+ promptMessage: 'Enter broker server path to file containing certificate in DER or PEM format', + title: 'Enter broker server path to file containing certificate in DER or PEM format'" />
-
Intermediate Certificate(s):
+
Intermediate Certificates (Server path or upload):
+ promptMessage: 'Enter broker server path to file containing intermediate certificates in DER or PEM format', + title: 'Enter path to file containing intermediate certificates in format DER or PEM'" />
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 index ba5aee0444..4ec2678575 100644 --- 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 @@ -22,16 +22,16 @@
-
Certificate URL or Path*:
+
Certificates (Server path or upload)*:
+ promptMessage: 'Enter broker server path to file containing certificate(s) in DER or PEM format', + title: 'Enter broker server path to file containing certificate(s) in DER or PEM format'" />
-- cgit v1.2.1 From 144d624d33077723fda55e4640157dde7c56a314 Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Mon, 2 Feb 2015 17:39:28 +0000 Subject: QPID-6351: Fix preferences provider widget to update UI every time on setting or loading data git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1656522 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/resources/js/qpid/management/addAuthenticationProvider.js | 1 + .../js/qpid/management/preferencesprovider/PreferencesProviderForm.js | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'qpid/java') 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 index 1b38c257fb..17b7edcec9 100644 --- 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 @@ -113,6 +113,7 @@ define(["dojo/_base/xhr", else { this.preferencesProviderForm.reset(); + this.preferencesProviderForm.preferencesProviderNameWidget.set("value", actualData.name); } this.authenticationProviderName.set("value", actualData.name); } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/PreferencesProviderForm.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/PreferencesProviderForm.js index 96c336ff2c..ef8273328b 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/PreferencesProviderForm.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/preferencesprovider/PreferencesProviderForm.js @@ -125,7 +125,8 @@ function (util, metadata, xhr, declare, array, domConstruct, win, query, json, _ this.preferencesProviderNameWidget.set("value", data.name); if (data.type == this.preferencesProviderTypeWidget.get("value")) { - this._toggleWidgets(data.type); + // re-create UI anyway + this._preferencesProviderTypeChanged(data.type); } else { -- cgit v1.2.1 From 2ff075fb2760b003e29b2a5235519a30a6da9395 Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Mon, 2 Feb 2015 20:50:15 +0000 Subject: QPID-6341 : Add test and allow a default alt text for oversized values git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1656566 13f79535-47bb-0310-9956-ffa450edef68 --- .../server/model/ConfiguredAutomatedAttribute.java | 6 ++ .../server/model/ConfiguredDerivedAttribute.java | 7 ++ .../server/model/ConfiguredObjectAttribute.java | 2 + .../apache/qpid/server/model/ManagedAttribute.java | 1 + .../rest/ConfiguredObjectToMapConverter.java | 7 +- .../rest/ConfiguredObjectToMapConverterTest.java | 80 ++++++++++++++++++++++ 6 files changed, 102 insertions(+), 1 deletion(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredAutomatedAttribute.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredAutomatedAttribute.java index f65688fea7..9fca898dc0 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredAutomatedAttribute.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredAutomatedAttribute.java @@ -129,6 +129,12 @@ public class ConfiguredAutomatedAttribute extend return _annotation.oversize(); } + @Override + public String getOversizedAltText() + { + return _annotation.oversizedAltText(); + } + public String getDescription() { return _annotation.description(); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredDerivedAttribute.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredDerivedAttribute.java index 9a53553c86..71488edb8c 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredDerivedAttribute.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredDerivedAttribute.java @@ -60,6 +60,13 @@ public class ConfiguredDerivedAttribute extends return _annotation.oversize(); } + @Override + public String getOversizedAltText() + { + return ""; + } + + public String getDescription() { return _annotation.description(); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectAttribute.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectAttribute.java index f03a036191..73b7839a8e 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectAttribute.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectAttribute.java @@ -45,6 +45,8 @@ public abstract class ConfiguredObjectAttribute e public abstract boolean isOversized(); + public abstract String getOversizedAltText(); + public abstract String getDescription(); public T convert(final Object value, C object) diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java index 75c349d9c0..05b2c610ba 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java @@ -36,4 +36,5 @@ public @interface ManagedAttribute String description() default ""; String[] validValues() default {}; boolean oversize() default false; + String oversizedAltText() default ""; } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java index 24fb272186..28bbac2a61 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java @@ -164,7 +164,12 @@ public class ConfiguredObjectToMapConverter String valueString = String.valueOf(value); if(valueString.length() > oversizeThreshold) { - object.put(name, String.valueOf(value).substring(0,oversizeThreshold-4) + "..."); + + String replacementValue = "".equals(attribute.getOversizedAltText()) + ? String.valueOf(value).substring(0, oversizeThreshold - 4) + "..." + : attribute.getOversizedAltText(); + + object.put(name, replacementValue); } else { diff --git a/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java index 8687330d49..b5847ad293 100644 --- a/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java +++ b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java @@ -28,6 +28,7 @@ import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -216,6 +217,85 @@ public class ConfiguredObjectToMapConverterTest extends TestCase } + public void testOversizedAttributes() + { + + Model model = createTestModel(); + ConfiguredObjectTypeRegistry typeRegistry = model.getTypeRegistry(); + final Map> attributeTypes = + typeRegistry.getAttributeTypes(TestChild.class); + final ConfiguredObjectAttribute longAttr = mock(ConfiguredObjectAttribute.class); + when(longAttr.isOversized()).thenReturn(true); + when(longAttr.getOversizedAltText()).thenReturn(""); + when(attributeTypes.get(eq("longAttr"))).thenReturn(longAttr); + + TestChild mockChild = mock(TestChild.class); + when(mockChild.getModel()).thenReturn(model); + when(_configuredObject.getModel()).thenReturn(model); + configureMockToReturnOneAttribute(mockChild, "longAttr", "this is not long"); + when(_configuredObject.getChildren(TestChild.class)).thenReturn(Arrays.asList(mockChild)); + + + Map resultMap = _converter.convertObjectToMap(_configuredObject, + ConfiguredObject.class, + 1, + false, + false, + false, + false, + 20); + Object children = resultMap.get("testchilds"); + assertNotNull(children); + assertTrue(children instanceof Collection); + assertTrue(((Collection)children).size()==1); + Object attrs = ((Collection)children).iterator().next(); + assertTrue(attrs instanceof Map); + assertEquals("this is not long", ((Map) attrs).get("longAttr")); + + + + resultMap = _converter.convertObjectToMap(_configuredObject, + ConfiguredObject.class, + 1, + false, + false, + false, + false, + 8); + + children = resultMap.get("testchilds"); + assertNotNull(children); + assertTrue(children instanceof Collection); + assertTrue(((Collection)children).size()==1); + attrs = ((Collection)children).iterator().next(); + assertTrue(attrs instanceof Map); + assertEquals("this...", ((Map) attrs).get("longAttr")); + + + + + when(longAttr.getOversizedAltText()).thenReturn("test alt text"); + + resultMap = _converter.convertObjectToMap(_configuredObject, + ConfiguredObject.class, + 1, + false, + false, + false, + false, + 8); + + children = resultMap.get("testchilds"); + assertNotNull(children); + assertTrue(children instanceof Collection); + assertTrue(((Collection)children).size()==1); + attrs = ((Collection)children).iterator().next(); + assertTrue(attrs instanceof Map); + assertEquals("test alt text", ((Map) attrs).get("longAttr")); + + + } + private Model createTestModel() { Model model = mock(Model.class); -- cgit v1.2.1 From c9c168abe3ab55f9b718b38403ccefa5f7e00ad9 Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Tue, 3 Feb 2015 10:14:38 +0000 Subject: QPID-6353 : [Java Broker] [AMQP 1.0] consumer attempting to drain an empty queue does not send back flow indicating drain is complete git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1656664 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/qpid/server/protocol/v1_0/ConsumerTarget_1_0.java | 5 +++++ .../java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java | 1 + 2 files changed, 6 insertions(+) (limited to 'qpid/java') diff --git a/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConsumerTarget_1_0.java b/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConsumerTarget_1_0.java index c5d9a5e35d..598fce03b9 100644 --- a/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConsumerTarget_1_0.java +++ b/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConsumerTarget_1_0.java @@ -343,6 +343,11 @@ class ConsumerTarget_1_0 extends AbstractConsumerTarget return _link.getSession(); } + public void flush() + { + _consumer.flush(); + } + private class DispositionAction implements UnsettledAction { diff --git a/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java b/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java index 2cfe431979..123d6ac2fb 100644 --- a/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java +++ b/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java @@ -496,6 +496,7 @@ public class SendingLink_1_0 implements SendingLinkListener, Link_1_0, DeliveryS && hasCredit()) { _draining = true; + _target.flush(); } while(!_resumeAcceptedTransfers.isEmpty() && getEndpoint().hasCreditToSend()) -- cgit v1.2.1 From b7ccb75d02b8c30c8e2a631ca7feea7dcda97160 Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Tue, 3 Feb 2015 15:02:36 +0000 Subject: QPID-6354: Fix validation of certificates and private keys for non java keystores/truststores git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1656751 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/java/broker-core/pom.xml | 3 + .../qpid/server/security/NonJavaKeyStoreImpl.java | 13 +- .../server/security/NonJavaTrustStoreImpl.java | 9 +- .../qpid/server/security/NonJavaKeyStoreTest.java | 220 +++++++++++++++++++++ .../server/security/NonJavaTrustStoreTest.java | 92 +++++++++ 5 files changed, 325 insertions(+), 12 deletions(-) create mode 100644 qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/NonJavaKeyStoreTest.java create mode 100644 qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/NonJavaTrustStoreTest.java (limited to 'qpid/java') diff --git a/qpid/java/broker-core/pom.xml b/qpid/java/broker-core/pom.xml index 68301f07bd..516ac9a4c4 100644 --- a/qpid/java/broker-core/pom.xml +++ b/qpid/java/broker-core/pom.xml @@ -150,6 +150,9 @@ ${basedir}/src/test/resources + + ${basedir}/../test-profiles/test_resources/ssl + diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/NonJavaKeyStoreImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/NonJavaKeyStoreImpl.java index 6231413dd7..f6298ab383 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/NonJavaKeyStoreImpl.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/NonJavaKeyStoreImpl.java @@ -248,16 +248,16 @@ public class NonJavaKeyStoreImpl extends AbstractConfiguredObject _broker = mock(Broker.class); + private final TaskExecutor _taskExecutor = CurrentThreadTaskExecutor.newStartedInstance(); + private final SecurityManager _securityManager = mock(SecurityManager.class); + private final Model _model = BrokerModel.getInstance(); + private final ConfiguredObjectFactory _factory = _model.getObjectFactory(); + private List _testResources; + + @Override + public void setUp() throws Exception + { + super.setUp(); + + when(_broker.getTaskExecutor()).thenReturn(_taskExecutor); + when(_broker.getModel()).thenReturn(_model); + when(_broker.getSecurityManager()).thenReturn(_securityManager); + _testResources = new ArrayList<>(); + } + + @Override + public void tearDown() throws Exception + { + try + { + super.tearDown(); + } + finally + { + for (File resource: _testResources) + { + try + { + resource.delete(); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + } + + private File[] extractResourcesFromTestKeyStore(boolean pem) throws Exception + { + java.security.KeyStore ks = java.security.KeyStore.getInstance(java.security.KeyStore.getDefaultType()); + try(InputStream is = getClass().getResourceAsStream("/java_broker_keystore.jks")) + { + ks.load(is, KEYSTORE_PASSWORD.toCharArray() ); + } + + + File privateKeyFile = TestFileUtils.createTempFile(this, ".private-key.der"); + try(FileOutputStream kos = new FileOutputStream(privateKeyFile)) + { + Key pvt = ks.getKey("java-broker", KEYSTORE_PASSWORD.toCharArray()); + if (pem) + { + kos.write("-----BEGIN PRIVATE KEY-----\n".getBytes()); + kos.write(Base64.encodeBase64(pvt.getEncoded(), true)); + kos.write("\n-----END PRIVATE KEY-----".getBytes()); + } + else + { + kos.write(pvt.getEncoded()); + } + kos.flush(); + } + + File certificateFile = TestFileUtils.createTempFile(this, ".certificate.der"); + + try(FileOutputStream cos = new FileOutputStream(certificateFile)) + { + Certificate pub = ks.getCertificate("rootca"); + if (pem) + { + cos.write("-----BEGIN CERTIFICATE-----\n".getBytes()); + cos.write(Base64.encodeBase64(pub.getEncoded(), true)); + cos.write("\n-----END CERTIFICATE-----".getBytes()); + } + else + { + cos.write(pub.getEncoded()); + } + cos.flush(); + } + + return new File[]{privateKeyFile,certificateFile}; + } + + public void testCreationOfTrustStoreFromValidPrivateKeyAndCertificateInDERFormat() throws Exception + { + runTestCreationOfTrustStoreFromValidPrivateKeyAndCertificateInDerFormat(false); + } + + public void testCreationOfTrustStoreFromValidPrivateKeyAndCertificateInPEMFormat() throws Exception + { + runTestCreationOfTrustStoreFromValidPrivateKeyAndCertificateInDerFormat(true); + } + + private void runTestCreationOfTrustStoreFromValidPrivateKeyAndCertificateInDerFormat(boolean isPEM)throws Exception + { + File[] resources = extractResourcesFromTestKeyStore(isPEM); + _testResources.addAll(Arrays.asList(resources)); + + Map attributes = new HashMap<>(); + attributes.put(NonJavaKeyStore.NAME, "myTestTrustStore"); + attributes.put("privateKeyUrl", resources[0].toURI().toURL().toExternalForm()); + attributes.put("certificateUrl", resources[1].toURI().toURL().toExternalForm()); + attributes.put(NonJavaKeyStore.TYPE, "NonJavaKeyStore"); + + NonJavaKeyStoreImpl fileTrustStore = + (NonJavaKeyStoreImpl) _factory.create(KeyStore.class, attributes, _broker); + + KeyManager[] keyManagers = fileTrustStore.getKeyManagers(); + assertNotNull(keyManagers); + assertEquals("Unexpected number of key managers", 1, keyManagers.length); + assertNotNull("Key manager is null", keyManagers[0]); + } + + public void testCreationOfTrustStoreFromValidPrivateKeyAndInvalidCertificate()throws Exception + { + File[] resources = extractResourcesFromTestKeyStore(true); + _testResources.addAll(Arrays.asList(resources)); + + File invalidCertificate = TestFileUtils.createTempFile(this, ".invalid.cert", "content"); + _testResources.add(invalidCertificate); + + Map attributes = new HashMap<>(); + attributes.put(NonJavaKeyStore.NAME, "myTestTrustStore"); + attributes.put("privateKeyUrl", resources[0].toURI().toURL().toExternalForm()); + attributes.put("certificateUrl", invalidCertificate.toURI().toURL().toExternalForm()); + attributes.put(NonJavaKeyStore.TYPE, "NonJavaKeyStore"); + + try + { + _factory.create(KeyStore.class, attributes, _broker); + fail("Created key store from invalid certificate"); + } + catch(IllegalConfigurationException e) + { + // pass + } + } + + public void testCreationOfTrustStoreFromInvalidPrivateKeyAndValidCertificate()throws Exception + { + File[] resources = extractResourcesFromTestKeyStore(true); + _testResources.addAll(Arrays.asList(resources)); + + File invalidPrivateKey = TestFileUtils.createTempFile(this, ".invalid.pk", "content"); + _testResources.add(invalidPrivateKey); + + Map attributes = new HashMap<>(); + attributes.put(NonJavaKeyStore.NAME, "myTestTrustStore"); + attributes.put("privateKeyUrl", invalidPrivateKey.toURI().toURL().toExternalForm()); + attributes.put("certificateUrl", resources[1].toURI().toURL().toExternalForm()); + attributes.put(NonJavaKeyStore.TYPE, "NonJavaKeyStore"); + + try + { + _factory.create(KeyStore.class, attributes, _broker); + fail("Created key store from invalid certificate"); + } + catch(IllegalConfigurationException e) + { + // pass + } + } +} diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/NonJavaTrustStoreTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/NonJavaTrustStoreTest.java new file mode 100644 index 0000000000..798d9fcbe5 --- /dev/null +++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/NonJavaTrustStoreTest.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.qpid.server.security; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import javax.net.ssl.TrustManager; +import java.util.HashMap; +import java.util.Map; + +import org.apache.qpid.server.configuration.IllegalConfigurationException; +import org.apache.qpid.server.configuration.updater.CurrentThreadTaskExecutor; +import org.apache.qpid.server.configuration.updater.TaskExecutor; +import org.apache.qpid.server.model.Broker; +import org.apache.qpid.server.model.BrokerModel; +import org.apache.qpid.server.model.ConfiguredObjectFactory; +import org.apache.qpid.server.model.Model; +import org.apache.qpid.server.model.TrustStore; +import org.apache.qpid.test.utils.QpidTestCase; + + +public class NonJavaTrustStoreTest extends QpidTestCase +{ + private final Broker _broker = mock(Broker.class); + private final TaskExecutor _taskExecutor = CurrentThreadTaskExecutor.newStartedInstance(); + private final SecurityManager _securityManager = mock(SecurityManager.class); + private final Model _model = BrokerModel.getInstance(); + private final ConfiguredObjectFactory _factory = _model.getObjectFactory(); + + @Override + public void setUp() throws Exception + { + super.setUp(); + + when(_broker.getTaskExecutor()).thenReturn(_taskExecutor); + when(_broker.getModel()).thenReturn(_model); + when(_broker.getSecurityManager()).thenReturn(_securityManager); + } + + public void testCreationOfTrustStoreFromValidCertificate() throws Exception + { + Map attributes = new HashMap<>(); + attributes.put(NonJavaTrustStore.NAME, "myTestTrustStore"); + attributes.put("certificatesUrl", getClass().getResource("/java_broker.crt").toExternalForm()); + attributes.put(NonJavaTrustStore.TYPE, "NonJavaTrustStore"); + + NonJavaTrustStoreImpl fileTrustStore = + (NonJavaTrustStoreImpl) _factory.create(TrustStore.class, attributes, _broker); + + TrustManager[] trustManagers = fileTrustStore.getTrustManagers(); + assertNotNull(trustManagers); + assertEquals("Unexpected number of trust managers", 1, trustManagers.length); + assertNotNull("Trust manager unexpected null", trustManagers[0]); + } + + public void testCreationOfTrustStoreFromNonCertificate() throws Exception + { + Map attributes = new HashMap<>(); + attributes.put(NonJavaTrustStore.NAME, "myTestTrustStore"); + attributes.put("certificatesUrl", getClass().getResource("/java_broker.req").toExternalForm()); + attributes.put(NonJavaTrustStore.TYPE, "NonJavaTrustStore"); + + try + { + _factory.create(TrustStore.class, attributes, _broker); + fail("Trust store is created from certificate request file"); + } + catch (IllegalConfigurationException e) + { + // pass + } + } + +} -- cgit v1.2.1 From 10b83e5bfa981e1faf5993eedb6979191fb1d9a8 Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Tue, 3 Feb 2015 16:57:01 +0000 Subject: QPID-6356: Remove operational log 'MNG-1006 : Using SSL Keystore : {0}' git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1656805 13f79535-47bb-0310-9956-ffa450edef68 --- .../messages/ManagementConsoleMessages.java | 34 ------------------ .../ManagementConsole_logmessages.properties | 2 -- .../messages/ManagementConsoleMessagesTest.java | 11 ------ .../server/management/plugin/HttpManagement.java | 8 ----- .../qpid/server/jmx/JMXManagedObjectRegistry.java | 2 -- .../management/jmx/ManagementLoggingTest.java | 41 ---------------------- 6 files changed, 98 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/ManagementConsoleMessages.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/ManagementConsoleMessages.java index 16a115d1ae..9ac0a2fe73 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/ManagementConsoleMessages.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/ManagementConsoleMessages.java @@ -46,7 +46,6 @@ public class ManagementConsoleMessages public static final String MANAGEMENTCONSOLE_LOG_HIERARCHY = DEFAULT_LOG_HIERARCHY_PREFIX + "managementconsole"; public static final String OPEN_LOG_HIERARCHY = DEFAULT_LOG_HIERARCHY_PREFIX + "managementconsole.open"; public static final String LISTENING_LOG_HIERARCHY = DEFAULT_LOG_HIERARCHY_PREFIX + "managementconsole.listening"; - public static final String SSL_KEYSTORE_LOG_HIERARCHY = DEFAULT_LOG_HIERARCHY_PREFIX + "managementconsole.ssl_keystore"; public static final String STOPPED_LOG_HIERARCHY = DEFAULT_LOG_HIERARCHY_PREFIX + "managementconsole.stopped"; public static final String CLOSE_LOG_HIERARCHY = DEFAULT_LOG_HIERARCHY_PREFIX + "managementconsole.close"; public static final String SHUTTING_DOWN_LOG_HIERARCHY = DEFAULT_LOG_HIERARCHY_PREFIX + "managementconsole.shutting_down"; @@ -58,7 +57,6 @@ public class ManagementConsoleMessages Logger.getLogger(MANAGEMENTCONSOLE_LOG_HIERARCHY); Logger.getLogger(OPEN_LOG_HIERARCHY); Logger.getLogger(LISTENING_LOG_HIERARCHY); - Logger.getLogger(SSL_KEYSTORE_LOG_HIERARCHY); Logger.getLogger(STOPPED_LOG_HIERARCHY); Logger.getLogger(CLOSE_LOG_HIERARCHY); Logger.getLogger(SHUTTING_DOWN_LOG_HIERARCHY); @@ -132,38 +130,6 @@ public class ManagementConsoleMessages }; } - /** - * Log a ManagementConsole message of the Format: - *
MNG-1006 : Using SSL Keystore : {0}
- * Optional values are contained in [square brackets] and are numbered - * sequentially in the method call. - * - */ - public static LogMessage SSL_KEYSTORE(String param1) - { - String rawMessage = _messages.getString("SSL_KEYSTORE"); - - final Object[] messageArguments = {param1}; - // Create a new MessageFormat to ensure thread safety. - // Sharing a MessageFormat and using applyPattern is not thread safe - MessageFormat formatter = new MessageFormat(rawMessage, _currentLocale); - - final String message = formatter.format(messageArguments); - - return new LogMessage() - { - public String toString() - { - return message; - } - - public String getLogHierarchy() - { - return SSL_KEYSTORE_LOG_HIERARCHY; - } - }; - } - /** * Log a ManagementConsole message of the Format: *
MNG-1005 : {0} Management Stopped
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/ManagementConsole_logmessages.properties b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/ManagementConsole_logmessages.properties index 7924be28d3..b6f1dbaa38 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/ManagementConsole_logmessages.properties +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/ManagementConsole_logmessages.properties @@ -30,8 +30,6 @@ SHUTTING_DOWN = MNG-1003 : Shutting down : {0} : port {1,number,#} READY = MNG-1004 : {0} Management Ready # 0 - Management Type STOPPED = MNG-1005 : {0} Management Stopped -# 0 - Path -SSL_KEYSTORE = MNG-1006 : Using SSL Keystore : {0} # 0 - Username OPEN = MNG-1007 : Open : User {0} # 0 - Username diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/logging/messages/ManagementConsoleMessagesTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/logging/messages/ManagementConsoleMessagesTest.java index dfc9357402..e72cb2806b 100644 --- a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/logging/messages/ManagementConsoleMessagesTest.java +++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/logging/messages/ManagementConsoleMessagesTest.java @@ -83,16 +83,5 @@ public class ManagementConsoleMessagesTest extends AbstractTestMessages validateLogMessage(log, "MNG-1005", expected); } - public void testManagementSSLKeyStore() - { - String path = "/path/to/the/keystore/files.jks"; - - _logMessage = ManagementConsoleMessages.SSL_KEYSTORE(path); - List log = performLog(); - - String[] expected = {"Using SSL Keystore :", path}; - - validateLogMessage(log, "MNG-1006", expected); - } } 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 75f4e59242..f62d8416bf 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 @@ -455,14 +455,6 @@ public class HttpManagement extends AbstractPluginAdapter implem { getBroker().getEventLogger().message(ManagementConsoleMessages.LISTENING(stringifyConnectorScheme(connector), connector.getPort())); - if (connector instanceof SslSocketConnector) - { - SslContextFactory sslContextFactory = ((SslSocketConnector)connector).getSslContextFactory(); - if (sslContextFactory != null && sslContextFactory.getKeyStorePath() != null) - { - getBroker().getEventLogger().message(ManagementConsoleMessages.SSL_KEYSTORE(sslContextFactory.getKeyStorePath())); - } - } } } diff --git a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java index 8fc1ea1d8e..1711968b8f 100644 --- a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java +++ b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java @@ -142,8 +142,6 @@ public class JMXManagedObjectRegistry implements ManagedObjectRegistry throw new ServerScopedRuntimeException("Unable to create SSLContext for key store", e); } - getEventLogger().message(ManagementConsoleMessages.SSL_KEYSTORE(keyStore.getName())); - //create the SSL RMI socket factories csf = new SslRMIClientSocketFactory(); ssf = new QpidSslRMIServerSocketFactory(sslContext,_connectorPort.getEnabledCipherSuites(), _connectorPort.getDisabledCipherSuites()); diff --git a/qpid/java/systests/src/test/java/org/apache/qpid/systest/management/jmx/ManagementLoggingTest.java b/qpid/java/systests/src/test/java/org/apache/qpid/systest/management/jmx/ManagementLoggingTest.java index 4df81845d8..a5a167f633 100644 --- a/qpid/java/systests/src/test/java/org/apache/qpid/systest/management/jmx/ManagementLoggingTest.java +++ b/qpid/java/systests/src/test/java/org/apache/qpid/systest/management/jmx/ManagementLoggingTest.java @@ -210,47 +210,6 @@ public class ManagementLoggingTest extends AbstractTestLogging } } - /** - * Description: - * Using the default configuration with SSL enabled for the management port the SSL Keystore path should be reported via MNG-1006 - * Input: - * Management SSL enabled default configuration. - * Output: - * - * MESSAGE MNG-1006 : Using SSL Keystore : test_resources/ssl/keystore.jks - * - * Validation Steps: - * - * 1. The MNG ID is correct - * 2. The keystore path is as specified in the configuration - */ - public void testManagementStartupSSLKeystore() throws Exception - { - if (isJavaBroker()) - { - setSystemProperty("javax.net.debug", "ssl"); - startBrokerAndCreateMonitor(true, true); - - List results = waitAndFindMatches("MNG-1006"); - - assertTrue("MNGer message not logged", results.size() > 0); - - String log = getLogMessage(results, 0); - - //1 - validateMessageID("MNG-1006", log); - - // Validate we only have two MNG-1002 (one via stdout, one via log4j) - results = findMatches("MNG-1006"); - assertEquals("Upexpected SSL Keystore message count", - 1, results.size()); - - // Validate the keystore path is as expected - assertTrue("SSL Keystore entry expected.:" + getMessageString(log), - getMessageString(log).endsWith("systestsKeyStore")); - } - } - /** * Description: Tests the management connection open/close are logged correctly. * -- cgit v1.2.1 From 54fb883b977ee1bfac5977597332dbe4602e05ae Mon Sep 17 00:00:00 2001 From: Keith Wall Date: Wed, 4 Feb 2015 12:13:12 +0000 Subject: NO-JIRA: Increment year in HTML footer of Java Web Management Console git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1657133 13f79535-47bb-0310-9956-ffa450edef68 --- .../broker-plugins/management-http/src/main/java/resources/footer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/footer.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/footer.html index 76d1d26695..44fa4fda36 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/footer.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/footer.html @@ -19,7 +19,7 @@ - --> - diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/group/showGroup.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/group/showGroup.html index 4fddf727d0..c84e794ac1 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/group/showGroup.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/group/showGroup.html @@ -23,8 +23,10 @@
- - +
+ + +
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/addGroup.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/addGroup.html index 8d3431808a..29ce2ebe6c 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/addGroup.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/addGroup.html @@ -30,8 +30,9 @@
- - +
+ +
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/add.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/add.html new file mode 100644 index 0000000000..7fc458cd4f --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/add.html @@ -0,0 +1,37 @@ + +
+
+
Path*:
+
+ +
+
+ +
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/show.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/show.html new file mode 100644 index 0000000000..740c65fd38 --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/show.html @@ -0,0 +1,25 @@ + +
+
+
Path to file:
+
+
+
+
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/showFileGroupManager.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/showFileGroupManager.html deleted file mode 100644 index d266971ee2..0000000000 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/showFileGroupManager.html +++ /dev/null @@ -1,34 +0,0 @@ - -
-
-
Path:
-
-
-
-
-
-
- - -
- -
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/showGroupManagingGroupProvider.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/showGroupManagingGroupProvider.html new file mode 100644 index 0000000000..62a6c7537c --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/showGroupManagingGroupProvider.html @@ -0,0 +1,30 @@ + +
+
+
+
+ + +
+
+ +
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js index 09473524b5..f739e52665 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js @@ -22,18 +22,24 @@ define(["dojo/_base/xhr", "dojo/parser", "dojo/query", "dojo/_base/connect", + "dojo/_base/array", + "dojo/_base/event", "qpid/common/properties", "qpid/common/updater", "qpid/common/util", + "qpid/common/metadata", "qpid/common/UpdatableStore", "dojox/grid/EnhancedGrid", "dijit/registry", - "dojo/_base/event", "dojox/html/entities", + "dojo/text!showGroupProvider.html", + "qpid/management/addGroupProvider", "dojox/grid/enhanced/plugins/Pagination", "dojox/grid/enhanced/plugins/IndirectSelection", "dojo/domReady!"], - function (xhr, parser, query, connect, properties, updater, util, UpdatableStore, EnhancedGrid, registry, event, entities) { + function (xhr, parser, query, connect, array, event, properties, updater, util, metadata, UpdatableStore, + EnhancedGrid, registry, entities, template, addGroupProvider) + { function GroupProvider(name, parent, controller) { this.name = name; @@ -45,38 +51,63 @@ define(["dojo/_base/xhr", return "GroupProvider: " + this.name ; }; - GroupProvider.prototype.open = function(contentPane) { + GroupProvider.prototype.open = function(contentPane) + { var that = this; this.contentPane = contentPane; - xhr.get({url: "showGroupProvider.html", - sync: true, - load: function(data) { - contentPane.containerNode.innerHTML = data; - parser.parse(contentPane.containerNode); - - that.groupProviderAdapter = new GroupProviderUpdater(contentPane.containerNode, that.modelObj, that.controller); - - updater.add( that.groupProviderAdapter ); - - that.groupProviderAdapter.update(); - - var deleteButton = query(".deleteGroupProviderButton", contentPane.containerNode)[0]; - var deleteWidget = registry.byNode(deleteButton); - connect.connect(deleteWidget, "onClick", - function(evt){ - event.stop(evt); - that.deleteGroupProvider(); - }); - }}); + contentPane.containerNode.innerHTML = template; + parser.parse(contentPane.containerNode); + + this.groupProviderUpdater = new GroupProviderUpdater(contentPane.containerNode, this.modelObj, this.controller); + + // load data + this.groupProviderUpdater.update(); + + this.deleteButton = registry.byNode(query(".deleteGroupProviderButton", contentPane.containerNode)[0]); + this.deleteButton.on("click", function(evt){ event.stop(evt); that.deleteGroupProvider(); }); + + this.editButton = registry.byNode(query(".editGroupProviderButton", contentPane.containerNode)[0]); + this.editButton.on("click", function(evt){ event.stop(evt); that.editGroupProvider(); }); + + var type = this.groupProviderUpdater.groupProviderData.type; + var providerDetailsNode = query(".providerDetails", contentPane.containerNode)[0]; + + require(["qpid/management/groupprovider/"+ encodeURIComponent(type.toLowerCase()) + "/show"], + function(DetailsUI) + { + that.groupProviderUpdater.details = new DetailsUI({containerNode: providerDetailsNode, parent: that}); + that.groupProviderUpdater.details.update(that.groupProviderUpdater.groupProviderData); + }); + + var managedInterfaces = metadata.getMetaData("GroupProvider", type).managedInterfaces; + if (managedInterfaces) + { + + var managedInterfaceUI = this.groupProviderUpdater.managedInterfaces; + + array.forEach(managedInterfaces, + function(managedInterface) + { + require(["qpid/management/groupprovider/" + encodeURIComponent(managedInterface)], + function(ManagedInterface) + { + managedInterfaceUI[ManagedInterface] = new ManagedInterface(providerDetailsNode, that.modelObj, that.controller); + managedInterfaceUI[ManagedInterface].update(that.groupProviderUpdater.groupProviderData); + }); + }); + } + + updater.add( this.groupProviderUpdater ); }; + GroupProvider.prototype.close = function() { - updater.remove( this.groupProviderAdapter ); + updater.remove( this.groupProviderUpdater ); }; GroupProvider.prototype.deleteGroupProvider = function() { var warnMessage = ""; - if (this.groupProviderAdapter.groupProviderData && this.groupProviderAdapter.groupProviderData.type.indexOf("File") != -1) + if (this.groupProviderUpdater.groupProviderData && this.groupProviderUpdater.groupProviderData.type.indexOf("File") != -1) { warnMessage = "NOTE: provider deletion will also remove the group file on disk.\n\n"; } @@ -96,7 +127,23 @@ define(["dojo/_base/xhr", util.xhrErrorHandler(this.failureReason); } } - }; + }; + + GroupProvider.prototype.editGroupProvider = function() + { + xhr.get( + { + url: this.groupProviderUpdater.query, + sync: true, + content: { actuals: true }, + handleAs: "json", + load: function(actualData) + { + addGroupProvider.show(actualData[0]); + } + } + ); + } function GroupProviderUpdater(node, groupProviderObj, controller) { @@ -105,27 +152,8 @@ define(["dojo/_base/xhr", this.type = query(".type", node)[0]; this.state = query(".state", node)[0]; this.query = "api/latest/groupprovider/"+encodeURIComponent(groupProviderObj.name); - this.typeUI ={"GroupFile": "FileGroupManager"}; - var that = this; - - xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"}) - .then(function(data) - { - that.groupProviderData = data[0]; - - util.flattenStatistics( that.groupProviderData ); - - that.updateHeader(); - - var ui = that.typeUI[that.groupProviderData.type]; - require(["qpid/management/groupprovider/"+ ui], - function(SpecificProvider) { - that.details = new SpecificProvider(query(".providerDetails", node)[0], groupProviderObj, controller); - that.details.update(); - }); - - }); - + this.managedInterfaces = {}; + this.details = null; } GroupProviderUpdater.prototype.updateHeader = function() @@ -138,6 +166,28 @@ define(["dojo/_base/xhr", GroupProviderUpdater.prototype.update = function() { var that = this; + xhr.get({url: this.query, sync: true, handleAs: "json"}).then(function(data) {that._update(data[0]);}); + }; + + GroupProviderUpdater.prototype._update = function(data) + { + this.groupProviderData = data; + util.flattenStatistics( this.groupProviderData ); + this.updateHeader(); + + if (this.details) + { + this.details.update(this.groupProviderData); + } + + for(var managedInterface in this.managedInterfaces) + { + var managedInterfaceUI = this.managedInterfaces[managedInterface]; + if (managedInterfaceUI) + { + managedInterfaceUI.update(this.groupProviderData); + } + } }; return GroupProvider; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js index 82281ad3d3..f158b8ceb6 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js @@ -18,7 +18,7 @@ * under the License. * */ -define(["dojo/_base/lang", +define([ "dojo/_base/xhr", "dojo/dom", "dojo/dom-construct", @@ -26,8 +26,10 @@ define(["dojo/_base/lang", "dojo/parser", "dojo/_base/array", "dojo/_base/event", - 'dojo/_base/json', + 'dojo/json', "qpid/common/util", + "qpid/common/metadata", + "dojo/text!addGroupProvider.html", "dojo/store/Memory", "dojox/validate/us", "dojox/validate/web", @@ -42,140 +44,152 @@ define(["dojo/_base/lang", "dijit/layout/ContentPane", "dojox/layout/TableContainer", "dojo/domReady!"], - function (lang, xhr, dom, construct, registry, parser, array, event, json, util) { - - var addGroupProvider = {}; - - addGroupProvider.show = function(groupProvider) { - var fields = [{ - name: "name", - createWidget: function(groupProvider) { - return new dijit.form.ValidationTextBox({ - required: true, - value: groupProvider.name, - disabled: groupProvider.name ? true : false, - label: "Name*:", - regexp: "^[\x20-\x2e\x30-\x7F]{1,255}$", - promptMessage: "Name of group provider.", - placeHolder: "name", - name: "name"}); - } - }, { - name: "type", - createWidget: function(groupProvider) { - - var typeContainer = construct.create("div"); - - var typeListContainer = new dojox.layout.TableContainer({ - cols: 1, - "labelWidth": "300", - customClass: "formLabel", - showLabels: true, - orientation: "horiz" - }); - - typeContainer.appendChild(typeListContainer.domNode); - - var providers = []; - var fieldSetContainers = {}; - xhr.get({ - url: "service/helper?action=ListGroupProviderAttributes", - handleAs: "json", - sync: true - }).then( - function(data) { - var providerIndex = 0; - - for (var providerType in data) { - if (data.hasOwnProperty(providerType)) { - providers[providerIndex++] = {id: providerType, name: providerType}; - - var attributes = data[providerType].attributes; - var descriptions = data[providerType].descriptions; - - var layout = new dojox.layout.TableContainer( { - cols: 1, - "labelWidth": "300", - customClass: "formLabel", - showLabels: true, - orientation: "horiz" - }); - - for(var i=0; i < attributes.length; i++) { - if ("type" == attributes[i]) - { - continue; - } - var labelValue = attributes[i]; - if (descriptions && descriptions[attributes[i]]) - { - labelValue = descriptions[attributes[i]]; - } - var text = new dijit.form.TextBox({ - label: labelValue + ":", - name: attributes[i] - }); - layout.addChild(text); - } - - typeContainer.appendChild(layout.domNode); - fieldSetContainers[providerType] = layout; - } - } - }); - - var providersStore = new dojo.store.Memory({ data: providers }); - - var typeList = new dijit.form.FilteringSelect({ - required: true, - value: groupProvider.type, - store: providersStore, - label: "Type*:", - name: "type"}); - - typeListContainer.addChild(typeList); - - var onChangeHandler = function onChangeHandler(newValue){ - for (var i in fieldSetContainers) { - var container = fieldSetContainers[i]; - var descendants = container.getChildren(); - for(var i in descendants){ - var descendant = descendants[i]; - var propName = descendant.name; - if (propName) { - descendant.set("disabled", true); - } + function (xhr, dom, construct, registry, parser, array, event, json, util, metadata, template) + { + + var addGroupProvider = + { + init: function() + { + var that=this; + this.containerNode = construct.create("div", {innerHTML: template}); + parser.parse(this.containerNode); + + this.groupProviderName = registry.byId("addGroupProvider.name"); + this.groupProviderName.set("regExpGen", util.nameOrContextVarRegexp); + + this.dialog = registry.byId("addGroupProvider"); + this.addButton = registry.byId("addGroupProvider.addButton"); + this.cancelButton = registry.byId("addGroupProvider.cancelButton"); + this.cancelButton.on("click", function(e){that._cancel(e);}); + this.addButton.on("click", function(e){that._add(e);}); + + this.groupProviderTypeFieldsContainer = dom.byId("addGroupProvider.typeFields"); + this.groupProviderForm = registry.byId("addGroupProvider.form"); + + this.groupProviderType = registry.byId("addGroupProvider.type"); + this.groupProviderType.on("change", function(type){that._groupProviderTypeChanged(type);}); + + var supportedTypes = metadata.getTypesForCategory("GroupProvider"); + supportedTypes.sort(); + var supportedTypesStore = util.makeTypeStore(supportedTypes); + this.groupProviderType.set("store", supportedTypesStore); + }, + show: function(actualData) + { + this.initialData = actualData; + this.groupProviderForm.reset(); + + if (actualData) + { + this._destroyTypeFields(this.containerNode); + this._initFields(actualData); + } + this.groupProviderName.set("disabled", actualData == null ? false : true); + this.groupProviderType.set("disabled", actualData == null ? false : true); + this.dialog.set("title", actualData == null ? "Add Group Provider" : "Edit Group Provider - " + actualData.name) + this.dialog.show(); + }, + _initFields:function(data) + { + var type = data["type"]; + var attributes = metadata.getMetaData("GroupProvider", type).attributes; + for(var name in attributes) + { + var widget = registry.byId("addGroupProvider."+name); + if (widget) + { + widget.set("value", data[name]); } - container.domNode.style.display = "none"; - } - var container = fieldSetContainers[newValue]; - if (container) - { - container.domNode.style.display = "block"; - var descendants = container.getChildren(); - for(var i in descendants){ - var descendant = descendants[i]; - var propName = descendant.name; - if (propName) { - descendant.set("disabled", false); - } + } + }, + _cancel: function(e) + { + event.stop(e); + this.dialog.hide(); + }, + _add: function(e) + { + event.stop(e); + this._submit(); + }, + _submit: function() + { + if (this.groupProviderForm.validate()) + { + var success = false,failureReason=null; + + var groupProviderData = util.getFormWidgetValues(this.groupProviderForm, this.initialData); + var encodedName = encodeURIComponent(this.groupProviderName.value); + var jsonString = json.stringify(groupProviderData); + + try { + xhr.put( + { + url: "api/latest/groupprovider/" + encodedName, + sync: true, + handleAs: "json", + headers: { "Content-Type": "application/json"}, + putData: jsonString, + load: function(x) {success = true; }, + error: function(error) {success = false; failureReason = error;} + }); + } + catch (e) + { + console.warn(e); } - } - }; - typeList.on("change", onChangeHandler); - onChangeHandler(typeList.value); - return new dijit.layout.ContentPane({content: typeContainer, style:{padding: 0}}); - } - }]; - util.showSetAttributesDialog( - fields, - groupProvider ? groupProvider : {}, - "api/latest/groupprovider" + (name ? "/" + encodeURIComponent(name.name) : ""), - groupProvider ? "Edit group provider - " + groupProvider.name : "Add group provider", - "Group", - groupProvider && groupProvider.type ? groupProvider.type : "Group", - groupProvider ? false : true); + if (success == true) + { + this.dialog.hide(); + } + else + { + util.xhrErrorHandler(failureReason); + } + } + else + { + alert('Form contains invalid data. Please correct first'); + } + }, + _groupProviderTypeChanged: function(type) + { + this._destroyTypeFields(this.groupProviderTypeFieldsContainer); + if (type) + { + var that = this; + require([ "qpid/management/groupprovider/" + type.toLowerCase() + "/add"], function(typeUI) + { + try + { + typeUI.show({containerNode: that.groupProviderTypeFieldsContainer, parent: that, data: that.initialData}); + util.applyMetadataToWidgets(that.groupProviderTypeFieldsContainer, "GroupProvider", type); + } + catch(e) + { + console.warn(e); + } + }); + } + }, + _destroyTypeFields: function(typeFieldsContainer) + { + var widgets = registry.findWidgets(typeFieldsContainer); + array.forEach(widgets, function(item) { item.destroyRecursive();}); + construct.empty(typeFieldsContainer); + } }; + + try + { + addGroupProvider.init(); + } + catch(e) + { + console.warn(e); + } return addGroupProvider; + }); \ No newline at end of file diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/Group.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/Group.js index 8f63a8c935..8ac6be04cc 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/Group.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/Group.js @@ -34,11 +34,12 @@ define(["dojo/_base/xhr", "dojox/grid/EnhancedGrid", "dojo/data/ObjectStore", "qpid/management/group/addGroupMember", + "dojox/html/entities", "dojox/grid/enhanced/plugins/Pagination", "dojox/grid/enhanced/plugins/IndirectSelection", "dojo/domReady!"], function (xhr, parser, query, registry, connect, event, json, properties, updater, util, formatter, - UpdatableStore, JsonRest, EnhancedGrid, ObjectStore, addGroupMember) { + UpdatableStore, JsonRest, EnhancedGrid, ObjectStore, addGroupMember, entities) { function Group(name, parent, controller) { this.name = name; @@ -78,10 +79,8 @@ define(["dojo/_base/xhr", parser.parse(contentPane.containerNode); that.groupUpdater = new GroupUpdater(contentPane.containerNode, that, that.controller); - - updater.add( that.groupUpdater ); - that.groupUpdater.update(); + updater.add( that.groupUpdater ); var addGroupMemberButton = query(".addGroupMemberButton", contentPane.containerNode)[0]; connect.connect(registry.byNode(addGroupMemberButton), "onClick", @@ -128,7 +127,7 @@ define(["dojo/_base/xhr", "durable", "lifetimePolicy", "type"]); - + this.name.innerHTML = entities.encode(String(groupObj.getGroupName())); this.query = "api/latest/groupmember/"+ encodeURIComponent(groupObj.getGroupProviderName()) + "/" + encodeURIComponent(groupObj.getGroupName()); xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"}).then(function(data) diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js deleted file mode 100644 index 4ee411633f..0000000000 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js +++ /dev/null @@ -1,262 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ -define(["dojo/_base/xhr", - "dojo/dom", - "dojo/parser", - "dojo/query", - "dojo/dom-construct", - "dojo/_base/connect", - "dojo/_base/window", - "dojo/_base/event", - "dojo/_base/json", - "dijit/registry", - "dojox/html/entities", - "qpid/common/util", - "qpid/common/properties", - "qpid/common/updater", - "qpid/common/UpdatableStore", - "dojox/grid/EnhancedGrid", - "dojox/grid/enhanced/plugins/Pagination", - "dojox/grid/enhanced/plugins/IndirectSelection", - "dojox/validate/us", "dojox/validate/web", - "dijit/Dialog", - "dijit/form/TextBox", - "dijit/form/ValidationTextBox", - "dijit/form/TimeTextBox", "dijit/form/Button", - "dijit/form/Form", - "dijit/form/DateTextBox", - "dojo/domReady!"], - function (xhr, dom, parser, query, construct, connect, win, event, json, registry, entities, util, properties, updater, UpdatableStore, EnhancedGrid) { - function DatabaseGroupManager(containerNode, groupProviderObj, controller) { - var node = construct.create("div", null, containerNode, "last"); - var that = this; - this.name = groupProviderObj.name; - xhr.get({url: "groupprovider/showFileGroupManager.html", - sync: true, - load: function(data) { - node.innerHTML = data; - parser.parse(node); - - - that.groupDatabaseUpdater= new GroupProviderUpdater(node, groupProviderObj, controller); - - updater.add( that.groupDatabaseUpdater); - - that.groupDatabaseUpdater.update(); - - - }}); - } - - DatabaseGroupManager.prototype.update = function() { - this.groupDatabaseUpdater.update(); - }; - - DatabaseGroupManager.prototype.close = function() { - updater.remove( this.groupDatabaseUpdater ); - }; - - function GroupProviderUpdater(node, groupProviderObj, controller) - { - this.controller = controller; - this.query = "api/latest/groupprovider/"+encodeURIComponent(groupProviderObj.name); - this.name = groupProviderObj.name; - var that = this; - - xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"}) - .then(function(data) { - that.path = query(".path", node)[0]; - that.groupProviderData = data[0]; - - util.flattenStatistics( that.groupProviderData ); - - var groupDiv = query(".groups", node)[0]; - - var gridProperties = { - height: 400, - keepSelection: true, - plugins: { - pagination: { - pageSizes: ["10", "25", "50", "100"], - description: true, - sizeSwitch: true, - pageStepper: true, - gotoButton: true, - maxPageStep: 4, - position: "bottom" - }, - indirectSelection: true - - }}; - - - that.groupsGrid = - new UpdatableStore(that.groupProviderData.groups, groupDiv, - [ { name: "Group Name", field: "name", width: "100%" } - ], function(obj) { - connect.connect(obj.grid, "onRowDblClick", obj.grid, - function(evt){ - var idx = evt.rowIndex, - theItem = this.getItem(idx); - var name = obj.dataStore.getValue(theItem,"name"); - that.controller.show("group", name, groupProviderObj, theItem.id); - }); - }, gridProperties, EnhancedGrid); - - - var addGroupButton = query(".addGroupButton", node)[0]; - connect.connect(registry.byNode(addGroupButton), "onClick", function(evt){ addGroup.show(groupProviderObj.name) }); - - var deleteGroupButton = query(".deleteGroupButton", node)[0]; - var deleteWidget = registry.byNode(deleteGroupButton); - connect.connect(deleteWidget, "onClick", - function(evt){ - event.stop(evt); - that.deleteGroups(); - }); - }); - } - - GroupProviderUpdater.prototype.deleteGroups = function() - { - var grid = this.groupsGrid.grid; - var data = grid.selection.getSelected(); - if(data.length) { - var that = this; - if(confirm("Delete " + data.length + " groups?")) { - var i, queryParam; - for(i = 0; i
- +
- + +
-- cgit v1.2.1 From 4a190dc734d13de94649f3fca4230cbe1926fc5c Mon Sep 17 00:00:00 2001 From: Keith Wall Date: Wed, 4 Feb 2015 15:05:37 +0000 Subject: QPID-6361: [Java Broker] Change 0-8..0-91 queue declare to no longer consider the durability when validating an existing queue. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1657270 13f79535-47bb-0310-9956-ffa450edef68 --- .../qpid/server/protocol/v0_8/AMQChannel.java | 11 ----- .../qpid/client/session/QueueDeclareTest.java | 53 +++++++++++++++++----- .../qpid/server/logging/ChannelLoggingTest.java | 49 -------------------- qpid/java/test-profiles/Java010Excludes | 1 - 4 files changed, 41 insertions(+), 73 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java b/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java index d52fb735a2..6108de2fda 100644 --- a/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java +++ b/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java @@ -3246,17 +3246,6 @@ public class AMQChannel + autoDelete + ")"); } - else if (queue.isDurable() != durable) - { - closeChannel(AMQConstant.ALREADY_EXISTS, - "Cannot re-declare queue '" - + queue.getName() - + "' with different durability (was: " - + queue.isDurable() - + " requested " - + durable - + ")"); - } else { setDefaultQueue(queue); diff --git a/qpid/java/systests/src/test/java/org/apache/qpid/client/session/QueueDeclareTest.java b/qpid/java/systests/src/test/java/org/apache/qpid/client/session/QueueDeclareTest.java index fefed5b4ab..f0013a82d7 100644 --- a/qpid/java/systests/src/test/java/org/apache/qpid/client/session/QueueDeclareTest.java +++ b/qpid/java/systests/src/test/java/org/apache/qpid/client/session/QueueDeclareTest.java @@ -20,48 +20,77 @@ */ package org.apache.qpid.client.session; -import java.util.Collections; - import javax.jms.Connection; +import javax.jms.Destination; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.Session; -import org.apache.qpid.client.AMQQueue; +import org.apache.qpid.client.AMQDestination; import org.apache.qpid.client.AMQSession; import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.FieldTable; import org.apache.qpid.test.utils.QpidBrokerTestCase; -import org.apache.qpid.url.AMQBindingURL; public class QueueDeclareTest extends QpidBrokerTestCase { private Connection _connection; private AMQSession _session; - protected void setUp() throws Exception { super.setUp(); _connection = getConnection(); + _connection.start(); _session = (AMQSession) _connection.createSession(true, Session.SESSION_TRANSACTED); } public void testDeclareAndBindWhenQueueIsNotSpecifiedInDestinationUrl() throws Exception { - AMQQueue destination = new AMQQueue(new AMQBindingURL("topic://amq.topic//?routingkey='testTopic'")); + AMQDestination destination = (AMQDestination) _session.createQueue("topic://amq.topic//?routingkey='testTopic'"); - assertEquals("Queue name is generated in parser", AMQShortString.EMPTY_STRING, destination.getAMQQueueName()); + assertEquals("Non empty queue name unexpectedly generated by parser : " + destination.getAMQQueueName(), AMQShortString.EMPTY_STRING, destination.getAMQQueueName()); - _session.declareAndBind(destination, FieldTable.convertToFieldTable(Collections. emptyMap())); + _session.declareAndBind(destination); - assertFalse("Unexpected queue name: [" + destination.getAMQQueueName() + "]", AMQShortString.EMPTY_STRING.equals(destination.getAMQQueueName())); + assertFalse("Non empty queue name should have been generated by declareAndBind", + AMQShortString.EMPTY_STRING.equals(destination.getAMQQueueName())); sendMessage(_session, destination, 1); + receiveMessage(destination); + } + + public void testDeclareIgnoresNonDurableFlagIfDurableQueueAlreadyExists() throws Exception + { + String format = "direct://amq.direct//%s?durable='%s'"; + AMQDestination durable = (AMQDestination) _session.createQueue(String.format(format, getTestQueueName(), true)); + AMQDestination nondurable = (AMQDestination) _session.createQueue(String.format(format, getTestQueueName(), false)); + + verifyDurabiltyIgnoreIfQueueExists(durable, nondurable); + } + + public void testDeclareIgnoresDurableFlagIfNonDurableQueueAlreadyExists() throws Exception + { + String format = "direct://amq.direct//%s?durable='%s'"; + AMQDestination nondurable = (AMQDestination) _session.createQueue(String.format(format, getTestQueueName(), false)); + AMQDestination durable = (AMQDestination) _session.createQueue(String.format(format, getTestQueueName(), true)); + verifyDurabiltyIgnoreIfQueueExists(nondurable, durable); + } + + private void verifyDurabiltyIgnoreIfQueueExists(final AMQDestination firstDeclare, final AMQDestination secondDeclare) throws Exception + { + _session.declareAndBind(firstDeclare); + + sendMessage(_session, firstDeclare, 1); + + _session.declareAndBind(secondDeclare); + receiveMessage(secondDeclare); + } + + private void receiveMessage(final Destination destination) throws Exception + { MessageConsumer consumer = _session.createConsumer(destination); - _connection.start(); - Message message = consumer.receive(1000l); + Message message = consumer.receive(RECEIVE_TIMEOUT); assertNotNull("Message not received", message); _session.commit(); } diff --git a/qpid/java/systests/src/test/java/org/apache/qpid/server/logging/ChannelLoggingTest.java b/qpid/java/systests/src/test/java/org/apache/qpid/server/logging/ChannelLoggingTest.java index 047151684f..7a18bb5ed2 100644 --- a/qpid/java/systests/src/test/java/org/apache/qpid/server/logging/ChannelLoggingTest.java +++ b/qpid/java/systests/src/test/java/org/apache/qpid/server/logging/ChannelLoggingTest.java @@ -20,7 +20,6 @@ */ package org.apache.qpid.server.logging; -import org.apache.qpid.AMQChannelClosedException; import org.apache.qpid.AMQException; import org.apache.qpid.client.AMQConnection; import org.apache.qpid.client.AMQDestination; @@ -306,54 +305,6 @@ public class ChannelLoggingTest extends AbstractTestLogging validateChannelClose(results); } - public void testChannelClosedOnQueueArgumentsMismatch() throws Exception - { - assertLoggingNotYetOccured(CHANNEL_PREFIX); - - Connection connection = getConnection(); - - // Create a session and then close it - Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - waitForMessage("CHN-1001"); - - String testQueueName = getTestQueueName(); - - Queue nonDurableQueue = (Queue) session.createQueue("direct://amq.direct/" + testQueueName + "/" + testQueueName - + "?durable='false'"); - - ((AMQSession)session).declareAndBind((AMQDestination)nonDurableQueue); - - Queue durableQueue = (Queue) session.createQueue("direct://amq.direct/" + testQueueName + "/" + testQueueName - + "?durable='true'"); - try - { - ((AMQSession)session).declareAndBind((AMQDestination) durableQueue); - fail("Exception not thrown"); - } - catch (AMQChannelClosedException acce) - { - // pass - } - catch (Exception e) - { - fail("Wrong exception thrown " + e); - } - waitForMessage("CHN-1003"); - - List results = findMatches(CHANNEL_PREFIX); - assertTrue("No CHN messages logged", results.size() > 0); - - String closeLog = results.get(results.size() -1); - int closeMessageID = closeLog.indexOf("CHN-1003"); - assertFalse("CHN-1003 is not found", closeMessageID == -1); - - String closeMessage = closeLog.substring(closeMessageID); - assertTrue("Unexpected close channel message :" + closeMessage, Pattern.matches(CHANNEL_CLOSE_FORCED_MESSAGE_PATTERN, closeMessage)); - - session.close(); - connection.close(); - } - public void testChannelClosedOnExclusiveQueueDeclaredOnDifferentSession() throws Exception { assertLoggingNotYetOccured(CHANNEL_PREFIX); diff --git a/qpid/java/test-profiles/Java010Excludes b/qpid/java/test-profiles/Java010Excludes index 136bc7918f..7294275684 100755 --- a/qpid/java/test-profiles/Java010Excludes +++ b/qpid/java/test-profiles/Java010Excludes @@ -34,7 +34,6 @@ org.apache.qpid.test.unit.topic.DurableSubscriptionTest#testUnsubscribeWhenUsing org.apache.qpid.server.logging.ChannelLoggingTest#testChannelStartsFlowStopped org.apache.qpid.server.logging.ChannelLoggingTest#testChannelStartConsumerFlowStarted org.apache.qpid.server.logging.ConsumerLoggingTest#testSubscriptionSuspend -org.apache.qpid.server.logging.ChannelLoggingTest#testChannelClosedOnQueueArgumentsMismatch // 0-10 is not supported by the MethodRegistry org.apache.qpid.test.unit.close.JavaServerCloseRaceConditionTest#* -- cgit v1.2.1 From 050ccae5ceb3f9b077a797326b3ff604bf91a0b5 Mon Sep 17 00:00:00 2001 From: Keith Wall Date: Wed, 4 Feb 2015 16:53:40 +0000 Subject: QPID-6350: [Java Client] Partial revert of r1655877. My solution was not solving the problem in all situations git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1657312 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/main/java/org/apache/qpid/transport/Connection.java | 10 +++++----- .../qpid/transport/network/security/ssl/SSLReceiver.java | 5 +---- 2 files changed, 6 insertions(+), 9 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/common/src/main/java/org/apache/qpid/transport/Connection.java b/qpid/java/common/src/main/java/org/apache/qpid/transport/Connection.java index 245f12ad0b..890aeda11b 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/transport/Connection.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/transport/Connection.java @@ -537,16 +537,16 @@ public class Connection extends ConnectionInvoker connectionLost.set(true); synchronized (lock) { - log.error(e, "exception: %s", e.getMessage()); + if(log.isDebugEnabled()) + { + log.debug("exception: %s state : %s", e.getMessage(), state); + } switch (state) { case OPENING: case CLOSING: - if (error == null) - { - error = e; - } + error = e; lock.notifyAll(); return; } diff --git a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java index 8e1395aa83..1bbf166d82 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java @@ -187,10 +187,7 @@ public class SSLReceiver implements Receiver } catch(SSLException e) { - if (log.isDebugEnabled()) - { - log.debug(e, "Error caught in SSLReceiver"); - } + log.error(e, "Error caught in SSLReceiver"); _sslStatus.setSslErrorFlag(); synchronized(_sslStatus.getSslLock()) { -- cgit v1.2.1 From bafd7f6d88ade9062a69ec78e3c3f3c4e5a7fe7b Mon Sep 17 00:00:00 2001 From: Keith Wall Date: Wed, 4 Feb 2015 16:53:47 +0000 Subject: QPID-6350: [Java Common] Change IoSender to half close once writing is done. Change IoSender half close once it knows it has finished writing data down the pipe. This is done to prevent the peer from seeing sporadic socket exception 'connection resets' if it happens that the other side closes the socket first. If half close is not supported (windows platform or SSLSocket), this change has no effect. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1657313 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/qpid/transport/Connection.java | 5 +---- .../apache/qpid/transport/network/io/IoSender.java | 21 +++++++++++++++++++++ .../transport/network/security/ssl/SSLReceiver.java | 5 ++++- .../transport/network/security/ssl/SSLSender.java | 2 +- 4 files changed, 27 insertions(+), 6 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/common/src/main/java/org/apache/qpid/transport/Connection.java b/qpid/java/common/src/main/java/org/apache/qpid/transport/Connection.java index 890aeda11b..e63949cc69 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/transport/Connection.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/transport/Connection.java @@ -537,10 +537,7 @@ public class Connection extends ConnectionInvoker connectionLost.set(true); synchronized (lock) { - if(log.isDebugEnabled()) - { - log.debug("exception: %s state : %s", e.getMessage(), state); - } + log.error(e, "exception: %s", e.getMessage()); switch (state) { diff --git a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoSender.java b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoSender.java index e06782c58a..25222e5285 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoSender.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoSender.java @@ -26,12 +26,15 @@ import java.net.Socket; import java.nio.ByteBuffer; import java.util.concurrent.atomic.AtomicBoolean; +import javax.net.ssl.SSLSocket; + import org.apache.qpid.thread.Threading; import org.apache.qpid.transport.Sender; import org.apache.qpid.transport.SenderClosedException; import org.apache.qpid.transport.SenderException; import org.apache.qpid.transport.TransportException; import org.apache.qpid.transport.util.Logger; +import org.apache.qpid.util.SystemUtils; public final class IoSender implements Runnable, Sender @@ -58,6 +61,12 @@ public final class IoSender implements Runnable, Sender private final Thread senderThread; private IoReceiver _receiver; private final String _remoteSocketAddress; + private static final boolean shutdownBroken; + + static + { + shutdownBroken = SystemUtils.isWindows(); + } private volatile Throwable exception = null; @@ -314,6 +323,18 @@ public final class IoSender implements Runnable, Sender } } } + + if (!shutdownBroken && !(socket instanceof SSLSocket)) + { + try + { + socket.shutdownOutput(); + } + catch (IOException e) + { + //pass + } + } } public void setIdleTimeout(int i) diff --git a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java index 1bbf166d82..8e1395aa83 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java @@ -187,7 +187,10 @@ public class SSLReceiver implements Receiver } catch(SSLException e) { - log.error(e, "Error caught in SSLReceiver"); + if (log.isDebugEnabled()) + { + log.debug(e, "Error caught in SSLReceiver"); + } _sslStatus.setSslErrorFlag(); synchronized(_sslStatus.getSslLock()) { diff --git a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLSender.java b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLSender.java index 7c61136b42..53bd7e49b7 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLSender.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLSender.java @@ -141,7 +141,7 @@ public class SSLSender implements Sender public void send(ByteBuffer appData) { - if (closed.get()) + if (closed.get() && !_sslStatus.getSslErrorFlag()) { throw new SenderException("SSL Sender is closed"); } -- cgit v1.2.1 From 43bba6aff5eb4ebbe3630d21fadb46cd32727535 Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Wed, 4 Feb 2015 17:46:45 +0000 Subject: QPID-6356: Add port transport into operational log message for starting managegement plugins git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1657341 13f79535-47bb-0310-9956-ffa450edef68 --- .../messages/ManagementConsoleMessages.java | 6 +++--- .../ManagementConsole_logmessages.properties | 2 +- .../messages/ManagementConsoleMessagesTest.java | 8 +++++--- .../server/management/plugin/HttpManagement.java | 22 +++++++++------------- .../qpid/server/jmx/JMXManagedObjectRegistry.java | 11 ++++++++--- 5 files changed, 26 insertions(+), 23 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/ManagementConsoleMessages.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/ManagementConsoleMessages.java index 9ac0a2fe73..6c27b51ce0 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/ManagementConsoleMessages.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/ManagementConsoleMessages.java @@ -100,16 +100,16 @@ public class ManagementConsoleMessages /** * Log a ManagementConsole message of the Format: - *
MNG-1002 : Starting : {0} : Listening on port {1,number,#}
+ *
MNG-1002 : Starting : {0} : Listening on {1} port {2,number,#}
* Optional values are contained in [square brackets] and are numbered * sequentially in the method call. * */ - public static LogMessage LISTENING(String param1, Number param2) + public static LogMessage LISTENING(String param1, String param2, Number param3) { String rawMessage = _messages.getString("LISTENING"); - final Object[] messageArguments = {param1, param2}; + final Object[] messageArguments = {param1, param2, param3}; // Create a new MessageFormat to ensure thread safety. // Sharing a MessageFormat and using applyPattern is not thread safe MessageFormat formatter = new MessageFormat(rawMessage, _currentLocale); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/ManagementConsole_logmessages.properties b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/ManagementConsole_logmessages.properties index b6f1dbaa38..bb4dce7d36 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/ManagementConsole_logmessages.properties +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/ManagementConsole_logmessages.properties @@ -22,7 +22,7 @@ STARTUP = MNG-1001 : {0} Management Startup # 0 - Service # 1 - Port -LISTENING = MNG-1002 : Starting : {0} : Listening on port {1,number,#} +LISTENING = MNG-1002 : Starting : {0} : Listening on {1} port {2,number,#} # 0 - Service # 1 - Port SHUTTING_DOWN = MNG-1003 : Shutting down : {0} : port {1,number,#} diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/logging/messages/ManagementConsoleMessagesTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/logging/messages/ManagementConsoleMessagesTest.java index e72cb2806b..4b4fbb2db6 100644 --- a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/logging/messages/ManagementConsoleMessagesTest.java +++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/logging/messages/ManagementConsoleMessagesTest.java @@ -22,6 +22,8 @@ package org.apache.qpid.server.logging.messages; import java.util.List; +import org.apache.qpid.server.model.Transport; + /** * Test MNG Log Messages */ @@ -39,13 +41,13 @@ public class ManagementConsoleMessagesTest extends AbstractTestMessages public void testManagementListening() { - String transport = "JMX"; + String management = "JMX"; Integer port = 8889; - _logMessage = ManagementConsoleMessages.LISTENING(transport, port); + _logMessage = ManagementConsoleMessages.LISTENING(management, Transport.TCP.name(), port); List log = performLog(); - String[] expected = {"Starting :", transport, ": Listening on port", String.valueOf(port)}; + String[] expected = {"Starting :", management, ": Listening on ", Transport.TCP.name(), " port", String.valueOf(port)}; validateLogMessage(log, "MNG-1002", expected); } 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 f62d8416bf..4e340c7b72 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 @@ -46,7 +46,6 @@ import org.eclipse.jetty.server.SessionManager; import org.eclipse.jetty.server.handler.ErrorHandler; import org.eclipse.jetty.server.nio.SelectChannelConnector; import org.eclipse.jetty.server.ssl.SslSelectChannelConnector; -import org.eclipse.jetty.server.ssl.SslSocketConnector; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; @@ -139,7 +138,7 @@ public class HttpManagement extends AbstractPluginAdapter implem try { _server.start(); - logOperationalListenMessages(_server); + logOperationalListenMessages(httpPorts); } catch (Exception e) { @@ -448,13 +447,15 @@ public class HttpManagement extends AbstractPluginAdapter implem root.addServlet(servletHolder, "/api/v" + BrokerModel.MODEL_MAJOR_VERSION + "/" + name + "/*"); } - private void logOperationalListenMessages(Server server) + private void logOperationalListenMessages(Collection> ports) { - Connector[] connectors = server.getConnectors(); - for (Connector connector : connectors) + for (Port port : ports) { - getBroker().getEventLogger().message(ManagementConsoleMessages.LISTENING(stringifyConnectorScheme(connector), - connector.getPort())); + Set transports = port.getTransports(); + for (Transport transport: transports) + { + getBroker().getEventLogger().message(ManagementConsoleMessages.LISTENING(Protocol.HTTP.name(), transport.name(), port.getPort())); + } } } @@ -463,15 +464,10 @@ public class HttpManagement extends AbstractPluginAdapter implem Connector[] connectors = server.getConnectors(); for (Connector connector : connectors) { - getBroker().getEventLogger().message(ManagementConsoleMessages.SHUTTING_DOWN(stringifyConnectorScheme(connector), - connector.getPort())); + getBroker().getEventLogger().message(ManagementConsoleMessages.SHUTTING_DOWN(Protocol.HTTP.name(), connector.getPort())); } } - private String stringifyConnectorScheme(Connector connector) - { - return connector instanceof SslSocketConnector ? "HTTPS" : "HTTP"; - } private Collection> getHttpPorts(Collection> ports) { diff --git a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java index 1711968b8f..040973ff6e 100644 --- a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java +++ b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java @@ -36,6 +36,7 @@ import java.rmi.server.RMIServerSocketFactory; import java.rmi.server.UnicastRemoteObject; import java.security.GeneralSecurityException; import java.util.HashMap; +import java.util.Set; import javax.management.JMException; import javax.management.MBeanServer; @@ -250,8 +251,12 @@ public class JMXManagedObjectRegistry implements ManagedObjectRegistry _cs.start(); - String connectorServer = (connectorSslEnabled ? "SSL " : "") + "JMX RMIConnectorServer"; - getEventLogger().message(ManagementConsoleMessages.LISTENING(connectorServer, jmxPortConnectorServer)); + Set connectorTransports = _connectorPort.getTransports(); + for (Transport transport: connectorTransports) + { + getEventLogger().message(ManagementConsoleMessages.LISTENING("JMX RMIConnectorServer", transport.name(), jmxPortConnectorServer)); + } + getEventLogger().message(ManagementConsoleMessages.READY(OPERATIONAL_LOGGING_NAME)); } @@ -261,7 +266,7 @@ public class JMXManagedObjectRegistry implements ManagedObjectRegistry final RMIServerSocketFactory ssf = getRmiServerSocketFactory(useCustomRmiRegistry); Registry rmiRegistry = LocateRegistry.createRegistry(jmxPortRegistryServer, null, ssf); - getEventLogger().message(ManagementConsoleMessages.LISTENING("RMI Registry", jmxPortRegistryServer)); + getEventLogger().message(ManagementConsoleMessages.LISTENING("RMI Registry", Transport.TCP.name(), jmxPortRegistryServer)); return rmiRegistry; } -- cgit v1.2.1 From a64c6cca562ba57cf0e45004961f19c525ef93e7 Mon Sep 17 00:00:00 2001 From: Keith Wall Date: Thu, 5 Feb 2015 11:21:52 +0000 Subject: QPID-6362: [Java Broker] Correctly generate management mode one-time-password (OTP) if none is specified by the user. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1657536 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java index 5f32dd3352..85fe7af0fb 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java @@ -42,6 +42,7 @@ import org.apache.qpid.common.QpidProperties; import org.apache.qpid.framing.ProtocolVersion; import org.apache.qpid.server.configuration.IllegalConfigurationException; import org.apache.qpid.server.util.Action; +import org.apache.qpid.server.util.StringUtil; import org.apache.qpid.util.FileUtils; /** @@ -50,6 +51,8 @@ import org.apache.qpid.util.FileUtils; */ public class Main { + private static final int MANAGEMENT_MODE_PASSWORD_LENGTH = 10; + private static final Option OPTION_HELP = new Option("h", "help", false, "print this message"); private static final Option OPTION_VERSION = new Option("v", "version", false, "print the version information and exit"); @@ -305,10 +308,11 @@ public class Main options.setManagementModeQuiesceVirtualHosts(quiesceVhosts); String password = _commandLine.getOptionValue(OPTION_MM_PASSWORD.getOpt()); - if (password != null) + if (password == null) { - options.setManagementModePassword(password); + password = new StringUtil().randomAlphaNumericString(MANAGEMENT_MODE_PASSWORD_LENGTH); } + options.setManagementModePassword(password); } setExceptionHandler(); -- cgit v1.2.1 From ce525e6c5e1df021c0e3f303bbdc078a678b0f54 Mon Sep 17 00:00:00 2001 From: Keith Wall Date: Thu, 5 Feb 2015 11:44:52 +0000 Subject: QPID-6362: [Java Broker] Remove now dead code from BrokerOptions git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1657541 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/main/java/org/apache/qpid/server/BrokerOptions.java | 8 -------- .../broker/src/test/java/org/apache/qpid/server/MainTest.java | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/BrokerOptions.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/BrokerOptions.java index c7cceb3913..59075dfb57 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/BrokerOptions.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/BrokerOptions.java @@ -30,7 +30,6 @@ import java.util.concurrent.ConcurrentMap; import org.apache.qpid.server.configuration.BrokerProperties; import org.apache.qpid.server.model.ConfiguredObject; import org.apache.qpid.server.model.SystemConfig; -import org.apache.qpid.server.util.StringUtil; public class BrokerOptions { @@ -58,7 +57,6 @@ public class BrokerOptions BrokerOptions.class.getClassLoader().getResource(DEFAULT_INITIAL_CONFIG_NAME).toExternalForm(); public static final String MANAGEMENT_MODE_USER_NAME = "mm_admin"; - private static final int MANAGEMENT_MODE_PASSWORD_LENGTH = 10; private static final File FALLBACK_WORK_DIR = new File(System.getProperty("user.dir"), "work"); @@ -79,7 +77,6 @@ public class BrokerOptions private boolean _skipLoggingConfiguration; private boolean _overwriteConfigurationStore; private Map _configProperties = new HashMap(); - private String _initialSystemProperties; private boolean _startupLoggedToSystemOut = true; public Map convertToSystemConfigAttributes() @@ -102,11 +99,6 @@ public class BrokerOptions public String getManagementModePassword() { - if(_managementModePassword == null) - { - _managementModePassword = new StringUtil().randomAlphaNumericString(MANAGEMENT_MODE_PASSWORD_LENGTH); - } - return _managementModePassword; } diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/MainTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/MainTest.java index 850fa993f5..636048cac2 100644 --- a/qpid/java/broker/src/test/java/org/apache/qpid/server/MainTest.java +++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/MainTest.java @@ -188,7 +188,7 @@ public class MainTest extends QpidTestCase assertTrue(options.isManagementMode()); assertEquals(password, options.getManagementModePassword()); - options = startDummyMain("-mmpass " + password); + options = startDummyMain("-mm -mmpass " + password); assertNotNull(options.getManagementModePassword()); } -- cgit v1.2.1 From d3f445a199c0ed050bd4fa4bc00f331111a7a64d Mon Sep 17 00:00:00 2001 From: Keith Wall Date: Thu, 5 Feb 2015 12:34:29 +0000 Subject: QPID-6363: [Java Client] Register SASL mechanisms early git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1657555 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/main/java/org/apache/qpid/client/AMQConnection.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'qpid/java') diff --git a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java index 70d91ad817..df55080f67 100644 --- a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java +++ b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java @@ -64,6 +64,7 @@ import org.apache.qpid.AMQUnresolvedAddressException; import org.apache.qpid.client.failover.FailoverException; import org.apache.qpid.client.failover.FailoverProtectedOperation; import org.apache.qpid.client.protocol.AMQProtocolHandler; +import org.apache.qpid.client.security.CallbackHandlerRegistry; import org.apache.qpid.client.state.AMQStateManager; import org.apache.qpid.configuration.ClientProperties; import org.apache.qpid.exchange.ExchangeDefaults; @@ -192,6 +193,17 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect private boolean _compressMessages; private int _messageCompressionThresholdSize; + static + { + // The registering of any additional SASL mechanisms with the Java Security API requires + // SecurityManager permissions. In execution environments such as web containers, + // this may require adjustments to the Java security.policy. + CallbackHandlerRegistry registry = CallbackHandlerRegistry.getInstance(); + if (_logger.isDebugEnabled()) + { + _logger.debug("Loaded mechanisms " + registry.getMechanisms()); + } + } /** * @param broker brokerdetails * @param username username -- cgit v1.2.1 From 0f1feb11d7cbbe40de10a680eb22b28918608615 Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Thu, 5 Feb 2015 22:53:16 +0000 Subject: QPID-6364: Add a secure attribute 'storeUrl' into Keystore for specifying store content location and make attribute 'path' derived. Rename Trsuststore attribute 'path' into 'storeUrl' for consistency. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1657708 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/qpid/server/security/FileKeyStore.java | 9 ++- .../qpid/server/security/FileKeyStoreImpl.java | 33 +++++++++-- .../qpid/server/security/FileTrustStore.java | 8 ++- .../qpid/server/security/FileTrustStoreImpl.java | 30 ++++++++-- .../store/BrokerStoreUpgraderAndRecoverer.java | 18 ++++++ .../qpid/server/security/FileKeyStoreTest.java | 24 ++++---- .../qpid/server/security/FileTrustStoreTest.java | 30 +++++----- .../java/resources/store/filekeystore/add.html | 4 +- .../java/resources/store/filetruststore/add.html | 4 +- .../java/resources/store/filetruststore/show.html | 4 +- qpid/java/systests/etc/config-systests.json | 4 +- .../auth/manager/ExternalAuthenticationTest.java | 2 +- .../apache/qpid/systest/rest/KeyStoreRestTest.java | 68 ++++++++++------------ .../qpid/systest/rest/TrustStoreRestTest.java | 6 +- .../qpid/systest/rest/acl/BrokerACLTest.java | 6 +- 15 files changed, 157 insertions(+), 93 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStore.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStore.java index 899e98fa22..775571574f 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStore.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStore.java @@ -22,6 +22,7 @@ package org.apache.qpid.server.security; import javax.net.ssl.KeyManagerFactory; +import org.apache.qpid.server.model.DerivedAttribute; import org.apache.qpid.server.model.KeyStore; import org.apache.qpid.server.model.ManagedAttribute; import org.apache.qpid.server.model.ManagedContextDefault; @@ -35,7 +36,8 @@ public interface FileKeyStore> extends KeyStore String CERTIFICATE_ALIAS = "certificateAlias"; String KEY_STORE_TYPE = "keyStoreType"; String PASSWORD = "password"; - String PATH = "path"; + String STORE_URL = "storeUrl"; + @ManagedContextDefault(name = "keyStoreFile.keyStoreType") RuntimeDefault DEFAULT_KEYSTORE_TYPE = new RuntimeDefault() @@ -60,7 +62,10 @@ public interface FileKeyStore> extends KeyStore @ManagedAttribute(defaultValue = "${this:path}") String getDescription(); - @ManagedAttribute( mandatory = true) + @ManagedAttribute( mandatory = true, secure = true) + String getStoreUrl(); + + @DerivedAttribute String getPath(); @ManagedAttribute diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStoreImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStoreImpl.java index 31a4b473ed..7bed1bcd7d 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStoreImpl.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStoreImpl.java @@ -68,7 +68,8 @@ public class FileKeyStoreImpl extends AbstractConfiguredObject private String _certificateAlias; @ManagedAttributeField private String _keyManagerFactoryAlgorithm; - @ManagedAttributeField + @ManagedAttributeField(afterSet = "postSetStoreUrl") + private String _storeUrl; private String _path; @ManagedAttributeField private String _password; @@ -162,7 +163,7 @@ public class FileKeyStoreImpl extends AbstractConfiguredObject java.security.KeyStore keyStore; try { - URL url = getUrlFromString(fileKeyStore.getPath()); + URL url = getUrlFromString(fileKeyStore.getStoreUrl()); String password = fileKeyStore.getPassword(); String keyStoreType = fileKeyStore.getKeyStoreType(); keyStore = SSLUtil.getInitializedKeyStore(url, password, keyStoreType); @@ -173,11 +174,11 @@ public class FileKeyStoreImpl extends AbstractConfiguredObject final String message; if (e instanceof IOException && e.getCause() != null && e.getCause() instanceof UnrecoverableKeyException) { - message = "Check key store password. Cannot instantiate key store from '" + fileKeyStore.getPath() + "'."; + message = "Check key store password. Cannot instantiate key store from '" + fileKeyStore.getStoreUrl() + "'."; } else { - message = "Cannot instantiate key store from '" + fileKeyStore.getPath() + "'."; + message = "Cannot instantiate key store from '" + fileKeyStore.getStoreUrl() + "'."; } throw new IllegalConfigurationException(message, e); @@ -198,7 +199,7 @@ public class FileKeyStoreImpl extends AbstractConfiguredObject if (cert == null) { throw new IllegalConfigurationException("Cannot find a certificate with alias '" + fileKeyStore.getCertificateAlias() - + "' in key store : " + fileKeyStore.getPath()); + + "' in key store : " + fileKeyStore.getStoreUrl()); } } @@ -218,6 +219,12 @@ public class FileKeyStoreImpl extends AbstractConfiguredObject } } + @Override + public String getStoreUrl() + { + return _storeUrl; + } + @Override public String getPath() { @@ -258,7 +265,7 @@ public class FileKeyStoreImpl extends AbstractConfiguredObject try { - URL url = getUrlFromString(_path); + URL url = getUrlFromString(_storeUrl); if (_certificateAlias != null) { return new KeyManager[] { @@ -301,4 +308,18 @@ public class FileKeyStoreImpl extends AbstractConfiguredObject } return url; } + + @SuppressWarnings(value = "unused") + private void postSetStoreUrl() + { + try + { + new URL(_storeUrl); + _path = null; + } + catch (MalformedURLException e) + { + _path = _storeUrl; + } + } } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStore.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStore.java index 86d7d5e4b8..f876831724 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStore.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStore.java @@ -22,6 +22,7 @@ package org.apache.qpid.server.security; import javax.net.ssl.KeyManagerFactory; +import org.apache.qpid.server.model.DerivedAttribute; import org.apache.qpid.server.model.ManagedAttribute; import org.apache.qpid.server.model.ManagedContextDefault; import org.apache.qpid.server.model.ManagedObject; @@ -35,7 +36,7 @@ public interface FileTrustStore> extends TrustStore< String PEERS_ONLY = "peersOnly"; String TRUST_STORE_TYPE = "trustStoreType"; String PASSWORD = "password"; - String PATH = "path"; + String STORE_URL = "storeUrl"; @ManagedContextDefault(name = "trustStoreFile.trustStoreType") RuntimeDefault DEFAULT_TRUSTSTORE_TYPE = new RuntimeDefault() @@ -58,10 +59,13 @@ public interface FileTrustStore> extends TrustStore< }; - @ManagedAttribute(defaultValue = "${this:path}") + @ManagedAttribute(defaultValue = "${this:storeUrl}") String getDescription(); @ManagedAttribute( mandatory = true ) + String getStoreUrl(); + + @DerivedAttribute String getPath(); @ManagedAttribute( defaultValue = "${trustStoreFile.trustManagerFactoryAlgorithm}") diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStoreImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStoreImpl.java index 66ae6fdb35..78f9a5184b 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStoreImpl.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStoreImpl.java @@ -64,7 +64,8 @@ public class FileTrustStoreImpl extends AbstractConfiguredObject attributes = new HashMap<>(record.getAttributes()); + Object path = attributes.remove("path"); + attributes.put("storeUrl", path); + record = new ConfiguredObjectRecordImpl(record.getId(), record.getType(), attributes, record.getParents()); + getUpdateMap().put(record.getId(), record); + return record; + } + private boolean isAmqpPort(final Map attributes) { Object type = attributes.get(ConfiguredObject.TYPE); diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/FileKeyStoreTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/FileKeyStoreTest.java index 0e45582d7c..0a2e122d16 100644 --- a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/FileKeyStoreTest.java +++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/FileKeyStoreTest.java @@ -69,7 +69,7 @@ public class FileKeyStoreTest extends QpidTestCase { Map attributes = new HashMap<>(); attributes.put(FileKeyStore.NAME, "myFileKeyStore"); - attributes.put(FileKeyStore.PATH, TestSSLConstants.BROKER_KEYSTORE); + attributes.put(FileKeyStore.STORE_URL, TestSSLConstants.BROKER_KEYSTORE); attributes.put(FileKeyStore.PASSWORD, TestSSLConstants.BROKER_KEYSTORE_PASSWORD); FileKeyStoreImpl fileKeyStore = (FileKeyStoreImpl) _factory.create(KeyStore.class, attributes, _broker); @@ -84,7 +84,7 @@ public class FileKeyStoreTest extends QpidTestCase { Map attributes = new HashMap<>(); attributes.put(FileKeyStore.NAME, "myFileKeyStore"); - attributes.put(FileKeyStore.PATH, TestSSLConstants.BROKER_KEYSTORE); + attributes.put(FileKeyStore.STORE_URL, TestSSLConstants.BROKER_KEYSTORE); attributes.put(FileKeyStore.PASSWORD, TestSSLConstants.BROKER_KEYSTORE_PASSWORD); attributes.put(FileKeyStore.CERTIFICATE_ALIAS, TestSSLConstants.BROKER_KEYSTORE_ALIAS); @@ -100,7 +100,7 @@ public class FileKeyStoreTest extends QpidTestCase { Map attributes = new HashMap<>(); attributes.put(FileKeyStore.NAME, "myFileKeyStore"); - attributes.put(FileKeyStore.PATH, TestSSLConstants.BROKER_KEYSTORE); + attributes.put(FileKeyStore.STORE_URL, TestSSLConstants.BROKER_KEYSTORE); attributes.put(FileKeyStore.PASSWORD, "wrong"); try @@ -119,7 +119,7 @@ public class FileKeyStoreTest extends QpidTestCase { Map attributes = new HashMap<>(); attributes.put(FileKeyStore.NAME, "myFileKeyStore"); - attributes.put(FileKeyStore.PATH, TestSSLConstants.KEYSTORE); + attributes.put(FileKeyStore.STORE_URL, TestSSLConstants.KEYSTORE); attributes.put(FileKeyStore.PASSWORD, TestSSLConstants.KEYSTORE_PASSWORD); attributes.put(FileKeyStore.CERTIFICATE_ALIAS, "notknown"); @@ -141,7 +141,7 @@ public class FileKeyStoreTest extends QpidTestCase Map attributes = new HashMap<>(); attributes.put(FileKeyStore.NAME, "myFileKeyStore"); - attributes.put(FileKeyStore.PATH, trustStoreAsDataUrl); + attributes.put(FileKeyStore.STORE_URL, trustStoreAsDataUrl); attributes.put(FileKeyStore.PASSWORD, TestSSLConstants.BROKER_KEYSTORE_PASSWORD); FileKeyStoreImpl fileKeyStore = (FileKeyStoreImpl) _factory.create(KeyStore.class, attributes, _broker); @@ -158,7 +158,7 @@ public class FileKeyStoreTest extends QpidTestCase Map attributes = new HashMap<>(); attributes.put(FileKeyStore.NAME, "myFileKeyStore"); - attributes.put(FileKeyStore.PATH, trustStoreAsDataUrl); + attributes.put(FileKeyStore.STORE_URL, trustStoreAsDataUrl); attributes.put(FileKeyStore.PASSWORD, TestSSLConstants.BROKER_KEYSTORE_PASSWORD); attributes.put(FileKeyStore.CERTIFICATE_ALIAS, TestSSLConstants.BROKER_KEYSTORE_ALIAS); @@ -177,7 +177,7 @@ public class FileKeyStoreTest extends QpidTestCase Map attributes = new HashMap<>(); attributes.put(FileKeyStore.NAME, "myFileKeyStore"); attributes.put(FileKeyStore.PASSWORD, "wrong"); - attributes.put(FileKeyStore.PATH, keyStoreAsDataUrl); + attributes.put(FileKeyStore.STORE_URL, keyStoreAsDataUrl); try { @@ -198,7 +198,7 @@ public class FileKeyStoreTest extends QpidTestCase Map attributes = new HashMap<>(); attributes.put(FileKeyStore.NAME, "myFileKeyStore"); attributes.put(FileKeyStore.PASSWORD, TestSSLConstants.BROKER_KEYSTORE_PASSWORD); - attributes.put(FileKeyStore.PATH, keyStoreAsDataUrl); + attributes.put(FileKeyStore.STORE_URL, keyStoreAsDataUrl); try { @@ -220,7 +220,7 @@ public class FileKeyStoreTest extends QpidTestCase Map attributes = new HashMap<>(); attributes.put(FileKeyStore.NAME, "myFileKeyStore"); attributes.put(FileKeyStore.PASSWORD, TestSSLConstants.BROKER_KEYSTORE_PASSWORD); - attributes.put(FileKeyStore.PATH, keyStoreAsDataUrl); + attributes.put(FileKeyStore.STORE_URL, keyStoreAsDataUrl); attributes.put(FileKeyStore.CERTIFICATE_ALIAS, "notknown"); try @@ -242,7 +242,7 @@ public class FileKeyStoreTest extends QpidTestCase Map attributes = new HashMap<>(); attributes.put(FileKeyStore.NAME, "myFileKeyStore"); - attributes.put(FileKeyStore.PATH, TestSSLConstants.BROKER_KEYSTORE); + attributes.put(FileKeyStore.STORE_URL, TestSSLConstants.BROKER_KEYSTORE); attributes.put(FileKeyStore.PASSWORD, TestSSLConstants.BROKER_KEYSTORE_PASSWORD); FileKeyStoreImpl fileKeyStore = (FileKeyStoreImpl) _factory.create(KeyStore.class, attributes, _broker); @@ -283,7 +283,7 @@ public class FileKeyStoreTest extends QpidTestCase Map attributes = new HashMap<>(); attributes.put(FileKeyStore.NAME, "myFileKeyStore"); - attributes.put(FileKeyStore.PATH, TestSSLConstants.BROKER_KEYSTORE); + attributes.put(FileKeyStore.STORE_URL, TestSSLConstants.BROKER_KEYSTORE); attributes.put(FileKeyStore.PASSWORD, TestSSLConstants.BROKER_KEYSTORE_PASSWORD); FileKeyStoreImpl fileKeyStore = (FileKeyStoreImpl) _factory.create(KeyStore.class, attributes, _broker); @@ -299,7 +299,7 @@ public class FileKeyStoreTest extends QpidTestCase Map attributes = new HashMap<>(); attributes.put(FileKeyStore.NAME, "myFileKeyStore"); - attributes.put(FileKeyStore.PATH, TestSSLConstants.BROKER_KEYSTORE); + attributes.put(FileKeyStore.STORE_URL, TestSSLConstants.BROKER_KEYSTORE); attributes.put(FileKeyStore.PASSWORD, TestSSLConstants.BROKER_KEYSTORE_PASSWORD); FileKeyStoreImpl fileKeyStore = (FileKeyStoreImpl) _factory.create(KeyStore.class, attributes, _broker); diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/FileTrustStoreTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/FileTrustStoreTest.java index d965549cdd..72c8926f85 100644 --- a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/FileTrustStoreTest.java +++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/FileTrustStoreTest.java @@ -73,7 +73,7 @@ public class FileTrustStoreTest extends QpidTestCase { Map attributes = new HashMap<>(); attributes.put(FileTrustStore.NAME, "myFileTrustStore"); - attributes.put(FileTrustStore.PATH, TestSSLConstants.TRUSTSTORE); + attributes.put(FileTrustStore.STORE_URL, TestSSLConstants.TRUSTSTORE); attributes.put(FileTrustStore.PASSWORD, TestSSLConstants.TRUSTSTORE_PASSWORD); FileTrustStoreImpl fileTrustStore = @@ -89,7 +89,7 @@ public class FileTrustStoreTest extends QpidTestCase { Map attributes = new HashMap<>(); attributes.put(FileTrustStore.NAME, "myFileTrustStore"); - attributes.put(FileTrustStore.PATH, TestSSLConstants.TRUSTSTORE); + attributes.put(FileTrustStore.STORE_URL, TestSSLConstants.TRUSTSTORE); attributes.put(FileTrustStore.PASSWORD, "wrong"); try @@ -108,7 +108,7 @@ public class FileTrustStoreTest extends QpidTestCase { Map attributes = new HashMap<>(); attributes.put(FileTrustStore.NAME, "myFileTrustStore"); - attributes.put(FileTrustStore.PATH, TestSSLConstants.BROKER_PEERSTORE); + attributes.put(FileTrustStore.STORE_URL, TestSSLConstants.BROKER_PEERSTORE); attributes.put(FileTrustStore.PASSWORD, TestSSLConstants.BROKER_PEERSTORE_PASSWORD); attributes.put(FileTrustStore.PEERS_ONLY, true); @@ -129,7 +129,7 @@ public class FileTrustStoreTest extends QpidTestCase Map attributes = new HashMap<>(); attributes.put(FileTrustStore.NAME, "myFileTrustStore"); - attributes.put(FileTrustStore.PATH, trustStoreAsDataUrl); + attributes.put(FileTrustStore.STORE_URL, trustStoreAsDataUrl); attributes.put(FileTrustStore.PASSWORD, TestSSLConstants.TRUSTSTORE_PASSWORD); FileTrustStoreImpl fileTrustStore = @@ -148,7 +148,7 @@ public class FileTrustStoreTest extends QpidTestCase Map attributes = new HashMap<>(); attributes.put(FileTrustStore.NAME, "myFileTrustStore"); attributes.put(FileTrustStore.PASSWORD, "wrong"); - attributes.put(FileTrustStore.PATH, trustStoreAsDataUrl); + attributes.put(FileTrustStore.STORE_URL, trustStoreAsDataUrl); try { @@ -169,7 +169,7 @@ public class FileTrustStoreTest extends QpidTestCase Map attributes = new HashMap<>(); attributes.put(FileTrustStore.NAME, "myFileTrustStore"); attributes.put(FileTrustStore.PASSWORD, TestSSLConstants.TRUSTSTORE_PASSWORD); - attributes.put(FileTrustStore.PATH, trustStoreAsDataUrl); + attributes.put(FileTrustStore.STORE_URL, trustStoreAsDataUrl); try { @@ -191,18 +191,18 @@ public class FileTrustStoreTest extends QpidTestCase Map attributes = new HashMap<>(); attributes.put(FileTrustStore.NAME, "myFileTrustStore"); - attributes.put(FileTrustStore.PATH, TestSSLConstants.TRUSTSTORE); + attributes.put(FileTrustStore.STORE_URL, TestSSLConstants.TRUSTSTORE); attributes.put(FileTrustStore.PASSWORD, TestSSLConstants.TRUSTSTORE_PASSWORD); FileTrustStoreImpl fileTrustStore = (FileTrustStoreImpl) _factory.create(TrustStore.class, attributes, _broker); - assertEquals("Unexpected path value before change", TestSSLConstants.TRUSTSTORE, fileTrustStore.getPath()); + assertEquals("Unexpected path value before change", TestSSLConstants.TRUSTSTORE, fileTrustStore.getStoreUrl()); try { Map unacceptableAttributes = new HashMap<>(); - unacceptableAttributes.put(FileTrustStore.PATH, "/not/a/truststore"); + unacceptableAttributes.put(FileTrustStore.STORE_URL, "/not/a/truststore"); fileTrustStore.setAttributes(unacceptableAttributes); fail("Exception not thrown"); @@ -213,17 +213,17 @@ public class FileTrustStoreTest extends QpidTestCase assertTrue("Exception text not as unexpected:" + message, message.contains("Cannot instantiate trust store")); } - assertEquals("Unexpected path value after failed change", TestSSLConstants.TRUSTSTORE, fileTrustStore.getPath()); + assertEquals("Unexpected path value after failed change", TestSSLConstants.TRUSTSTORE, fileTrustStore.getStoreUrl()); Map changedAttributes = new HashMap<>(); - changedAttributes.put(FileTrustStore.PATH, TestSSLConstants.BROKER_TRUSTSTORE); + changedAttributes.put(FileTrustStore.STORE_URL, TestSSLConstants.BROKER_TRUSTSTORE); changedAttributes.put(FileTrustStore.PASSWORD, TestSSLConstants.BROKER_TRUSTSTORE_PASSWORD); fileTrustStore.setAttributes(changedAttributes); assertEquals("Unexpected path value after change that is expected to be successful", TestSSLConstants.BROKER_TRUSTSTORE, - fileTrustStore.getPath()); + fileTrustStore.getStoreUrl()); } public void testDeleteTrustStore_Success() throws Exception @@ -233,7 +233,7 @@ public class FileTrustStoreTest extends QpidTestCase Map attributes = new HashMap<>(); attributes.put(FileTrustStore.NAME, "myFileTrustStore"); - attributes.put(FileTrustStore.PATH, TestSSLConstants.TRUSTSTORE); + attributes.put(FileTrustStore.STORE_URL, TestSSLConstants.TRUSTSTORE); attributes.put(FileTrustStore.PASSWORD, TestSSLConstants.TRUSTSTORE_PASSWORD); FileTrustStoreImpl fileTrustStore = @@ -250,7 +250,7 @@ public class FileTrustStoreTest extends QpidTestCase Map attributes = new HashMap<>(); attributes.put(FileTrustStore.NAME, "myFileTrustStore"); - attributes.put(FileTrustStore.PATH, TestSSLConstants.TRUSTSTORE); + attributes.put(FileTrustStore.STORE_URL, TestSSLConstants.TRUSTSTORE); attributes.put(FileTrustStore.PASSWORD, TestSSLConstants.TRUSTSTORE_PASSWORD); FileTrustStoreImpl fileTrustStore = @@ -281,7 +281,7 @@ public class FileTrustStoreTest extends QpidTestCase Map attributes = new HashMap<>(); attributes.put(FileTrustStore.NAME, "myFileTrustStore"); - attributes.put(FileTrustStore.PATH, TestSSLConstants.TRUSTSTORE); + attributes.put(FileTrustStore.STORE_URL, TestSSLConstants.TRUSTSTORE); attributes.put(FileTrustStore.PASSWORD, TestSSLConstants.TRUSTSTORE_PASSWORD); FileTrustStoreImpl fileTrustStore = diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/store/filekeystore/add.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/store/filekeystore/add.html index 2356accbd4..676ae4007b 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/store/filekeystore/add.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/store/filekeystore/add.html @@ -22,10 +22,10 @@
Server path or upload*:
-
Server path or upload*:
- -
Path:
-
+
Store Url:
+
Peers only:
diff --git a/qpid/java/systests/etc/config-systests.json b/qpid/java/systests/etc/config-systests.json index fa5e7f7724..8103f4568c 100644 --- a/qpid/java/systests/etc/config-systests.json +++ b/qpid/java/systests/etc/config-systests.json @@ -29,12 +29,12 @@ } ], "keystores" : [ { "name" : "systestsKeyStore", - "path" : "${QPID_HOME}${file.separator}..${file.separator}test-profiles${file.separator}test_resources${file.separator}ssl${file.separator}java_broker_keystore.jks", + "storeUrl" : "${QPID_HOME}${file.separator}..${file.separator}test-profiles${file.separator}test_resources${file.separator}ssl${file.separator}java_broker_keystore.jks", "password" : "password" } ], "truststores" : [ { "name" : "systestsTrustStore", - "path" : "${QPID_HOME}${file.separator}..${file.separator}test-profiles${file.separator}test_resources${file.separator}ssl${file.separator}java_broker_truststore.jks", + "storeUrl" : "${QPID_HOME}${file.separator}..${file.separator}test-profiles${file.separator}test_resources${file.separator}ssl${file.separator}java_broker_truststore.jks", "password" : "password" } ], "ports" : [ { diff --git a/qpid/java/systests/src/test/java/org/apache/qpid/server/security/auth/manager/ExternalAuthenticationTest.java b/qpid/java/systests/src/test/java/org/apache/qpid/server/security/auth/manager/ExternalAuthenticationTest.java index 5522187ee5..e855a721ee 100644 --- a/qpid/java/systests/src/test/java/org/apache/qpid/server/security/auth/manager/ExternalAuthenticationTest.java +++ b/qpid/java/systests/src/test/java/org/apache/qpid/server/security/auth/manager/ExternalAuthenticationTest.java @@ -203,7 +203,7 @@ public class ExternalAuthenticationTest extends QpidBrokerTestCase //add the peersOnly store to the config Map sslTrustStoreAttributes = new HashMap(); sslTrustStoreAttributes.put(TrustStore.NAME, peerStoreName); - sslTrustStoreAttributes.put(FileTrustStore.PATH, BROKER_PEERSTORE); + sslTrustStoreAttributes.put(FileTrustStore.STORE_URL, BROKER_PEERSTORE); sslTrustStoreAttributes.put(FileTrustStore.PASSWORD, BROKER_PEERSTORE_PASSWORD); sslTrustStoreAttributes.put(FileTrustStore.PEERS_ONLY, true); getBrokerConfiguration().addObjectConfiguration(TrustStore.class, sslTrustStoreAttributes); diff --git a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java index 03b0a7a304..772f86edf4 100644 --- a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java +++ b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java @@ -52,8 +52,12 @@ public class KeyStoreRestTest extends QpidRestTestCase List> keyStores = assertNumberOfKeyStores(1); Map keystore = keyStores.get(0); - assertKeyStoreAttributes(keystore, TestBrokerConfiguration.ENTRY_NAME_SSL_KEYSTORE, - QPID_HOME + "/../" + TestSSLConstants.BROKER_KEYSTORE, null); + + assertEquals("Unexpected name", TestBrokerConfiguration.ENTRY_NAME_SSL_KEYSTORE, keystore.get(KeyStore.NAME)); + assertEquals("unexpected path to key store", AbstractConfiguredObject.SECURED_STRING_VALUE, keystore.get(FileKeyStore.STORE_URL)); + assertEquals("unexpected (dummy) password of default systests key store", AbstractConfiguredObject.SECURED_STRING_VALUE, keystore.get(FileKeyStore.PASSWORD)); + assertEquals("unexpected type of default systests key store", java.security.KeyStore.getDefaultType(), keystore.get(FileKeyStore.KEY_STORE_TYPE)); + assertFalse("should not be a certificateAlias attribute", keystore.containsKey(FileKeyStore.CERTIFICATE_ALIAS)); } public void testCreate() throws Exception @@ -67,10 +71,14 @@ public class KeyStoreRestTest extends QpidRestTestCase createKeyStore(name, certAlias, TestSSLConstants.KEYSTORE, TestSSLConstants.KEYSTORE_PASSWORD); assertNumberOfKeyStores(2); - List> keyStores = getRestTestHelper().getJsonAsList("keystore/" + name); + List> keyStores = getRestTestHelper().getJsonAsList("keystore/" + name + "?actuals=true"); assertNotNull("details cannot be null", keyStores); - assertKeyStoreAttributes(keyStores.get(0), name, TestSSLConstants.KEYSTORE, certAlias); + Map keystore = keyStores.get(0); + assertEquals("Unexpected name", name, keystore.get(KeyStore.NAME)); + assertEquals("unexpected path to key store", TestSSLConstants.KEYSTORE, keystore.get(FileKeyStore.STORE_URL)); + assertEquals("unexpected password", TestSSLConstants.KEYSTORE_PASSWORD, keystore.get(FileKeyStore.PASSWORD)); + assertEquals("unexpected alias", certAlias, keystore.get(FileKeyStore.CERTIFICATE_ALIAS)); } public void testCreateWithDataUrl() throws Exception @@ -85,10 +93,14 @@ public class KeyStoreRestTest extends QpidRestTestCase createKeyStore(name, null, dataUrlForKeyStore, TestSSLConstants.KEYSTORE_PASSWORD); assertNumberOfKeyStores(2); - List> keyStores = getRestTestHelper().getJsonAsList("keystore/" + name); + List> keyStores = getRestTestHelper().getJsonAsList("keystore/" + name + "?actuals=true"); assertNotNull("details cannot be null", keyStores); - assertKeyStoreAttributes(keyStores.get(0), name, dataUrlForKeyStore, null); + Map keystore = keyStores.get(0); + assertEquals("Unexpected name", name, keystore.get(KeyStore.NAME)); + assertEquals("unexpected data", dataUrlForKeyStore, keystore.get(FileKeyStore.STORE_URL)); + assertEquals("unexpected password", TestSSLConstants.KEYSTORE_PASSWORD, keystore.get(FileKeyStore.PASSWORD)); + assertEquals("unexpected alias", null, keystore.get(FileKeyStore.CERTIFICATE_ALIAS)); } public void testDelete() throws Exception @@ -104,15 +116,17 @@ public class KeyStoreRestTest extends QpidRestTestCase getRestTestHelper().submitRequest("keystore/" + name, "DELETE", HttpServletResponse.SC_OK); - List> keyStore = getRestTestHelper().getJsonAsList("keystore/" + name); + List> keyStore = getRestTestHelper().getJsonAsList("keystore/" + name + "?actuals=true"); assertNotNull("details should not be null", keyStore); assertTrue("details should be empty as the keystore no longer exists", keyStore.isEmpty()); //check only the default systests key store remains List> keyStores = assertNumberOfKeyStores(1); Map keystore = keyStores.get(0); - assertKeyStoreAttributes(keystore, TestBrokerConfiguration.ENTRY_NAME_SSL_KEYSTORE, - QPID_HOME + "/../" + TestSSLConstants.BROKER_KEYSTORE, null); + assertEquals("Unexpected name", TestBrokerConfiguration.ENTRY_NAME_SSL_KEYSTORE, keystore.get(KeyStore.NAME)); + assertEquals("unexpected path to key store", AbstractConfiguredObject.SECURED_STRING_VALUE, keystore.get(FileKeyStore.STORE_URL)); + assertEquals("unexpected (dummy) password of default systests key store", AbstractConfiguredObject.SECURED_STRING_VALUE, keystore.get(FileKeyStore.PASSWORD)); + assertFalse("should not be a certificateAlias attribute", keystore.containsKey(FileKeyStore.CERTIFICATE_ALIAS)); } public void testUpdate() throws Exception @@ -127,14 +141,18 @@ public class KeyStoreRestTest extends QpidRestTestCase Map attributes = new HashMap(); attributes.put(KeyStore.NAME, name); - attributes.put(FileKeyStore.PATH, TestSSLConstants.UNTRUSTED_KEYSTORE); + attributes.put(FileKeyStore.STORE_URL, TestSSLConstants.UNTRUSTED_KEYSTORE); getRestTestHelper().submitRequest("keystore/" + name, "PUT", attributes, HttpServletResponse.SC_OK); - List> keyStore = getRestTestHelper().getJsonAsList("keystore/" + name); - assertNotNull("details should not be null", keyStore); + List> keyStores = getRestTestHelper().getJsonAsList("keystore/" + name + "?actuals=true"); + assertNotNull("details should not be null", keyStores); - assertKeyStoreAttributes(keyStore.get(0), name, TestSSLConstants.UNTRUSTED_KEYSTORE, null); + Map keystore = keyStores.get(0); + assertEquals("Unexpected name", name, keystore.get(KeyStore.NAME)); + assertEquals("unexpected data", TestSSLConstants.UNTRUSTED_KEYSTORE, keystore.get(FileKeyStore.STORE_URL)); + assertEquals("unexpected password", TestSSLConstants.KEYSTORE_PASSWORD, keystore.get(FileKeyStore.PASSWORD)); + assertEquals("unexpected alias", null, keystore.get(FileKeyStore.CERTIFICATE_ALIAS)); } @@ -151,7 +169,7 @@ public class KeyStoreRestTest extends QpidRestTestCase { Map keyStoreAttributes = new HashMap<>(); keyStoreAttributes.put(KeyStore.NAME, name); - keyStoreAttributes.put(FileKeyStore.PATH, keyStorePath); + keyStoreAttributes.put(FileKeyStore.STORE_URL, keyStorePath); keyStoreAttributes.put(FileKeyStore.PASSWORD, keystorePassword); if (certAlias != null) { @@ -161,26 +179,4 @@ public class KeyStoreRestTest extends QpidRestTestCase getRestTestHelper().submitRequest("keystore/" + name, "PUT", keyStoreAttributes, HttpServletResponse.SC_CREATED); } - private void assertKeyStoreAttributes(Map keystore, String name, String path, String certAlias) - { - assertEquals("default systests key store is missing", - name, keystore.get(KeyStore.NAME)); - assertEquals("unexpected path to key store", - path, keystore.get(FileKeyStore.PATH)); - assertEquals("unexpected (dummy) password of default systests key store", - AbstractConfiguredObject.SECURED_STRING_VALUE, keystore.get(FileKeyStore.PASSWORD)); - assertEquals("unexpected type of default systests key store", - java.security.KeyStore.getDefaultType(), keystore.get(FileKeyStore.KEY_STORE_TYPE)); - if(certAlias == null) - { - assertFalse("should not be a certificateAlias attribute", - keystore.containsKey(FileKeyStore.CERTIFICATE_ALIAS)); - } - else - { - assertEquals("unexpected certificateAlias value", - certAlias, keystore.get(FileKeyStore.CERTIFICATE_ALIAS)); - - } - } } diff --git a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/TrustStoreRestTest.java b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/TrustStoreRestTest.java index 6cca3fc12c..5919473676 100644 --- a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/TrustStoreRestTest.java +++ b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/TrustStoreRestTest.java @@ -127,7 +127,7 @@ public class TrustStoreRestTest extends QpidRestTestCase Map attributes = new HashMap(); attributes.put(TrustStore.NAME, name); - attributes.put(FileTrustStore.PATH, TestSSLConstants.TRUSTSTORE); + attributes.put(FileTrustStore.STORE_URL, TestSSLConstants.TRUSTSTORE); getRestTestHelper().submitRequest("truststore/" + name , "PUT", attributes, HttpServletResponse.SC_OK); @@ -151,7 +151,7 @@ public class TrustStoreRestTest extends QpidRestTestCase Map trustStoreAttributes = new HashMap(); trustStoreAttributes.put(TrustStore.NAME, name); //deliberately using the client trust store to differentiate from the one we are already for broker - trustStoreAttributes.put(FileTrustStore.PATH, truststorePath); + trustStoreAttributes.put(FileTrustStore.STORE_URL, truststorePath); trustStoreAttributes.put(FileTrustStore.PASSWORD, truststorePassword); trustStoreAttributes.put(FileTrustStore.PEERS_ONLY, peersOnly); @@ -163,7 +163,7 @@ public class TrustStoreRestTest extends QpidRestTestCase assertEquals("default systests trust store is missing", name, truststore.get(TrustStore.NAME)); assertEquals("unexpected path to trust store", - path, truststore.get(FileTrustStore.PATH)); + path, truststore.get(FileTrustStore.STORE_URL)); assertEquals("unexpected (dummy) password of default systests trust store", AbstractConfiguredObject.SECURED_STRING_VALUE, truststore.get(FileTrustStore.PASSWORD)); assertEquals("unexpected type of default systests trust store", diff --git a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/acl/BrokerACLTest.java b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/acl/BrokerACLTest.java index 86ebf11575..c05e95c4d4 100644 --- a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/acl/BrokerACLTest.java +++ b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/acl/BrokerACLTest.java @@ -183,7 +183,7 @@ public class BrokerACLTest extends QpidRestTestCase assertEquals("Setting of provider attribites should be allowed", 403, responseCode); Map provider = getRestTestHelper().getJsonAsSingletonList("authenticationprovider/" + providerName); - assertEquals("Unexpected PATH attribute value", + assertEquals("Unexpected STORE_URL attribute value", providerData.get(ExternalFileBasedAuthenticationManager.PATH), provider.get(ExternalFileBasedAuthenticationManager.PATH)); } @@ -922,7 +922,7 @@ public class BrokerACLTest extends QpidRestTestCase { Map keyStoreAttributes = new HashMap(); keyStoreAttributes.put(KeyStore.NAME, name); - keyStoreAttributes.put(FileKeyStore.PATH, TestSSLConstants.KEYSTORE); + keyStoreAttributes.put(FileKeyStore.STORE_URL, TestSSLConstants.KEYSTORE); keyStoreAttributes.put(FileKeyStore.PASSWORD, TestSSLConstants.KEYSTORE_PASSWORD); keyStoreAttributes.put(FileKeyStore.CERTIFICATE_ALIAS, certAlias); @@ -933,7 +933,7 @@ public class BrokerACLTest extends QpidRestTestCase { Map trustStoreAttributes = new HashMap(); trustStoreAttributes.put(TrustStore.NAME, name); - trustStoreAttributes.put(FileTrustStore.PATH, TestSSLConstants.KEYSTORE); + trustStoreAttributes.put(FileTrustStore.STORE_URL, TestSSLConstants.KEYSTORE); trustStoreAttributes.put(FileTrustStore.PASSWORD, TestSSLConstants.KEYSTORE_PASSWORD); trustStoreAttributes.put(FileTrustStore.PEERS_ONLY, peersOnly); -- cgit v1.2.1 From f0636abb3d7de4b757a4859857dfce004a4d30a3 Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Fri, 6 Feb 2015 17:11:38 +0000 Subject: QPID-6366: [Java Broker] Prevent data urls cluttering the UI and prevent potentially large data url consuming too much bandwidth during the regular REST poll git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1657900 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/qpid/server/model/ConfiguredObject.java | 2 + .../apache/qpid/server/security/FileKeyStore.java | 2 +- .../qpid/server/security/FileTrustStore.java | 2 +- .../qpid/server/security/NonJavaKeyStore.java | 6 +-- .../qpid/server/security/NonJavaTrustStore.java | 2 +- .../plugins/ACLFileAccessControlProvider.java | 2 +- .../plugin/servlet/rest/MetaDataServlet.java | 5 +- .../resources/js/qpid/common/ResourceWidget.js | 4 ++ .../js/qpid/management/store/filekeystore/add.js | 8 ++-- .../js/qpid/management/store/filetruststore/add.js | 8 ++-- .../qpid/management/store/nonjavakeystore/add.js | 31 +++++++++---- .../qpid/management/store/nonjavatruststore/add.js | 33 +++++++++----- .../apache/qpid/systest/rest/KeyStoreRestTest.java | 3 +- .../qpid/systest/rest/TrustStoreRestTest.java | 53 ++++++++++++++-------- 14 files changed, 106 insertions(+), 55 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java index deda7768f3..7079461a09 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java @@ -35,6 +35,8 @@ import org.apache.qpid.server.store.ConfiguredObjectRecord; */ public interface ConfiguredObject> { + String OVER_SIZED_ATTRIBUTE_ALTERNATIVE_TEXT = "Value is too long to display"; + String ID = "id"; String NAME = "name"; String TYPE = "type"; diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStore.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStore.java index 775571574f..0607f4b3d3 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStore.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStore.java @@ -62,7 +62,7 @@ public interface FileKeyStore> extends KeyStore @ManagedAttribute(defaultValue = "${this:path}") String getDescription(); - @ManagedAttribute( mandatory = true, secure = true) + @ManagedAttribute( mandatory = true, secure = true, oversize = true, oversizedAltText = OVER_SIZED_ATTRIBUTE_ALTERNATIVE_TEXT) String getStoreUrl(); @DerivedAttribute diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStore.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStore.java index f876831724..a8035da5b4 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStore.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStore.java @@ -62,7 +62,7 @@ public interface FileTrustStore> extends TrustStore< @ManagedAttribute(defaultValue = "${this:storeUrl}") String getDescription(); - @ManagedAttribute( mandatory = true ) + @ManagedAttribute( mandatory = true, oversize = true, oversizedAltText = OVER_SIZED_ATTRIBUTE_ALTERNATIVE_TEXT) String getStoreUrl(); @DerivedAttribute diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/NonJavaKeyStore.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/NonJavaKeyStore.java index 458daa4b7a..78509182b5 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/NonJavaKeyStore.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/NonJavaKeyStore.java @@ -31,13 +31,13 @@ public interface NonJavaKeyStore> extends KeyStore< @ManagedAttribute(defaultValue = "${this:subjectName}") String getDescription(); - @ManagedAttribute( mandatory = true, secure = true ) + @ManagedAttribute( mandatory = true, secure = true, oversize = true, oversizedAltText = OVER_SIZED_ATTRIBUTE_ALTERNATIVE_TEXT ) String getPrivateKeyUrl(); - @ManagedAttribute( mandatory = true ) + @ManagedAttribute( mandatory = true, oversize = true, oversizedAltText = OVER_SIZED_ATTRIBUTE_ALTERNATIVE_TEXT ) String getCertificateUrl(); - @ManagedAttribute + @ManagedAttribute( oversize = true, oversizedAltText = OVER_SIZED_ATTRIBUTE_ALTERNATIVE_TEXT ) String getIntermediateCertificateUrl(); @DerivedAttribute diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/NonJavaTrustStore.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/NonJavaTrustStore.java index f7d970074d..2ae5a329d5 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/NonJavaTrustStore.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/NonJavaTrustStore.java @@ -34,7 +34,7 @@ public interface NonJavaTrustStore> extends Trust @ManagedAttribute(defaultValue = "${this:certificateDetails}") String getDescription(); - @ManagedAttribute( mandatory = true ) + @ManagedAttribute( mandatory = true, oversize = true, oversizedAltText = OVER_SIZED_ATTRIBUTE_ALTERNATIVE_TEXT ) String getCertificatesUrl(); enum CertificateDetails diff --git a/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/ACLFileAccessControlProvider.java b/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/ACLFileAccessControlProvider.java index b8509ebd39..3e0f5b63f0 100644 --- a/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/ACLFileAccessControlProvider.java +++ b/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/ACLFileAccessControlProvider.java @@ -27,6 +27,6 @@ import org.apache.qpid.server.model.ManagedObject; @ManagedObject( category = false, type="AclFile" ) public interface ACLFileAccessControlProvider> extends AccessControlProvider { - @ManagedAttribute( mandatory = true, description = "File location" ) + @ManagedAttribute( mandatory = true, description = "File location", oversize = true, oversizedAltText = OVER_SIZED_ATTRIBUTE_ALTERNATIVE_TEXT) String getPath(); } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java index 9b384cd36f..b995bb442c 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java @@ -188,7 +188,10 @@ public class MetaDataServlet extends AbstractServlet { attrDetails.put("secure",attribute.isSecure()); } - + if(attribute.isOversized()) + { + attrDetails.put("oversize", attribute.isOversized()); + } attributeDetails.put(attribute.getName(), attrDetails); } return attributeDetails; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ResourceWidget.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ResourceWidget.js index 7b1663ac5d..f603c96ff3 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ResourceWidget.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ResourceWidget.js @@ -168,6 +168,10 @@ function (declare, array, lang, util, _WidgetBase, _TemplatedMixin, _WidgetsInTe { console.log(message); } + }, + _setPlaceHolderAttr: function(newValue) + { + this.resourceLocation.set("placeHolder", newValue); } } ); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filekeystore/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filekeystore/add.js index feb7da1864..b4c45d8f99 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filekeystore/add.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filekeystore/add.js @@ -52,13 +52,15 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm var name = item.id.replace("addStore.",""); if (name in attributes ) { - if (item.type != "password") + var attribute = attributes[name]; + if (attribute.secure || attribute.oversize) { - item.set("value", effectiveData[name]); + item.set("required", false); + item.set("placeHolder", effectiveData[name]); } else { - item.set("required", effectiveData?false:true); + item.set("value", effectiveData[name]); } } }); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filetruststore/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filetruststore/add.js index b55affb33b..e04ee1a835 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filetruststore/add.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/store/filetruststore/add.js @@ -53,13 +53,15 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm var name = item.id.replace("addStore.",""); if (name in attributes ) { - if (item.type != "password") + var attribute = attributes[name]; + if (attribute.secure || attribute.oversize) { - item.set("value", effectiveData[name]); + item.set("required", false); + item.set("placeHolder", effectiveData[name]); } else { - item.set("required", effectiveData?false:true); + item.set("value", effectiveData[name]); } } }); 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 index 989af03832..0d74699d79 100644 --- 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 @@ -43,15 +43,28 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm }, 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 (effectiveData) + { + var attributes = metadata.getMetaData("KeyStore", "NonJavaKeyStore").attributes; + var widgets = registry.findWidgets(this.containerNode); + array.forEach(widgets, function(item) + { + var name = item.id.replace("addStore.",""); + if (name in attributes ) + { + var attribute = attributes[name]; + if (attribute.oversize || attribute.secure) + { + item.set("required", false); + item.set("placeHolder", effectiveData[name]); + } + else + { + item.set("value", effectiveData[name]); + } + } + }); + } } }; 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 index 15926d1832..53e3b43082 100644 --- 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 @@ -43,17 +43,28 @@ define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/comm }, 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 (effectiveData) + { + var attributes = metadata.getMetaData("TrustStore", "NonJavaTrustStore").attributes; + var widgets = registry.findWidgets(this.containerNode); + array.forEach(widgets, function(item) + { + var name = item.id.replace("addStore.",""); + if (name in attributes ) + { + var attribute = attributes[name]; + if (attribute.oversize || attribute.secure) + { + item.set("required", false); + item.set("placeHolder", effectiveData[name]); + } + else + { + item.set("value", effectiveData[name]); + } + } + }); + } } }; diff --git a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java index 772f86edf4..b0e396cf8e 100644 --- a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java +++ b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java @@ -28,6 +28,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.qpid.server.model.AbstractConfiguredObject; +import org.apache.qpid.server.model.ConfiguredObject; import org.apache.qpid.server.model.KeyStore; import org.apache.qpid.server.security.FileKeyStore; import org.apache.qpid.test.utils.TestBrokerConfiguration; @@ -98,7 +99,7 @@ public class KeyStoreRestTest extends QpidRestTestCase Map keystore = keyStores.get(0); assertEquals("Unexpected name", name, keystore.get(KeyStore.NAME)); - assertEquals("unexpected data", dataUrlForKeyStore, keystore.get(FileKeyStore.STORE_URL)); + assertEquals("unexpected data", ConfiguredObject.OVER_SIZED_ATTRIBUTE_ALTERNATIVE_TEXT, keystore.get(FileKeyStore.STORE_URL)); assertEquals("unexpected password", TestSSLConstants.KEYSTORE_PASSWORD, keystore.get(FileKeyStore.PASSWORD)); assertEquals("unexpected alias", null, keystore.get(FileKeyStore.CERTIFICATE_ALIAS)); } diff --git a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/TrustStoreRestTest.java b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/TrustStoreRestTest.java index 5919473676..c1ea83e0dd 100644 --- a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/TrustStoreRestTest.java +++ b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/TrustStoreRestTest.java @@ -27,6 +27,7 @@ import java.util.Map; import javax.servlet.http.HttpServletResponse; import org.apache.qpid.server.model.AbstractConfiguredObject; +import org.apache.qpid.server.model.ConfiguredObject; import org.apache.qpid.server.model.TrustStore; import org.apache.qpid.server.security.FileTrustStore; import org.apache.qpid.test.utils.TestBrokerConfiguration; @@ -36,6 +37,7 @@ import org.apache.qpid.util.FileUtils; public class TrustStoreRestTest extends QpidRestTestCase { + @Override public void setUp() throws Exception { @@ -51,8 +53,14 @@ public class TrustStoreRestTest extends QpidRestTestCase List> trustStores = assertNumberOfTrustStores(1); Map truststore = trustStores.get(0); - assertTrustStoreAttributes(truststore, TestBrokerConfiguration.ENTRY_NAME_SSL_TRUSTSTORE, - QPID_HOME + "/../" + TestSSLConstants.BROKER_TRUSTSTORE, false); + assertEquals("default systests trust store is missing", + TestBrokerConfiguration.ENTRY_NAME_SSL_TRUSTSTORE, truststore.get(TrustStore.NAME)); + assertEquals("unexpected store URL", ConfiguredObject.OVER_SIZED_ATTRIBUTE_ALTERNATIVE_TEXT, truststore.get(FileTrustStore.STORE_URL)); + assertEquals("unexpected (dummy) password of default systests trust store", + AbstractConfiguredObject.SECURED_STRING_VALUE, truststore.get(FileTrustStore.PASSWORD)); + assertEquals("unexpected type of default systests trust store", + java.security.KeyStore.getDefaultType(), truststore.get(FileTrustStore.TRUST_STORE_TYPE)); + assertEquals("unexpected peersOnly value", false, truststore.get(FileTrustStore.PEERS_ONLY)); } public void testCreate() throws Exception @@ -68,7 +76,12 @@ public class TrustStoreRestTest extends QpidRestTestCase List> trustStores = getRestTestHelper().getJsonAsList("truststore/" + name); assertNotNull("details cannot be null", trustStores); - assertTrustStoreAttributes(trustStores.get(0), name, TestSSLConstants.TRUSTSTORE, true); + Map truststore = trustStores.get(0); + assertEquals("unexpected trust store name", name, truststore.get(TrustStore.NAME)); + assertEquals("unexpected store URL", TestSSLConstants.TRUSTSTORE, truststore.get(FileTrustStore.STORE_URL)); + assertEquals("unexpected password value", AbstractConfiguredObject.SECURED_STRING_VALUE, truststore.get(FileTrustStore.PASSWORD)); + assertEquals("unexpected type", java.security.KeyStore.getDefaultType(), truststore.get(FileTrustStore.TRUST_STORE_TYPE)); + assertEquals("unexpected peersOnly value", true, truststore.get(FileTrustStore.PEERS_ONLY)); } public void testCreateUsingDataUrl() throws Exception @@ -88,7 +101,12 @@ public class TrustStoreRestTest extends QpidRestTestCase List> trustStores = getRestTestHelper().getJsonAsList("truststore/" + name); assertNotNull("details cannot be null", trustStores); - assertTrustStoreAttributes(trustStores.get(0), name, dataUrlForTruststore, false); + Map truststore = trustStores.get(0); + assertEquals("nexpected trust store name", name, truststore.get(TrustStore.NAME)); + assertEquals("unexpected store URL value", ConfiguredObject.OVER_SIZED_ATTRIBUTE_ALTERNATIVE_TEXT, truststore.get(FileTrustStore.STORE_URL)); + assertEquals("unexpected password value", AbstractConfiguredObject.SECURED_STRING_VALUE, truststore.get(FileTrustStore.PASSWORD)); + assertEquals("unexpected type of trust store", java.security.KeyStore.getDefaultType(), truststore.get(FileTrustStore.TRUST_STORE_TYPE)); + assertEquals("unexpected peersOnly value", false, truststore.get(FileTrustStore.PEERS_ONLY)); } public void testDelete() throws Exception @@ -110,8 +128,11 @@ public class TrustStoreRestTest extends QpidRestTestCase //check only the default systests trust store remains List> trustStores = assertNumberOfTrustStores(1); Map truststore = trustStores.get(0); - assertTrustStoreAttributes(truststore, TestBrokerConfiguration.ENTRY_NAME_SSL_TRUSTSTORE, - QPID_HOME + "/../" + TestSSLConstants.BROKER_TRUSTSTORE, false); + assertEquals("unexpected name", TestBrokerConfiguration.ENTRY_NAME_SSL_TRUSTSTORE, truststore.get(TrustStore.NAME)); + assertEquals("unexpected store URL value", ConfiguredObject.OVER_SIZED_ATTRIBUTE_ALTERNATIVE_TEXT, truststore.get(FileTrustStore.STORE_URL)); + assertEquals("unexpected password value", AbstractConfiguredObject.SECURED_STRING_VALUE, truststore.get(FileTrustStore.PASSWORD)); + assertEquals("unexpected type of trust store", java.security.KeyStore.getDefaultType(), truststore.get(FileTrustStore.TRUST_STORE_TYPE)); + assertEquals("unexpected peersOnly value", false, truststore.get(FileTrustStore.PEERS_ONLY)); } @@ -134,7 +155,12 @@ public class TrustStoreRestTest extends QpidRestTestCase List> trustStore = getRestTestHelper().getJsonAsList("truststore/" + name); assertNotNull("details should not be null", trustStore); - assertTrustStoreAttributes(trustStore.get(0), name, TestSSLConstants.TRUSTSTORE, false); + Map truststore = trustStore.get(0); + assertEquals("unexpected name", name, truststore.get(TrustStore.NAME)); + assertEquals("unexpected path to trust store", TestSSLConstants.TRUSTSTORE, truststore.get(FileTrustStore.STORE_URL)); + assertEquals("unexpected password", AbstractConfiguredObject.SECURED_STRING_VALUE, truststore.get(FileTrustStore.PASSWORD)); + assertEquals("unexpected type", java.security.KeyStore.getDefaultType(), truststore.get(FileTrustStore.TRUST_STORE_TYPE)); + assertEquals("unexpected peersOnly value", false, truststore.get(FileTrustStore.PEERS_ONLY)); } private List> assertNumberOfTrustStores(int numberOfTrustStores) throws Exception @@ -158,17 +184,4 @@ public class TrustStoreRestTest extends QpidRestTestCase getRestTestHelper().submitRequest("truststore/" + name, "PUT", trustStoreAttributes, HttpServletResponse.SC_CREATED); } - private void assertTrustStoreAttributes(Map truststore, String name, String path, boolean peersOnly) - { - assertEquals("default systests trust store is missing", - name, truststore.get(TrustStore.NAME)); - assertEquals("unexpected path to trust store", - path, truststore.get(FileTrustStore.STORE_URL)); - assertEquals("unexpected (dummy) password of default systests trust store", - AbstractConfiguredObject.SECURED_STRING_VALUE, truststore.get(FileTrustStore.PASSWORD)); - assertEquals("unexpected type of default systests trust store", - java.security.KeyStore.getDefaultType(), truststore.get(FileTrustStore.TRUST_STORE_TYPE)); - assertEquals("unexpected peersOnly value", - peersOnly, truststore.get(FileTrustStore.PEERS_ONLY)); - } } -- cgit v1.2.1 From c856605f7cff59acd9a20cd17bc8732eb1057c6d Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Fri, 6 Feb 2015 17:46:57 +0000 Subject: QPID-6367: [Java Broker] Change broker model version to 3.0 due to backward incompatible model changes git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1657905 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/main/java/org/apache/qpid/server/model/BrokerModel.java | 7 ++++--- .../apache/qpid/server/store/BrokerStoreUpgraderAndRecoverer.java | 8 ++++---- .../qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java | 8 ++++---- qpid/java/broker-core/src/main/resources/initial-config.json | 2 +- qpid/java/systests/etc/config-systests.json | 2 +- 5 files changed, 14 insertions(+), 13 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java index a9e9f26af0..57d61b963a 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java @@ -42,12 +42,13 @@ public final class BrokerModel extends Model * 1.3 Truststore/Keystore type => trustStoreType / type => keyStoreType * 1.4 Separate messageStoreSettings from virtualhost * 2.0 Introduce VirtualHostNode as a child of a Broker instead of VirtualHost - * 2.1 Add VH aliases; + * 3.0 Add VH aliases; * Remove Broker#supportedVirtualHostNodeTypes, #supportedVirtualHostTypes, #supportedAuthenticationProviders, * supportedPreferencesProviderTypes, VH#supportedExchangeTypes, VH#supportedQueueTypes + * Renamed FileTrustStore/FileKeyStore.path => FileTrustStore/FileKeyStore.storeUrl */ - public static final int MODEL_MAJOR_VERSION = 2; - public static final int MODEL_MINOR_VERSION = 1; + public static final int MODEL_MAJOR_VERSION = 3; + public static final int MODEL_MINOR_VERSION = 0; public static final String MODEL_VERSION = MODEL_MAJOR_VERSION + "." + MODEL_MINOR_VERSION; private static final Model MODEL_INSTANCE = new BrokerModel(); private final Map, Collection>> _parents = diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecoverer.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecoverer.java index 08612825de..4da9c898f2 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecoverer.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecoverer.java @@ -54,7 +54,7 @@ public class BrokerStoreUpgraderAndRecoverer register(new Upgrader_1_1_to_1_2()); register(new Upgrader_1_2_to_1_3()); register(new Upgrader_1_3_to_2_0()); - register(new Upgrader_2_0_to_2_1()); + register(new Upgrader_2_0_to_3_0()); } private void register(StoreUpgraderPhase upgrader) @@ -217,11 +217,11 @@ public class BrokerStoreUpgraderAndRecoverer } } - private class Upgrader_2_0_to_2_1 extends StoreUpgraderPhase + private class Upgrader_2_0_to_3_0 extends StoreUpgraderPhase { - public Upgrader_2_0_to_2_1() + public Upgrader_2_0_to_3_0() { - super("modelVersion", "2.0", "2.1"); + super("modelVersion", "2.0", "3.0"); } @Override diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java index cd3ae5fdb7..10d8a5d61c 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java @@ -63,7 +63,7 @@ public class VirtualHostStoreUpgraderAndRecoverer register(new Upgrader_0_2_to_0_3()); register(new Upgrader_0_3_to_0_4()); register(new Upgrader_0_4_to_2_0()); - register(new Upgrader_2_0_to_2_1()); + register(new Upgrader_2_0_to_3_0()); Map defaultExchangeIds = new HashMap(); for (String exchangeName : DEFAULT_EXCHANGES.keySet()) @@ -483,11 +483,11 @@ public class VirtualHostStoreUpgraderAndRecoverer } - private class Upgrader_2_0_to_2_1 extends StoreUpgraderPhase + private class Upgrader_2_0_to_3_0 extends StoreUpgraderPhase { - public Upgrader_2_0_to_2_1() + public Upgrader_2_0_to_3_0() { - super("modelVersion", "2.0", "2.1"); + super("modelVersion", "2.0", "3.0"); } @Override diff --git a/qpid/java/broker-core/src/main/resources/initial-config.json b/qpid/java/broker-core/src/main/resources/initial-config.json index 12411fc436..7d88d8fd5c 100644 --- a/qpid/java/broker-core/src/main/resources/initial-config.json +++ b/qpid/java/broker-core/src/main/resources/initial-config.json @@ -20,7 +20,7 @@ */ { "name": "${broker.name}", - "modelVersion": "2.1", + "modelVersion": "3.0", "defaultVirtualHost" : "default", "authenticationproviders" : [ { "name" : "passwordFile", diff --git a/qpid/java/systests/etc/config-systests.json b/qpid/java/systests/etc/config-systests.json index 8103f4568c..05ba4f2178 100644 --- a/qpid/java/systests/etc/config-systests.json +++ b/qpid/java/systests/etc/config-systests.json @@ -21,7 +21,7 @@ { "name": "Broker", "defaultVirtualHost" : "test", - "modelVersion": "2.1", + "modelVersion": "3.0", "authenticationproviders" : [ { "name" : "plain", "type" : "PlainPasswordFile", -- cgit v1.2.1 From 13bd5eee9f73678f500ac717673b67ac0740f6ee Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Sat, 7 Feb 2015 14:41:02 +0000 Subject: QPID-6366 : Fix failing test due to long absolute path for /tmp git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1658065 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/qpid/systest/rest/AccessControlProviderRestTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'qpid/java') diff --git a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/AccessControlProviderRestTest.java b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/AccessControlProviderRestTest.java index 0dda8e077b..26f7f16bec 100644 --- a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/AccessControlProviderRestTest.java +++ b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/AccessControlProviderRestTest.java @@ -29,6 +29,7 @@ import java.util.UUID; import org.apache.qpid.server.BrokerOptions; import org.apache.qpid.server.management.plugin.HttpManagement; +import org.apache.qpid.server.management.plugin.servlet.rest.RestServlet; import org.apache.qpid.server.model.AccessControlProvider; import org.apache.qpid.server.model.Plugin; import org.apache.qpid.server.model.State; @@ -183,7 +184,7 @@ public class AccessControlProviderRestTest extends QpidRestTestCase getRestTestHelper().setUsernameAndPassword(BrokerOptions.MANAGEMENT_MODE_USER_NAME, MANAGEMENT_MODE_PASSWORD); - Map acl = getRestTestHelper().getJsonAsSingletonList("accesscontrolprovider/" + TestBrokerConfiguration.ENTRY_NAME_ACL_FILE); + Map acl = getRestTestHelper().getJsonAsSingletonList("accesscontrolprovider/" + TestBrokerConfiguration.ENTRY_NAME_ACL_FILE + "?" + RestServlet.OVERSIZE_PARAM + "=" + (file.getAbsolutePath().length()+10)); assertEquals("Unexpected id", id.toString(), acl.get(AccessControlProvider.ID)); assertEquals("Unexpected path", file.getAbsolutePath() , acl.get(FileAccessControlProviderConstants.PATH)); assertEquals("Unexpected state", State.ERRORED.name() , acl.get(AccessControlProvider.STATE)); -- cgit v1.2.1 From bd9ca7255cd5c08ec348dd5976249e0a8dd1a8bc Mon Sep 17 00:00:00 2001 From: Keith Wall Date: Sat, 7 Feb 2015 19:09:18 +0000 Subject: QPID-6371: [Java Broker/Java Common] Prevent log4j warning during Broker startup git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1658098 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/qpid/client/AMQConnection.java | 6 ++ .../org/apache/qpid/common/QpidProperties.java | 76 ++++------------------ 2 files changed, 19 insertions(+), 63 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java index df55080f67..6c37462011 100644 --- a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java +++ b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java @@ -66,6 +66,7 @@ import org.apache.qpid.client.failover.FailoverProtectedOperation; import org.apache.qpid.client.protocol.AMQProtocolHandler; import org.apache.qpid.client.security.CallbackHandlerRegistry; import org.apache.qpid.client.state.AMQStateManager; +import org.apache.qpid.common.QpidProperties; import org.apache.qpid.configuration.ClientProperties; import org.apache.qpid.exchange.ExchangeDefaults; import org.apache.qpid.framing.AMQShortString; @@ -195,6 +196,11 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect static { + if (_logger.isDebugEnabled()) + { + _logger.debug("Qpid version : " + QpidProperties.getVersionString()); + } + // The registering of any additional SASL mechanisms with the Java Security API requires // SecurityManager permissions. In execution environments such as web containers, // this may require adjustments to the Java security.policy. diff --git a/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java b/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java index 74219f216e..d077cc9717 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java @@ -22,12 +22,8 @@ package org.apache.qpid.common; import java.io.IOException; import java.io.InputStream; -import java.util.Map; import java.util.Properties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * QpidProperties captures the project name, version number, and source code repository revision number from a properties * file which is generated as part of the build process. Normally, the name and version number are pulled from the module @@ -37,18 +33,9 @@ import org.slf4j.LoggerFactory; * *

To get the build version of any Qpid code call the {@link #main} method. This version string is usually also * printed to the console on broker start up. - *

- * TODO Code to locate/load/log properties can be factored into a reusable properties utils class. Avoid having this - * same snippet of loading code scattered in many places. - *

- * TODO Could also add a build number property for a sequential build number assigned by an automated build system, for - * build reproducability purposes. */ public class QpidProperties { - /** Used for debugging purposes. */ - private static final Logger _logger = LoggerFactory.getLogger(QpidProperties.class); - /** The name of the version properties file to load from the class path. */ public static final String VERSION_RESOURCE = "qpidversion.properties"; @@ -68,13 +55,13 @@ public class QpidProperties private static final String DEFAULT = "unknown"; /** Holds the product name. */ - private static String productName = DEFAULT; + private static final String productName; /** Holds the product version. */ - private static String releaseVersion = DEFAULT; + private static final String releaseVersion; /** Holds the source code revision. */ - private static String buildVersion = DEFAULT; + private static final String buildVersion; private static final Properties properties = new Properties(); @@ -82,40 +69,24 @@ public class QpidProperties static { - try + try(InputStream propertyStream = QpidProperties.class.getClassLoader().getResourceAsStream(VERSION_RESOURCE)) { - InputStream propertyStream = QpidProperties.class.getClassLoader().getResourceAsStream(VERSION_RESOURCE); - if (propertyStream == null) - { - _logger.warn("Unable to find resource " + VERSION_RESOURCE + " from classloader"); - } - else + if (propertyStream != null) { properties.load(propertyStream); - - if (_logger.isDebugEnabled()) - { - _logger.debug("Dumping QpidProperties"); - for (Map.Entry entry : properties.entrySet()) - { - _logger.debug("Property: " + entry.getKey() + " Value: " + entry.getValue()); - } - - _logger.debug("End of property dump"); - } - - productName = readPropertyValue(properties, PRODUCT_NAME_PROPERTY); - String versionSuffix = (String) properties.get(RELEASE_VERSION_SUFFIX); - String version = readPropertyValue(properties, RELEASE_VERSION_PROPERTY); - releaseVersion = versionSuffix == null || "".equals(versionSuffix) ? version : version + ";" + versionSuffix; - buildVersion = readPropertyValue(properties, BUILD_VERSION_PROPERTY); } } catch (IOException e) { - // Log a warning about this and leave the values initialized to unknown. - _logger.error("Could not load version.properties resource: " + e, e); + // Ignore, most likely running within an IDE, values will have the DEFAULT text } + + String versionSuffix = properties.getProperty(RELEASE_VERSION_SUFFIX); + String version = properties.getProperty(RELEASE_VERSION_PROPERTY, DEFAULT); + + productName = properties.getProperty(PRODUCT_NAME_PROPERTY, DEFAULT); + releaseVersion = versionSuffix == null || "".equals(versionSuffix) ? version : version + ";" + versionSuffix; + buildVersion = properties.getProperty(BUILD_VERSION_PROPERTY, DEFAULT); } public static Properties asProperties() @@ -163,27 +134,6 @@ public class QpidProperties return getProductName() + " - " + getReleaseVersion() + " build: " + getBuildVersion(); } - /** - * Helper method to extract a named property from properties. - * - * @param props The properties. - * @param propertyName The named property to extract. - * - * @return The extracted property or a default value if the properties do not contain the named property. - * - * @todo A bit pointless. - */ - private static String readPropertyValue(Properties props, String propertyName) - { - String retVal = (String) props.get(propertyName); - if (retVal == null) - { - retVal = DEFAULT; - } - - return retVal; - } - /** * Prints the versioning information to the console. This is extremely usefull for identifying Qpid code in the * wild, where the origination of the code has been forgotten. -- cgit v1.2.1 From 03166fbe95e9026f6b15a0aa6645841d2703f8c2 Mon Sep 17 00:00:00 2001 From: Keith Wall Date: Sat, 7 Feb 2015 19:09:31 +0000 Subject: QPID-6372: [Java Broker] Windows - localise the environment variable changes made by qpid-startup.bat git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1658099 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/java/broker/bin/qpid-server.bat | 3 +++ 1 file changed, 3 insertions(+) (limited to 'qpid/java') diff --git a/qpid/java/broker/bin/qpid-server.bat b/qpid/java/broker/bin/qpid-server.bat index 9c3403edc7..de10e72483 100755 --- a/qpid/java/broker/bin/qpid-server.bat +++ b/qpid/java/broker/bin/qpid-server.bat @@ -20,6 +20,8 @@ @echo off REM Script to run the Qpid Java Broker +SETLOCAL + rem Guess QPID_HOME if not defined set CURRENT_DIR=%cd% if not "%QPID_HOME%" == "" goto gotHome @@ -199,3 +201,4 @@ if "%debug%" == "true" echo %COMMAND% %COMMAND% :end +ENDLOCAL -- cgit v1.2.1 From 5edd1e5f5fac729d719219a1854a97419112e784 Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Mon, 9 Feb 2015 15:05:37 +0000 Subject: QPID-6365: [Java Broker] Only expose secure attribute values when transport is SSL and initial configuration is requested git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1658424 13f79535-47bb-0310-9956-ffa450edef68 --- .../rest/ConfiguredObjectToMapConverter.java | 24 +++-- .../plugin/servlet/rest/RestServlet.java | 2 +- .../rest/ConfiguredObjectToMapConverterTest.java | 105 +++++++++++++++++++-- .../apache/qpid/systest/rest/KeyStoreRestTest.java | 6 +- 4 files changed, 118 insertions(+), 19 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java index 28bbac2a61..331b50ea7c 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java @@ -57,13 +57,14 @@ public class ConfiguredObjectToMapConverter final boolean inheritedActuals, final boolean includeSystemContext, final boolean extractAsConfig, - final int oversizeThreshold + final int oversizeThreshold, + final boolean isSecureTransport ) { Map object = new LinkedHashMap<>(); incorporateAttributesIntoMap(confObject, object, useActualValues, inheritedActuals, includeSystemContext, - extractAsConfig, oversizeThreshold); + extractAsConfig, oversizeThreshold, isSecureTransport); if(!extractAsConfig) { incorporateStatisticsIntoMap(confObject, object); @@ -72,7 +73,7 @@ public class ConfiguredObjectToMapConverter if(depth > 0) { incorporateChildrenIntoMap(confObject, clazz, depth, object, useActualValues, inheritedActuals, - includeSystemContext, extractAsConfig, oversizeThreshold); + includeSystemContext, extractAsConfig, oversizeThreshold, isSecureTransport); } return object; } @@ -85,7 +86,8 @@ public class ConfiguredObjectToMapConverter final boolean inheritedActuals, final boolean includeSystemContext, final boolean extractAsConfig, - final int oversizeThreshold) + final int oversizeThreshold, + final boolean isSecureTransport) { // if extracting as config add a fake attribute for each secondary parent if(extractAsConfig && confObject.getModel().getParentTypes(confObject.getCategoryClass()).size()>1) @@ -159,6 +161,14 @@ public class ConfiguredObjectToMapConverter .getTypeRegistry() .getAttributeTypes(confObject.getClass()) .get(name); + + if (attribute.isSecure() && !(isSecureTransport && extractAsConfig)) + { + // do not expose actual secure attribute value + // getAttribute() returns encoded value + value = confObject.getAttribute(name); + } + if(attribute.isOversized() && !extractAsConfig) { String valueString = String.valueOf(value); @@ -240,7 +250,8 @@ public class ConfiguredObjectToMapConverter final boolean inheritedActuals, final boolean includeSystemContext, final boolean extractAsConfig, - final int oversizeThreshold) + final int oversizeThreshold, + final boolean isSecure) { List> childTypes = new ArrayList<>(confObject.getModel().getChildTypes(clazz)); @@ -283,7 +294,8 @@ public class ConfiguredObjectToMapConverter inheritedActuals, includeSystemContext, extractAsConfig, - oversizeThreshold)); + oversizeThreshold, + isSecure)); } } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java index 1ed0741a8e..19d498e240 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java @@ -371,7 +371,7 @@ public class RestServlet extends AbstractServlet { output.add(_objectConverter.convertObjectToMap(configuredObject, getConfiguredClass(), - depth, actuals, inheritedActuals, includeSystemContext, extractInitialConfig, oversizeThreshold)); + depth, actuals, inheritedActuals, includeSystemContext, extractInitialConfig, oversizeThreshold, request.isSecure())); } diff --git a/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java index b5847ad293..b3c9bd911f 100644 --- a/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java +++ b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverterTest.java @@ -68,7 +68,8 @@ public class ConfiguredObjectToMapConverterTest extends TestCase false, false, false, - 120); + 120, + false); Map statsAsMap = (Map) resultMap.get(STATISTICS_MAP_KEY); assertNotNull("Statistics should be part of map", statsAsMap); assertEquals("Unexpected number of statistics", 1, statsAsMap.size()); @@ -90,7 +91,8 @@ public class ConfiguredObjectToMapConverterTest extends TestCase false, false, false, - 120); + 120, + false); assertEquals("Unexpected number of attributes", 1, resultMap.size()); assertEquals("Unexpected attribute value", attributeValue, resultMap.get(attributeName)); } @@ -114,7 +116,8 @@ public class ConfiguredObjectToMapConverterTest extends TestCase false, false, false, - 120); + 120, + false); assertEquals("Unexpected number of attributes", 1, resultMap.size()); assertEquals("Unexpected attribute value", "attributeConfiguredObjectName", resultMap.get(attributeName)); } @@ -139,7 +142,8 @@ public class ConfiguredObjectToMapConverterTest extends TestCase false, false, false, - 120); + 120, + false); assertEquals("Unexpected parent map size", 1, resultMap.size()); final List> childList = (List>) resultMap.get("testchilds"); @@ -183,7 +187,8 @@ public class ConfiguredObjectToMapConverterTest extends TestCase false, false, false, - 120); + 120, + false); assertEquals("Unexpected parent map size", 2, resultMap.size()); assertEquals("Incorrect context", resultMap.get(ConfiguredObject.CONTEXT), actualContext); List> childList = (List>) resultMap.get("testchilds"); @@ -201,7 +206,8 @@ public class ConfiguredObjectToMapConverterTest extends TestCase false, false, false, - 120); + 120, + false); assertEquals("Unexpected parent map size", 2, resultMap.size()); Map inheritedContext = new HashMap<>(); inheritedContext.put("key","value"); @@ -243,7 +249,8 @@ public class ConfiguredObjectToMapConverterTest extends TestCase false, false, false, - 20); + 20, + false); Object children = resultMap.get("testchilds"); assertNotNull(children); assertTrue(children instanceof Collection); @@ -261,7 +268,8 @@ public class ConfiguredObjectToMapConverterTest extends TestCase false, false, false, - 8); + 8, + false); children = resultMap.get("testchilds"); assertNotNull(children); @@ -283,7 +291,8 @@ public class ConfiguredObjectToMapConverterTest extends TestCase false, false, false, - 8); + 8, + false); children = resultMap.get("testchilds"); assertNotNull(children); @@ -296,6 +305,84 @@ public class ConfiguredObjectToMapConverterTest extends TestCase } + public void testSecureAttributes() + { + + Model model = createTestModel(); + ConfiguredObjectTypeRegistry typeRegistry = model.getTypeRegistry(); + Map> attributeTypes = typeRegistry.getAttributeTypes(TestChild.class); + ConfiguredObjectAttribute secureAttribute = mock(ConfiguredObjectAttribute.class); + when(secureAttribute.isSecure()).thenReturn(true); + when(attributeTypes.get(eq("secureAttribute"))).thenReturn(secureAttribute); + + TestChild mockChild = mock(TestChild.class); + when(mockChild.getModel()).thenReturn(model); + when(_configuredObject.getModel()).thenReturn(model); + + // set encoded value + configureMockToReturnOneAttribute(mockChild, "secureAttribute", "*****"); + + // set actual values + when(mockChild.getActualAttributes()).thenReturn(Collections.singletonMap("secureAttribute", "secret")); + when(_configuredObject.getChildren(TestChild.class)).thenReturn(Arrays.asList(mockChild)); + when(model.getParentTypes(TestChild.class)).thenReturn(Collections.>singleton(TestChild.class)); + when(_configuredObject.getCategoryClass()).thenReturn(TestChild.class); + when(mockChild.isDurable()).thenReturn(true); + + Map resultMap = _converter.convertObjectToMap(_configuredObject, + ConfiguredObject.class, + 1, + false, + false, + false, + false, + 20, + false); + Object children = resultMap.get("testchilds"); + assertNotNull(children); + assertTrue(children instanceof Collection); + assertTrue(((Collection)children).size()==1); + Object attrs = ((Collection)children).iterator().next(); + assertTrue(attrs instanceof Map); + assertEquals("*****", ((Map) attrs).get("secureAttribute")); + + resultMap = _converter.convertObjectToMap(_configuredObject, + ConfiguredObject.class, + 1, + true, + true, + false, + true, + 20, + true); + + children = resultMap.get("testchilds"); + assertNotNull(children); + assertTrue(children instanceof Collection); + assertTrue(((Collection)children).size()==1); + attrs = ((Collection)children).iterator().next(); + assertTrue(attrs instanceof Map); + assertEquals("secret", ((Map) attrs).get("secureAttribute")); + + resultMap = _converter.convertObjectToMap(_configuredObject, + ConfiguredObject.class, + 1, + true, + true, + false, + false, + 20, + true); + + children = resultMap.get("testchilds"); + assertNotNull(children); + assertTrue(children instanceof Collection); + assertTrue(((Collection)children).size()==1); + attrs = ((Collection)children).iterator().next(); + assertTrue(attrs instanceof Map); + assertEquals("*****", ((Map) attrs).get("secureAttribute")); + } + private Model createTestModel() { Model model = mock(Model.class); diff --git a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java index b0e396cf8e..a19c2e698c 100644 --- a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java +++ b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java @@ -78,7 +78,7 @@ public class KeyStoreRestTest extends QpidRestTestCase Map keystore = keyStores.get(0); assertEquals("Unexpected name", name, keystore.get(KeyStore.NAME)); assertEquals("unexpected path to key store", TestSSLConstants.KEYSTORE, keystore.get(FileKeyStore.STORE_URL)); - assertEquals("unexpected password", TestSSLConstants.KEYSTORE_PASSWORD, keystore.get(FileKeyStore.PASSWORD)); + assertEquals("unexpected password", AbstractConfiguredObject.SECURED_STRING_VALUE, keystore.get(FileKeyStore.PASSWORD)); assertEquals("unexpected alias", certAlias, keystore.get(FileKeyStore.CERTIFICATE_ALIAS)); } @@ -100,7 +100,7 @@ public class KeyStoreRestTest extends QpidRestTestCase Map keystore = keyStores.get(0); assertEquals("Unexpected name", name, keystore.get(KeyStore.NAME)); assertEquals("unexpected data", ConfiguredObject.OVER_SIZED_ATTRIBUTE_ALTERNATIVE_TEXT, keystore.get(FileKeyStore.STORE_URL)); - assertEquals("unexpected password", TestSSLConstants.KEYSTORE_PASSWORD, keystore.get(FileKeyStore.PASSWORD)); + assertEquals("unexpected password", AbstractConfiguredObject.SECURED_STRING_VALUE, keystore.get(FileKeyStore.PASSWORD)); assertEquals("unexpected alias", null, keystore.get(FileKeyStore.CERTIFICATE_ALIAS)); } @@ -152,7 +152,7 @@ public class KeyStoreRestTest extends QpidRestTestCase Map keystore = keyStores.get(0); assertEquals("Unexpected name", name, keystore.get(KeyStore.NAME)); assertEquals("unexpected data", TestSSLConstants.UNTRUSTED_KEYSTORE, keystore.get(FileKeyStore.STORE_URL)); - assertEquals("unexpected password", TestSSLConstants.KEYSTORE_PASSWORD, keystore.get(FileKeyStore.PASSWORD)); + assertEquals("unexpected password", AbstractConfiguredObject.SECURED_STRING_VALUE, keystore.get(FileKeyStore.PASSWORD)); assertEquals("unexpected alias", null, keystore.get(FileKeyStore.CERTIFICATE_ALIAS)); } -- cgit v1.2.1 From ea2c9f4581ddec8fda51fc9d81146e22ef791921 Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Mon, 9 Feb 2015 16:31:00 +0000 Subject: QPID-6365: Fix failing tests git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1658452 13f79535-47bb-0310-9956-ffa450edef68 --- .../test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java index a19c2e698c..a3bf1ab3cb 100644 --- a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java +++ b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/KeyStoreRestTest.java @@ -77,7 +77,7 @@ public class KeyStoreRestTest extends QpidRestTestCase Map keystore = keyStores.get(0); assertEquals("Unexpected name", name, keystore.get(KeyStore.NAME)); - assertEquals("unexpected path to key store", TestSSLConstants.KEYSTORE, keystore.get(FileKeyStore.STORE_URL)); + assertEquals("unexpected path to key store", AbstractConfiguredObject.SECURED_STRING_VALUE, keystore.get(FileKeyStore.STORE_URL)); assertEquals("unexpected password", AbstractConfiguredObject.SECURED_STRING_VALUE, keystore.get(FileKeyStore.PASSWORD)); assertEquals("unexpected alias", certAlias, keystore.get(FileKeyStore.CERTIFICATE_ALIAS)); } @@ -99,7 +99,7 @@ public class KeyStoreRestTest extends QpidRestTestCase Map keystore = keyStores.get(0); assertEquals("Unexpected name", name, keystore.get(KeyStore.NAME)); - assertEquals("unexpected data", ConfiguredObject.OVER_SIZED_ATTRIBUTE_ALTERNATIVE_TEXT, keystore.get(FileKeyStore.STORE_URL)); + assertEquals("unexpected data", AbstractConfiguredObject.SECURED_STRING_VALUE, keystore.get(FileKeyStore.STORE_URL)); assertEquals("unexpected password", AbstractConfiguredObject.SECURED_STRING_VALUE, keystore.get(FileKeyStore.PASSWORD)); assertEquals("unexpected alias", null, keystore.get(FileKeyStore.CERTIFICATE_ALIAS)); } @@ -151,7 +151,7 @@ public class KeyStoreRestTest extends QpidRestTestCase Map keystore = keyStores.get(0); assertEquals("Unexpected name", name, keystore.get(KeyStore.NAME)); - assertEquals("unexpected data", TestSSLConstants.UNTRUSTED_KEYSTORE, keystore.get(FileKeyStore.STORE_URL)); + assertEquals("unexpected data", AbstractConfiguredObject.SECURED_STRING_VALUE, keystore.get(FileKeyStore.STORE_URL)); assertEquals("unexpected password", AbstractConfiguredObject.SECURED_STRING_VALUE, keystore.get(FileKeyStore.PASSWORD)); assertEquals("unexpected alias", null, keystore.get(FileKeyStore.CERTIFICATE_ALIAS)); } -- cgit v1.2.1 From ee17dbccdd6cf81d622efede3fa36230b70bdaa7 Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Mon, 9 Feb 2015 16:31:07 +0000 Subject: QPID-6364: Set Keystore/Truststore derived attribute 'path' to non-data URL. Change the upgrader to upgrade only FileKeyStore and FileTrustStore git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1658453 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/qpid/server/security/FileKeyStoreImpl.java | 9 ++++----- .../apache/qpid/server/security/FileTrustStoreImpl.java | 9 ++++----- .../server/store/BrokerStoreUpgraderAndRecoverer.java | 17 ++++++++++------- 3 files changed, 18 insertions(+), 17 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStoreImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStoreImpl.java index 7bed1bcd7d..aa5f55dfb4 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStoreImpl.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileKeyStoreImpl.java @@ -312,14 +312,13 @@ public class FileKeyStoreImpl extends AbstractConfiguredObject @SuppressWarnings(value = "unused") private void postSetStoreUrl() { - try + if (_storeUrl != null && !_storeUrl.startsWith("data:")) { - new URL(_storeUrl); - _path = null; + _path = _storeUrl; } - catch (MalformedURLException e) + else { - _path = _storeUrl; + _path = null; } } } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStoreImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStoreImpl.java index 78f9a5184b..fb161fef4e 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStoreImpl.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/FileTrustStoreImpl.java @@ -338,14 +338,13 @@ public class FileTrustStoreImpl extends AbstractConfiguredObject attributes = new HashMap<>(record.getAttributes()); - Object path = attributes.remove("path"); - attributes.put("storeUrl", path); - record = new ConfiguredObjectRecordImpl(record.getId(), record.getType(), attributes, record.getParents()); - getUpdateMap().put(record.getId(), record); + if (expectedType.equals(attributes.get("type"))) + { + Object path = attributes.remove("path"); + attributes.put("storeUrl", path); + record = new ConfiguredObjectRecordImpl(record.getId(), record.getType(), attributes, record.getParents()); + getUpdateMap().put(record.getId(), record); + } return record; } -- cgit v1.2.1 From da8935e0491a2b8e9edb6671e5874b77516ee2a9 Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Tue, 10 Feb 2015 09:32:24 +0000 Subject: QPID-6374 : Reorder ock aquisition and remove synchronization where it is not desired to reduce deadlocks git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1658652 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/qpid/client/AMQConnection.java | 109 ++++++++++---------- .../java/org/apache/qpid/client/AMQSession.java | 111 ++++++++++----------- .../apache/qpid/client/BasicMessageConsumer.java | 41 ++++---- 3 files changed, 133 insertions(+), 128 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java index 6c37462011..c7fcde824a 100644 --- a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java +++ b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java @@ -865,13 +865,17 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect public void close(long timeout) throws JMSException { - close(new ArrayList(_sessions.values()), timeout); - } + boolean closed; - public void close(List sessions, long timeout) throws JMSException - { - if (!setClosed()) + synchronized (_sessionCreationLock) + { + closed = setClosed(); + } + + if (!closed) { + List sessions = new ArrayList<>(_sessions.values()); + setClosing(true); try { @@ -886,54 +890,52 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect private void doClose(List sessions, long timeout) throws JMSException { - synchronized (_sessionCreationLock) + if (!sessions.isEmpty()) { - if (!sessions.isEmpty()) + AMQSession session = sessions.remove(0); + synchronized (session.getMessageDeliveryLock()) { - AMQSession session = sessions.remove(0); - synchronized (session.getMessageDeliveryLock()) - { - doClose(sessions, timeout); - } + doClose(sessions, timeout); } - else + } + else + { + synchronized (getFailoverMutex()) { - synchronized (getFailoverMutex()) + try { try { - try - { - closeAllSessions(null, timeout); - } - finally - { - //This MUST occur after we have successfully closed all Channels/Sessions - shutdownTaskPool(timeout); - } + closeAllSessions(null, timeout); } - catch (JMSException e) + finally { - _logger.error("Error closing connection", e); - JMSException jmse = new JMSException("Error closing connection: " + e); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; + //This MUST occur after we have successfully closed all Channels/Sessions + shutdownTaskPool(timeout); } - finally + } + catch (JMSException e) + { + _logger.error("Error closing connection", e); + JMSException jmse = new JMSException("Error closing connection: " + e); + jmse.setLinkedException(e); + jmse.initCause(e); + throw jmse; + } + finally + { + try { - try - { - _delegate.closeConnection(timeout); - } - catch (Exception e) - { - _logger.warn("Error closing underlying protocol connection", e); - } + _delegate.closeConnection(timeout); + } + catch (Exception e) + { + _logger.warn("Error closing underlying protocol connection", e); } } } } + } private void shutdownTaskPool(final long timeout) @@ -1308,28 +1310,29 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect try { - // get the failover mutex before trying to close - synchronized (getFailoverMutex()) + // decide if we are going to close the session + if (hardError(cause)) { - // decide if we are going to close the session - if (hardError(cause)) + closer = (!setClosed()) || closer; { - closer = (!setClosed()) || closer; - { - _logger.info("Closing AMQConnection due to :" + cause); - } - } - else - { - _logger.info("Not a hard-error connection not closing: " + cause); + _logger.info("Closing AMQConnection due to :" + cause); } + } + else + { + _logger.info("Not a hard-error connection not closing: " + cause); + } + - // if we are closing the connection, close sessions first - if (closer) + // if we are closing the connection, close sessions first + if (closer) + { + // get the failover mutex before trying to close + synchronized (getFailoverMutex()) { try { - closeAllSessions(cause, -1); // FIXME: when doing this end up with RejectedExecutionException from executor. + closeAllSessions(cause, -1); } catch (JMSException e) { diff --git a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession.java b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession.java index 29460bb42d..12e9285af8 100644 --- a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession.java +++ b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession.java @@ -808,7 +808,16 @@ public abstract class AMQSession extends Closeable implements Messa if (sendClose) { + // The Synchronized block only needs to protect network traffic. - synchronized (_connection.getFailoverMutex()) + + try { - try + // If the session is open or we are in the process + // of closing the session then send a cance + // no point otherwise as the connection will be gone + if (!_session.isClosed() || _session.isClosing()) { - // If the session is open or we are in the process - // of closing the session then send a cance - // no point otherwise as the connection will be gone - if (!_session.isClosed() || _session.isClosing()) + synchronized(_session.getMessageDeliveryLock()) { - synchronized(_session.getMessageDeliveryLock()) + synchronized (_connection.getFailoverMutex()) { sendCancel(); } } } - catch (AMQException e) - { - throw new JMSAMQException("Error closing consumer: " + e, e); - } - catch (FailoverException e) - { - throw new JMSAMQException("FailoverException interrupted basic cancel.", e); - } - catch (TransportException e) - { - throw _session.toJMSException("Exception while closing consumer: " + e.getMessage(), e); - } } + catch (AMQException e) + { + throw new JMSAMQException("Error closing consumer: " + e, e); + } + catch (FailoverException e) + { + throw new JMSAMQException("FailoverException interrupted basic cancel.", e); + } + catch (TransportException e) + { + throw _session.toJMSException("Exception while closing consumer: " + e.getMessage(), e); + } + } else { -- cgit v1.2.1 From 6bca3754c2b893ae0a27d3c11559f25c9b1e7ea4 Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Tue, 10 Feb 2015 11:58:57 +0000 Subject: QPID-6374 : Always call exception listener from connection task pool, rather than from within the failover mutex git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1658689 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/qpid/client/AMQConnection.java | 15 ++++++++--- .../qpid/client/AMQConnectionDelegate_0_10.java | 30 ++++++++++++++-------- .../org/apache/qpid/client/MockAMQConnection.java | 10 ++++++-- 3 files changed, 39 insertions(+), 16 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java index c7fcde824a..5518435b94 100644 --- a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java +++ b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java @@ -1349,16 +1349,25 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect private void deliverJMSExceptionToExceptionListenerOrLog(final JMSException je, final Throwable cause) { - // deliver the exception if there is a listener - ExceptionListener exceptionListener = getExceptionListenerNoCheck(); + final ExceptionListener exceptionListener = getExceptionListenerNoCheck(); if (exceptionListener != null) { - exceptionListener.onException(je); + performConnectionTask(new Runnable() + { + @Override + public void run() + { + // deliver the exception if there is a listener + exceptionListener.onException(je); + } + }); } else { _logger.error("Throwable Received but no listener set: " + cause); } + + } private boolean hardError(Throwable cause) diff --git a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java index 4e9164c3b0..fdeab7ae70 100644 --- a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java +++ b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java @@ -291,7 +291,7 @@ public class AMQConnectionDelegate_0_10 implements AMQConnectionDelegate, Connec public void closed(Connection conn) { - ConnectionException exc = exception; + final ConnectionException exc = exception; exception = null; if (exc == null) @@ -299,7 +299,7 @@ public class AMQConnectionDelegate_0_10 implements AMQConnectionDelegate, Connec return; } - ConnectionClose close = exc.getClose(); + final ConnectionClose close = exc.getClose(); if (close == null || close.getReplyCode() == ConnectionCloseCode.CONNECTION_FORCED) { _conn.getProtocolHandler().setFailoverLatch(new CountDownLatch(1)); @@ -332,23 +332,31 @@ public class AMQConnectionDelegate_0_10 implements AMQConnectionDelegate, Connec _conn.setClosed(); - ExceptionListener listener = _conn.getExceptionListenerNoCheck(); + final ExceptionListener listener = _conn.getExceptionListenerNoCheck(); if (listener == null) { _logger.error("connection exception: " + conn, exc); } else { - String code = null; - if (close != null) + _conn.performConnectionTask(new Runnable() { - code = close.getReplyCode().toString(); - } + @Override + public void run() + { + String code = null; + if (close != null) + { + code = close.getReplyCode().toString(); + } + + JMSException ex = new JMSException(exc.getMessage(), code); + ex.setLinkedException(exc); + ex.initCause(exc); + listener.onException(ex); + } + }); - JMSException ex = new JMSException(exc.getMessage(), code); - ex.setLinkedException(exc); - ex.initCause(exc); - listener.onException(ex); } } diff --git a/qpid/java/client/src/test/java/org/apache/qpid/client/MockAMQConnection.java b/qpid/java/client/src/test/java/org/apache/qpid/client/MockAMQConnection.java index 009598d8a4..ceb2a323ca 100644 --- a/qpid/java/client/src/test/java/org/apache/qpid/client/MockAMQConnection.java +++ b/qpid/java/client/src/test/java/org/apache/qpid/client/MockAMQConnection.java @@ -20,14 +20,14 @@ */ package org.apache.qpid.client; +import java.io.IOException; + import org.apache.qpid.AMQException; import org.apache.qpid.client.state.AMQState; import org.apache.qpid.framing.ProtocolVersion; import org.apache.qpid.jms.BrokerDetails; import org.apache.qpid.url.URLSyntaxException; -import java.io.IOException; - public class MockAMQConnection extends AMQConnection { public MockAMQConnection(String broker, String username, String password, String clientName, String virtualHost) @@ -60,4 +60,10 @@ public class MockAMQConnection extends AMQConnection { return super.getDelegate(); } + + @Override + public void performConnectionTask(final Runnable task) + { + task.run(); + } } -- cgit v1.2.1 From e2e6d542b8cde9e702d1c3b63376e9d8380ba1c7 Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Tue, 10 Feb 2015 13:37:00 +0000 Subject: QPID-6374 : tidyup calls to connection task pool git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1658714 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/qpid/client/AMQConnection.java | 40 ++++++++---- .../org/apache/qpid/client/AMQSession_0_8.java | 71 ++++++++++++---------- 2 files changed, 67 insertions(+), 44 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java index 5518435b94..4c596b88a0 100644 --- a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java +++ b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java @@ -32,6 +32,7 @@ import java.util.LinkedList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; @@ -1353,16 +1354,23 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect if (exceptionListener != null) { performConnectionTask(new Runnable() - { - @Override - public void run() - { - // deliver the exception if there is a listener - exceptionListener.onException(je); - } - }); - } - else + { + @Override + public void run() + { + // deliver the exception if there is a listener + try + { + exceptionListener.onException(je); + } + catch (RuntimeException e) + { + _logger.error("Exception occurred in ExceptionListener", e); + } + } + }); + } + else { _logger.error("Throwable Received but no listener set: " + cause); } @@ -1478,7 +1486,17 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect public void performConnectionTask(Runnable task) { - _taskPool.execute(task); + try + { + _taskPool.execute(task); + } + catch (RejectedExecutionException e) + { + if(!(isClosed() || isClosing())) + { + throw e; + } + } } public AMQSession getSession(int channelId) diff --git a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_8.java b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_8.java index bb0f0d9b13..143de271a1 100644 --- a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_8.java +++ b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_8.java @@ -772,42 +772,47 @@ public class AMQSession_0_8 extends AMQSession