diff --git a/client/src/main/java/dev/fitko/fitconnect/client/SubscriberClient.java b/client/src/main/java/dev/fitko/fitconnect/client/SubscriberClient.java index 837b1686f4461743d8b4f3a53f9365d12fc27c76..3133629351c4f3d1ec0b2d5039798d1fa1005ea9 100644 --- a/client/src/main/java/dev/fitko/fitconnect/client/SubscriberClient.java +++ b/client/src/main/java/dev/fitko/fitconnect/client/SubscriberClient.java @@ -32,6 +32,7 @@ import java.util.List; import java.util.Set; import java.util.UUID; +import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; import static dev.fitko.fitconnect.client.util.SubmissionUtil.buildDecryptedAttachmentPayload; import static dev.fitko.fitconnect.client.util.SubmissionUtil.getDataHashFromMetadata; import static dev.fitko.fitconnect.client.util.SubmissionUtil.mapToReceivedAttachments; @@ -42,8 +43,8 @@ import static dev.fitko.fitconnect.client.util.SubmissionUtil.mapToReceivedAttac public class SubscriberClient { private static final Logger LOGGER = LoggerFactory.getLogger(SubscriberClient.class); + private static final ObjectMapper MAPPER = new ObjectMapper().configure(FAIL_ON_UNKNOWN_PROPERTIES, false); private static final int DEFAULT_SUBMISSION_LIMIT = 500; - private final Subscriber subscriber; private final RSAKey privateKey; @@ -184,7 +185,7 @@ public class SubscriberClient { private Metadata decryptMetadata(final String encryptedMetadata) throws IOException { final byte[] metadataBytes = subscriber.decryptStringContent(privateKey, encryptedMetadata); - return new ObjectMapper().readValue(metadataBytes, Metadata.class); + return MAPPER.readValue(metadataBytes, Metadata.class); } private ValidationResult validateAttachments(final List<DecryptedAttachmentPayload> decryptedAttachmentPayloads) { diff --git a/client/src/test/java/dev/fitko/fitconnect/client/SubscriberClientTest.java b/client/src/test/java/dev/fitko/fitconnect/client/SubscriberClientTest.java index a7c42664c8723a47fdc94e96478dce7baaa3777a..ef92c9b38c16331e3a9ed5e13acf62ea11a4bb77 100644 --- a/client/src/test/java/dev/fitko/fitconnect/client/SubscriberClientTest.java +++ b/client/src/test/java/dev/fitko/fitconnect/client/SubscriberClientTest.java @@ -314,6 +314,49 @@ class SubscriberClientTest { logs.assertContains("Metadata does not match schema"); } + @Test + void testUnknownPropertyOnMetadata() throws JsonProcessingException { + // Given + final var submissionId = UUID.randomUUID(); + final var destinationId = UUID.randomUUID(); + final var caseId = UUID.randomUUID(); + + final var submission = new Submission(); + submission.setSubmissionId(submissionId); + submission.setDestinationId(destinationId); + submission.setCaseId(caseId); + + final Map<String, Map<?, ?>> metadata = Map.of( + "$schemaFoo", Collections.emptyMap(), + "contentStructure", Map.of( + "data", Map.of( + "hash", Map.of( + "type", SignatureType.SHA_512, + "content", "bla" + ), + "submissionSchema", Map.of( + "schemaUri", URI.create("https://dummy.schema.url"), + "mimeType", MimeType.APPLICATION_JSON + ) + ) + ) + ); + + final var invalidMetadata = mapper.writeValueAsBytes(metadata); + + when(subscriberMock.getSubmission(any())).thenReturn(submission); + when(subscriberMock.decryptStringContent(any(), any())).thenReturn(invalidMetadata); + when(subscriberMock.validateMetadata(any())).thenReturn(ValidationResult.ok()); + when(subscriberMock.validateHashIntegrity(any(), any())).thenReturn(ValidationResult.ok()); + + // When + final var receivedSubmission = underTest.requestSubmission(submissionId); + + // Then + assertNotNull(receivedSubmission); + assertThat(receivedSubmission.getSubmissionMetadata().getContentStructure().getData().getHash().getContent(), is("bla")); + } + @Test void testCorruptedData() throws JsonProcessingException {