Skip to content

Commit

Permalink
restrict put-metadata with too large metadata
Browse files Browse the repository at this point in the history
Signed-off-by: Johannes Schneider <johannes.schneider@bosch.io>
  • Loading branch information
jokraehe committed Jul 25, 2022
1 parent 5a00b1a commit 12fa65a
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import java.util.Set;
import java.util.SortedSet;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
Expand All @@ -33,13 +34,16 @@
import org.eclipse.ditto.base.model.headers.DittoHeaders;
import org.eclipse.ditto.base.model.headers.metadata.MetadataHeader;
import org.eclipse.ditto.base.model.headers.metadata.MetadataHeaderKey;
import org.eclipse.ditto.base.model.json.FieldType;
import org.eclipse.ditto.base.model.signals.WithOptionalEntity;
import org.eclipse.ditto.base.model.signals.commands.Command;
import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonValue;
import org.eclipse.ditto.things.model.Thing;
import org.eclipse.ditto.things.model.ThingsModelFactory;
import org.eclipse.ditto.things.model.signals.commands.ThingCommandSizeValidator;
import org.eclipse.ditto.things.model.signals.commands.modify.CreateThing;
import org.eclipse.ditto.things.model.signals.commands.modify.MergeThing;

Expand All @@ -52,6 +56,9 @@
@Immutable
final class MetadataFromCommand implements Supplier<Metadata> {

private static final Predicate<JsonField> FIELDS_NOT_HIDDEN_OR_METADATA = FieldType.notHidden()
.or(jsonField -> Objects.equals(Thing.JsonFields.METADATA.getPointer(), jsonField.getKey().asPointer()));

private final Command<?> command;
private final Thing mergedThing;

Expand Down Expand Up @@ -133,7 +140,20 @@ public Metadata get() {
final var expandedMetadataHeaders = metadataHeaders.stream()
.flatMap(this::expandWildcards)
.collect(Collectors.toCollection(LinkedHashSet::new));
return buildMetadata(optionalJsonValue.get(), expandedMetadataHeaders);

final var metadata = buildMetadata(optionalJsonValue.get(), expandedMetadataHeaders);

final var thingJsonObject = mergedThing.toBuilder()
.setMetadata(metadata)
.build()
.toJson(FIELDS_NOT_HIDDEN_OR_METADATA);

ThingCommandSizeValidator.getInstance().ensureValidSize(
thingJsonObject::getUpperBoundForStringSize,
() -> thingJsonObject.toString().length(),
command::getDittoHeaders);

return metadata;
}
return existingMetadata;
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
package org.eclipse.ditto.things.service.persistence.actors.strategies.commands;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.assertj.core.api.Assertions.assertThatNullPointerException;
import static org.mutabilitydetector.unittesting.AllowedReason.provided;
import static org.mutabilitydetector.unittesting.MutabilityAssert.assertInstancesOf;
Expand All @@ -32,8 +33,13 @@
import org.eclipse.ditto.things.model.FeatureProperties;
import org.eclipse.ditto.things.model.Thing;
import org.eclipse.ditto.things.model.ThingId;
import org.eclipse.ditto.things.model.ThingTooLargeException;
import org.eclipse.ditto.things.model.ThingsModelFactory;
import org.eclipse.ditto.things.model.signals.commands.TestConstants;
import org.eclipse.ditto.things.model.signals.commands.modify.CreateThing;
import org.eclipse.ditto.things.model.signals.commands.modify.MergeThing;
import org.eclipse.ditto.things.model.signals.commands.modify.ModifyFeature;
import org.eclipse.ditto.things.model.signals.commands.modify.ModifyThing;
import org.eclipse.ditto.things.model.signals.commands.modify.ThingModifyCommand;

import org.junit.Before;
Expand Down Expand Up @@ -234,4 +240,31 @@ public void ensureThatLeafsCanOnlyBeObjects() {
.doesNotContain(JsonField.newInstance("/properties/capacitorNr", JsonValue.of("unlimited")));
}

@Test
public void ensureMaxThingSizeWithMetadata() {
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < TestConstants.THING_SIZE_LIMIT_BYTES; i++) {
sb.append('a');
}
final var thingId = ThingId.of("test.ns", "foo-bar");
final var thing = ThingsModelFactory.newThingBuilder()
.setLifecycle(TestConstants.Thing.LIFECYCLE)
.setPolicyId(TestConstants.Thing.POLICY_ID)
.setId(thingId)
.setAttribute(JsonPointer.of("foo"), JsonValue.of("bar"))
.build();

final var dittoHeaders = DittoHeaders.newBuilder()
.putMetadata(MetadataHeaderKey.parse("attributes/foo/meta"), JsonObject.newBuilder()
.set("description", sb.toString())
.build())
.build();

final var modifyThing = ModifyThing.of(thingId, thing, null, dittoHeaders);

final var metadataFromCommand = MetadataFromCommand.of(modifyThing, null, null);

assertThatExceptionOfType(ThingTooLargeException.class).isThrownBy(metadataFromCommand::get);
}

}

0 comments on commit 12fa65a

Please sign in to comment.