Skip to content

Commit

Permalink
Issue #559: Validate channel header immediately on setting in `DittoH…
Browse files Browse the repository at this point in the history
…eadersBuilder`.

Signed-off-by: Juergen Fickel <juergen.fickel@bosch.io>
  • Loading branch information
Juergen Fickel committed Oct 13, 2021
1 parent d5b5dc2 commit b1b6050
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -306,7 +307,14 @@ public S readRevokedSubjects(final Collection<AuthorizationSubject> readRevokedS

@Override
public S channel(@Nullable final CharSequence channel) {
putCharSequence(DittoHeaderDefinition.CHANNEL, channel);
final DittoHeaderDefinition headerDefinition = DittoHeaderDefinition.CHANNEL;
if (null != channel) {
final ValueValidator dittoChannelValidator = HeaderValueValidators.getDittoChannelValidator();
dittoChannelValidator.accept(headerDefinition, channel);
putCharSequence(headerDefinition, channel.toString().trim().toLowerCase(Locale.ENGLISH));
} else {
removeHeader(headerDefinition.getKey());
}
return myself;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,14 @@ default B randomCorrelationId() {

/**
* Sets the specified String as channel of the Signal/Exception.
* Allowed values are {@value "twin"} and {@value "live"}.
* If omitted, {@value "twin"} is used as default.
*
* @param channel the channel of the Signal/Exception to be set.
* {@code null} removes an already set channel header.
* @return this builder for Method Chaining.
* @throws IllegalArgumentException if {@code channel} is empty.
* @throws org.eclipse.ditto.base.model.exceptions.DittoHeaderInvalidException if {@code channel} after trimming and
* converting to lower case does not match {@value "twin"} or {@value "live"}.
*/
B channel(@Nullable CharSequence channel);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@

import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.assertj.core.api.Assertions.entry;
import static org.eclipse.ditto.json.assertions.DittoJsonAssertions.assertThat;
import static org.eclipse.ditto.base.model.headers.DefaultDittoHeadersBuilder.of;
import static org.eclipse.ditto.json.assertions.DittoJsonAssertions.assertThat;

import java.time.Instant;
import java.util.Arrays;
Expand All @@ -25,13 +25,6 @@
import java.util.Map;
import java.util.UUID;

import org.eclipse.ditto.json.JsonArray;
import org.eclipse.ditto.json.JsonCollectors;
import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonKey;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonParseException;
import org.eclipse.ditto.json.JsonValue;
import org.eclipse.ditto.base.model.acks.AcknowledgementLabel;
import org.eclipse.ditto.base.model.acks.AcknowledgementRequest;
import org.eclipse.ditto.base.model.assertions.DittoBaseAssertions;
Expand All @@ -42,6 +35,13 @@
import org.eclipse.ditto.base.model.headers.metadata.MetadataHeaderKey;
import org.eclipse.ditto.base.model.headers.metadata.MetadataHeaders;
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;
import org.eclipse.ditto.json.JsonArray;
import org.eclipse.ditto.json.JsonCollectors;
import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonKey;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonParseException;
import org.eclipse.ditto.json.JsonValue;
import org.junit.Before;
import org.junit.Test;

Expand Down Expand Up @@ -453,4 +453,49 @@ public void createBuilderFromMapContainingInvalidMetadataValue() {
.withCauseInstanceOf(JsonParseException.class);
}

@Test
public void setValidTwinChannelCharSequence() {
final DittoHeaders dittoHeaders = DefaultDittoHeadersBuilder.newInstance()
.channel(" twIn ")
.build();

assertThat(dittoHeaders).containsEntry(DittoHeaderDefinition.CHANNEL.getKey(), "twin");
}

@Test
public void setValidLiveChannelCharSequence() {
final DittoHeaders dittoHeaders = DefaultDittoHeadersBuilder.newInstance()
.channel("LIve ")
.build();

assertThat(dittoHeaders).containsEntry(DittoHeaderDefinition.CHANNEL.getKey(), "live");
}

@Test
public void setInvalidChannelCharSequence() {
final String invalidChannelCharSequence = "quuz";
final DefaultDittoHeadersBuilder defaultDittoHeadersBuilder = DefaultDittoHeadersBuilder.newInstance();

assertThatExceptionOfType(DittoHeaderInvalidException.class)
.isThrownBy(() -> defaultDittoHeadersBuilder.channel(invalidChannelCharSequence))
.withMessage("The value '%s' of the header '%s' is not a valid channel.",
invalidChannelCharSequence,
DittoHeaderDefinition.CHANNEL)
.withNoCause();
}

@Test
public void putInvalidChannelCharSequenceAsHeader() {
final String channelKey = DittoHeaderDefinition.CHANNEL.getKey();
final String invalidChannelCharSequence = "qux";
final DefaultDittoHeadersBuilder defaultDittoHeadersBuilder = DefaultDittoHeadersBuilder.newInstance();

assertThatExceptionOfType(DittoHeaderInvalidException.class)
.isThrownBy(() -> defaultDittoHeadersBuilder.putHeader(channelKey, invalidChannelCharSequence))
.withMessage("The value '%s' of the header '%s' is not a valid channel.",
invalidChannelCharSequence,
channelKey)
.withNoCause();
}

}

0 comments on commit b1b6050

Please sign in to comment.