Skip to content

Commit

Permalink
fix WoT action validation was only done for application/json content-…
Browse files Browse the repository at this point in the history
…type
  • Loading branch information
thjaeckle committed Jan 21, 2025
1 parent 4966ef4 commit 251034b
Showing 1 changed file with 77 additions and 60 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@
import org.eclipse.ditto.things.model.signals.commands.modify.ThingModifyCommand;
import org.eclipse.ditto.wot.api.validator.WotThingModelValidator;
import org.eclipse.ditto.wot.integration.DittoWotIntegration;
import org.eclipse.ditto.wot.validation.WotThingModelPayloadValidationException;

/**
* Enforcer responsible for enforcing {@link ThingCommand}s and filtering {@link ThingCommandResponse}s utilizing the
Expand Down Expand Up @@ -572,29 +573,37 @@ private CompletionStage<Boolean> doesThingExist() {
private CompletionStage<MessageCommand<?, ?>> performWotBasedMessageCommandValidation(
final MessageCommand<?, ?> messageCommand
) {
if (isJsonMessageContent(messageCommand.getMessage())) {
@SuppressWarnings("unchecked") final Message<JsonValue> message =
((MessageCommand<JsonValue, ?>) messageCommand)
.getMessage();

final MessageDirection messageDirection = message.getDirection();
final JsonValue messageCommandPayload = message
.getPayload()
.orElse(null);

if (messageCommand instanceof SendThingMessage<?> sendThingMessage) {
return performWotBasedThingMessageValidation(messageCommand, sendThingMessage, messageDirection,
messageCommandPayload
).thenApply(aVoid -> messageCommand);
} else if (messageCommand instanceof SendFeatureMessage<?> sendFeatureMessage) {
final String featureId = sendFeatureMessage.getFeatureId();
return performWotBasedFeatureMessageValidation(messageCommand, sendFeatureMessage, featureId,
messageDirection, messageCommandPayload
).thenApply(aVoid -> messageCommand);
@SuppressWarnings("unchecked") final Message<JsonValue> message =
((MessageCommand<JsonValue, ?>) messageCommand)
.getMessage();

if (message.getPayload().isPresent() && !isJsonMessageContent(message)) {
return CompletableFuture.failedFuture(
WotThingModelPayloadValidationException
.newBuilder("Could not validate non-JSON message content type <" +
message.getContentType().orElse("?") + "> for message subject " +
"<" + message.getSubject() + ">"
)
.dittoHeaders(messageCommand.getDittoHeaders())
.build()
);
}

final MessageDirection messageDirection = message.getDirection();
final JsonValue messageCommandPayload = message
.getPayload()
.orElse(null);

if (messageCommand instanceof SendThingMessage<?> sendThingMessage) {
return performWotBasedThingMessageValidation(messageCommand, sendThingMessage, messageDirection,
messageCommandPayload
).thenApply(aVoid -> messageCommand);
} else if (messageCommand instanceof SendFeatureMessage<?> sendFeatureMessage) {
final String featureId = sendFeatureMessage.getFeatureId();
return performWotBasedFeatureMessageValidation(messageCommand, sendFeatureMessage, featureId,
messageDirection, messageCommandPayload
).thenApply(aVoid -> messageCommand);

} else {
return CompletableFuture.completedFuture(messageCommand);
}
} else {
return CompletableFuture.completedFuture(messageCommand);
}
Expand Down Expand Up @@ -674,44 +683,52 @@ private CompletionStage<Void> performWotBasedFeatureMessageValidation(final Mess
private CompletionStage<MessageCommandResponse<?, ?>> performWotBasedMessageCommandResponseValidation(
final MessageCommandResponse<?, ?> messageCommandResponse
) {
if (isJsonMessageContent(messageCommandResponse.getMessage())) {
@SuppressWarnings("unchecked") final Message<JsonValue> message =
((MessageCommandResponse<JsonValue, ?>) messageCommandResponse)
.getMessage();

final MessageDirection messageDirection = message.getDirection();
final JsonValue messageCommandPayload = message
.getPayload()
.orElse(null);

if (messageDirection == MessageDirection.TO &&
messageCommandResponse instanceof SendThingMessageResponse<?> sendThingMessageResponse) {
return resolveThingDefinition()
.thenCompose(optThingDefinition -> thingModelValidator.validateThingActionOutput(
optThingDefinition.orElse(null),
sendThingMessageResponse.getMessage().getSubject(),
messageCommandPayload,
sendThingMessageResponse.getResourcePath(),
sendThingMessageResponse.getDittoHeaders()
))
.thenApply(aVoid -> messageCommandResponse);
} else if (messageDirection == MessageDirection.TO &&
messageCommandResponse instanceof SendFeatureMessageResponse<?> sendFeatureMessageResponse) {
final String featureId = sendFeatureMessageResponse.getFeatureId();
return resolveThingAndFeatureDefinition(featureId)
.thenCompose(optDefinitionPair -> thingModelValidator.validateFeatureActionOutput(
optDefinitionPair.first().orElse(null),
optDefinitionPair.second().orElse(null),
featureId,
sendFeatureMessageResponse.getMessage().getSubject(),
messageCommandPayload,
sendFeatureMessageResponse.getResourcePath(),
sendFeatureMessageResponse.getDittoHeaders()
))
.thenApply(aVoid -> messageCommandResponse);
} else {
return CompletableFuture.completedFuture(messageCommandResponse);
}
@SuppressWarnings("unchecked") final Message<JsonValue> message =
((MessageCommandResponse<JsonValue, ?>) messageCommandResponse)
.getMessage();

if (message.getPayload().isPresent() && !isJsonMessageContent(message)) {
return CompletableFuture.failedFuture(
WotThingModelPayloadValidationException
.newBuilder("Could not validate non-JSON message content type <" +
message.getContentType().orElse("?") + "> for message response subject " +
"<" + message.getSubject() + ">"
)
.dittoHeaders(messageCommandResponse.getDittoHeaders())
.build()
);
}

final MessageDirection messageDirection = message.getDirection();
final JsonValue messageCommandPayload = message
.getPayload()
.orElse(null);

if (messageDirection == MessageDirection.TO &&
messageCommandResponse instanceof SendThingMessageResponse<?> sendThingMessageResponse) {
return resolveThingDefinition()
.thenCompose(optThingDefinition -> thingModelValidator.validateThingActionOutput(
optThingDefinition.orElse(null),
sendThingMessageResponse.getMessage().getSubject(),
messageCommandPayload,
sendThingMessageResponse.getResourcePath(),
sendThingMessageResponse.getDittoHeaders()
))
.thenApply(aVoid -> messageCommandResponse);
} else if (messageDirection == MessageDirection.TO &&
messageCommandResponse instanceof SendFeatureMessageResponse<?> sendFeatureMessageResponse) {
final String featureId = sendFeatureMessageResponse.getFeatureId();
return resolveThingAndFeatureDefinition(featureId)
.thenCompose(optDefinitionPair -> thingModelValidator.validateFeatureActionOutput(
optDefinitionPair.first().orElse(null),
optDefinitionPair.second().orElse(null),
featureId,
sendFeatureMessageResponse.getMessage().getSubject(),
messageCommandPayload,
sendFeatureMessageResponse.getResourcePath(),
sendFeatureMessageResponse.getDittoHeaders()
))
.thenApply(aVoid -> messageCommandResponse);
} else {
return CompletableFuture.completedFuture(messageCommandResponse);
}
Expand Down

0 comments on commit 251034b

Please sign in to comment.