Skip to content

Commit 82f2904

Browse files
committed
Add test for SASL external
Disabled for now. References rabbitmq/rabbitmq-server#8488
1 parent 07f4901 commit 82f2904

File tree

3 files changed

+89
-48
lines changed

3 files changed

+89
-48
lines changed

ci/start-broker.sh

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ mkdir -p rabbitmq-configuration/tls
1818
cp -R "${PWD}"/tls-gen/basic/result/* rabbitmq-configuration/tls
1919
chmod o+r rabbitmq-configuration/tls/*
2020

21-
echo "[rabbitmq_stream,rabbitmq_mqtt,rabbitmq_stomp,rabbitmq_amqp1_0]." >> rabbitmq-configuration/enabled_plugins
21+
echo "[rabbitmq_stream,rabbitmq_mqtt,rabbitmq_stomp,rabbitmq_amqp1_0,rabbitmq_auth_mechanism_ssl]." >> rabbitmq-configuration/enabled_plugins
2222

2323
echo "loopback_users = none
2424
@@ -29,6 +29,10 @@ ssl_options.certfile = /etc/rabbitmq/tls/server_$(hostname)_certificate.pem
2929
ssl_options.keyfile = /etc/rabbitmq/tls/server_$(hostname)_key.pem
3030
ssl_options.verify = verify_peer
3131
ssl_options.fail_if_no_peer_cert = false
32+
ssl_options.depth = 1
33+
34+
auth_mechanisms.1 = PLAIN
35+
auth_mechanisms.2 = EXTERNAL
3236
3337
stream.listeners.ssl.1 = 5551" >> rabbitmq-configuration/rabbitmq.conf
3438

src/test/java/com/rabbitmq/stream/impl/TestUtils.java

Lines changed: 52 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
1414
package com.rabbitmq.stream.impl;
1515

16+
import static java.lang.String.format;
1617
import static java.util.concurrent.TimeUnit.SECONDS;
1718
import static org.assertj.core.api.Assertions.assertThat;
1819
import static org.junit.jupiter.api.Assertions.fail;
@@ -64,6 +65,7 @@
6465
import java.util.concurrent.atomic.AtomicReference;
6566
import java.util.function.Consumer;
6667
import java.util.function.Function;
68+
import java.util.function.Predicate;
6769
import java.util.function.Supplier;
6870
import java.util.stream.IntStream;
6971
import org.assertj.core.api.AssertDelegateTarget;
@@ -336,7 +338,7 @@ private static String streamName(ExtensionContext context) {
336338

337339
private static String streamName(Class<?> testClass, Method testMethod) {
338340
String uuid = UUID.randomUUID().toString();
339-
return String.format(
341+
return format(
340342
"%s_%s%s",
341343
testClass.getSimpleName(), testMethod.getName(), uuid.substring(uuid.length() / 2));
342344
}
@@ -480,6 +482,12 @@ static boolean atLeastVersion(String expectedVersion, String currentVersion) {
480482
@ExtendWith(DisabledIfAmqp10NotEnabledCondition.class)
481483
@interface DisabledIfAmqp10NotEnabled {}
482484

485+
@Target({ElementType.TYPE, ElementType.METHOD})
486+
@Retention(RetentionPolicy.RUNTIME)
487+
@Documented
488+
@ExtendWith(DisabledIfAuthMechanismSslNotEnabledCondition.class)
489+
@interface DisabledIfAuthMechanismSslNotEnabled {}
490+
483491
@Target({ElementType.TYPE, ElementType.METHOD})
484492
@Retention(RetentionPolicy.RUNTIME)
485493
@Documented
@@ -707,75 +715,72 @@ public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext con
707715
}
708716
}
709717

710-
static class DisabledIfMqttNotEnabledCondition implements ExecutionCondition {
718+
abstract static class DisabledIfPluginNotEnabledCondition implements ExecutionCondition {
719+
720+
private final String pluginLabel;
721+
private final Predicate<String> condition;
722+
723+
DisabledIfPluginNotEnabledCondition(String pluginLabel, Predicate<String> condition) {
724+
this.pluginLabel = pluginLabel;
725+
this.condition = condition;
726+
}
711727

712728
@Override
713729
public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) {
714730
if (Host.rabbitmqctlCommand() == null) {
715731
return ConditionEvaluationResult.disabled(
716-
"rabbitmqctl.bin system property not set, cannot check if MQTT plugin is enabled");
732+
format(
733+
"rabbitmqctl.bin system property not set, cannot check if %s plugin is enabled",
734+
pluginLabel));
717735
} else {
718736
try {
719737
Process process = Host.rabbitmqctl("status");
720738
String output = capture(process.getInputStream());
721-
if (output.contains("rabbitmq_mqtt") && output.contains("protocol: mqtt")) {
722-
return ConditionEvaluationResult.enabled("MQTT plugin enabled");
739+
if (condition.test(output)) {
740+
return ConditionEvaluationResult.enabled(format("%s plugin enabled", pluginLabel));
723741
} else {
724-
return ConditionEvaluationResult.disabled("MQTT plugin disabled");
742+
return ConditionEvaluationResult.disabled(format("%s plugin disabled", pluginLabel));
725743
}
726744
} catch (Exception e) {
727745
return ConditionEvaluationResult.disabled(
728-
"Error while trying to detect MQTT plugin: " + e.getMessage());
746+
format("Error while trying to detect %s plugin: " + e.getMessage(), pluginLabel));
729747
}
730748
}
731749
}
732750
}
733751

734-
static class DisabledIfStompNotEnabledCondition implements ExecutionCondition {
752+
static class DisabledIfMqttNotEnabledCondition extends DisabledIfPluginNotEnabledCondition {
735753

736-
@Override
737-
public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) {
738-
if (Host.rabbitmqctlCommand() == null) {
739-
return ConditionEvaluationResult.disabled(
740-
"rabbitmqctl.bin system property not set, cannot check if STOMP plugin is enabled");
741-
} else {
742-
try {
743-
Process process = Host.rabbitmqctl("status");
744-
String output = capture(process.getInputStream());
745-
if (output.contains("rabbitmq_stomp") && output.contains("protocol: stomp")) {
746-
return ConditionEvaluationResult.enabled("STOMP plugin enabled");
747-
} else {
748-
return ConditionEvaluationResult.disabled("STOMP plugin disabled");
749-
}
750-
} catch (Exception e) {
751-
return ConditionEvaluationResult.disabled(
752-
"Error while trying to detect STOMP plugin: " + e.getMessage());
753-
}
754-
}
754+
DisabledIfMqttNotEnabledCondition() {
755+
super(
756+
"MQTT", output -> output.contains("rabbitmq_mqtt") && output.contains("protocol: mqtt"));
755757
}
756758
}
757759

758-
static class DisabledIfAmqp10NotEnabledCondition implements ExecutionCondition {
760+
static class DisabledIfStompNotEnabledCondition extends DisabledIfPluginNotEnabledCondition {
759761

760-
@Override
761-
public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) {
762-
if (Host.rabbitmqctlCommand() == null) {
763-
return ConditionEvaluationResult.disabled(
764-
"rabbitmqctl.bin system property not set, cannot check if STOMP plugin is enabled");
765-
} else {
766-
try {
767-
Process process = Host.rabbitmqctl("status");
768-
String output = capture(process.getInputStream());
769-
if (output.contains("rabbitmq_amqp1_0") && output.contains("AMQP 1.0")) {
770-
return ConditionEvaluationResult.enabled("STOMP plugin enabled");
771-
} else {
772-
return ConditionEvaluationResult.disabled("STOMP plugin disabled");
773-
}
774-
} catch (Exception e) {
775-
return ConditionEvaluationResult.disabled(
776-
"Error while trying to detect STOMP plugin: " + e.getMessage());
777-
}
778-
}
762+
DisabledIfStompNotEnabledCondition() {
763+
super(
764+
"STOMP",
765+
output -> output.contains("rabbitmq_stomp") && output.contains("protocol: stomp"));
766+
}
767+
}
768+
769+
static class DisabledIfAuthMechanismSslNotEnabledCondition
770+
extends DisabledIfPluginNotEnabledCondition {
771+
772+
DisabledIfAuthMechanismSslNotEnabledCondition() {
773+
super(
774+
"X509 authentication mechanism",
775+
output -> output.contains("rabbitmq_auth_mechanism_ssl"));
776+
}
777+
}
778+
779+
static class DisabledIfAmqp10NotEnabledCondition extends DisabledIfPluginNotEnabledCondition {
780+
781+
DisabledIfAmqp10NotEnabledCondition() {
782+
super(
783+
"AMQP 1.0", output -> output.contains("rabbitmq_amqp1_0") && output.contains("AMQP 1.0"));
779784
}
780785
}
781786

src/test/java/com/rabbitmq/stream/impl/TlsTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import static com.rabbitmq.stream.impl.TestUtils.b;
1717
import static com.rabbitmq.stream.impl.TestUtils.latchAssert;
1818
import static com.rabbitmq.stream.impl.Utils.TRUST_EVERYTHING_TRUST_MANAGER;
19+
import static java.lang.String.format;
1920
import static java.time.Duration.ofSeconds;
2021
import static org.assertj.core.api.Assertions.assertThat;
2122
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -28,7 +29,9 @@
2829
import com.rabbitmq.stream.Producer;
2930
import com.rabbitmq.stream.StreamException;
3031
import com.rabbitmq.stream.impl.Client.ClientParameters;
32+
import com.rabbitmq.stream.impl.TestUtils.DisabledIfAuthMechanismSslNotEnabled;
3133
import com.rabbitmq.stream.impl.TestUtils.DisabledIfTlsNotEnabled;
34+
import com.rabbitmq.stream.sasl.DefaultSaslConfiguration;
3235
import io.netty.channel.Channel;
3336
import io.netty.handler.ssl.SslContext;
3437
import io.netty.handler.ssl.SslContextBuilder;
@@ -48,6 +51,7 @@
4851
import java.security.spec.PKCS8EncodedKeySpec;
4952
import java.util.Base64;
5053
import java.util.Collections;
54+
import java.util.UUID;
5155
import java.util.concurrent.CountDownLatch;
5256
import java.util.function.Consumer;
5357
import java.util.stream.IntStream;
@@ -57,6 +61,7 @@
5761
import javax.net.ssl.SSLParameters;
5862
import org.junit.jupiter.api.AfterEach;
5963
import org.junit.jupiter.api.BeforeEach;
64+
import org.junit.jupiter.api.Disabled;
6065
import org.junit.jupiter.api.Test;
6166
import org.junit.jupiter.api.extension.ExtendWith;
6267

@@ -252,6 +257,33 @@ void verifiedConnectionWithCorrectClientPrivateKey() throws Exception {
252257
cf.get(new ClientParameters().sslContext(context));
253258
}
254259

260+
@Test
261+
@DisabledIfAuthMechanismSslNotEnabled
262+
@Disabled
263+
void verifiedConnectionWithCorrectClientPrivateKeyAndSaslExternal() throws Exception {
264+
X509Certificate clientCertificate = clientCertificate();
265+
SslContext context =
266+
SslContextBuilder.forClient()
267+
.trustManager(caCertificate())
268+
.keyManager(clientKey(), clientCertificate)
269+
.build();
270+
271+
String username = clientCertificate.getSubjectX500Principal().getName();
272+
Host.rabbitmqctl(format("delete_user %s", username));
273+
Host.rabbitmqctl(format("add_user %s foo", username));
274+
try {
275+
Host.rabbitmqctl(format("set_permissions %s '.*' '.*' '.*'", username));
276+
277+
cf.get(
278+
new ClientParameters()
279+
.username(UUID.randomUUID().toString())
280+
.sslContext(context)
281+
.saslConfiguration(DefaultSaslConfiguration.EXTERNAL));
282+
} finally {
283+
Host.rabbitmqctl(format("delete_user %s", username));
284+
}
285+
}
286+
255287
@Test
256288
void hostnameVerificationShouldFailWhenSettingHostToLoopbackInterface() throws Exception {
257289
SslContext context = SslContextBuilder.forClient().trustManager(caCertificate()).build();

0 commit comments

Comments
 (0)