From ad5c681386cff5a8ae931fa17fd394a72babc4e8 Mon Sep 17 00:00:00 2001 From: Dominik Guggemos Date: Wed, 17 Oct 2018 22:42:44 +0200 Subject: [PATCH] add validation (+tests) of enforcement for amqp 0.9.1 connections --- .../messaging/mqtt/MqttValidator.java | 4 +- .../messaging/rabbitmq/RabbitMQValidator.java | 8 ++- .../rabbitmq/RabbitMQValidatorTest.java | 52 +++++++++++++++++++ 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/services/connectivity/messaging/src/main/java/org/eclipse/ditto/services/connectivity/messaging/mqtt/MqttValidator.java b/services/connectivity/messaging/src/main/java/org/eclipse/ditto/services/connectivity/messaging/mqtt/MqttValidator.java index 3828603fd5..07a2d43342 100644 --- a/services/connectivity/messaging/src/main/java/org/eclipse/ditto/services/connectivity/messaging/mqtt/MqttValidator.java +++ b/services/connectivity/messaging/src/main/java/org/eclipse/ditto/services/connectivity/messaging/mqtt/MqttValidator.java @@ -133,7 +133,7 @@ private static void validateSourceEnforcement(@Nullable final Enforcement enforc final DittoHeaders dittoHeaders, final Supplier sourceDescription) { if (enforcement != null) { - validateEnforcementOrigin(enforcement, sourceDescription, dittoHeaders); + validateEnforcementInput(enforcement, sourceDescription, dittoHeaders); final String dummyThingId = "namespace:name"; final Map filtersMap = PlaceholderFilter.filterAddressesAsMap(enforcement.getFilters(), @@ -155,7 +155,7 @@ private static void validateSourceEnforcement(@Nullable final Enforcement enforc } } - private static void validateEnforcementOrigin(final Enforcement enforcement, + private static void validateEnforcementInput(final Enforcement enforcement, final Supplier sourceDescription, final DittoHeaders dittoHeaders) { final SourceAddressPlaceholder sourceAddressPlaceholder = PlaceholderFactory.newSourceAddressPlaceholder(); try { diff --git a/services/connectivity/messaging/src/main/java/org/eclipse/ditto/services/connectivity/messaging/rabbitmq/RabbitMQValidator.java b/services/connectivity/messaging/src/main/java/org/eclipse/ditto/services/connectivity/messaging/rabbitmq/RabbitMQValidator.java index 36c6010196..d497df917c 100644 --- a/services/connectivity/messaging/src/main/java/org/eclipse/ditto/services/connectivity/messaging/rabbitmq/RabbitMQValidator.java +++ b/services/connectivity/messaging/src/main/java/org/eclipse/ditto/services/connectivity/messaging/rabbitmq/RabbitMQValidator.java @@ -23,6 +23,7 @@ import org.eclipse.ditto.model.connectivity.Source; import org.eclipse.ditto.model.connectivity.Target; import org.eclipse.ditto.services.connectivity.messaging.validation.AbstractProtocolValidator; +import org.eclipse.ditto.services.models.connectivity.placeholder.PlaceholderFactory; /** * Connection specification for RabbitMQ protocol. @@ -45,7 +46,12 @@ public static RabbitMQValidator newInstance() { @Override protected void validateSource(final Source source, final DittoHeaders dittoHeaders, final Supplier sourceDescription) { - // noop + + source.getEnforcement().ifPresent(enforcement -> { + validateEnforcement(enforcement.getInput(), PlaceholderFactory.newHeadersPlaceholder(), dittoHeaders); + enforcement.getFilters().forEach(filterTemplate -> validateEnforcement(filterTemplate, + PlaceholderFactory.newThingPlaceholder(), dittoHeaders)); + }); } @Override diff --git a/services/connectivity/messaging/src/test/java/org/eclipse/ditto/services/connectivity/messaging/rabbitmq/RabbitMQValidatorTest.java b/services/connectivity/messaging/src/test/java/org/eclipse/ditto/services/connectivity/messaging/rabbitmq/RabbitMQValidatorTest.java index d6d586b870..5048aac6e8 100644 --- a/services/connectivity/messaging/src/test/java/org/eclipse/ditto/services/connectivity/messaging/rabbitmq/RabbitMQValidatorTest.java +++ b/services/connectivity/messaging/src/test/java/org/eclipse/ditto/services/connectivity/messaging/rabbitmq/RabbitMQValidatorTest.java @@ -13,6 +13,14 @@ import static org.mutabilitydetector.unittesting.MutabilityAssert.assertInstancesOf; import static org.mutabilitydetector.unittesting.MutabilityMatchers.areImmutable; +import org.assertj.core.api.Assertions; +import org.eclipse.ditto.model.base.headers.DittoHeaders; +import org.eclipse.ditto.model.connectivity.ConnectionConfigurationInvalidException; +import org.eclipse.ditto.model.connectivity.ConnectivityModelFactory; +import org.eclipse.ditto.model.connectivity.Source; +import org.eclipse.ditto.model.connectivity.SourceBuilder; +import org.eclipse.ditto.model.connectivity.UnresolvedPlaceholderException; +import org.eclipse.ditto.services.connectivity.messaging.TestConstants; import org.junit.Test; /** @@ -24,4 +32,48 @@ public final class RabbitMQValidatorTest { public void testImmutability() { assertInstancesOf(RabbitMQValidator.class, areImmutable()); } + + private static final RabbitMQValidator UNDER_TEST = RabbitMQValidator.newInstance(); + + + @Test + public void testValidationOfEnforcement() { + final Source source = newSourceBuilder() + .enforcement(ConnectivityModelFactory.newEnforcement( + "{{ header:device_id }}", "{{ thing:id }}", "{{ thing:name }}", "{{ thing:namespace }}")) + .build(); + + UNDER_TEST.validateSource(source, DittoHeaders.empty(), () -> "testSource"); + } + + @Test + public void testInvalidInputThrowsException() { + final Source source = newSourceBuilder() + .enforcement(ConnectivityModelFactory.newEnforcement("{{ thing:id }}", "{{ thing:namespace }}")) + .build(); + + Assertions.assertThatExceptionOfType(ConnectionConfigurationInvalidException.class) + .isThrownBy(() -> UNDER_TEST.validateSource(source, DittoHeaders.empty(), () -> "testSource")) + .withCauseInstanceOf(UnresolvedPlaceholderException.class); + } + + @Test + public void testInvalidMatcherThrowsException() { + final Source source = newSourceBuilder() + .enforcement(ConnectivityModelFactory.newEnforcement( + "{{ header:device_id }}", "{{ header:ditto }}")) + .build(); + + Assertions.assertThatExceptionOfType(ConnectionConfigurationInvalidException.class) + .isThrownBy(() -> UNDER_TEST.validateSource(source, DittoHeaders.empty(), () -> "testSource")) + .withCauseInstanceOf(UnresolvedPlaceholderException.class); + } + + private static SourceBuilder newSourceBuilder() { + return ConnectivityModelFactory.newSourceBuilder() + .address("telemetry/device") + .authorizationContext( + TestConstants.Authorization.AUTHORIZATION_CONTEXT); + } + }