diff --git a/FitConnect/Encryption/CertificateHelper.cs b/FitConnect/Encryption/CertificateHelper.cs index ed2ddca504f3054bbe5b122f404c8e8f1c38b7f5..132dad52e6a420821b634501fd7972691b163ff8 100644 --- a/FitConnect/Encryption/CertificateHelper.cs +++ b/FitConnect/Encryption/CertificateHelper.cs @@ -24,7 +24,7 @@ public class CertificateHelper { LogLevel logLevel = LogLevel.Warning) { var certificateChain = new X509Chain(); - certificate.ExportToPem($"./temp/{Guid.NewGuid().ToString()}.pem"); + // certificate.ExportToPem($"./temp/{Guid.NewGuid().ToString()}.pem"); _logger?.LogDebug("Issuers: {Issuer}", certificate.Issuer); if (rootCertificate != null) { @@ -64,11 +64,11 @@ public class CertificateHelper { var certificates = key.X5c.Select(s => new X509Certificate2(Convert.FromBase64String(s))) .ToList(); - if (certificates.Count != 3) { - _logger?.Log(logLevel, "Found {Count} certificate(s) but should be 3", - certificates.Count); - return false; - } + // if (certificates.Count != 3) { + // _logger?.Log(logLevel, "Found {Count} certificate(s) but should be 3", + // certificates.Count); + // return false; + // } // root ??= new X509Certificate2(Convert.FromBase64String(key.X5t)); diff --git a/FitConnect/Encryption/FitEncryption.cs b/FitConnect/Encryption/FitEncryption.cs index 4d7ad1b755ba42b0dddca1e091b3f561df097f93..4975ed142f25316c18ce1b3f94aecfe7e4ca9d20 100644 --- a/FitConnect/Encryption/FitEncryption.cs +++ b/FitConnect/Encryption/FitEncryption.cs @@ -97,7 +97,7 @@ public class FitEncryption { _logger?.LogInformation("Generating authentication tags"); var attachmentDictionary = new Dictionary<string, string>(); submission.Attachments.ForEach(a => - attachmentDictionary.Add(a.Id, a.AttachmentAuthentication)); + attachmentDictionary.Add(a.Id, a.AttachmentAuthentication!)); if (submission.Data != null) return new { diff --git a/FitConnect/Interfaces/Subscriber/ISubscriber.cs b/FitConnect/Interfaces/Subscriber/ISubscriber.cs index 2f6c2489409826aafe2847d9413a3fef07541359..2f3b0520aa008b362a9b4d71cbd4d9953ffc64e6 100644 --- a/FitConnect/Interfaces/Subscriber/ISubscriber.cs +++ b/FitConnect/Interfaces/Subscriber/ISubscriber.cs @@ -20,6 +20,6 @@ public interface ISubscriber : IFitConnectClient { /// <param name="submissionId">unique identifier of a <see cref="Submission" /></param> /// <param name="skipSchemaTest"></param> /// <returns>A subscriber object with a submission</returns> - public ISubscriberWithSubmission RequestSubmission(string? submissionId, + public ISubscriberWithSubmission RequestSubmission(string submissionId, bool skipSchemaTest = false); } diff --git a/FitConnect/Models/Attachment.cs b/FitConnect/Models/Attachment.cs index 5450e7f35990ba68513bb19355b912d8bb3aac77..88cdc74a7c7f13e0279dd7f47f13f441c8b8cfa9 100644 --- a/FitConnect/Models/Attachment.cs +++ b/FitConnect/Models/Attachment.cs @@ -44,7 +44,7 @@ public class Attachment { public string Id { get; } = Guid.NewGuid().ToString(); public byte[]? Content { get; init; } - public string AttachmentAuthentication { get; } + public string? AttachmentAuthentication { get; } public string? Hash => CalculateHash(); diff --git a/FitConnect/Models/Submission.cs b/FitConnect/Models/Submission.cs index c3027214c7ec3f28b906eaef6c649f05d0dbd4a7..b8792a1d46a3790e20986c32dc9b4a42afad5ee0 100644 --- a/FitConnect/Models/Submission.cs +++ b/FitConnect/Models/Submission.cs @@ -5,8 +5,8 @@ using FitConnect.Services.Models.v1.Submission; namespace FitConnect.Models; public class Submission { - public string? Id { get; set; } - public string? CaseId { get; set; } + public string Id { get; set; } = null!; + public string CaseId { get; set; } = null!; public Destination Destination { get; set; } = new(); public string DestinationId { diff --git a/FitConnect/Services/Models/ServiceTypeDto.cs b/FitConnect/Services/Models/ServiceTypeDto.cs index 4a2b55f2b758148d3af08b37f39ce58496e3bc7b..25591062ac054a093237cb3654ccc6ad84a7dd1b 100644 --- a/FitConnect/Services/Models/ServiceTypeDto.cs +++ b/FitConnect/Services/Models/ServiceTypeDto.cs @@ -15,11 +15,11 @@ public class ServiceTypeDto { public class AcceptanceStatus { [JsonProperty("metadata")] - public string Metadata { get; set; } + public string? Metadata { get; set; } [JsonProperty("data")] - public string Data { get; set; } + public string? Data { get; set; } [JsonProperty("attachments")] - public Dictionary<string, string> Attachments { get; set; } + public Dictionary<string, string> Attachments { get; set; } = new Dictionary<string, string>(); } diff --git a/FitConnect/Services/Models/v1/Submission/SubmissionCreatedDto.cs b/FitConnect/Services/Models/v1/Submission/SubmissionCreatedDto.cs index fa607ae2dfa44a67008a0052ee68f75abd6d6fb8..048c3490e83081d74952465691e80bf56f4b0026 100644 --- a/FitConnect/Services/Models/v1/Submission/SubmissionCreatedDto.cs +++ b/FitConnect/Services/Models/v1/Submission/SubmissionCreatedDto.cs @@ -4,11 +4,11 @@ namespace FitConnect.Services.Models.v1.Submission; public class SubmissionCreatedDto { [JsonProperty("destinationId")] - public string? DestinationId { get; set; } + public string DestinationId { get; set; } = null!; [JsonProperty("submissionId")] - public string? SubmissionId { get; set; } + public string SubmissionId { get; set; } = null!; [JsonProperty("caseId")] - public string? CaseId { get; set; } + public string CaseId { get; set; } = null!; } diff --git a/FitConnect/Services/Models/v1/Submission/SubmissionDto.cs b/FitConnect/Services/Models/v1/Submission/SubmissionDto.cs index 9a4f1aa1c17a3796cb435cc7ee5a6022597931de..1c0e3be45e4188ee8111f9434a463cf4491388c4 100644 --- a/FitConnect/Services/Models/v1/Submission/SubmissionDto.cs +++ b/FitConnect/Services/Models/v1/Submission/SubmissionDto.cs @@ -12,10 +12,10 @@ public class SubmissionDto { [JsonProperty("caseId")] - public string? CaseId { get; set; } + public string CaseId { get; set; } = null!; [JsonProperty("destinationId")] - public string? DestinationId { get; set; } + public string DestinationId { get; set; } = null!; [JsonProperty("encryptedData")] @@ -31,5 +31,5 @@ public class SubmissionDto { [JsonProperty("submissionId")] - public string? SubmissionId { get; set; } + public string SubmissionId { get; set; } = null!; } diff --git a/FitConnect/Services/Models/v1/Submission/SubmissionForPickupDto.cs b/FitConnect/Services/Models/v1/Submission/SubmissionForPickupDto.cs index a3106e65e80ac8c9a405ff5a92b99f8627a1e22b..c1a7911aacd32b07f4bf7427993e173b18ad1523 100644 --- a/FitConnect/Services/Models/v1/Submission/SubmissionForPickupDto.cs +++ b/FitConnect/Services/Models/v1/Submission/SubmissionForPickupDto.cs @@ -10,5 +10,5 @@ public class SubmissionForPickupDto { public string? DestinationId { get; set; } [JsonProperty("submissionId")] - public string? Id { get; set; } + public string Id { get; set; } = null!; } diff --git a/FitConnect/Subscriber.cs b/FitConnect/Subscriber.cs index 1635bc5b9cb6db2d470318bfa19ddff327e92aba..40e6e839b31d225fd445395d3aeeeb299828cda4 100644 --- a/FitConnect/Subscriber.cs +++ b/FitConnect/Subscriber.cs @@ -15,6 +15,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using NJsonSchema; +using NJsonSchema.Annotations; using NJsonSchema.Validation; using Metadata = FitConnect.Models.Api.Metadata.Metadata; @@ -82,7 +83,7 @@ public class Subscriber : FitConnectClient, public ISubscriberWithSubmission RequestSubmission(string submissionId, bool skipSchemaTest = false) { var submission = (Submission)SubmissionService.GetSubmission(submissionId); - var (metaDataString, _, metaHash) = Encryption.Decrypt(submission.EncryptedMetadata); + var (metaDataString, _, metaHash) = Encryption.Decrypt(submission.EncryptedMetadata!); if (!skipSchemaTest) { var valid = JsonHelper.VerifyMetadata(metaDataString); diff --git a/IntegrationTests/CertificateValidation.cs b/IntegrationTests/CertificateValidation.cs index 67fd47f630cc6bcd29d856e0469ec54304e23a49..7a26e50a8bff96bb44352117d7066bd4f2a44103 100644 --- a/IntegrationTests/CertificateValidation.cs +++ b/IntegrationTests/CertificateValidation.cs @@ -23,7 +23,6 @@ public class CertificateValidation { private MockSettings _settings = null!; private ILogger _logger = null!; private CertificateHelper _certificateHelper = null!; - private Mock<ILogger> _mockLogger = null!; [SetUp] public void Setup() { @@ -48,7 +47,7 @@ public class CertificateValidation { _settings.SenderClientSecret, _logger); - var certificate = (sender as FitConnect.Sender) + var certificate = (sender as FitConnect.Sender)! .GetPublicKeyFromDestination(_settings.DestinationId).Result; new CertificateHelper(_logger).ValidateCertificate(JsonWebKey.Create(certificate), LogLevel.Trace); @@ -61,7 +60,7 @@ public class CertificateValidation { _settings.SenderClientSecret, _logger); - var certificate = (sender as FitConnect.Sender) + var certificate = (sender as FitConnect.Sender)! .GetPublicKeyFromDestination(_settings.DestinationId).Result; new CertificateHelper(_logger).ValidateCertificate(JsonWebKey.Create(certificate), LogLevel.Trace); @@ -81,7 +80,7 @@ public class CertificateValidation { .WithServiceType("", _settings.LeikaKey) .WithAttachments(new Attachment("Test.pdf", "Simple Test PDF")) .Submit(); - }).InnerExceptions.Any(e => e.GetType() == typeof(SecurityException)); + })!.InnerExceptions.Any(e => e.GetType() == typeof(SecurityException)).Should().BeTrue(); } [Test] @@ -97,7 +96,7 @@ public class CertificateValidation { .WithServiceType("", _settings.LeikaKey) .WithAttachments(new Attachment("Test.pdf", "Simple Test PDF")) .Submit(); - }).InnerExceptions.Any(e => e.GetType() == typeof(SecurityException)); + })!.InnerExceptions.Any(e => e.GetType() == typeof(SecurityException)).Should().BeTrue(); } [Test] @@ -159,12 +158,9 @@ public class CertificateValidation { var shouldFail = !fileName.Contains("/valid"); var jwk = new JsonWebKey(File.ReadAllText(fileName)); var valid = _certificateHelper.ValidateCertificate(jwk, - shouldFail ? LogLevel.Warning : LogLevel.Critical, new[] { - new X509Certificate2("./certificates/root.pem"), - new X509Certificate2("./certificates/ca.30244.der"), - new X509Certificate2("./certificates/ca.26305.der"), - new X509Certificate2("./certificates/ca.26281.der") - }); + shouldFail ? LogLevel.Warning : LogLevel.Critical, + Directory.GetFiles("./certificates/roots") + .Select(file => new X509Certificate2(file)).ToArray()); if (shouldFail) valid = !valid; diff --git a/IntegrationTests/IntegrationTests.csproj b/IntegrationTests/IntegrationTests.csproj index 6ffb71a77899ebf01aebf25db372b787fd40d3c1..567f9503d482b4017bb248ab89f7db83e4b7fe98 100644 --- a/IntegrationTests/IntegrationTests.csproj +++ b/IntegrationTests/IntegrationTests.csproj @@ -48,28 +48,58 @@ <None Update="certificates\revokedEncJWK.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> - <None Update="certificates\root.pem"> + <None Update="certificates\ca.30244.der"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> - <None Update="certificates\ca.30244.der"> + <None Update="temp\readme.md"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> - <None Update="certificates\ca.30244.der"> + <None Update="certificates\invalidEncJwkWithLessThan3Certificates.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> - <None Update="temp\readme.md"> + <None Update="certificates\ca.26281.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\ca.26305.der"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> - <None Update="certificates\ca.21636.der"> + <None Update="certificates\roots\ca.21636.der"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> - <None Update="certificates\invalidEncJwkWithLessThan3Certificates.json"> + <None Update="certificates\roots\ca.30244.der"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> - <None Update="certificates\ca.26281.der"> + <None Update="certificates\roots\root.pem"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> - <None Update="certificates\ca.26305.der"> + <None Update="certificates\roots\ca.17478.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.29249.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.29267.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.29284.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.29302.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.29319.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.29336.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.29353.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.29370.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.29387.der"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> </ItemGroup> diff --git a/IntegrationTests/Sender/ThreadTest.cs b/IntegrationTests/Sender/ThreadTest.cs index 9de0bf1d2eacc495e89f8bb00e1fa5b3f777caef..2588b1db76c0418696901346514e9156392bab15 100644 --- a/IntegrationTests/Sender/ThreadTest.cs +++ b/IntegrationTests/Sender/ThreadTest.cs @@ -75,7 +75,7 @@ public class ThreadTest { foreach (var submission in submissions) subscriber - .RequestSubmission(submission.Id) + .RequestSubmission(submission.Id!) .AcceptSubmission(); submissions.Count.Should().Be(NumberOfThreads); diff --git a/IntegrationTests/Subscriber/SubscriberTestHappyPath.cs b/IntegrationTests/Subscriber/SubscriberTestHappyPath.cs index 34917379c86191992e036e65eb68996e4582a5c9..9255aed0061d7c5af65a71c18052bac6d2a418b9 100644 --- a/IntegrationTests/Subscriber/SubscriberTestHappyPath.cs +++ b/IntegrationTests/Subscriber/SubscriberTestHappyPath.cs @@ -42,7 +42,7 @@ public class SubscriberTestHappyPath : SubscriberTestBase { var submissions = Subscriber.GetAvailableSubmissions().ToList(); submissions.Count().Should().BeGreaterThan(0); var i = 0; - foreach (var submissionId in submissions.Select(s => s.Id)) { + foreach (var submissionId in submissions.Select(s => s.Id!)) { // Act Console.WriteLine($"Getting submission {submissionId}"); var dto = Subscriber.RequestSubmission(submissionId);