diff --git a/api/src/main/java/fitconnect/api/domain/metadata/data/EidasAdesProfile.java b/api/src/main/java/fitconnect/api/domain/metadata/data/EidasAdesProfile.java index 0fd71a987508c907262c061cba264c1a0b66d41e..3e19a0aa2274ba1bf16f4d2c2b2f161ab35bca9f 100644 --- a/api/src/main/java/fitconnect/api/domain/metadata/data/EidasAdesProfile.java +++ b/api/src/main/java/fitconnect/api/domain/metadata/data/EidasAdesProfile.java @@ -18,6 +18,7 @@ public enum EidasAdesProfile { HTTP_URI_ETSI_ORG_ADES_191_X_2_LEVEL_BASELINE_B_T("http://uri.etsi.org/ades/191x2/level/baseline/B-T#"), HTTP_URI_ETSI_ORG_ADES_191_X_2_LEVEL_BASELINE_B_LT("http://uri.etsi.org/ades/191x2/level/baseline/B-LT#"), HTTP_URI_ETSI_ORG_ADES_191_X_2_LEVEL_BASELINE_B_LTA("http://uri.etsi.org/ades/191x2/level/baseline/B-LTA#"); + private final String value; private final static Map<String, EidasAdesProfile> CONSTANTS = new HashMap<>(); diff --git a/api/src/main/java/fitconnect/api/metadata/MetadataService.java b/api/src/main/java/fitconnect/api/metadata/MetadataService.java index e9d674575c767d7e038856084d835fe7a00cd2ff..94a847f081723404cbaf8b00ce5e3914d20f1603 100644 --- a/api/src/main/java/fitconnect/api/metadata/MetadataService.java +++ b/api/src/main/java/fitconnect/api/metadata/MetadataService.java @@ -1,8 +1,23 @@ package fitconnect.api.metadata; +import com.nimbusds.jose.jwk.RSAKey; import fitconnect.api.domain.metadata.Metadata; +import fitconnect.api.domain.metadata.attachment.Attachment; +import fitconnect.api.domain.metadata.data.Data; +import java.util.List; + +/** + * Provides the generation of correct and valid {@link Metadata} for a submission + */ public interface MetadataService { - Metadata createMetadata(); + /** + * + * @param data the actual data payload (json or xml) + * @param attachments list of 0..n attachments as binary data + * @param publicKey the publicKey the data and attachments are encrypted with + * @return Metadata with hashes of the data and attachments to send + */ + Metadata createMetadata(final Data data, final List<Attachment> attachments, final RSAKey publicKey); } diff --git a/api/src/main/java/fitconnect/api/validation/CertificateValidator.java b/api/src/main/java/fitconnect/api/validation/CertificateValidator.java new file mode 100644 index 0000000000000000000000000000000000000000..af35996defdaace136c8a5dad31a7e1128633d0e --- /dev/null +++ b/api/src/main/java/fitconnect/api/validation/CertificateValidator.java @@ -0,0 +1,12 @@ +package fitconnect.api.validation; + +import com.nimbusds.jose.jwk.RSAKey; + +/** + * + * See <a>https://docs.fitko.de/fit-connect/docs/sending/encrypt/#certificateValidation</a> + */ +public interface CertificateValidator { + + ValidationResult validatePublicKey(final RSAKey publicKey); +} diff --git a/api/src/main/java/fitconnect/api/validation/MetadataValidator.java b/api/src/main/java/fitconnect/api/validation/MetadataValidator.java new file mode 100644 index 0000000000000000000000000000000000000000..6c1e3776a30bb950d49a6977a2e8c4936b4cd92a --- /dev/null +++ b/api/src/main/java/fitconnect/api/validation/MetadataValidator.java @@ -0,0 +1,31 @@ +package fitconnect.api.validation; + +import fitconnect.api.domain.metadata.Metadata; +import fitconnect.api.domain.metadata.attachment.Attachment; +import fitconnect.api.domain.metadata.data.Data; + +/** + * A validator that ensure the integrity of the transferred metadata of a submission + */ +public interface MetadataValidator { + + /** + * Validated the metdata against a given schema + * + * @param metadata the current metadata object that is validated + * @param jsonSchema the schema that is used to validate against + * + * @return a validation result with an optional error list + */ + ValidationResult validateMetadataSchema(final Metadata metadata, String jsonSchema); + + /** + * Checks if the message digest hashes of the metadatas {@link Data} and {@link Attachment} + * are correct after transmission + * + * @param metadata the current metadata object that is validated + * + * @return a validation result with an optional error list + */ + ValidationResult validateMetadataHashValues(final Metadata metadata); +} diff --git a/api/src/main/java/fitconnect/api/validation/ValidationResult.java b/api/src/main/java/fitconnect/api/validation/ValidationResult.java index d2a0e7fccce8d57dd39d7772a524ddaad76dcdc5..08bb6eef68a76ee1b7fec6f8faeefce6cb5ee2cf 100644 --- a/api/src/main/java/fitconnect/api/validation/ValidationResult.java +++ b/api/src/main/java/fitconnect/api/validation/ValidationResult.java @@ -1,4 +1,8 @@ package fitconnect.api.validation; -public class ValidationResult { -} +import java.util.List; + +/** + * Wrapper for validations including errors that occurred + */ +public record ValidationResult(boolean isValid, List<Exception> errors) { } diff --git a/impl/src/main/java/fitconnect/impl/SubmissionSender.java b/impl/src/main/java/fitconnect/impl/SubmissionSender.java index 7bdcde0f639912dae211f0310cebe38a4b994a0b..4275afff815c747483b93f539dea16cf9717db7b 100644 --- a/impl/src/main/java/fitconnect/impl/SubmissionSender.java +++ b/impl/src/main/java/fitconnect/impl/SubmissionSender.java @@ -5,15 +5,20 @@ import fitconnect.api.auth.OAuthService; import fitconnect.api.auth.OAuthToken; import fitconnect.api.crypto.EncryptionService; import fitconnect.api.domain.metadata.Metadata; +import fitconnect.api.domain.metadata.attachment.Attachment; +import fitconnect.api.domain.metadata.data.Data; import fitconnect.api.metadata.MetadataService; import fitconnect.api.problems.EncryptionProblem; +import fitconnect.api.validation.CertificateValidator; +import fitconnect.api.validation.ValidationResult; +import java.util.List; import java.util.Optional; /** * A technical system that creates a submission via the FIT-Co Submission API. */ -public class SubmissionSender implements OAuthService, EncryptionService, MetadataService { +public class SubmissionSender implements OAuthService, EncryptionService, MetadataService, CertificateValidator { private final OAuthService authService; private final EncryptionService encryptionService; @@ -39,7 +44,13 @@ public class SubmissionSender implements OAuthService, EncryptionService, Metada } @Override - public Metadata createMetadata() { + public Metadata createMetadata(Data data, List<Attachment> attachments, RSAKey publicKey) { throw new UnsupportedOperationException("not yet implemented"); } + + @Override + public ValidationResult validatePublicKey(final RSAKey publicKey) { + throw new UnsupportedOperationException("not yet implemented"); + } + } diff --git a/impl/src/main/java/fitconnect/impl/SubmissionSubscriber.java b/impl/src/main/java/fitconnect/impl/SubmissionSubscriber.java index e4e1e2f4349f3c16e13631e6586d62048e5a3c7d..e271f2cbd234a44ba3894c85d4f198c14767c573 100644 --- a/impl/src/main/java/fitconnect/impl/SubmissionSubscriber.java +++ b/impl/src/main/java/fitconnect/impl/SubmissionSubscriber.java @@ -4,14 +4,17 @@ import com.nimbusds.jose.jwk.RSAKey; import fitconnect.api.auth.OAuthService; import fitconnect.api.auth.OAuthToken; import fitconnect.api.crypto.DecryptionService; +import fitconnect.api.domain.metadata.Metadata; import fitconnect.api.problems.DecryptionProblem; +import fitconnect.api.validation.MetadataValidator; +import fitconnect.api.validation.ValidationResult; import java.util.Optional; /** * The technical system that accepts submissions on the administration side. */ -public class SubmissionSubscriber implements OAuthService, DecryptionService { +public class SubmissionSubscriber implements OAuthService, DecryptionService, MetadataValidator { private final OAuthService authService; private final DecryptionService decryptionService; @@ -36,4 +39,14 @@ public class SubmissionSubscriber implements OAuthService, DecryptionService { return decryptionService.decryptBytes(privateKey, encryptedData); } + + @Override + public ValidationResult validateMetadataSchema(Metadata metadata, String jsonSchema) { + throw new UnsupportedOperationException("not yet implemented"); + } + + @Override + public ValidationResult validateMetadataHashValues(Metadata metadata) { + throw new UnsupportedOperationException("not yet implemented"); + } }