From 2c9744ad4d188c1f6175ae8d92ea6d9a9f3b5c63 Mon Sep 17 00:00:00 2001 From: Henry Borasch <Henry.Borasch@sinc.de> Date: Fri, 3 Mar 2023 12:27:45 +0100 Subject: [PATCH] fixed typo and tests --- .../fitconnect/api/services/Subscriber.java | 10 +++++++ .../validation/ValidationService.java | 4 +-- .../fitconnect/client/SubscriberClient.java | 13 +++++++-- .../client/ClientIntegrationTest.java | 28 +++++++++---------- .../fitconnect/core/SubmissionSender.java | 2 +- .../fitconnect/core/SubmissionSubscriber.java | 7 +++++ .../validation/DefaultValidationService.java | 2 +- .../fitconnect/core/SubmissionSenderTest.java | 4 +-- .../DefaultValidationServiceTest.java | 8 +++--- 9 files changed, 51 insertions(+), 27 deletions(-) diff --git a/api/src/main/java/dev/fitko/fitconnect/api/services/Subscriber.java b/api/src/main/java/dev/fitko/fitconnect/api/services/Subscriber.java index ebe4ee0a3..448aad72e 100644 --- a/api/src/main/java/dev/fitko/fitconnect/api/services/Subscriber.java +++ b/api/src/main/java/dev/fitko/fitconnect/api/services/Subscriber.java @@ -11,6 +11,7 @@ import dev.fitko.fitconnect.api.domain.model.submission.Submission; import dev.fitko.fitconnect.api.domain.model.submission.SubmissionForPickup; import dev.fitko.fitconnect.api.domain.validation.ValidationResult; +import java.net.URI; import java.util.List; import java.util.Set; import java.util.UUID; @@ -76,6 +77,15 @@ public interface Subscriber { */ ValidationResult validateMetadata(Metadata metadata); + /** + * Validates the submission data structure against a given JSON-schema to ensure its correctness. + * + * @param submissionData the submission data object that is validated + * @param schemaUri schema to validate against + * @return a {@link ValidationResult}, contains an error if the submission data is invalid or doesn't match the schema + */ + ValidationResult validateSubmissionDataSchema(String submissionData, URI schemaUri); + /** * Validates data integrity of {@link Attachment} or {@link Data}. * diff --git a/api/src/main/java/dev/fitko/fitconnect/api/services/validation/ValidationService.java b/api/src/main/java/dev/fitko/fitconnect/api/services/validation/ValidationService.java index 99057bf38..d9b88c9de 100644 --- a/api/src/main/java/dev/fitko/fitconnect/api/services/validation/ValidationService.java +++ b/api/src/main/java/dev/fitko/fitconnect/api/services/validation/ValidationService.java @@ -75,14 +75,14 @@ public interface ValidationService { ValidationResult validateHashIntegrity(String originalHexHash, byte[] data); /** - * Tests if a given string is well-formed JSON syntax. + * Tests if a given string matches the specified schema. * * @param json json string that is tested * @param schemaUri URI of schema to validate against * * @return a {@link ValidationResult} with an optional error */ - ValidationResult validateJsonFormat(String json, URI schemaUri); + ValidationResult validateSubmissionDataSchema(String json, URI schemaUri); /** * Tests if a given string is well-formed XML syntax. 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 4c75814f7..15f51911b 100644 --- a/client/src/main/java/dev/fitko/fitconnect/client/SubscriberClient.java +++ b/client/src/main/java/dev/fitko/fitconnect/client/SubscriberClient.java @@ -2,6 +2,7 @@ package dev.fitko.fitconnect.client; import com.fasterxml.jackson.databind.ObjectMapper; import com.nimbusds.jose.jwk.RSAKey; +import com.nimbusds.jose.util.StandardCharset; import dev.fitko.fitconnect.api.domain.model.destination.Destination; import dev.fitko.fitconnect.api.domain.model.event.EventLogEntry; import dev.fitko.fitconnect.api.domain.model.metadata.Metadata; @@ -113,9 +114,15 @@ public class SubscriberClient { LOGGER.info("Decrypting data ..."); final byte[] decryptedData = decryptData(submission.getEncryptedData()); final String hashFromSender = getDataHashFromMetadata(metadata); - final ValidationResult dataValidation = subscriber.validateHashIntegrity(hashFromSender, decryptedData); - if (dataValidation.hasError()) { - LOGGER.error("Data might be corrupted, hash-sum does not match", dataValidation.getError()); + final ValidationResult dataHashValidation = subscriber.validateHashIntegrity(hashFromSender, decryptedData); + if (dataHashValidation.hasError()) { + LOGGER.error("Data might be corrupted, hash-sum does not match", dataHashValidation.getError()); + return null; + } + final ValidationResult dataSchemaValidation = subscriber.validateSubmissionDataSchema(new String(decryptedData, StandardCharset.UTF_8), + metadata.getContentStructure().getData().getSubmissionSchema().getSchemaUri()); + if (dataSchemaValidation.hasError()) { + LOGGER.error("Submission data does not match the provided schema", dataHashValidation.getError()); return null; } diff --git a/client/src/test/java/dev/fitko/fitconnect/client/ClientIntegrationTest.java b/client/src/test/java/dev/fitko/fitconnect/client/ClientIntegrationTest.java index 152b935b8..96801051d 100644 --- a/client/src/test/java/dev/fitko/fitconnect/client/ClientIntegrationTest.java +++ b/client/src/test/java/dev/fitko/fitconnect/client/ClientIntegrationTest.java @@ -72,7 +72,7 @@ class ClientIntegrationTest { final var submission = SubmissionBuilder.Builder() .withAttachment(new File("src/test/resources/attachment.txt")) .withJsonData("{ \"data\": \"Beispiel Fachdaten\" }", - URI.create("https://schema.fitko.de/fim/s00000096_1.0.schema.json")) + URI.create("https://schema.fitko.de/fim/s00000000009_1.0.0.schema.json")) .withDestination(UUID.fromString(System.getenv("TEST_DESTINATION_ID"))) .withServiceType("Test Service", "urn:de:fim:leika:leistung:99400048079000") .build(); @@ -89,7 +89,7 @@ class ClientIntegrationTest { // Then assertNotNull(receivedSubmission); assertThat(receivedSubmission.getData(), is("{ \"data\": \"Beispiel Fachdaten\" }")); - assertThat(receivedSubmission.getDataSchemaUri(), is(URI.create("https://schema.fitko.de/fim/s00000096_1.0.schema.json"))); + assertThat(receivedSubmission.getDataSchemaUri(), is(URI.create("https://schema.fitko.de/fim/s00000000009_1.0.0.schema.json"))); assertThat(receivedSubmission.getDataMimeType().toString(), is("application/json")); assertThat(new String(receivedSubmission.getAttachments().get(0).getData()), is("Test attachment")); } @@ -194,7 +194,7 @@ class ClientIntegrationTest { // When final var submission = SubmissionBuilder.Builder() .withJsonData("{ \"data\": \"Beispiel Fachdaten\" }", - URI.create("https://schema.fitko.de/fim/s00000096_1.0.schema.json")) + URI.create("https://schema.fitko.de/fim/s00000000009_1.0.0.schema.json")) .withDestination(UUID.fromString(System.getenv("TEST_DESTINATION_ID"))) .withServiceType("Test Service", "urn:de:fim:leika:leistung:99400048079000") .build(); @@ -224,14 +224,14 @@ class ClientIntegrationTest { final var submissionOne = SubmissionBuilder.Builder() .withJsonData("{ \"data\": \"Beispiel Fachdaten 1\" }", - URI.create("https://schema.fitko.de/fim/s00000096_1.0.schema.json")) + URI.create("https://schema.fitko.de/fim/s00000000009_1.0.0.schema.json")) .withDestination(destinationId) .withServiceType(serviceName, leikaKey) .build(); final var submissionTwo = SubmissionBuilder.Builder() .withJsonData("{ \"data\": \"Beispiel Fachdaten 2\" }", - URI.create("https://schema.fitko.de/fim/s00000096_1.0.schema.json")) + URI.create("https://schema.fitko.de/fim/s00000000009_1.0.0.schema.json")) .withDestination(destinationId) .withServiceType(serviceName, leikaKey) .build(); @@ -270,7 +270,7 @@ class ClientIntegrationTest { final var submission = SubmissionBuilder.Builder() .withAttachment(new File("src/test/resources/attachment.txt")) .withJsonData("{ \"data\": \"Beispiel Fachdaten\" }", - URI.create("https://schema.fitko.de/fim/s00000096_1.0.schema.json")) + URI.create("https://schema.fitko.de/fim/s00000000009_1.0.0.schema.json")) .withDestination(UUID.fromString(System.getenv("TEST_DESTINATION_ID"))) .withServiceType("Test Service", "urn:de:fim:leika:leistung:99400048079000") .build(); @@ -301,7 +301,7 @@ class ClientIntegrationTest { final var submission = SubmissionBuilder.Builder() .withAttachment(new File("src/test/resources/attachment.txt")) .withJsonData("{ \"data\": \"Beispiel Fachdaten\" }", - URI.create("https://schema.fitko.de/fim/s00000096_1.0.schema.json")) + URI.create("https://schema.fitko.de/fim/s00000000009_1.0.0.schema.json")) .withDestination(UUID.fromString(System.getenv("TEST_DESTINATION_ID"))) .withServiceType("Test Service", "urn:de:fim:leika:leistung:99400048079000") .build(); @@ -331,7 +331,7 @@ class ClientIntegrationTest { final var submission = SubmissionBuilder.Builder() .withJsonData("{ \"data\": \"Beispiel Fachdaten\" }", - URI.create("https://schema.fitko.de/fim/s00000096_1.0.schema.json")) + URI.create("https://schema.fitko.de/fim/s00000000009_1.0.0.schema.json")) .withDestination(UUID.fromString(System.getenv("TEST_DESTINATION_ID"))) .withServiceType("Test Service", "urn:de:fim:leika:leistung:99400048079000") .build(); @@ -363,7 +363,7 @@ class ClientIntegrationTest { final var submission = SubmissionBuilder.Builder() .withAttachment(new File("src/test/resources/attachment.txt")) .withJsonData("{ \"data\": \"Beispiel Fachdaten\" }", - URI.create("https://schema.fitko.de/fim/s00000096_1.0.schema.json")) + URI.create("https://schema.fitko.de/fim/s00000000009_1.0.0.schema.json")) .withDestination(UUID.fromString(System.getenv("TEST_DESTINATION_ID"))) .withServiceType("Test Service", "urn:de:fim:leika:leistung:99400048079000") .build(); @@ -402,7 +402,7 @@ class ClientIntegrationTest { final var submission = SubmissionBuilder.Builder() .withAttachment(new File("src/test/resources/attachment.txt")) .withJsonData("{ \"data\": \"Beispiel Fachdaten\" }", - URI.create("https://schema.fitko.de/fim/s00000096_1.0.schema.json")) + URI.create("https://schema.fitko.de/fim/s00000000009_1.0.0.schema.json")) .withDestination(UUID.fromString(System.getenv("TEST_DESTINATION_ID"))) .withServiceType("Test Service", "urn:de:fim:leika:leistung:99400048079000") .build(); @@ -535,7 +535,7 @@ class ClientIntegrationTest { private ApplicationConfig getConfigWithCredentialsFromGitlab(final String environmentName, final boolean allowInsecurePublicKey, - final boolean skipSubmissiomDataValidation) { + final boolean skipSubmissionDataValidation) { final var sender = new SenderConfig(System.getenv("SENDER_CLIENT_ID"), System.getenv("SENDER_CLIENT_SECRET")); @@ -547,7 +547,7 @@ class ClientIntegrationTest { .build(); final var envName = new EnvironmentName(environmentName); - final Environment env = getEnvironment(allowInsecurePublicKey, skipSubmissiomDataValidation); + final Environment env = getEnvironment(allowInsecurePublicKey, skipSubmissionDataValidation); return ApplicationConfig.builder() .senderConfig(sender) @@ -557,11 +557,11 @@ class ClientIntegrationTest { .build(); } - private static Environment getEnvironment(final boolean allowInsecurePublicKey, final boolean skipSubmissiomDataValidation) { + private static Environment getEnvironment(final boolean allowInsecurePublicKey, final boolean skipSubmissionDataValidation) { final String authBaseUrl = "https://auth-testing.fit-connect.fitko.dev"; final String routingBaseUrl = "https://routing-api-testing.fit-connect.fitko.dev"; final String selfServicePortalUrl = "https://portal.auth-testing.fit-connect.fitko.dev"; final String submissionBaseUrl = "https://submission-api-testing.fit-connect.fitko.dev"; - return new Environment(authBaseUrl, routingBaseUrl, submissionBaseUrl, selfServicePortalUrl, allowInsecurePublicKey, skipSubmissiomDataValidation); + return new Environment(authBaseUrl, routingBaseUrl, submissionBaseUrl, selfServicePortalUrl, allowInsecurePublicKey, skipSubmissionDataValidation); } } diff --git a/core/src/main/java/dev/fitko/fitconnect/core/SubmissionSender.java b/core/src/main/java/dev/fitko/fitconnect/core/SubmissionSender.java index d58b74baf..4a1f2c2ea 100644 --- a/core/src/main/java/dev/fitko/fitconnect/core/SubmissionSender.java +++ b/core/src/main/java/dev/fitko/fitconnect/core/SubmissionSender.java @@ -118,7 +118,7 @@ public class SubmissionSender implements Sender { @Override public ValidationResult validateJsonFormat(final String json, final URI schemaUri) { LOGGER.info("Validating data json format"); - return validationService.validateJsonFormat(json, schemaUri); + return validationService.validateSubmissionDataSchema(json, schemaUri); } @Override diff --git a/core/src/main/java/dev/fitko/fitconnect/core/SubmissionSubscriber.java b/core/src/main/java/dev/fitko/fitconnect/core/SubmissionSubscriber.java index c47927ed6..898ae70a1 100644 --- a/core/src/main/java/dev/fitko/fitconnect/core/SubmissionSubscriber.java +++ b/core/src/main/java/dev/fitko/fitconnect/core/SubmissionSubscriber.java @@ -17,6 +17,7 @@ import dev.fitko.fitconnect.api.services.validation.ValidationService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.net.URI; import java.util.List; import java.util.Set; import java.util.UUID; @@ -79,6 +80,12 @@ public class SubmissionSubscriber implements Subscriber { return validationService.validateMetadataSchema(metadata); } + @Override + public ValidationResult validateSubmissionDataSchema(String submissiondata, URI schemaUri) { + LOGGER.info("Validating submission data schema"); + return validationService.validateSubmissionDataSchema(submissiondata, schemaUri); + } + @Override public ValidationResult validateHashIntegrity(final String originalHash, final byte[] data) { LOGGER.info("Validating data hash integrity"); diff --git a/core/src/main/java/dev/fitko/fitconnect/core/validation/DefaultValidationService.java b/core/src/main/java/dev/fitko/fitconnect/core/validation/DefaultValidationService.java index 128de388f..ba18643c8 100644 --- a/core/src/main/java/dev/fitko/fitconnect/core/validation/DefaultValidationService.java +++ b/core/src/main/java/dev/fitko/fitconnect/core/validation/DefaultValidationService.java @@ -151,7 +151,7 @@ public class DefaultValidationService implements ValidationService { } @Override - public ValidationResult validateJsonFormat(final String json, final URI schemaUri) { + public ValidationResult validateSubmissionDataSchema(final String json, final URI schemaUri) { if (config.getCurrentEnvironment().isSkipSubmissionDataValidation()) { LOGGER.warn("Submission data validation is deactivated. This should be done only on secure test environments."); diff --git a/core/src/test/java/dev/fitko/fitconnect/core/SubmissionSenderTest.java b/core/src/test/java/dev/fitko/fitconnect/core/SubmissionSenderTest.java index 788783120..a832bbc0b 100644 --- a/core/src/test/java/dev/fitko/fitconnect/core/SubmissionSenderTest.java +++ b/core/src/test/java/dev/fitko/fitconnect/core/SubmissionSenderTest.java @@ -333,7 +333,7 @@ public class SubmissionSenderTest { void testValidJsonFormatValidation() { // Given - when(validationServiceMock.validateJsonFormat(any(), eq(URI.create("urn:something")))).thenReturn(ValidationResult.ok()); + when(validationServiceMock.validateSubmissionDataSchema(any(), eq(URI.create("urn:something")))).thenReturn(ValidationResult.ok()); // When final ValidationResult validationResult = underTest.validateJsonFormat("{}", URI.create("urn:something")); @@ -346,7 +346,7 @@ public class SubmissionSenderTest { void testInvalidJsonFormatValidation() { // Given - when(validationServiceMock.validateJsonFormat(any(), eq(URI.create("urn:something")))).thenReturn(ValidationResult.error(new ValidationException("Invalid json"))); + when(validationServiceMock.validateSubmissionDataSchema(any(), eq(URI.create("urn:something")))).thenReturn(ValidationResult.error(new ValidationException("Invalid json"))); // When final ValidationResult validationResult = underTest.validateJsonFormat("$%&/()", URI.create("urn:something")); diff --git a/core/src/test/java/dev/fitko/fitconnect/core/validation/DefaultValidationServiceTest.java b/core/src/test/java/dev/fitko/fitconnect/core/validation/DefaultValidationServiceTest.java index a8675a48e..14b68de5f 100644 --- a/core/src/test/java/dev/fitko/fitconnect/core/validation/DefaultValidationServiceTest.java +++ b/core/src/test/java/dev/fitko/fitconnect/core/validation/DefaultValidationServiceTest.java @@ -419,7 +419,7 @@ class DefaultValidationServiceTest { final var validJson = getResource("/valid_json_data.json"); // When - final ValidationResult validationResult = defaultValidationService.validateJsonFormat(validJson, URI.create("urn:something")); + final ValidationResult validationResult = defaultValidationService.validateSubmissionDataSchema(validJson, URI.create("urn:something")); // Then assertTrue(validationResult.isValid()); @@ -436,7 +436,7 @@ class DefaultValidationServiceTest { final var invalidJson = getResource("/invalid_json_data.json"); // When - final ValidationResult validationResult = defaultValidationService.validateJsonFormat(invalidJson, URI.create("urn:something")); + final ValidationResult validationResult = defaultValidationService.validateSubmissionDataSchema(invalidJson, URI.create("urn:something")); // Then assertFalse(validationResult.isValid()); @@ -455,7 +455,7 @@ class DefaultValidationServiceTest { final var invalidJson = "{ \"someString\": \"someStringValue\", \"someArray\": [\"someArrayValue\"] }"; // When - final ValidationResult validationResult = defaultValidationService.validateJsonFormat(invalidJson, URI.create("urn:something")); + final ValidationResult validationResult = defaultValidationService.validateSubmissionDataSchema(invalidJson, URI.create("urn:something")); // Then assertTrue(validationResult.isValid()); @@ -473,7 +473,7 @@ class DefaultValidationServiceTest { final var invalidJson = "{ \"wrongString\": \"someStringValue\", \"someArray\": [\"someArrayValue\"] }"; // When - final ValidationResult validationResult = defaultValidationService.validateJsonFormat(invalidJson, URI.create("urn:something")); + final ValidationResult validationResult = defaultValidationService.validateSubmissionDataSchema(invalidJson, URI.create("urn:something")); // Then assertFalse(validationResult.isValid()); -- GitLab