This is an automated email from the ASF dual-hosted git repository.
vavrtom pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-broker-j.git
The following commit(s) were added to refs/heads/main by this push:
new 9f3d4f92b8 QPID-8677 - [Broker-J] IllegalConfigurationException when
deleting misconfigured port (#247)
9f3d4f92b8 is described below
commit 9f3d4f92b857e2817228b0477a4f5260f2c74aa2
Author: Daniil Kirilyuk <[email protected]>
AuthorDate: Mon Sep 30 10:01:10 2024 +0200
QPID-8677 - [Broker-J] IllegalConfigurationException when deleting
misconfigured port (#247)
---
.../qpid/server/model/port/AbstractPort.java | 49 +++++----
.../qpid/server/model/port/HttpPortImplTest.java | 118 +++++++++++++++++++--
2 files changed, 136 insertions(+), 31 deletions(-)
diff --git
a/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java
b/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java
index 1e23580a1d..2e1ec3f3b2 100644
---
a/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java
+++
b/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java
@@ -279,25 +279,22 @@ public abstract class AbstractPort<X extends
AbstractPort<X>> extends AbstractCo
super.validateChange(proxyForValidation, changedAttributes);
Port<?> updated = (Port<?>)proxyForValidation;
-
- if(!getName().equals(updated.getName()))
+ if (!getName().equals(updated.getName()))
{
throw new IllegalConfigurationException("Changing the port name is
not allowed");
}
- if(changedAttributes.contains(PORT))
+ if (changedAttributes.contains(PORT))
{
int newPort = updated.getPort();
if (getPort() != newPort && newPort != 0)
{
- for (Port p : _container.getChildren(Port.class))
+ for (Port<?> p : _container.getChildren(Port.class))
{
if (p.getBoundPort() == newPort || p.getPort() == newPort)
{
- throw new IllegalConfigurationException("Port number "
- + newPort
- + " is already
in use by port "
- + p.getName());
+ throw new IllegalConfigurationException("Port number "
+ newPort +
+ " is already in use by port " + p.getName());
}
}
}
@@ -310,40 +307,42 @@ public abstract class AbstractPort<X extends
AbstractPort<X>> extends AbstractCo
boolean usesSsl = isUsingTLSTransport(transports);
- if (usesSsl)
+ if (usesSsl && changedAttributes.contains(KEY_STORE) &&
updated.getKeyStore() == null)
{
- if (updated.getKeyStore() == null)
- {
- throw new IllegalConfigurationException("Can't create port
which requires SSL but has no key store configured.");
- }
+ throw new IllegalConfigurationException("Can't create port which
requires SSL but has no key store configured.");
}
- if(changedAttributes.contains(Port.AUTHENTICATION_PROVIDER) ||
changedAttributes.contains(Port.TRANSPORTS))
+ if (changedAttributes.contains(Port.AUTHENTICATION_PROVIDER) ||
changedAttributes.contains(Port.TRANSPORTS))
{
validateAuthenticationMechanisms(updated.getAuthenticationProvider(),
updated.getTransports());
}
boolean requiresCertificate = updated.getNeedClientAuth() ||
updated.getWantClientAuth();
- if (usesSsl)
+ if (changedAttributes.contains(TRANSPORTS) ||
changedAttributes.contains(TRUST_STORES) ||
+ changedAttributes.contains(NEED_CLIENT_AUTH) ||
changedAttributes.contains(WANT_CLIENT_AUTH))
{
- if ((updated.getTrustStores() == null ||
updated.getTrustStores().isEmpty() ) && requiresCertificate)
+ if (usesSsl)
{
- throw new IllegalConfigurationException("Can't create port
which requests SSL client certificates but has no trust store configured.");
+ if ((updated.getTrustStores() == null ||
updated.getTrustStores().isEmpty()) && requiresCertificate)
+ {
+ throw new IllegalConfigurationException(
+ "Can't create port which requests SSL client
certificates but has no trust store configured.");
+ }
}
- }
- else
- {
- if (requiresCertificate)
+ else
{
- throw new IllegalConfigurationException("Can't create port
which requests SSL client certificates but doesn't use SSL transport.");
+ if (requiresCertificate)
+ {
+ throw new IllegalConfigurationException(
+ "Can't create port which requests SSL client
certificates but doesn't use SSL transport.");
+ }
}
}
-
- if(requiresCertificate && updated.getClientCertRecorder() != null)
+ if (requiresCertificate && updated.getClientCertRecorder() != null)
{
- if(!(updated.getClientCertRecorder() instanceof
ManagedPeerCertificateTrustStore))
+ if (!(updated.getClientCertRecorder() instanceof
ManagedPeerCertificateTrustStore))
{
throw new IllegalConfigurationException("Only trust stores of
type " + ManagedPeerCertificateTrustStore.TYPE_NAME + " may be used as the
client certificate recorder");
}
diff --git
a/broker-core/src/test/java/org/apache/qpid/server/model/port/HttpPortImplTest.java
b/broker-core/src/test/java/org/apache/qpid/server/model/port/HttpPortImplTest.java
index 4d630370de..2a51d062c3 100644
---
a/broker-core/src/test/java/org/apache/qpid/server/model/port/HttpPortImplTest.java
+++
b/broker-core/src/test/java/org/apache/qpid/server/model/port/HttpPortImplTest.java
@@ -20,11 +20,13 @@
package org.apache.qpid.server.model.port;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -38,24 +40,31 @@ import
org.apache.qpid.server.configuration.updater.TaskExecutor;
import org.apache.qpid.server.logging.EventLogger;
import org.apache.qpid.server.model.AuthenticationProvider;
import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.BrokerImpl;
import org.apache.qpid.server.model.BrokerModel;
+import org.apache.qpid.server.model.JsonSystemConfigImpl;
+import org.apache.qpid.server.model.KeyStore;
import org.apache.qpid.server.model.Model;
+import org.apache.qpid.server.model.State;
import org.apache.qpid.server.model.SystemConfig;
+import org.apache.qpid.server.model.TrustStore;
import org.apache.qpid.test.utils.UnitTestBase;
@SuppressWarnings({"rawtypes", "unchecked"})
-public class HttpPortImplTest extends UnitTestBase
+class HttpPortImplTest extends UnitTestBase
{
private static final String AUTHENTICATION_PROVIDER_NAME = "test";
private Broker _broker;
@BeforeEach
- public void setUp() throws Exception
+ public void setUp()
{
final TaskExecutor taskExecutor =
CurrentThreadTaskExecutor.newStartedInstance();
final Model model = BrokerModel.getInstance();
final SystemConfig systemConfig = mock(SystemConfig.class);
+ when(systemConfig.getCategoryClass()).thenReturn(SystemConfig.class);
+
when(systemConfig.getTypeClass()).thenReturn(JsonSystemConfigImpl.class);
_broker = mock(Broker.class);
when(_broker.getParent()).thenReturn(systemConfig);
when(_broker.getTaskExecutor()).thenReturn(taskExecutor);
@@ -63,6 +72,7 @@ public class HttpPortImplTest extends UnitTestBase
when(_broker.getModel()).thenReturn(model);
when(_broker.getEventLogger()).thenReturn(new EventLogger());
when(_broker.getCategoryClass()).thenReturn(Broker.class);
+ when(_broker.getTypeClass()).thenReturn(BrokerImpl.class);
final AuthenticationProvider<?> provider =
mock(AuthenticationProvider.class);
when(provider.getName()).thenReturn(AUTHENTICATION_PROVIDER_NAME);
@@ -74,7 +84,7 @@ public class HttpPortImplTest extends UnitTestBase
}
@Test
- public void testCreateWithIllegalThreadPoolValues()
+ void testCreateWithIllegalThreadPoolValues()
{
final int threadPoolMinimumSize = 37;
final int invalidThreadPoolMaximumSize = threadPoolMinimumSize - 1;
@@ -88,7 +98,7 @@ public class HttpPortImplTest extends UnitTestBase
}
@Test
- public void
testIllegalChangeWithMaxThreadPoolSizeSmallerThanMinThreadPoolSize()
+ void testIllegalChangeWithMaxThreadPoolSizeSmallerThanMinThreadPoolSize()
{
final int threadPoolMinimumSize = 37;
final int invalidThreadPoolMaximumSize = threadPoolMinimumSize - 1;
@@ -105,7 +115,7 @@ public class HttpPortImplTest extends UnitTestBase
}
@Test
- public void testIllegalChangeWithNegativeThreadPoolSize()
+ void testIllegalChangeWithNegativeThreadPoolSize()
{
final int illegalThreadPoolMinimumSize = -1;
final int threadPoolMaximumSize = 1;
@@ -122,7 +132,7 @@ public class HttpPortImplTest extends UnitTestBase
}
@Test
- public void testChangeWithLegalThreadPoolValues()
+ void testChangeWithLegalThreadPoolValues()
{
final int threadPoolMinimumSize = 37;
final int threadPoolMaximumSize = threadPoolMinimumSize + 1;
@@ -141,4 +151,100 @@ public class HttpPortImplTest extends UnitTestBase
assertEquals(port.getThreadPoolMaximum(), (long) threadPoolMaximumSize,
"Port did not pickup changes to maximum thread pool size");
}
+
+ @Test
+ void deletePort()
+ {
+ final Map<String, Object> attributes = Map.of(HttpPort.PORT, 0,
+ HttpPort.NAME, getTestName(),
+ HttpPort.AUTHENTICATION_PROVIDER, AUTHENTICATION_PROVIDER_NAME,
+ HttpPort.WANT_CLIENT_AUTH, true,
+ HttpPort.NEED_CLIENT_AUTH, true,
+ HttpPort.PROTOCOLS, List.of("HTTP"),
+ HttpPort.TRANSPORTS, List.of("SSL"),
+ HttpPort.KEY_STORE, mock(KeyStore.class),
+ HttpPort.TRUST_STORES, List.of(mock(TrustStore.class)));
+
+ final HttpPortImpl port = new HttpPortImpl(attributes, _broker);
+
+ assertEquals(State.UNINITIALIZED, port.getState());
+
+ port.create();
+
+ assertEquals(State.QUIESCED, port.getState());
+
+ port.delete();
+
+ assertEquals(State.DELETED, port.getState());
+ }
+
+ /** Checks the deletion of an invalid port */
+ @Test
+ void deleteUninitializedInvalidPort()
+ {
+ final Map<String, Object> attributes = Map.of(HttpPort.PORT, 0,
+ HttpPort.NAME, getTestName(),
+ HttpPort.AUTHENTICATION_PROVIDER, AUTHENTICATION_PROVIDER_NAME,
+ HttpPort.WANT_CLIENT_AUTH, true,
+ HttpPort.NEED_CLIENT_AUTH, true,
+ HttpPort.PROTOCOLS, List.of("HTTP"),
+ HttpPort.TRANSPORTS, List.of("SSL"),
+ HttpPort.KEY_STORE, mock(KeyStore.class),
+ HttpPort.TRUST_STORES, List.of());
+
+ final HttpPortImpl port = new HttpPortImpl(attributes, _broker);
+
+ assertEquals(State.UNINITIALIZED, port.getState());
+
+ port.delete();
+
+ assertEquals(State.DELETED, port.getState());
+ }
+
+ /** Checks the update of an invalid port */
+ @Test
+ void updateUninitializedInvalidPort()
+ {
+ final Map<String, Object> attributes = Map.of(HttpPort.PORT, 0,
+ HttpPort.NAME, getTestName(),
+ HttpPort.AUTHENTICATION_PROVIDER, AUTHENTICATION_PROVIDER_NAME,
+ HttpPort.WANT_CLIENT_AUTH, true,
+ HttpPort.NEED_CLIENT_AUTH, true,
+ HttpPort.PROTOCOLS, List.of("HTTP"),
+ HttpPort.TRANSPORTS, List.of("SSL"),
+ HttpPort.KEY_STORE, mock(KeyStore.class),
+ HttpPort.TRUST_STORES, List.of());
+
+ final HttpPortImpl port = new HttpPortImpl(attributes, _broker);
+
+ assertEquals(State.UNINITIALIZED, port.getState());
+
+ final Map<String, Object> args1 = Map.of(HttpPort.NAME, "changed");
+ IllegalConfigurationException exception =
assertThrows(IllegalConfigurationException.class, () ->
port.setAttributes(args1));
+ assertEquals("Changing the port name is not allowed",
exception.getMessage());
+
+ final Map<String, Object> args2 = Map.of(HttpPort.WANT_CLIENT_AUTH,
false);
+ exception = assertThrows(IllegalConfigurationException.class, () ->
port.setAttributes(args2));
+ assertEquals("Can't create port which requests SSL client certificates
but has no trust store configured.",
+ exception.getMessage());
+
+ final Map<String, Object> args3 = Map.of(HttpPort.NEED_CLIENT_AUTH,
false);
+ exception = assertThrows(IllegalConfigurationException.class, () ->
port.setAttributes(args3));
+ assertEquals("Can't create port which requests SSL client certificates
but has no trust store configured.",
+ exception.getMessage());
+
+ final Map<String, Object> args4 = Map.of(HttpPort.TRANSPORTS,
List.of("TCP"));
+ exception = assertThrows(IllegalConfigurationException.class, () ->
port.setAttributes(args4));
+ assertEquals("Can't create port which requests SSL client certificates
but doesn't use SSL transport.",
+ exception.getMessage());
+
+ final Map<String, Object> args5 = new HashMap<>();
+ args5.put(HttpPort.KEY_STORE, null);
+ exception = assertThrows(IllegalConfigurationException.class, () ->
port.setAttributes(args5));
+ assertEquals("Can't create port which requires SSL but has no key
store configured.",
+ exception.getMessage());
+
+ final Map<String, Object> args6 = Map.of(HttpPort.TRUST_STORES,
List.of(mock(TrustStore.class)));
+ assertDoesNotThrow(() -> port.setAttributes(args6));
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]