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