Skip to content

Commit

Permalink
Issue #561: Added revoked subjects to DittoHeaders.
Browse files Browse the repository at this point in the history
Signed-off-by: Juergen Fickel <juergen.fickel@bosch-si.com>
  • Loading branch information
Juergen Fickel authored and Juergen Fickel committed Jan 27, 2020
1 parent b22f62b commit 1f89497
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,21 @@ public AuthorizationContext getAuthorizationContext() {

@Override
public Set<String> getReadSubjects() {
final JsonArray jsonValueArray = getJsonArrayForDefinition(DittoHeaderDefinition.READ_SUBJECTS);
return getSubjects(DittoHeaderDefinition.READ_SUBJECTS);
}

private Set<String> getSubjects(final HeaderDefinition headerDefinition) {
final JsonArray jsonValueArray = getJsonArrayForDefinition(headerDefinition);
return jsonValueArray.stream()
.map(JsonValue::asString)
.collect(Collectors.toSet());
}

@Override
public Set<String> getRevokedSubjects() {
return getSubjects(DittoHeaderDefinition.REVOKED_SUBJECTS);
}

@Override
public Optional<String> getChannel() {
return getStringForDefinition(DittoHeaderDefinition.CHANNEL);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,12 @@ public S readSubjects(final Collection<String> readSubjects) {
return myself;
}

@Override
public S revokedSubjects(final Collection<String> revokedSubjects) {
putStringCollection(DittoHeaderDefinition.REVOKED_SUBJECTS, revokedSubjects);
return myself;
}

@Override
public S channel(@Nullable final CharSequence channel) {
putCharSequence(DittoHeaderDefinition.CHANNEL, channel);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,16 @@ public enum DittoHeaderDefinition implements HeaderDefinition {
*/
READ_SUBJECTS("ditto-read-subjects", JsonArray.class, false, false),

/**
* Header definition for revoked subjects value.
*
* <p>
* Key: {@code "revoked-subjects"}, Java type: {@link JsonArray}.
* </p>
* @since 1.1.0
*/
REVOKED_SUBJECTS("ditto-revoked-subjects", JsonArray.class, false, false),

/**
* Header definition for a signal's content-type.
* <p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,16 @@ default DittoHeadersBuilder toBuilder() {
*/
Set<String> getReadSubjects();

/**
* Returns the authorization subjects with explicitly revoked "READ" permissions for the key in the map defining a
* pointer in the Thing.
* Changes on the returned Set are not reflected back to this headers object.
*
* @return the revoked subjects for pointers in the Thing.
* @since 1.1.0
*/
Set<String> getRevokedSubjects();

/**
* Returns the channel (twin/live) on which a Signal/Exception was sent/occurred.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,16 @@ default B randomCorrelationId() {
*/
B readSubjects(Collection<String> readSubjects);

/**
* Sets the revokedSubjects value.
*
* @param revokedSubjects the revokedSubjects value to be set.
* @return this builder for Method Chaining.
* @throws NullPointerException if {@code revokedSubjects} is {@code null}.
* @since 1.1.0
*/
B revokedSubjects(Collection<String> revokedSubjects);

/**
* Sets the specified String as channel of the Signal/Exception.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import org.assertj.core.util.Lists;
import org.assertj.core.util.Maps;
import org.eclipse.ditto.json.JsonArray;
import org.eclipse.ditto.json.JsonArrayBuilder;
Expand Down Expand Up @@ -60,7 +60,9 @@ public final class ImmutableDittoHeadersTest {
private static final EntityTagMatchers KNOWN_IF_NONE_MATCH =
EntityTagMatchers.fromCommaSeparatedString("\"notOneValue\",\"notAnotherValue\"");
private static final EntityTag KNOWN_ETAG = EntityTag.fromString("\"-12124212\"");
private static final Collection<String> KNOWN_READ_SUBJECTS = Collections.singleton(KNOWN_READ_SUBJECT);
private static final Collection<String> KNOWN_READ_SUBJECTS = Lists.list(KNOWN_READ_SUBJECT);
private static final Collection<String> KNOWN_REVOKED_SUBJECTS =
Lists.list("knownRevokedSubject1", "knownRevokedSubject2");
private static final String KNOWN_CONTENT_TYPE = "application/json";
private static final String KNOWN_ORIGIN = "knownOrigin";
private static final String KNOWN_REPLY_TARGET = "5";
Expand Down Expand Up @@ -88,6 +90,7 @@ public void settingAllKnownHeadersWorksAsExpected() {
.authorizationSubjects(AUTH_SUBJECTS)
.correlationId(KNOWN_CORRELATION_ID)
.readSubjects(KNOWN_READ_SUBJECTS)
.revokedSubjects(KNOWN_REVOKED_SUBJECTS)
.responseRequired(KNOWN_RESPONSE_REQUIRED)
.dryRun(false)
.schemaVersion(KNOWN_SCHEMA_VERSION)
Expand Down Expand Up @@ -170,7 +173,14 @@ public void getAuthorizationContextReturnsExpected() {
public void getReadSubjectsReturnsExpected() {
final DittoHeaders underTest = DittoHeaders.newBuilder().readSubjects(KNOWN_READ_SUBJECTS).build();

assertThat(underTest.getReadSubjects()).isEqualTo(KNOWN_READ_SUBJECTS);
assertThat(underTest.getReadSubjects()).containsExactlyInAnyOrderElementsOf(KNOWN_READ_SUBJECTS);
}

@Test
public void getRevokedSubjectsReturnsExpected() {
final DittoHeaders underTest = DittoHeaders.newBuilder().revokedSubjects(KNOWN_REVOKED_SUBJECTS).build();

assertThat(underTest.getRevokedSubjects()).containsExactlyInAnyOrderElementsOf(KNOWN_REVOKED_SUBJECTS);
}

@Test
Expand Down Expand Up @@ -211,6 +221,7 @@ public void toJsonReturnsExpected() {
.set(DittoHeaderDefinition.RESPONSE_REQUIRED.getKey(), KNOWN_RESPONSE_REQUIRED)
.set(DittoHeaderDefinition.DRY_RUN.getKey(), false)
.set(DittoHeaderDefinition.READ_SUBJECTS.getKey(), toJsonArray(KNOWN_READ_SUBJECTS))
.set(DittoHeaderDefinition.REVOKED_SUBJECTS.getKey(), toJsonArray(KNOWN_REVOKED_SUBJECTS))
.set(DittoHeaderDefinition.IF_MATCH.getKey(), KNOWN_IF_MATCH.toString())
.set(DittoHeaderDefinition.IF_NONE_MATCH.getKey(), KNOWN_IF_NONE_MATCH.toString())
.set(DittoHeaderDefinition.ETAG.getKey(), KNOWN_ETAG.toString())
Expand Down Expand Up @@ -317,7 +328,7 @@ public void entriesSizeIsGreaterThanZeroIfHeadersAreNotEmpty() {

@Test
public void entriesSizeIsNotGreaterThanZeroIfHeadersAreEmpty() {
final ImmutableDittoHeaders underTest = ImmutableDittoHeaders.of(Collections.emptyMap());
final ImmutableDittoHeaders underTest = ImmutableDittoHeaders.of(new HashMap());

assertThat(underTest.isEntriesSizeGreaterThan(0)).isFalse();
}
Expand Down Expand Up @@ -371,6 +382,7 @@ private static Map<String, String> createMapContainingAllKnownHeaders() {
result.put(DittoHeaderDefinition.RESPONSE_REQUIRED.getKey(), String.valueOf(KNOWN_RESPONSE_REQUIRED));
result.put(DittoHeaderDefinition.DRY_RUN.getKey(), String.valueOf(false));
result.put(DittoHeaderDefinition.READ_SUBJECTS.getKey(), toJsonArray(KNOWN_READ_SUBJECTS).toString());
result.put(DittoHeaderDefinition.REVOKED_SUBJECTS.getKey(), toJsonArray(KNOWN_REVOKED_SUBJECTS).toString());
result.put(DittoHeaderDefinition.IF_MATCH.getKey(), KNOWN_IF_MATCH.toString());
result.put(DittoHeaderDefinition.IF_NONE_MATCH.getKey(), KNOWN_IF_NONE_MATCH.toString());
result.put(DittoHeaderDefinition.ETAG.getKey(), KNOWN_ETAG.toString());
Expand Down

0 comments on commit 1f89497

Please sign in to comment.