From f9592e0d891b2eca8b91e06e6da0f8cd6c15f24c Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Mon, 25 Aug 2014 15:31:34 +0000 Subject: Merging from trunk r1618840:1619054 in the Java tree git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/0.30@1620349 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/qpid/amqp_1_0/client/Sender.java | 7 +- .../qpid/amqp_1_0/framing/ConnectionHandler.java | 15 - .../java/org/apache/qpid/amqp_1_0/type/Binary.java | 42 ++- .../amqp_1_0/type/security/SaslMechanisms.java | 2 +- .../berkeleydb/BDBHAReplicaVirtualHost.java | 2 +- .../ConfiguredObjectRegistrationGenerator.java | 67 ++-- .../server/configuration/BrokerProperties.java | 3 - .../server/model/ConfiguredObjectFactoryImpl.java | 9 - .../apache/qpid/server/model/ManagedObject.java | 1 + .../java/org/apache/qpid/server/model/Port.java | 25 -- .../qpid/server/model/port/AbstractPort.java | 45 +-- .../apache/qpid/server/model/port/AmqpPort.java | 9 +- .../qpid/server/model/port/AmqpPortImpl.java | 50 ++- .../apache/qpid/server/model/port/HttpPort.java | 2 +- .../qpid/server/model/port/HttpPortImpl.java | 6 - .../org/apache/qpid/server/model/port/JmxPort.java | 2 +- .../apache/qpid/server/model/port/JmxPortImpl.java | 6 - .../org/apache/qpid/server/model/port/RmiPort.java | 2 +- .../apache/qpid/server/model/port/RmiPortImpl.java | 6 - .../auth/manager/SimpleAuthenticationManager.java | 2 +- .../security/encryption/AESKeyFileEncrypter.java | 38 ++- .../encryption/AESKeyFileEncrypterFactory.java | 14 +- .../server/virtualhost/AbstractVirtualHost.java | 2 +- .../qpid/server/model/adapter/PortFactoryTest.java | 71 +---- .../encryption/AESKeyFileEncrypterFactoryTest.java | 343 +++++++++++++++++++++ .../encryption/AESKeyFileEncrypterTest.java | 221 +++++++++++++ .../security/access/firewall/InetNetwork.java | 58 ++-- .../server/protocol/v0_10/ConsumerTarget_0_10.java | 1 + .../qpid/server/protocol/v1_0/SendingLink_1_0.java | 2 +- .../server/management/plugin/HttpManagement.java | 2 +- .../plugin/servlet/rest/RestServlet.java | 39 ++- .../src/main/java/resources/index.html | 2 +- .../resources/js/qpid/common/grid/GridUpdater.js | 2 +- .../src/main/java/resources/js/qpid/common/util.js | 27 +- .../qpid/server/jmx/JMXManagementPluginImpl.java | 4 +- .../src/main/java/org/apache/qpid/server/Main.java | 2 +- .../org/apache/qpid/client/AMQSession_0_10.java | 2 +- .../client/message/AbstractJMSMessageFactory.java | 26 -- .../qpid/client/message/FieldTableSupport.java | 6 +- .../qpid/client/protocol/AMQProtocolHandler.java | 9 +- .../apache/qpid/client/util/BlockingWaiter.java | 12 +- .../qpid/framing/BasicContentHeaderProperties.java | 28 +- .../qpid/transport/network/io/IoReceiver.java | 2 +- .../network/security/sasl/SASLEncryptor.java | 8 +- .../main/java/org/apache/qpid/url/URLHelper.java | 8 +- .../main/java/org/apache/qpid/util/Strings.java | 4 +- .../qpid/disttest/client/ParticipantExecutor.java | 5 +- .../qpid/disttest/controller/TestRunner.java | 7 +- .../qpid/disttest/jms/ControllerJmsDelegate.java | 7 +- .../org/apache/qpid/test/utils/QpidTestCase.java | 2 +- .../apache/qpid/test/utils/QpidBrokerTestCase.java | 2 - .../qpid/server/SupportedProtocolVersionsTest.java | 5 +- 52 files changed, 830 insertions(+), 434 deletions(-) create mode 100644 qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactoryTest.java create mode 100644 qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterTest.java diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Sender.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Sender.java index adeab4ab5d..2b76344085 100644 --- a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Sender.java +++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Sender.java @@ -448,9 +448,9 @@ public class Sender implements DeliveryStateHandler public void handle(Binary deliveryTag, DeliveryState state, Boolean settled) { + OutcomeAction action; if(state instanceof Outcome) { - OutcomeAction action; if((action = _outcomeActions.remove(deliveryTag)) != null) { @@ -464,7 +464,6 @@ public class Sender implements DeliveryStateHandler } else if(state instanceof TransactionalState) { - OutcomeAction action; if((action = _outcomeActions.remove(deliveryTag)) != null) { final Outcome outcome = ((TransactionalState) state).getOutcome(); @@ -472,6 +471,10 @@ public class Sender implements DeliveryStateHandler } } + else if(state == null && settled && (action = _outcomeActions.remove(deliveryTag)) != null) + { + action.onOutcome(deliveryTag, _defaultOutcome); + } } public SendingLinkEndpoint getEndpoint() diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/ConnectionHandler.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/ConnectionHandler.java index b5ab25c3fb..96a31cd4e6 100644 --- a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/ConnectionHandler.java +++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/ConnectionHandler.java @@ -318,22 +318,7 @@ public class ConnectionHandler { _writer.setValue(frame); - try - { _writer.writeToBuffer(_buffer); - } - catch(RuntimeException e) - { - e.printStackTrace(); - throw e; - } - catch(Error e) - { - e.printStackTrace(); - throw e; - } - - } else { diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Binary.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Binary.java index 8074354051..b617167528 100644 --- a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Binary.java +++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Binary.java @@ -23,8 +23,6 @@ package org.apache.qpid.amqp_1_0.type; import java.nio.ByteBuffer; import java.util.Collection; -import static java.lang.Math.min; - public class Binary { @@ -64,32 +62,32 @@ public class Binary public final boolean equals(Object o) { - Binary buf = (Binary) o; - if(o == null) - { - return false; - } - final int size = _length; - if (size != buf._length) + if(o instanceof Binary) { - return false; - } - - final byte[] myData = _data; - final byte[] theirData = buf._data; - int myOffset = _offset; - int theirOffset = buf._offset; - final int myLimit = myOffset + size; + Binary buf = (Binary) o; - while(myOffset < myLimit) - { - if (myData[myOffset++] != theirData[theirOffset++]) + final int size = _length; + if (size == buf._length) { - return false; + final byte[] myData = _data; + final byte[] theirData = buf._data; + int myOffset = _offset; + int theirOffset = buf._offset; + final int myLimit = myOffset + size; + + while (myOffset < myLimit) + { + if (myData[myOffset++] != theirData[theirOffset++]) + { + return false; + } + } + + return true; } } - return true; + return false; } diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslMechanisms.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslMechanisms.java index 9598035899..20b0cd926a 100644 --- a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslMechanisms.java +++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslMechanisms.java @@ -58,7 +58,7 @@ public class SaslMechanisms { builder.append(','); } - builder.append("saslServerMechanisms=").append(_saslServerMechanisms == null ? "" : Arrays.asList(_saslServerMechanisms)); + builder.append("saslServerMechanisms=").append(Arrays.asList(_saslServerMechanisms)); } builder.append('}'); diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHost.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHost.java index 55805b5626..6f03dc51df 100644 --- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHost.java +++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHost.java @@ -58,7 +58,7 @@ import org.apache.qpid.server.virtualhost.VirtualHostImpl; Object that represents the VirtualHost whilst the VirtualHostNode is in the replica role. The real virtualhost will be elsewhere in the group. */ -@ManagedObject( category = false, type = "BDB_HA_REPLICA" ) +@ManagedObject( category = false, type = "BDB_HA_REPLICA", register = false ) public class BDBHAReplicaVirtualHost extends AbstractConfiguredObject implements VirtualHostImpl, ExchangeImpl>, VirtualHost, ExchangeImpl> diff --git a/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectRegistrationGenerator.java b/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectRegistrationGenerator.java index 3c6cb4270e..9e63e96fb7 100644 --- a/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectRegistrationGenerator.java +++ b/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectRegistrationGenerator.java @@ -87,30 +87,33 @@ public class ConfiguredObjectRegistrationGenerator extends AbstractProcessor PackageElement packageElement = elementUtils.getPackageOf(e); String packageName = packageElement.getQualifiedName().toString(); String className = e.getSimpleName().toString(); - for(AnnotationMirror a : e.getAnnotationMirrors()) + AnnotationMirror annotation = getAnnotation(e, annotationElement); + + AnnotationValue registerValue = getAnnotationValue(annotation, "register"); + + if(registerValue == null || (Boolean) registerValue.getValue() ) { - if(a.getAnnotationType().asElement().equals(annotationElement)) + AnnotationValue typeValue = getAnnotationValue(annotation, "type"); + + if (typeValue != null) { - for(Map.Entry entry : a.getElementValues().entrySet()) - { - if(entry.getKey().getSimpleName().toString().equals("type")) - { - _typeMap.put(packageName + "." + className, (String) entry.getValue().getValue()); - processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "looking for " + packageName + "." + className); - _categoryMap.put(packageName + "." + className, getCategory((TypeElement)e)); - break; - } - } - break; + _typeMap.put(packageName + "." + className, (String) typeValue.getValue()); + processingEnv.getMessager() + .printMessage(Diagnostic.Kind.NOTE, + "looking for " + packageName + "." + className); + _categoryMap.put(packageName + "." + className, getCategory((TypeElement) e)); + } + + + Set classNames = _managedObjectClasses.get(packageName); + if (classNames == null) + { + classNames = new HashSet<>(); + _managedObjectClasses.put(packageName, classNames); + } + classNames.add(className); } - Set classNames = _managedObjectClasses.get(packageName); - if (classNames == null) - { - classNames = new HashSet<>(); - _managedObjectClasses.put(packageName, classNames); - } - classNames.add(className); } } for (Map.Entry> entry : _managedObjectClasses.entrySet()) @@ -129,6 +132,30 @@ public class ConfiguredObjectRegistrationGenerator extends AbstractProcessor return false; } + private AnnotationValue getAnnotationValue(final AnnotationMirror annotation, final String attribute) + { + for(Map.Entry entry : annotation.getElementValues().entrySet()) + { + if(entry.getKey().getSimpleName().toString().equals(attribute)) + { + return entry.getValue(); + } + } + return null; + } + + private AnnotationMirror getAnnotation(final Element e, final TypeElement annotationElement) + { + for(AnnotationMirror a : e.getAnnotationMirrors()) + { + if (a.getAnnotationType().asElement().equals(annotationElement)) + { + return a; + } + } + return null; + } + private String getCategory(final TypeElement e) { Elements elementUtils = processingEnv.getElementUtils(); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/BrokerProperties.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/BrokerProperties.java index ccda1e1fe1..765e1e4fa5 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/BrokerProperties.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/BrokerProperties.java @@ -40,9 +40,6 @@ public class BrokerProperties public static final String PROPERTY_DEFAULT_SUPPORTED_PROTOCOL_REPLY = "qpid.broker_default_supported_protocol_version_reply"; public static final String PROPERTY_DISABLED_FEATURES = "qpid.broker_disabled_features"; - public static final String PROPERTY_BROKER_DEFAULT_AMQP_PROTOCOL_EXCLUDES = "qpid.broker_default_amqp_protocol_excludes"; - public static final String PROPERTY_BROKER_DEFAULT_AMQP_PROTOCOL_INCLUDES = "qpid.broker_default_amqp_protocol_includes"; - public static final String PROPERTY_MANAGEMENT_RIGHTS_INFER_ALL_ACCESS = "qpid.broker_jmx_method_rights_infer_all_access"; public static final String PROPERTY_USE_CUSTOM_RMI_SOCKET_FACTORY = "qpid.broker_jmx_use_custom_rmi_socket_factory"; diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryImpl.java index 350e4fcd44..27d914c639 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryImpl.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryImpl.java @@ -137,15 +137,6 @@ public class ConfiguredObjectFactoryImpl implements ConfiguredObjectFactory else { factory = getConfiguredObjectTypeFactory(category, null); - if(factory == null) - { - ManagedObject annotation = categoryClass.getAnnotation(ManagedObject.class); - factory = getConfiguredObjectTypeFactory(category, annotation.defaultType()); - if(factory == null) - { - throw new NoFactoryForTypeException(category, annotation.defaultType()); - } - } } return factory; } 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 8cfb84135e..f18869bced 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 @@ -35,4 +35,5 @@ public @interface ManagedObject boolean creatable() default true; String defaultType() default ""; // in this case the class/interface itself is to be used String type() default ""; + boolean register() default true; } 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 e98ff1a79a..eca3b0c7b1 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 @@ -20,7 +20,6 @@ */ package org.apache.qpid.server.model; -import java.security.AccessControlException; import java.util.Collection; import java.util.Set; @@ -64,30 +63,6 @@ public interface Port> extends ConfiguredObject @ManagedAttribute Collection getTrustStores(); - - - - - - void addTransport(Transport transport) throws IllegalStateException, - AccessControlException, - IllegalArgumentException; - - Transport removeTransport(Transport transport) throws IllegalStateException, - AccessControlException, - IllegalArgumentException; - - - void addProtocol(Protocol protocol) throws IllegalStateException, - AccessControlException, - IllegalArgumentException; - - Protocol removeProtocol(Protocol protocol) throws IllegalStateException, - AccessControlException, - IllegalArgumentException; - - Collection getAvailableProtocols(); - //children Collection getVirtualHostBindings(); Collection getConnections(); 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 32587c0f4e..61790441f9 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 @@ -189,40 +189,12 @@ abstract public class AbstractPort> extends AbstractCo return _transports; } - @Override - public void addTransport(Transport transport) - throws IllegalStateException, AccessControlException, IllegalArgumentException - { - throw new IllegalStateException(); - } - - @Override - public Transport removeTransport(Transport transport) - throws IllegalStateException, AccessControlException, IllegalArgumentException - { - throw new IllegalStateException(); - } - @Override public Set getProtocols() { return _protocols; } - @Override - public void addProtocol(Protocol protocol) - throws IllegalStateException, AccessControlException, IllegalArgumentException - { - throw new IllegalStateException(); - } - - @Override - public Protocol removeProtocol(Protocol protocol) - throws IllegalStateException, AccessControlException, IllegalArgumentException - { - throw new IllegalStateException(); - } - @Override public Collection getVirtualHostBindings() { @@ -250,19 +222,6 @@ abstract public class AbstractPort> extends AbstractCo return null; } - @Override - public Set getAvailableProtocols() - { - Set protocols = getProtocols(); - if(protocols == null || protocols.isEmpty()) - { - protocols = getDefaultProtocols(); - } - return protocols; - } - - protected abstract Set getDefaultProtocols(); - @Override public State getState() { @@ -382,11 +341,11 @@ abstract public class AbstractPort> extends AbstractCo for (Port existingPort : existingPorts) { - Collection portProtocols = existingPort.getAvailableProtocols(); + Collection portProtocols = existingPort.getProtocols(); if (portProtocols != null) { final ArrayList intersection = new ArrayList(portProtocols); - intersection.retainAll(getAvailableProtocols()); + intersection.retainAll(getProtocols()); if(!intersection.isEmpty()) { throw new IllegalConfigurationException("Port for protocols " + intersection + " already exists. Only one management port per protocol can be created."); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPort.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPort.java index fa599b4d5f..b50a289b22 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPort.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPort.java @@ -24,6 +24,7 @@ import java.util.Set; import org.apache.qpid.server.model.AuthenticationProvider; import org.apache.qpid.server.model.ManagedAttribute; +import org.apache.qpid.server.model.ManagedContextDefault; import org.apache.qpid.server.model.ManagedObject; import org.apache.qpid.server.model.Port; import org.apache.qpid.server.model.Protocol; @@ -42,6 +43,11 @@ public interface AmqpPort> extends Port String SEND_BUFFER_SIZE = "sendBufferSize"; String RECEIVE_BUFFER_SIZE = "receiveBufferSize"; + String DEFAULT_AMQP_PROTOCOLS = "qpid.port.default_amqp_protocols"; + + @ManagedContextDefault(name = DEFAULT_AMQP_PROTOCOLS) + String INSTALLED_PROTOCOLS = AmqpPortImpl.getInstalledProtocolsAsString(); + @ManagedAttribute( defaultValue = AmqpPort.DEFAULT_AMQP_TCP_NO_DELAY ) boolean isTcpNoDelay(); @@ -66,8 +72,9 @@ public interface AmqpPort> extends Port validValues = {"org.apache.qpid.server.model.port.AmqpPortImpl#getAllAvailableTransportCombinations()"}) Set getTransports(); - @ManagedAttribute( validValues = {"org.apache.qpid.server.model.port.AmqpPortImpl#getAllAvailableProtocolCombinations()"} ) + @ManagedAttribute( defaultValue = "${" + DEFAULT_AMQP_PROTOCOLS + "}", validValues = {"org.apache.qpid.server.model.port.AmqpPortImpl#getAllAvailableProtocolCombinations()"} ) Set getProtocols(); VirtualHostImpl getVirtualHost(String name); + } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java index 1fbc0c8bc1..2c958b00d0 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java @@ -25,7 +25,6 @@ import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.EnumSet; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -43,6 +42,7 @@ import org.apache.qpid.server.logging.messages.BrokerMessages; import org.apache.qpid.server.model.Broker; import org.apache.qpid.server.model.KeyStore; import org.apache.qpid.server.model.ManagedAttributeField; +import org.apache.qpid.server.model.ManagedContextDefault; import org.apache.qpid.server.model.ManagedObjectFactoryConstructor; import org.apache.qpid.server.model.Protocol; import org.apache.qpid.server.model.State; @@ -53,6 +53,7 @@ import org.apache.qpid.server.plugin.QpidServiceLoader; import org.apache.qpid.server.plugin.TransportProviderFactory; import org.apache.qpid.server.transport.AcceptingTransport; import org.apache.qpid.server.transport.TransportProvider; +import org.apache.qpid.server.util.ServerScopedRuntimeException; import org.apache.qpid.server.virtualhost.VirtualHostImpl; import org.apache.qpid.transport.network.security.ssl.QpidMultipleTrustManager; @@ -110,34 +111,6 @@ public class AmqpPortImpl extends AbstractPortWithAuthProvider imp return (VirtualHostImpl) _broker.findVirtualHostByName(name); } - protected Set getDefaultProtocols() - { - Set defaultProtocols = EnumSet.of(Protocol.AMQP_0_8, Protocol.AMQP_0_9, Protocol.AMQP_0_9_1, - Protocol.AMQP_0_10, Protocol.AMQP_1_0); - String excludedProtocols = System.getProperty(BrokerProperties.PROPERTY_BROKER_DEFAULT_AMQP_PROTOCOL_EXCLUDES); - if (excludedProtocols != null) - { - String[] excludes = excludedProtocols.split(","); - for (String exclude : excludes) - { - Protocol protocol = Protocol.valueOf(exclude); - defaultProtocols.remove(protocol); - } - } - String includedProtocols = System.getProperty(BrokerProperties.PROPERTY_BROKER_DEFAULT_AMQP_PROTOCOL_INCLUDES); - if (includedProtocols != null) - { - String[] includes = includedProtocols.split(","); - for (String include : includes) - { - Protocol protocol = Protocol.valueOf(include); - defaultProtocols.add(protocol); - } - } - return defaultProtocols; - } - - @Override protected State onActivate() { @@ -178,7 +151,7 @@ public class AmqpPortImpl extends AbstractPortWithAuthProvider imp _transport = transportProvider.createTransport(transportSet, sslContext, this, - getAvailableProtocols(), + getProtocols(), defaultSupportedProtocolReply); _transport.start(); @@ -363,4 +336,21 @@ public class AmqpPortImpl extends AbstractPortWithAuthProvider imp } return Collections.unmodifiableSet(combinationsAsString); } + + + public static String getInstalledProtocolsAsString() + { + Set installedProtocols = getInstalledProtocols(); + ObjectMapper mapper = new ObjectMapper(); + + try(StringWriter output = new StringWriter()) + { + mapper.writeValue(output, installedProtocols); + return output.toString(); + } + catch (IOException e) + { + throw new ServerScopedRuntimeException(e); + } + } } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/HttpPort.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/HttpPort.java index fa2af121ae..51d31cb8ab 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/HttpPort.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/HttpPort.java @@ -51,7 +51,7 @@ public interface HttpPort> extends Port validValues = {"[ \"TCP\" ]", "[ \"SSL\" ]", "[ \"TCP\", \"SSL\" ]"}) Set getTransports(); - @ManagedAttribute( validValues = { "[ \"HTTP\"]"} ) + @ManagedAttribute( defaultValue = "HTTP", validValues = { "[ \"HTTP\"]"} ) Set getProtocols(); void setPortManager(PortManager manager); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/HttpPortImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/HttpPortImpl.java index a89ba9bbff..33abee9bde 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/HttpPortImpl.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/HttpPortImpl.java @@ -40,12 +40,6 @@ public class HttpPortImpl extends AbstractPortWithAuthProvider imp super(attributes, broker); } - @Override - protected Set getDefaultProtocols() - { - return Collections.singleton(Protocol.HTTP); - } - public void setPortManager(PortManager manager) { _portManager = manager; diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/JmxPort.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/JmxPort.java index 48754e92e4..981d81a342 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/JmxPort.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/JmxPort.java @@ -51,7 +51,7 @@ public interface JmxPort> extends Port validValues = {"[ \"TCP\" ]", "[ \"SSL\" ]"}) Set getTransports(); - @ManagedAttribute( validValues = { "[ \"JMX_RMI\"]"} ) + @ManagedAttribute( defaultValue = "JMX_RMI", validValues = { "[ \"JMX_RMI\"]"} ) Set getProtocols(); void setPortManager(PortManager manager); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/JmxPortImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/JmxPortImpl.java index ac691c0860..a235613c29 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/JmxPortImpl.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/JmxPortImpl.java @@ -47,12 +47,6 @@ public class JmxPortImpl extends AbstractPortWithAuthProvider imple validateOnlyOneInstance(); } - @Override - protected Set getDefaultProtocols() - { - return Collections.singleton(Protocol.JMX_RMI); - } - @Override public void setPortManager(PortManager manager) { diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/RmiPort.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/RmiPort.java index d2420aa343..8fad90ada3 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/RmiPort.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/RmiPort.java @@ -32,7 +32,7 @@ import org.apache.qpid.server.model.Transport; public interface RmiPort> extends Port { - @ManagedAttribute( validValues = { "[ \"RMI\"]"} ) + @ManagedAttribute( defaultValue = "RMI", validValues = { "[ \"RMI\"]"} ) Set getProtocols(); @ManagedAttribute( defaultValue = "TCP", diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/RmiPortImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/RmiPortImpl.java index e236b7cb91..82e68d75c8 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/RmiPortImpl.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/RmiPortImpl.java @@ -56,12 +56,6 @@ public class RmiPortImpl extends AbstractPort implements RmiPort getDefaultProtocols() - { - return Collections.singleton(Protocol.RMI); - } - public void setPortManager(PortManager manager) { _portManager = manager; diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleAuthenticationManager.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleAuthenticationManager.java index 5b62f7cffd..0e532cee89 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleAuthenticationManager.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleAuthenticationManager.java @@ -46,7 +46,7 @@ import org.apache.qpid.server.security.auth.UsernamePrincipal; import org.apache.qpid.server.security.auth.sasl.plain.PlainPasswordCallback; import org.apache.qpid.server.security.auth.sasl.plain.PlainSaslServer; -@ManagedObject( category = false, type = "Simple" ) +@ManagedObject( category = false, type = "Simple", register = false ) public class SimpleAuthenticationManager extends AbstractAuthenticationManager { private static final Logger _logger = Logger.getLogger(SimpleAuthenticationManager.class); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypter.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypter.java index c0c92f0389..b094ea96f9 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypter.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypter.java @@ -36,17 +36,25 @@ import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.xml.bind.DatatypeConverter; -import org.apache.qpid.server.configuration.IllegalConfigurationException; - class AESKeyFileEncrypter implements ConfigurationSecretEncrypter { private static final String CIPHER_NAME = "AES/CBC/PKCS5Padding"; private static final int AES_INITIALIZATION_VECTOR_LENGTH = 16; + private static final String AES_ALGORITHM = "AES"; private final SecretKey _secretKey; private final SecureRandom _random = new SecureRandom(); AESKeyFileEncrypter(SecretKey secretKey) { + if(secretKey == null) + { + throw new NullPointerException("A non null secret key must be supplied"); + } + if(!AES_ALGORITHM.equals(secretKey.getAlgorithm())) + { + throw new IllegalArgumentException("Provided secret key was for the algorithm: " + secretKey.getAlgorithm() + + "when" + AES_ALGORITHM + "was needed."); + } _secretKey = secretKey; } @@ -68,19 +76,26 @@ class AESKeyFileEncrypter implements ConfigurationSecretEncrypter } catch (IOException | InvalidAlgorithmParameterException | InvalidKeyException | NoSuchAlgorithmException | NoSuchPaddingException e) { - throw new IllegalConfigurationException("Unable to encrypt secret", e); + throw new IllegalArgumentException("Unable to encrypt secret", e); } } @Override public String decrypt(final String encrypted) { + if(!isValidBase64(encrypted)) + { + throw new IllegalArgumentException("Encrypted value is not valid Base 64 data: '" + encrypted + "'"); + } byte[] encryptedBytes = DatatypeConverter.parseBase64Binary(encrypted); try { Cipher cipher = Cipher.getInstance(CIPHER_NAME); - cipher.init(Cipher.DECRYPT_MODE, _secretKey, new IvParameterSpec(encryptedBytes, 0, - AES_INITIALIZATION_VECTOR_LENGTH)); + + IvParameterSpec ivParameterSpec = new IvParameterSpec(encryptedBytes, 0, AES_INITIALIZATION_VECTOR_LENGTH); + + cipher.init(Cipher.DECRYPT_MODE, _secretKey, ivParameterSpec); + return new String(readFromCipherStream(encryptedBytes, AES_INITIALIZATION_VECTOR_LENGTH, encryptedBytes.length - AES_INITIALIZATION_VECTOR_LENGTH, @@ -88,10 +103,15 @@ class AESKeyFileEncrypter implements ConfigurationSecretEncrypter } catch (IOException | InvalidAlgorithmParameterException | InvalidKeyException | NoSuchAlgorithmException | NoSuchPaddingException e) { - throw new IllegalConfigurationException("Unable to encrypt secret", e); + throw new IllegalArgumentException("Unable to encrypt secret", e); } } + private boolean isValidBase64(final String encrypted) + { + return encrypted.matches("^([\\w\\d+/]{4})*([\\w\\d+/]{2}==|[\\w\\d+/]{3}=)?$"); + } + private byte[] readFromCipherStream(final byte[] unencryptedBytes, final Cipher cipher) throws IOException { @@ -106,16 +126,16 @@ class AESKeyFileEncrypter implements ConfigurationSecretEncrypter offset, length), cipher)) { - byte[] buf = new byte[1024]; + byte[] buf = new byte[512]; int pos = 0; int read; while ((read = cipherInputStream.read(buf, pos, buf.length - pos)) != -1) { pos += read; - if (pos == buf.length - 1) + if (pos == buf.length) { byte[] tmp = buf; - buf = new byte[buf.length + 1024]; + buf = new byte[buf.length + 512]; System.arraycopy(tmp, 0, buf, 0, tmp.length); } } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactory.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactory.java index 447f19b7ce..ef92c2a131 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactory.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactory.java @@ -46,13 +46,15 @@ import org.apache.qpid.server.plugin.PluggableService; @PluggableService public class AESKeyFileEncrypterFactory implements ConfigurationSecretEncrypterFactory { - private static final String ENCRYPTER_KEY_FILE = "encrypter.key.file"; + static final String ENCRYPTER_KEY_FILE = "encrypter.key.file"; private static final int AES_KEY_SIZE_BITS = 256; private static final int AES_KEY_SIZE_BYTES = AES_KEY_SIZE_BITS / 8; private static final String AES_ALGORITHM = "AES"; - public static String TYPE = "AESKeyFile"; + public static final String TYPE = "AESKeyFile"; + + static final String DEFAULT_KEYS_SUBDIR_NAME = ".keys"; @Override public ConfigurationSecretEncrypter createEncrypter(final ConfiguredObject object) @@ -66,7 +68,7 @@ public class AESKeyFileEncrypterFactory implements ConfigurationSecretEncrypterF { fileLocation = object.getContextValue(String.class, BrokerOptions.QPID_WORK_DIR) - + File.separator + ".keys" + File.separator + + File.separator + DEFAULT_KEYS_SUBDIR_NAME + File.separator + object.getCategoryClass().getSimpleName() + "_" + object.getName() + ".key"; @@ -94,14 +96,14 @@ public class AESKeyFileEncrypterFactory implements ConfigurationSecretEncrypterF || permissions.contains(PosixFilePermission.GROUP_WRITE) || permissions.contains(PosixFilePermission.OTHERS_WRITE)) { - throw new IllegalStateException("Key file '" + throw new IllegalArgumentException("Key file '" + fileLocation + "' has incorrect permissions. Only the owner " + "should be able to read or write this file."); } if(Files.size(file.toPath()) != AES_KEY_SIZE_BYTES) { - throw new IllegalConfigurationException("Key file '" + fileLocation + "' contains an incorrect about of data"); + throw new IllegalArgumentException("Key file '" + fileLocation + "' contains an incorrect about of data"); } try(FileInputStream inputStream = new FileInputStream(file)) @@ -151,7 +153,7 @@ public class AESKeyFileEncrypterFactory implements ConfigurationSecretEncrypterF } catch (NoSuchAlgorithmException | IOException e) { - throw new IllegalConfigurationException("Cannot create key file: " + e.getMessage(), e); + throw new IllegalArgumentException("Cannot create key file: " + e.getMessage(), e); } } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java index 450fc30bf2..eacc4f2458 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java @@ -251,7 +251,7 @@ public abstract class AbstractVirtualHost> exte { for(Port port :_broker.getPorts()) { - if (Protocol.hasAmqpProtocol(port.getAvailableProtocols())) + if (Protocol.hasAmqpProtocol(port.getProtocols())) { _aliases.add(new VirtualHostAliasAdapter(this, port)); } diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/adapter/PortFactoryTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/adapter/PortFactoryTest.java index 48681a6075..523203c756 100644 --- a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/adapter/PortFactoryTest.java +++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/adapter/PortFactoryTest.java @@ -25,16 +25,13 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; -import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.UUID; -import org.apache.qpid.server.configuration.BrokerProperties; import org.apache.qpid.server.configuration.IllegalConfigurationException; import org.apache.qpid.server.configuration.updater.CurrentThreadTaskExecutor; import org.apache.qpid.server.configuration.updater.TaskExecutor; @@ -100,8 +97,6 @@ public class PortFactoryTest extends QpidTestCase } - setTestSystemProperty(BrokerProperties.PROPERTY_BROKER_DEFAULT_AMQP_PROTOCOL_EXCLUDES, null); - setTestSystemProperty(BrokerProperties.PROPERTY_BROKER_DEFAULT_AMQP_PROTOCOL_INCLUDES, null); _factory = new ConfiguredObjectFactoryImpl(BrokerModel.getInstance()); _attributes.put(Port.ID, _portId); _attributes.put(Port.NAME, getName()); @@ -114,62 +109,6 @@ public class PortFactoryTest extends QpidTestCase _attributes.put(Port.BINDING_ADDRESS, "127.0.0.1"); } - public void testDefaultProtocols() - { - Map attributes = new HashMap(); - attributes.put(Port.PORT, 1); - attributes.put(Port.NAME, getName()); - attributes.put(Port.DESIRED_STATE, State.QUIESCED); - - attributes.put(Port.AUTHENTICATION_PROVIDER, _authProviderName); - Port port = _factory.create(Port.class, attributes, _broker); - - Collection protocols = port.getAvailableProtocols(); - - EnumSet expected = EnumSet.of(Protocol.AMQP_0_8, Protocol.AMQP_0_9, Protocol.AMQP_0_9_1, Protocol.AMQP_0_10, - Protocol.AMQP_1_0); - assertEquals("Unexpected protocols", new HashSet(expected), new HashSet(protocols)); - } - - public void testDefaultProtocolsWhenProtocolExcludeSystemPropertyIsSet() - { - setTestSystemProperty(BrokerProperties.PROPERTY_BROKER_DEFAULT_AMQP_PROTOCOL_EXCLUDES, Protocol.AMQP_1_0.name() + "," - + Protocol.AMQP_0_10.name()); - - Map attributes = new HashMap(); - attributes.put(Port.PORT, 1); - attributes.put(Port.NAME, getName()); - attributes.put(Port.AUTHENTICATION_PROVIDER, _authProviderName); - attributes.put(Port.DESIRED_STATE, State.QUIESCED); - Port port = _factory.create(Port.class, attributes, _broker); - - - Collection protocols = port.getAvailableProtocols(); - - EnumSet expected = EnumSet.of(Protocol.AMQP_0_8, Protocol.AMQP_0_9, Protocol.AMQP_0_9_1); - assertEquals("Unexpected protocols", new HashSet(expected), new HashSet(protocols)); - } - - public void testDefaultProtocolsWhenProtocolIncludeSystemPropertyIsSet() - { - setTestSystemProperty(BrokerProperties.PROPERTY_BROKER_DEFAULT_AMQP_PROTOCOL_EXCLUDES, Protocol.AMQP_1_0.name() + "," - + Protocol.AMQP_0_10.name() + "," + Protocol.AMQP_0_9_1.name()); - setTestSystemProperty(BrokerProperties.PROPERTY_BROKER_DEFAULT_AMQP_PROTOCOL_INCLUDES, Protocol.AMQP_0_10.name() + "," - + Protocol.AMQP_0_9_1.name()); - - Map attributes = new HashMap(); - attributes.put(Port.PORT, 1); - attributes.put(Port.NAME, getName()); - attributes.put(Port.AUTHENTICATION_PROVIDER, _authProviderName); - attributes.put(Port.DESIRED_STATE, State.QUIESCED); - Port port = _factory.create(Port.class, attributes, _broker); - - Collection protocols = port.getAvailableProtocols(); - - EnumSet expected = EnumSet.of(Protocol.AMQP_0_8, Protocol.AMQP_0_9, Protocol.AMQP_0_9_1, Protocol.AMQP_0_10); - assertEquals("Unexpected protocols", new HashSet(expected), new HashSet(protocols)); - } - public void testCreatePortWithMinimumAttributes() { Map attributes = new HashMap(); @@ -184,8 +123,6 @@ public class PortFactoryTest extends QpidTestCase assertTrue(port instanceof AmqpPort); assertEquals("Unexpected port", 1, port.getPort()); assertEquals("Unexpected transports", Collections.singleton(PortFactory.DEFAULT_TRANSPORT), port.getTransports()); - assertEquals("Unexpected protocols", EnumSet.of(Protocol.AMQP_0_8, Protocol.AMQP_0_9, Protocol.AMQP_0_9_1, Protocol.AMQP_0_10, - Protocol.AMQP_1_0), port.getAvailableProtocols()); assertEquals("Unexpected send buffer size", PortFactory.DEFAULT_AMQP_SEND_BUFFER_SIZE, port.getAttribute(AmqpPort.SEND_BUFFER_SIZE)); assertEquals("Unexpected receive buffer size", PortFactory.DEFAULT_AMQP_RECEIVE_BUFFER_SIZE, @@ -333,7 +270,7 @@ public class PortFactoryTest extends QpidTestCase { assertEquals(_tcpTransports, port.getTransports()); } - assertEquals(amqp010ProtocolSet, port.getAvailableProtocols()); + assertEquals(amqp010ProtocolSet, port.getProtocols()); assertEquals("Unexpected send buffer size", 2, port.getAttribute(AmqpPort.SEND_BUFFER_SIZE)); assertEquals("Unexpected receive buffer size", 1, port.getAttribute(AmqpPort.RECEIVE_BUFFER_SIZE)); assertEquals("Unexpected need client auth", needClientAuth, port.getAttribute(Port.NEED_CLIENT_AUTH)); @@ -361,7 +298,7 @@ public class PortFactoryTest extends QpidTestCase assertEquals(_portId, port.getId()); assertEquals(_portNumber, port.getPort()); assertEquals(_tcpTransports, port.getTransports()); - assertEquals(nonAmqpProtocolSet, port.getAvailableProtocols()); + assertEquals(nonAmqpProtocolSet, port.getProtocols()); } public void testCreateNonAmqpPortWithPartiallySetAttributes() @@ -382,7 +319,7 @@ public class PortFactoryTest extends QpidTestCase assertEquals(_portId, port.getId()); assertEquals(_portNumber, port.getPort()); assertEquals(Collections.singleton(PortFactory.DEFAULT_TRANSPORT), port.getTransports()); - assertEquals(nonAmqpProtocolSet, port.getAvailableProtocols()); + assertEquals(nonAmqpProtocolSet, port.getProtocols()); } @@ -411,7 +348,7 @@ public class PortFactoryTest extends QpidTestCase attributes.put(Port.PROTOCOLS, Collections.singleton(Protocol.RMI)); Port rmiPort = mock(Port.class); - when(rmiPort.getAvailableProtocols()).thenReturn(Collections.singleton(Protocol.RMI)); + when(rmiPort.getProtocols()).thenReturn(Collections.singleton(Protocol.RMI)); when(_broker.getPorts()).thenReturn(Collections.singletonList(rmiPort)); try diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactoryTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactoryTest.java new file mode 100644 index 0000000000..320c5dbdc8 --- /dev/null +++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactoryTest.java @@ -0,0 +1,343 @@ +/* + * + * 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.encryption; + +import static org.mockito.Matchers.anyMap; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.nio.file.attribute.PosixFilePermission; +import java.security.NoSuchAlgorithmException; +import java.util.Collections; +import java.util.EnumSet; +import java.util.Map; +import java.util.UUID; + +import javax.crypto.Cipher; + +import org.mockito.ArgumentCaptor; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import org.apache.qpid.server.BrokerOptions; +import org.apache.qpid.server.model.Broker; +import org.apache.qpid.test.utils.QpidTestCase; + +public class AESKeyFileEncrypterFactoryTest extends QpidTestCase +{ + private Broker _broker; + private Path _tmpDir; + private AESKeyFileEncrypterFactory _factory; + + @Override + public void setUp() throws Exception + { + super.setUp(); + _broker = mock(Broker.class); + _tmpDir = Files.createTempDirectory(getTestName()); + + when(_broker.getContextKeys(eq(false))).thenReturn(Collections.emptySet()); + when(_broker.getContextValue(eq(String.class), eq(BrokerOptions.QPID_WORK_DIR))).thenReturn(_tmpDir.toString()); + when(_broker.getCategoryClass()).thenReturn(Broker.class); + when(_broker.getName()).thenReturn(getName()); + final ArgumentCaptor contextCaptor = ArgumentCaptor.forClass(Map.class); + + when(_broker.setAttribute(eq("context"), anyMap(), contextCaptor.capture() )).thenAnswer(new Answer() { + + @Override + public Void answer(final InvocationOnMock invocationOnMock) throws Throwable + { + Map replacementContext = contextCaptor.getValue(); + when(_broker.getContext()).thenReturn(replacementContext); + return null; + } + }); + + _factory = new AESKeyFileEncrypterFactory(); + } + + public void testCreateKeyInDefaultLocation() throws Exception + { + if(isStrongEncryptionEnabled()) + { + ConfigurationSecretEncrypter encrypter = _factory.createEncrypter(_broker); + + KeyFilePathChecker keyFilePathChecker = new KeyFilePathChecker(); + + doChecks(encrypter, keyFilePathChecker); + + String pathName = (String) _broker.getContext().get(AESKeyFileEncrypterFactory.ENCRYPTER_KEY_FILE); + + // check the context variable was set + assertEquals(keyFilePathChecker.getKeyFile().toString(), pathName); + } + } + + private void doChecks(final ConfigurationSecretEncrypter encrypter, + final KeyFilePathChecker keyFilePathChecker) throws IOException + { + // walk the directory to find the file + Files.walkFileTree(_tmpDir, keyFilePathChecker); + + // check the file was actually found + assertNotNull(keyFilePathChecker.getKeyFile()); + + String secret = "notasecret"; + + // check the encrypter works + assertEquals(secret, encrypter.decrypt(encrypter.encrypt(secret))); + + } + + public void testSettingContextKeyLeadsToFileCreation() throws Exception + { + if(isStrongEncryptionEnabled()) + { + String filename = UUID.randomUUID().toString() + ".key"; + String subdirName = getTestName() + File.separator + "test"; + String fileLocation = _tmpDir.toString() + File.separator + subdirName + File.separator + filename; + + when(_broker.getContextKeys(eq(false))).thenReturn(Collections.singleton(AESKeyFileEncrypterFactory.ENCRYPTER_KEY_FILE)); + when(_broker.getContextValue(eq(String.class), + eq(AESKeyFileEncrypterFactory.ENCRYPTER_KEY_FILE))).thenReturn(fileLocation); + + ConfigurationSecretEncrypter encrypter = _factory.createEncrypter(_broker); + + KeyFilePathChecker keyFilePathChecker = new KeyFilePathChecker(subdirName, filename); + + doChecks(encrypter, keyFilePathChecker); + } + } + + + public void testUnableToCreateFileInSpecifiedLocation() throws Exception + { + if(isStrongEncryptionEnabled()) + { + + String filename = UUID.randomUUID().toString() + ".key"; + String subdirName = getTestName() + File.separator + "test"; + String fileLocation = _tmpDir.toString() + File.separator + subdirName + File.separator + filename; + + when(_broker.getContextKeys(eq(false))).thenReturn(Collections.singleton(AESKeyFileEncrypterFactory.ENCRYPTER_KEY_FILE)); + when(_broker.getContextValue(eq(String.class), + eq(AESKeyFileEncrypterFactory.ENCRYPTER_KEY_FILE))).thenReturn(fileLocation); + + Files.createDirectories(Paths.get(fileLocation)); + + try + { + ConfigurationSecretEncrypter encrypter = _factory.createEncrypter(_broker); + fail("should not be able to create a key file where a directory currently is"); + } + catch (IllegalArgumentException e) + { + // pass + } + } + } + + + public void testPermissionsAreChecked() throws Exception + { + if(isStrongEncryptionEnabled()) + { + + String filename = UUID.randomUUID().toString() + ".key"; + String subdirName = getTestName() + File.separator + "test"; + String fileLocation = _tmpDir.toString() + File.separator + subdirName + File.separator + filename; + + when(_broker.getContextKeys(eq(false))).thenReturn(Collections.singleton(AESKeyFileEncrypterFactory.ENCRYPTER_KEY_FILE)); + when(_broker.getContextValue(eq(String.class), + eq(AESKeyFileEncrypterFactory.ENCRYPTER_KEY_FILE))).thenReturn(fileLocation); + + Files.createDirectories(Paths.get(_tmpDir.toString(), subdirName)); + + File file = new File(fileLocation); + file.createNewFile(); + Files.setPosixFilePermissions(file.toPath(), + EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.GROUP_READ)); + + try + { + ConfigurationSecretEncrypter encrypter = _factory.createEncrypter(_broker); + fail("should not be able to create a key file where the file is readable"); + } + catch (IllegalArgumentException e) + { + // pass + } + } + } + + public void testInvalidKey() throws Exception + { + if(isStrongEncryptionEnabled()) + { + String filename = UUID.randomUUID().toString() + ".key"; + String subdirName = getTestName() + File.separator + "test"; + String fileLocation = _tmpDir.toString() + File.separator + subdirName + File.separator + filename; + + when(_broker.getContextKeys(eq(false))).thenReturn(Collections.singleton(AESKeyFileEncrypterFactory.ENCRYPTER_KEY_FILE)); + when(_broker.getContextValue(eq(String.class), + eq(AESKeyFileEncrypterFactory.ENCRYPTER_KEY_FILE))).thenReturn(fileLocation); + + Files.createDirectories(Paths.get(_tmpDir.toString(), subdirName)); + + File file = new File(fileLocation); + try (FileOutputStream fos = new FileOutputStream(file)) + { + fos.write("This is not an AES key. It is a string saying it is not an AES key".getBytes( + StandardCharsets.US_ASCII)); + } + Files.setPosixFilePermissions(file.toPath(), EnumSet.of(PosixFilePermission.OWNER_READ)); + + try + { + ConfigurationSecretEncrypter encrypter = _factory.createEncrypter(_broker); + fail("should not be able to start where the key is not a valid key"); + } + catch (IllegalArgumentException e) + { + // pass + } + } + } + + @Override + public void tearDown() throws Exception + { + Files.walkFileTree(_tmpDir, + new SimpleFileVisitor() + { + @Override + public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) + throws IOException + { + Files.delete(file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(final Path dir, final IOException exc) + throws IOException + { + Files.delete(dir); + return FileVisitResult.CONTINUE; + } + }); + super.tearDown(); + } + + private boolean isStrongEncryptionEnabled() throws NoSuchAlgorithmException + { + return Cipher.getMaxAllowedKeyLength("AES")>=256; + } + + private class KeyFilePathChecker extends SimpleFileVisitor + { + + private final String _fileName; + private final String _subdirName; + private Path _keyFile; + private boolean _inKeysSubdir; + + public KeyFilePathChecker() + { + this(AESKeyFileEncrypterFactory.DEFAULT_KEYS_SUBDIR_NAME, "Broker_" + AESKeyFileEncrypterFactoryTest.this.getName() + ".key"); + } + + public KeyFilePathChecker(final String subdirName, final String fileName) + { + _subdirName = subdirName; + _fileName = fileName; + } + + @Override + public FileVisitResult preVisitDirectory(final Path dir, final BasicFileAttributes attrs) throws IOException + { + if(!_inKeysSubdir && dir.endsWith(_subdirName)) + { + _inKeysSubdir = true; + assertFalse(Files.getPosixFilePermissions(dir).contains(PosixFilePermission.OTHERS_READ)); + assertFalse(Files.getPosixFilePermissions(dir).contains(PosixFilePermission.OTHERS_WRITE)); + assertFalse(Files.getPosixFilePermissions(dir).contains(PosixFilePermission.OTHERS_EXECUTE)); + + assertFalse(Files.getPosixFilePermissions(dir).contains(PosixFilePermission.GROUP_READ)); + assertFalse(Files.getPosixFilePermissions(dir).contains(PosixFilePermission.GROUP_WRITE)); + assertFalse(Files.getPosixFilePermissions(dir).contains(PosixFilePermission.GROUP_EXECUTE)); + return FileVisitResult.CONTINUE; + } + else + { + return _inKeysSubdir ? FileVisitResult.SKIP_SUBTREE : FileVisitResult.CONTINUE; + } + + } + + @Override + public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException + { + if(_inKeysSubdir) + { + if(file.endsWith(_fileName)) + { + _keyFile = file; + + assertFalse(Files.getPosixFilePermissions(file).contains(PosixFilePermission.OTHERS_READ)); + assertFalse(Files.getPosixFilePermissions(file).contains(PosixFilePermission.OTHERS_WRITE)); + assertFalse(Files.getPosixFilePermissions(file).contains(PosixFilePermission.OTHERS_EXECUTE)); + + assertFalse(Files.getPosixFilePermissions(file).contains(PosixFilePermission.GROUP_READ)); + assertFalse(Files.getPosixFilePermissions(file).contains(PosixFilePermission.GROUP_WRITE)); + assertFalse(Files.getPosixFilePermissions(file).contains(PosixFilePermission.GROUP_EXECUTE)); + + return FileVisitResult.TERMINATE; + } + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(final Path dir, final IOException exc) throws IOException + { + _inKeysSubdir = false; + return FileVisitResult.CONTINUE; + } + + public Path getKeyFile() + { + return _keyFile; + } + + } +} diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterTest.java new file mode 100644 index 0000000000..3feb458a8b --- /dev/null +++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterTest.java @@ -0,0 +1,221 @@ +/* + * + * 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.encryption; + +import java.nio.charset.StandardCharsets; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.HashSet; +import java.util.Random; +import java.util.Set; + +import javax.crypto.Cipher; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.PBEKeySpec; +import javax.crypto.spec.SecretKeySpec; + +import org.apache.qpid.test.utils.QpidTestCase; + +public class AESKeyFileEncrypterTest extends QpidTestCase +{ + private final SecureRandom _random = new SecureRandom(); + public static final String PLAINTEXT = "notaverygoodpassword"; + + public void testSimpleEncryptDecrypt() throws Exception + { + if(isStrongEncryptionEnabled()) + { + doTestSimpleEncryptDecrypt(PLAINTEXT); + } + } + + + public void testRepeatedEncryptionsReturnDifferentValues() throws Exception + { + if(isStrongEncryptionEnabled()) + { + SecretKeySpec secretKey = createSecretKey(); + AESKeyFileEncrypter encrypter = new AESKeyFileEncrypter(secretKey); + + Set encryptions = new HashSet<>(); + + int iterations = 100; + + for (int i = 0; i < iterations; i++) + { + encryptions.add(encrypter.encrypt(PLAINTEXT)); + } + + assertEquals("Not all encryptions were distinct", iterations, encryptions.size()); + + for (String encrypted : encryptions) + { + assertEquals("Not all encryptions decrypt correctly", PLAINTEXT, encrypter.decrypt(encrypted)); + } + } + } + + public void testCreationFailsOnInvalidSecret() throws Exception + { + if(isStrongEncryptionEnabled()) + { + try + { + new AESKeyFileEncrypter(null); + fail("An encrypter should not be creatable from a null key"); + } + catch (NullPointerException e) + { + // pass + } + + try + { + PBEKeySpec keySpec = new PBEKeySpec("password".toCharArray()); + SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); + new AESKeyFileEncrypter(factory.generateSecret(keySpec)); + fail("An encrypter should not be creatable from the wrong type of secret key"); + } + catch (IllegalArgumentException e) + { + // pass + } + } + } + + public void testEncryptionOfEmptyString() throws Exception + { + if(isStrongEncryptionEnabled()) + { + String text = ""; + doTestSimpleEncryptDecrypt(text); + } + } + + private void doTestSimpleEncryptDecrypt(final String text) + { + SecretKeySpec secretKey = createSecretKey(); + AESKeyFileEncrypter encrypter = new AESKeyFileEncrypter(secretKey); + + String encrypted = encrypter.encrypt(text); + assertNotNull("Encrypter did not return a result from encryption", encrypted); + assertFalse("Plain text and encrypted version are equal", text.equals(encrypted)); + String decrypted = encrypter.decrypt(encrypted); + assertNotNull("Encrypter did not return a result from decryption",decrypted); + assertTrue("Encryption was not reversible", text.equals(decrypted)); + } + + public void testEncryptingNullFails() throws Exception + { + if(isStrongEncryptionEnabled()) + { + try + { + SecretKeySpec secretKey = createSecretKey(); + AESKeyFileEncrypter encrypter = new AESKeyFileEncrypter(secretKey); + + String encrypted = encrypter.encrypt(null); + fail("Attempting to encrypt null should fail"); + } + catch (NullPointerException e) + { + // pass + } + } + } + + public void testEncryptingVeryLargeSecret() throws Exception + { + if(isStrongEncryptionEnabled()) + { + Random random = new Random(); + byte[] data = new byte[4096]; + random.nextBytes(data); + for (int i = 0; i < data.length; i++) + { + data[i] = (byte) (data[i] & 0xEF); + } + doTestSimpleEncryptDecrypt(new String(data, StandardCharsets.US_ASCII)); + } + } + + private boolean isStrongEncryptionEnabled() throws NoSuchAlgorithmException + { + return Cipher.getMaxAllowedKeyLength("AES")>=256; + } + + public void testDecryptNonsense() throws Exception + { + if(isStrongEncryptionEnabled()) + { + SecretKeySpec secretKey = createSecretKey(); + AESKeyFileEncrypter encrypter = new AESKeyFileEncrypter(secretKey); + + + try + { + encrypter.decrypt(null); + fail("Should not decrypt a null value"); + } + catch (NullPointerException e) + { + // pass + } + + try + { + encrypter.decrypt(""); + fail("Should not decrypt the empty String"); + } + catch (IllegalArgumentException e) + { + // pass + } + + try + { + encrypter.decrypt("thisisnonsense"); + fail("Should not decrypt a small amount of nonsense"); + } + catch (IllegalArgumentException e) + { + // pass + } + + try + { + String answer = encrypter.decrypt("thisisn'tvalidBase64!soitshouldfailwithanIllegalArgumentException"); + fail("Should not decrypt a larger amount of nonsense"); + } + catch (IllegalArgumentException e) + { + // pass + } + } + } + + private SecretKeySpec createSecretKey() + { + final byte[] keyData = new byte[32]; + _random.nextBytes(keyData); + return new SecretKeySpec(keyData, "AES"); + } +} diff --git a/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/firewall/InetNetwork.java b/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/firewall/InetNetwork.java index 2e979b38f1..7294d9c5e8 100644 --- a/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/firewall/InetNetwork.java +++ b/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/firewall/InetNetwork.java @@ -61,10 +61,10 @@ class InetNetwork @Override public boolean equals(Object obj) { - return (obj != null) && - (obj instanceof InetNetwork) && - ((InetNetwork)obj).network.equals(network) && - ((InetNetwork)obj).netmask.equals(netmask); + return (obj != null) && + (obj instanceof InetNetwork) && + ((InetNetwork) obj).network.equals(network) && + ((InetNetwork) obj).netmask.equals(netmask); } public static InetNetwork getFromString(String netspec) throws java.net.UnknownHostException @@ -95,15 +95,13 @@ class InetNetwork { try { - return getByAddress( - new byte[] - { - (byte) (mask[0] & ip[0]), - (byte) (mask[1] & ip[1]), - (byte) (mask[2] & ip[2]), - (byte) (mask[3] & ip[3]) - } - ); + return InetAddress.getByAddress(new byte[] + { + (byte) (mask[0] & ip[0]), + (byte) (mask[1] & ip[1]), + (byte) (mask[2] & ip[2]), + (byte) (mask[3] & ip[3]) + }); } catch (Exception _) { @@ -127,7 +125,7 @@ class InetNetwork */ static private String normalizeFromAsterisk(final String netspec) { - String[] masks = { "0.0.0.0/0.0.0.0", "0.0.0/255.0.0.0", "0.0/255.255.0.0", "0/255.255.255.0" }; + String[] masks = {"0.0.0.0/0.0.0.0", "0.0.0/255.0.0.0", "0.0/255.255.0.0", "0/255.255.255.0"}; char[] srcb = netspec.toCharArray(); int octets = 0; for (int i = 1; i < netspec.length(); i++) @@ -137,7 +135,7 @@ class InetNetwork octets++; } } - return (octets == 0) ? masks[0] : netspec.substring(0, netspec.length() -1 ).concat(masks[octets]); + return (octets == 0) ? masks[0] : netspec.substring(0, netspec.length() - 1).concat(masks[octets]); } /* @@ -148,30 +146,14 @@ class InetNetwork */ static private String normalizeFromCIDR(final String netspec) { - final int bits = 32 - Integer.parseInt(netspec.substring(netspec.indexOf('/')+1)); - final int mask = (bits == 32) ? 0 : 0xFFFFFFFF - ((1 << bits)-1); + final int bits = 32 - Integer.parseInt(netspec.substring(netspec.indexOf('/') + 1)); + final int mask = (bits == 32) ? 0 : 0xFFFFFFFF - ((1 << bits) - 1); return netspec.substring(0, netspec.indexOf('/') + 1) + - Integer.toString(mask >> 24 & 0xFF, 10) + "." + - Integer.toString(mask >> 16 & 0xFF, 10) + "." + - Integer.toString(mask >> 8 & 0xFF, 10) + "." + - Integer.toString(mask >> 0 & 0xFF, 10); + Integer.toString(mask >> 24 & 0xFF, 10) + "." + + Integer.toString(mask >> 16 & 0xFF, 10) + "." + + Integer.toString(mask >> 8 & 0xFF, 10) + "." + + Integer.toString(mask >> 0 & 0xFF, 10); } - private static InetAddress getByAddress(byte[] ip) throws java.net.UnknownHostException - { - InetAddress addr = InetAddress.getByAddress(ip); - - if (addr == null) { - addr = InetAddress.getByName - ( - Integer.toString(ip[0] & 0xFF, 10) + "." + - Integer.toString(ip[1] & 0xFF, 10) + "." + - Integer.toString(ip[2] & 0xFF, 10) + "." + - Integer.toString(ip[3] & 0xFF, 10) - ); - } - - return addr; - } -} \ No newline at end of file +} diff --git a/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ConsumerTarget_0_10.java b/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ConsumerTarget_0_10.java index ec0c38ec42..db7ee54cb2 100644 --- a/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ConsumerTarget_0_10.java +++ b/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ConsumerTarget_0_10.java @@ -285,6 +285,7 @@ public class ConsumerTarget_0_10 extends AbstractConsumerTarget implements FlowC else if(!msgCompressed && compressionSupported && (messageProps == null || messageProps.getContentEncoding()==null) + && body != null && body.remaining() > _session.getConnection().getMessageCompressionThreshold()) { byte[] compressed = GZIPUtils.compressBufferToArray(body); 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 deaa3ef50b..def75527f3 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 @@ -628,7 +628,7 @@ public class SendingLink_1_0 implements SendingLinkListener, Link_1_0, DeliveryS queueEntry.release(); _unsettledMap.remove(deliveryTag); } - else if(initialUnsettledMap != null && (initialUnsettledMap.get(deliveryTag) instanceof Outcome)) + else if(initialUnsettledMap.get(deliveryTag) instanceof Outcome) { Outcome outcome = (Outcome) initialUnsettledMap.get(deliveryTag); 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 d29144f09b..f55b373119 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 @@ -441,7 +441,7 @@ public class HttpManagement extends AbstractPluginAdapter implem Collection> httpPorts = new HashSet<>(); for (Port port : ports) { - if (port.getAvailableProtocols().contains(Protocol.HTTP)) + if (port.getProtocols().contains(Protocol.HTTP)) { httpPorts.add(port); } 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 171c0d1e1c..dc1f5bba46 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 @@ -17,7 +17,6 @@ package org.apache.qpid.server.management.plugin.servlet.rest; import java.io.IOException; -import java.io.PrintWriter; import java.io.Writer; import java.security.AccessControlException; import java.util.ArrayList; @@ -43,6 +42,7 @@ import org.apache.log4j.Logger; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.SerializationConfig; +import org.apache.qpid.server.configuration.IllegalConfigurationException; import org.apache.qpid.server.model.Broker; import org.apache.qpid.server.model.ConfiguredObject; import org.apache.qpid.server.util.urlstreamhandler.data.Handler; @@ -407,7 +407,7 @@ public class RestServlet extends AbstractServlet } catch (RuntimeException e) { - setResponseStatus(response, e); + setResponseStatus(request, response, e); } return; } @@ -423,7 +423,7 @@ public class RestServlet extends AbstractServlet Collection[] objects = new Collection[_hierarchy.length]; if (_hierarchy.length == 1) { - createOrUpdate(providedObject, _hierarchy[0], getBroker(), null, response); + createOrUpdate(providedObject, _hierarchy[0], getBroker(), null, request, response); } else { @@ -486,13 +486,14 @@ public class RestServlet extends AbstractServlet ConfiguredObject theParent = parents.remove(0); ConfiguredObject[] otherParents = parents.toArray(new ConfiguredObject[parents.size()]); - createOrUpdate(providedObject, objClass, theParent, otherParents, response); + createOrUpdate(providedObject, objClass, theParent, otherParents, request, response); } } private void createOrUpdate(Map providedObject, Class objClass, - ConfiguredObject theParent, ConfiguredObject[] otherParents, HttpServletResponse response) throws IOException + ConfiguredObject theParent, ConfiguredObject[] otherParents, HttpServletRequest request, + HttpServletResponse response) throws IOException { try { @@ -513,7 +514,7 @@ public class RestServlet extends AbstractServlet } catch (RuntimeException e) { - setResponseStatus(response, e); + setResponseStatus(request, response, e); } } @@ -552,24 +553,40 @@ public class RestServlet extends AbstractServlet return true; } - private void setResponseStatus(HttpServletResponse response, RuntimeException e) throws IOException + private void setResponseStatus(HttpServletRequest request, HttpServletResponse response, RuntimeException e) throws IOException { if (e instanceof AccessControlException) { if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Caught security exception, sending " + HttpServletResponse.SC_FORBIDDEN, e); + LOGGER.debug("AccessControlException, sending " + HttpServletResponse.SC_FORBIDDEN, e); } response.setStatus(HttpServletResponse.SC_FORBIDDEN); } else { - LOGGER.warn("Caught exception", e); + if (e instanceof IllegalConfigurationException || e instanceof IllegalArgumentException) + { + if (LOGGER.isDebugEnabled()) + { + LOGGER.debug(e.getClass().getSimpleName() + " processing request : " + e.getMessage()); + } + else if (LOGGER.isTraceEnabled()) + { + LOGGER.trace(e.getClass().getSimpleName() + " processing request", e); + } + } + else + { + LOGGER.warn("Unexpected exception processing request ", e); + } + response.setStatus(HttpServletResponse.SC_CONFLICT); response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); - PrintWriter out = response.getWriter(); + + Writer out = getOutputWriter(request, response); ObjectMapper mapper = new ObjectMapper(); mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true); mapper.writeValue(out, Collections.singletonMap("errorMessage", e.getMessage())); @@ -596,7 +613,7 @@ public class RestServlet extends AbstractServlet } catch(RuntimeException e) { - setResponseStatus(response, e); + setResponseStatus(request, response, e); } } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/index.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/index.html index 3c0cb9a5f6..11f229237c 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/index.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/index.html @@ -125,7 +125,7 @@
- +
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/grid/GridUpdater.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/grid/GridUpdater.js index 8d58b6dec0..e5d96d44e7 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/grid/GridUpdater.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/grid/GridUpdater.js @@ -160,7 +160,7 @@ define(["dojo/_base/xhr", if (this.serviceUrl) { var requestUrl = lang.isFunction(this.serviceUrl) ? this.serviceUrl() : this.serviceUrl; - xhr.get({url: requestUrl, sync: true, handleAs: "json"}).then(processData, util.errorHandler); + xhr.get({url: requestUrl, sync: true, handleAs: "json"}).then(processData, util.xhrErrorHandler); } else { diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js index 441d6776e7..cb0cc792e8 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js @@ -345,15 +345,18 @@ define(["dojo/_base/xhr", var hasMessage = error.hasOwnProperty("message"); var message; - if (error.status == 401) + if (error.status == 0) { - message = hasMessage ? error.message : "Authentication required"; + message = "Unable to contact the Broker"; + } + else if (error.status == 401) + { + message = "Authentication required"; userMustReauth = true; } else if (error.status == 403) { - message = hasMessage ? error.message : "Forbidden"; - userMustReauth = true; + message = "Access Forbidden"; } else { @@ -398,22 +401,6 @@ define(["dojo/_base/xhr", } }; - util.errorHandler = function errorHandler(error) - { - if(error.status == 401) - { - alert("Authentication Failed"); - } - else if(error.status == 403) - { - alert("Access Denied"); - } - else - { - alert(error); - } - } - util.sendRequest = function (url, method, attributes, sync) { var success = false; diff --git a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java index ead6ba6865..98c6d9ffe8 100644 --- a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java +++ b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java @@ -184,12 +184,12 @@ public class JMXManagementPluginImpl private boolean isConnectorPort(Port port) { - return port.getAvailableProtocols().contains(Protocol.JMX_RMI); + return port.getProtocols().contains(Protocol.JMX_RMI); } private boolean isRegistryPort(Port port) { - return port.getAvailableProtocols().contains(Protocol.RMI); + return port.getProtocols().contains(Protocol.RMI); } @Override 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 43b0f9da67..d6b8a25b8a 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 @@ -146,7 +146,7 @@ public class Main { execute(); } - catch(Throwable e) + catch(Exception e) { System.err.println("Exception during startup: " + e); e.printStackTrace(); diff --git a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java index 46473900c0..19720ea386 100644 --- a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java +++ b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java @@ -101,7 +101,7 @@ public class AMQSession_0_10 extends AMQSession queueDestinationCache, diff --git a/qpid/java/client/src/main/java/org/apache/qpid/client/message/FieldTableSupport.java b/qpid/java/client/src/main/java/org/apache/qpid/client/message/FieldTableSupport.java index c3f36a545a..3d3b753ad3 100644 --- a/qpid/java/client/src/main/java/org/apache/qpid/client/message/FieldTableSupport.java +++ b/qpid/java/client/src/main/java/org/apache/qpid/client/message/FieldTableSupport.java @@ -20,12 +20,12 @@ */ package org.apache.qpid.client.message; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.FieldTable; - import java.util.HashMap; import java.util.Map; +import org.apache.qpid.framing.AMQShortString; +import org.apache.qpid.framing.FieldTable; + public class FieldTableSupport { private FieldTableSupport() diff --git a/qpid/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java b/qpid/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java index 681082526c..48bfe74cfc 100644 --- a/qpid/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java +++ b/qpid/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java @@ -172,6 +172,10 @@ public class AMQProtocolHandler implements ProtocolEngine private long _writtenBytes; private long _readBytes; + private int _messageReceivedCount; + private int _messagesOut; + + private NetworkConnection _network; private Sender _sender; private long _lastReadTime = System.currentTimeMillis(); @@ -451,9 +455,6 @@ public class AMQProtocolHandler implements ProtocolEngine _lastFailoverException = null; } - private static int _messageReceivedCount; - - public void received(ByteBuffer msg) { _readBytes += msg.remaining(); @@ -559,8 +560,6 @@ public class AMQProtocolHandler implements ProtocolEngine } - private static int _messagesOut; - public StateWaiter createWaiter(Set states) throws AMQException { return getStateManager().createWaiter(states); diff --git a/qpid/java/client/src/main/java/org/apache/qpid/client/util/BlockingWaiter.java b/qpid/java/client/src/main/java/org/apache/qpid/client/util/BlockingWaiter.java index 53b6730ef7..21f1623dd1 100644 --- a/qpid/java/client/src/main/java/org/apache/qpid/client/util/BlockingWaiter.java +++ b/qpid/java/client/src/main/java/org/apache/qpid/client/util/BlockingWaiter.java @@ -20,6 +20,11 @@ */ package org.apache.qpid.client.util; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,11 +32,6 @@ import org.apache.qpid.AMQException; import org.apache.qpid.AMQTimeoutException; import org.apache.qpid.client.failover.FailoverException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.ReentrantLock; - /** * BlockingWaiter is a 'rendezvous' which delegates handling of * incoming Objects to a listener implemented as a sub-class of this and hands off the process or @@ -243,7 +243,7 @@ public abstract class BlockingWaiter } else { - _logger.error("WARNING: new error '" + e == null ? "null" : e.getMessage() + "' arrived while old one not yet processed:" + _error.getMessage()); + _logger.error("WARNING: new error '" + (e == null ? "null" : e.getMessage()) + "' arrived while old one not yet processed:" + _error.getMessage()); } if (_waiting.get()) diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java index b490aee898..ef0da9b918 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java @@ -136,42 +136,42 @@ public class BasicContentHeaderProperties { int size = 0; - if ((_propertyFlags & (CONTENT_TYPE_MASK)) > 0) + if ((_propertyFlags & (CONTENT_TYPE_MASK)) != 0) { size += EncodingUtils.encodedShortStringLength(_contentType); } - if ((_propertyFlags & ENCODING_MASK) > 0) + if ((_propertyFlags & ENCODING_MASK) != 0) { size += EncodingUtils.encodedShortStringLength(_encoding); } - if ((_propertyFlags & HEADERS_MASK) > 0) + if ((_propertyFlags & HEADERS_MASK) != 0) { size += EncodingUtils.encodedFieldTableLength(_headers); } - if ((_propertyFlags & DELIVERY_MODE_MASK) > 0) + if ((_propertyFlags & DELIVERY_MODE_MASK) != 0) { size += 1; } - if ((_propertyFlags & PRIORITY_MASK) > 0) + if ((_propertyFlags & PRIORITY_MASK) != 0) { size += 1; } - if ((_propertyFlags & CORRELATION_ID_MASK) > 0) + if ((_propertyFlags & CORRELATION_ID_MASK) != 0) { size += EncodingUtils.encodedShortStringLength(_correlationId); } - if ((_propertyFlags & REPLY_TO_MASK) > 0) + if ((_propertyFlags & REPLY_TO_MASK) != 0) { size += EncodingUtils.encodedShortStringLength(_replyTo); } - if ((_propertyFlags & EXPIRATION_MASK) > 0) + if ((_propertyFlags & EXPIRATION_MASK) != 0) { if (_expiration == 0L) { @@ -183,32 +183,32 @@ public class BasicContentHeaderProperties } } - if ((_propertyFlags & MESSAGE_ID_MASK) > 0) + if ((_propertyFlags & MESSAGE_ID_MASK) != 0) { size += EncodingUtils.encodedShortStringLength(_messageId); } - if ((_propertyFlags & TIMESTAMP_MASK) > 0) + if ((_propertyFlags & TIMESTAMP_MASK) != 0) { size += 8; } - if ((_propertyFlags & TYPE_MASK) > 0) + if ((_propertyFlags & TYPE_MASK) != 0) { size += EncodingUtils.encodedShortStringLength(_type); } - if ((_propertyFlags & USER_ID_MASK) > 0) + if ((_propertyFlags & USER_ID_MASK) != 0) { size += EncodingUtils.encodedShortStringLength(_userId); } - if ((_propertyFlags & APPLICATION_ID_MASK) > 0) + if ((_propertyFlags & APPLICATION_ID_MASK) != 0) { size += EncodingUtils.encodedShortStringLength(_appId); } - if ((_propertyFlags & CLUSTER_ID_MASK) > 0) + if ((_propertyFlags & CLUSTER_ID_MASK) != 0) { size += EncodingUtils.encodedShortStringLength(_clusterId); } diff --git a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoReceiver.java b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoReceiver.java index e8499539be..b52b59aa15 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoReceiver.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoReceiver.java @@ -210,7 +210,7 @@ final class IoReceiver implements Runnable } } } - catch (Throwable t) + catch (Exception t) { if (shouldReport(t)) { diff --git a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/sasl/SASLEncryptor.java b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/sasl/SASLEncryptor.java index a90ea52202..2a70087c10 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/sasl/SASLEncryptor.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/sasl/SASLEncryptor.java @@ -21,13 +21,13 @@ package org.apache.qpid.transport.network.security.sasl; +import javax.security.sasl.Sasl; +import javax.security.sasl.SaslClient; + import org.apache.qpid.transport.Connection; import org.apache.qpid.transport.ConnectionException; import org.apache.qpid.transport.ConnectionListener; -import javax.security.sasl.Sasl; -import javax.security.sasl.SaslClient; - public abstract class SASLEncryptor implements ConnectionListener { private SaslClient saslClient; @@ -45,7 +45,7 @@ public abstract class SASLEncryptor implements ConnectionListener if (conn.getSaslClient() != null) { saslClient = conn.getSaslClient(); - if (saslClient.isComplete() && saslClient.getNegotiatedProperty(Sasl.QOP) == "auth-conf") + if (saslClient.isComplete() && "auth-conf".equals(saslClient.getNegotiatedProperty(Sasl.QOP))) { sendBuffSize = Integer.parseInt( (String)saslClient.getNegotiatedProperty(Sasl.RAW_SEND_SIZE)); diff --git a/qpid/java/common/src/main/java/org/apache/qpid/url/URLHelper.java b/qpid/java/common/src/main/java/org/apache/qpid/url/URLHelper.java index 8516e7fa0e..c7fea15576 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/url/URLHelper.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/url/URLHelper.java @@ -151,15 +151,15 @@ public class URLHelper } else { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append('?'); - for (String key : options.keySet()) + for (Map.Entry entry : options.entrySet()) { - sb.append(key); + sb.append(entry.getKey()); sb.append("='"); - sb.append(options.get(key)); + sb.append(entry.getValue()); sb.append("'"); sb.append(DEFAULT_OPTION_SEPERATOR); diff --git a/qpid/java/common/src/main/java/org/apache/qpid/util/Strings.java b/qpid/java/common/src/main/java/org/apache/qpid/util/Strings.java index b7b9bf8c6e..6dd6a989cb 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/util/Strings.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/util/Strings.java @@ -323,9 +323,9 @@ public final class Strings sb.append("<"); if (map != null) { - for(String key : map.keySet()) + for(Map.Entry entry : map.entrySet()) { - sb.append(key).append(" = ").append(map.get(key)).append(" "); + sb.append(entry.getKey()).append(" = ").append(entry.getValue()).append(" "); } } sb.append(">"); diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutor.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutor.java index 10f62708a4..f34ac941bc 100644 --- a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutor.java +++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutor.java @@ -25,10 +25,11 @@ import java.util.concurrent.ThreadFactory; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; -import org.apache.qpid.disttest.message.ParticipantResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.apache.qpid.disttest.message.ParticipantResult; + public class ParticipantExecutor { private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantExecutor.class); @@ -100,7 +101,7 @@ public class ParticipantExecutor } result = _participant.doIt(_client.getClientName()); } - catch (Throwable t) + catch (Exception t) { String errorMessage = "Unhandled error: " + t.getMessage(); LOGGER.error(errorMessage, t); diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunner.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunner.java index e973f07c12..a60a7ec88f 100644 --- a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunner.java +++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunner.java @@ -26,6 +26,9 @@ import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.apache.qpid.disttest.DistributedTestException; import org.apache.qpid.disttest.controller.config.QueueConfig; import org.apache.qpid.disttest.controller.config.TestInstance; @@ -36,8 +39,6 @@ import org.apache.qpid.disttest.message.ParticipantResult; import org.apache.qpid.disttest.message.Response; import org.apache.qpid.disttest.message.StartTestCommand; import org.apache.qpid.disttest.message.TearDownTestCommand; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class TestRunner { @@ -72,7 +73,7 @@ public class TestRunner { deleteQueues(); } - catch (Throwable t) + catch (Exception t) { LOGGER.error("Failed to delete test queues during shutdown", t); } diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ControllerJmsDelegate.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ControllerJmsDelegate.java index 782f7ae2fd..330407e375 100644 --- a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ControllerJmsDelegate.java +++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ControllerJmsDelegate.java @@ -36,13 +36,14 @@ import javax.jms.Session; import javax.naming.Context; import javax.naming.NamingException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.apache.qpid.disttest.DistributedTestException; import org.apache.qpid.disttest.controller.CommandListener; import org.apache.qpid.disttest.controller.config.QueueConfig; import org.apache.qpid.disttest.message.Command; import org.apache.qpid.disttest.message.RegisterClientCommand; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class ControllerJmsDelegate { @@ -121,7 +122,7 @@ public class ControllerJmsDelegate processCommandWithFirstSupportingListener(command); LOGGER.debug("Finished processing command for message " + jmsMessageID); } - catch (Throwable t) + catch (Exception t) { LOGGER.error("Can't handle JMS message", t); } diff --git a/qpid/java/qpid-test-utils/src/main/java/org/apache/qpid/test/utils/QpidTestCase.java b/qpid/java/qpid-test-utils/src/main/java/org/apache/qpid/test/utils/QpidTestCase.java index 845e7e58c3..74d2f1cf97 100644 --- a/qpid/java/qpid-test-utils/src/main/java/org/apache/qpid/test/utils/QpidTestCase.java +++ b/qpid/java/qpid-test-utils/src/main/java/org/apache/qpid/test/utils/QpidTestCase.java @@ -74,7 +74,7 @@ public class QpidTestCase extends TestCase String testExcludes = System.getProperty(TEST_EXCLUDES); //For the maven build, process the test.excludes property - if(testExcludes != null && exclusionListURIs == "") + if(testExcludes != null && "".equals(exclusionListURIs)) { for (String exclude : testExcludes.split("\\s+")) { diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java index 0345485167..386cd80f38 100755 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java +++ b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java @@ -550,8 +550,6 @@ public class QpidBrokerTestCase extends QpidTestCase // in to the external broker's QPID_OPTS string. setSystemProperty("amqj.protocol.logging.level"); setSystemProperty("root.logging.level"); - setSystemProperty(BrokerProperties.PROPERTY_BROKER_DEFAULT_AMQP_PROTOCOL_EXCLUDES); - setSystemProperty(BrokerProperties.PROPERTY_BROKER_DEFAULT_AMQP_PROTOCOL_INCLUDES); setSystemProperty("test.port"); setSystemProperty("test.mport"); diff --git a/qpid/java/systests/src/test/java/org/apache/qpid/server/SupportedProtocolVersionsTest.java b/qpid/java/systests/src/test/java/org/apache/qpid/server/SupportedProtocolVersionsTest.java index b94827f249..85a523329a 100644 --- a/qpid/java/systests/src/test/java/org/apache/qpid/server/SupportedProtocolVersionsTest.java +++ b/qpid/java/systests/src/test/java/org/apache/qpid/server/SupportedProtocolVersionsTest.java @@ -34,7 +34,6 @@ import org.apache.qpid.configuration.ClientProperties; import org.apache.qpid.framing.ProtocolVersion; import org.apache.qpid.server.configuration.BrokerProperties; import org.apache.qpid.server.model.Protocol; -import org.apache.qpid.server.model.adapter.PortFactoryTest; import org.apache.qpid.server.plugin.AMQPProtocolVersionWrapper; import org.apache.qpid.test.utils.QpidBrokerTestCase; @@ -43,7 +42,6 @@ import org.apache.qpid.test.utils.QpidBrokerTestCase; * versions entirely, rather than selectively excluding them on particular ports, * and it is possible to configure the reply to an unsupported protocol initiation. *

- * Protocol exclusion/inclusion are unit tested as part of {@link PortFactoryTest} */ public class SupportedProtocolVersionsTest extends QpidBrokerTestCase { @@ -55,8 +53,7 @@ public class SupportedProtocolVersionsTest extends QpidBrokerTestCase private void clearProtocolSupportManipulations() throws Exception { //Remove the QBTC provided protocol manipulations, giving only the protocols which default to enabled - setSystemProperty(BrokerProperties.PROPERTY_BROKER_DEFAULT_AMQP_PROTOCOL_EXCLUDES, null); - setSystemProperty(BrokerProperties.PROPERTY_BROKER_DEFAULT_AMQP_PROTOCOL_INCLUDES, null); + setSystemProperty(QpidBrokerTestCase.TEST_AMQP_PORT_PROTOCOLS_PROPERTY, getProtocolsAsString(getAllAmqpProtocols())); } -- cgit v1.2.1