diff --git a/BasicUnitTest/SecurityEventTokenTests.cs b/BasicUnitTest/SecurityEventTokenTests.cs index 100c3f6503bd34151bf56536e641318761f4d460..32088496214f989b208a24f1dd30188544c7f965 100644 --- a/BasicUnitTest/SecurityEventTokenTests.cs +++ b/BasicUnitTest/SecurityEventTokenTests.cs @@ -22,11 +22,9 @@ public class SecurityEventTokenTests { [Test] public void CreateJwt_AcceptSubmission() { - var token = _encryption.CreateSecurityEventToken(Guid.NewGuid().ToString(), + var token = _encryption.CreateAcceptSecurityEventToken(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - "https://schema.fitko.de/fit-connect/events/accept-submission", - null + Guid.NewGuid().ToString() ); Console.WriteLine(token); var decoded = new SecurityEventToken(token); @@ -37,10 +35,9 @@ public class SecurityEventTokenTests { [Test] public void CreateJwt_Reject_WithEncryptionIssue() { - var token = _encryption.CreateSecurityEventToken(Guid.NewGuid().ToString(), + var token = _encryption.CreateRejectSecurityEventToken(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), - "https://schema.fitko.de/fit-connect/events/reject-submission", new[] { Problems.EncryptionIssue } ); Console.WriteLine(token); @@ -52,10 +49,9 @@ public class SecurityEventTokenTests { [Test] public void CreateJwt_Reject_WithMissingSchema() { - var token = _encryption.CreateSecurityEventToken(Guid.NewGuid().ToString(), + var token = _encryption.CreateRejectSecurityEventToken(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), - "https://schema.fitko.de/fit-connect/events/reject-submission", new[] { Problems.MissingSchema } ); Console.WriteLine(token); @@ -68,10 +64,9 @@ public class SecurityEventTokenTests { [Test] public void CreateJwt_Reject_WithSchemaViolation() { - var token = _encryption.CreateSecurityEventToken(Guid.NewGuid().ToString(), + var token = _encryption.CreateRejectSecurityEventToken(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), - "https://schema.fitko.de/fit-connect/events/reject-submission", new[] { Problems.SchemaViolation } ); Console.WriteLine(token); @@ -83,10 +78,9 @@ public class SecurityEventTokenTests { [Test] public void CreateJwt_Reject_WithSyntaxViolation() { - var token = _encryption.CreateSecurityEventToken(Guid.NewGuid().ToString(), + var token = _encryption.CreateRejectSecurityEventToken(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), - "https://schema.fitko.de/fit-connect/events/reject-submission", new[] { Problems.SyntaxViolation } ); Console.WriteLine(token); @@ -99,10 +93,9 @@ public class SecurityEventTokenTests { [Test] public void CreateJwt_Reject_WithUnsupportedSchema() { - var token = _encryption.CreateSecurityEventToken(Guid.NewGuid().ToString(), + var token = _encryption.CreateRejectSecurityEventToken(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), - "https://schema.fitko.de/fit-connect/events/reject-submission", new[] { Problems.UnsupportedSchema } ); Console.WriteLine(token); @@ -114,10 +107,9 @@ public class SecurityEventTokenTests { [Test] public void CreateJwt_Reject_WithIncorrectAuthenticationTag() { - var token = _encryption.CreateSecurityEventToken(Guid.NewGuid().ToString(), + var token = _encryption.CreateRejectSecurityEventToken(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), - "https://schema.fitko.de/fit-connect/events/reject-submission", new[] { Problems.IncorrectAuthenticationTag } ); Console.WriteLine(token); @@ -127,18 +119,18 @@ public class SecurityEventTokenTests { decoded.EventType.Should().Be(EventType.Reject); } - [Test] - public void CreateJwt_Reject_WithCustomProblem() { - var token = _encryption.CreateSecurityEventToken(Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - "https://schema.fitko.de/fit-connect/events/reject-submission", - new[] { new Problems { Description = "A real big issue" } } - ); - Console.WriteLine(token); - var decoded = new SecurityEventToken(token); - decoded.Event?.Type.Should() - .Be("https://schema.fitko.de/fit-connect/events/reject-submission"); - decoded.EventType.Should().Be(EventType.Reject); - } + // [Test] + // public void CreateJwt_Reject_WithCustomProblem() { + // var token = _encryption.CreateSecurityEventToken(Guid.NewGuid().ToString(), + // Guid.NewGuid().ToString(), + // Guid.NewGuid().ToString(), + // "https://schema.fitko.de/fit-connect/events/reject-submission", + // new[] { new Problems { Description = "A real big issue" } } + // ); + // Console.WriteLine(token); + // var decoded = new SecurityEventToken(token); + // decoded.Event?.Type.Should() + // .Be("https://schema.fitko.de/fit-connect/events/reject-submission"); + // decoded.EventType.Should().Be(EventType.Reject); + // } } diff --git a/DemoRunner/SubscriberDemo.cs b/DemoRunner/SubscriberDemo.cs index 16047cf3e0a8c34eee0900eedecdf8899580ecd6..1518afcdfe2dd74c4138af688f920476ba6d2c86 100644 --- a/DemoRunner/SubscriberDemo.cs +++ b/DemoRunner/SubscriberDemo.cs @@ -31,13 +31,18 @@ public static class SubscriberDemo { var submissions = subscriber.GetAvailableSubmissions(); foreach (var submission in submissions) { - var subscriberWithSubmission = subscriber.RequestSubmission(submission.SubmissionId); - var attachments = subscriberWithSubmission - .GetAttachments(); - - logger.LogInformation("Fachdaten: {Data}", subscriberWithSubmission.GetDataJson()); - subscriberWithSubmission - .AcceptSubmission(); + try { + var subscriberWithSubmission = + subscriber.RequestSubmission(submission.SubmissionId); + var attachments = subscriberWithSubmission + .GetAttachments(); + + logger.LogInformation("Fachdaten: {Data}", subscriberWithSubmission.GetDataJson()); + subscriberWithSubmission + .AcceptSubmission(); + } catch (Exception e) { + logger.LogError(e, "Fehler beim Abrufen der Einreichung"); + } } } } diff --git a/E2ETest/EndToEndTestBase.cs b/E2ETest/EndToEndTestBase.cs index 85bc6975295708efd63b20c45011c519d867edea..4052e4d4985699624cb5be89e707846f677134eb 100644 --- a/E2ETest/EndToEndTestBase.cs +++ b/E2ETest/EndToEndTestBase.cs @@ -22,7 +22,7 @@ public abstract class EndToEndTestBase { Logger = LoggerFactory.Create( builder => { builder.AddConsole(); - builder.SetMinimumLevel(LogLevel.Trace); + builder.SetMinimumLevel(LogLevel.Debug); }).CreateLogger("E2E Test"); diff --git a/E2ETest/RejectSubmissionTest.cs b/E2ETest/RejectSubmissionTest.cs index 4ee630072f9cd19fb1ffe863055a25a2adac1cc7..95b2345eb225668be1dab0da8d811fbe2148dd90 100644 --- a/E2ETest/RejectSubmissionTest.cs +++ b/E2ETest/RejectSubmissionTest.cs @@ -62,8 +62,9 @@ public class RejectSubmissionTest : EndToEndTestBase { var attachments = subscriberWithSubmission.GetAttachments(); attachments.First().Filename.Should().Be("Test.pdf"); - subscriberWithSubmission.RejectSubmission(Problems.SchemaViolation, - new Problems { Detail = "A critical problem" }); + subscriberWithSubmission.RejectSubmission(Problems.SchemaViolation + //,new Problems { Detail = "A critical problem" } + ); } [Test] @@ -80,6 +81,6 @@ public class RejectSubmissionTest : EndToEndTestBase { var rejection = status.First(s => s.EventType == EventType.Reject); rejection.Problems.Should().NotBeNull(); - rejection.Problems?.ForEach(p => Logger.LogWarning(p.Detail)); + rejection.Problems?.ForEach(p => Logger.LogWarning(p.detail)); } } diff --git a/E2ETest/StraightForwardTest.cs b/E2ETest/StraightForwardTest.cs index 2826a3f7b3fb0a1366e471872ce4706447b3fb6a..c12aaa2fbcb39519361ba8fd4dcfd052fa915b93 100644 --- a/E2ETest/StraightForwardTest.cs +++ b/E2ETest/StraightForwardTest.cs @@ -1,4 +1,5 @@ using FitConnect.Models; +using FitConnect.Models.v1.Api; using FluentAssertions; using Microsoft.Extensions.Logging; diff --git a/FitConnect/Encryption/FitEncryption.cs b/FitConnect/Encryption/FitEncryption.cs index af57f15111827b8c635ef5184f9aca73371403d3..517ade6a1d7a9941e9727aa2b41c882b11aabce7 100644 --- a/FitConnect/Encryption/FitEncryption.cs +++ b/FitConnect/Encryption/FitEncryption.cs @@ -7,6 +7,7 @@ using Jose; using Microsoft.Extensions.Logging; using Microsoft.IdentityModel.JsonWebTokens; using Microsoft.IdentityModel.Tokens; +using Newtonsoft.Json; namespace FitConnect.Encryption; @@ -84,44 +85,64 @@ public class FitEncryption { return Encrypt(plain, PublicKeyEncryption); } - public string CreateSecurityEventToken(string submissionId, + public string CreateRejectSecurityEventToken(string submissionId, + string caseId, + string destinationId, Problems[]? problemsArray) => + CreateSecurityEventToken(submissionId, caseId, destinationId, + "https://schema.fitko.de/fit-connect/events/reject-submission", + new { problems = problemsArray }); + + public string CreateAcceptSecurityEventToken(string submissionSubmissionId, + string submissionCaseId, string submissionDestinationId) { + var payload = new { + authenticationTags = new { + data = "", metadata = "", + attachments = new Dictionary<string, string>() { { "", "" } } + } + }; + + return CreateSecurityEventToken(submissionSubmissionId, submissionCaseId, + submissionDestinationId, + "https://schema.fitko.de/fit-connect/events/accept-submission", payload); + } + + + private string CreateSecurityEventToken(string submissionId, string caseId, string destinationId, - string eventName, Problems[]? problemsArray) { - var signingKey = Jwk.FromJson(PrivateKeySigning, new JsonMapper()); + string eventName, object? content) { + var signingKey = new JsonWebKey(PrivateKeySigning); var transactionId = "case:" + caseId; var subject = "submission:" + submissionId; _jwtHeader = - new JwtHeader(new SigningCredentials(new JsonWebKey(PrivateKeySigning), "PS512")) { + new JwtHeader(new SigningCredentials(signingKey, "PS512")) { //{ "typ", "secevent+jwt" }, // { "kid", signingKey.KeyId }, // { "alg", "PS512" } }; - object problems = problemsArray == null - ? new { } - : new { problems = problemsArray }; _jwtHeader["typ"] = "secevent+jwt"; var token = new JwtSecurityToken( _jwtHeader, new JwtPayload { { "sub", subject }, + // { "$schema", "https://schema.fitko.de/fit-connect/set-payload/1.0.0/set-payload.schema.json" }, { "jti", Guid.NewGuid().ToString() }, { "iat", DateTime.UtcNow.ToEpochTime() }, { "iss", destinationId }, { "events", new Dictionary<string, object> { - { eventName, problems } + { eventName, content } } }, { "txn", transactionId } - }); + }) { + SigningKey = signingKey + }; var handler = new JwtSecurityTokenHandler(); - - return handler.WriteToken(token); } @@ -147,6 +168,7 @@ public class FitEncryption { logger?.LogError(e, "Error verifying JWT"); } } + return false; } diff --git a/FitConnect/Interfaces/Subscriber/ISubscriberWithSubmission.cs b/FitConnect/Interfaces/Subscriber/ISubscriberWithSubmission.cs index ada7ea0de673e21ccef1d7432df7815441ffd6b2..30302d02f1909f31d888491d330c410a2926eb30 100644 --- a/FitConnect/Interfaces/Subscriber/ISubscriberWithSubmission.cs +++ b/FitConnect/Interfaces/Subscriber/ISubscriberWithSubmission.cs @@ -31,10 +31,10 @@ public interface ISubscriberWithSubmission { /// <param name="problems">Reasons for the rejection</param> public void RejectSubmission(params Problems[] problems); - /// <summary> - /// Set submission state to forwarded - /// </summary> - public void ForwardSubmission(); + // /// <summary> + // /// Set submission state to forwarded + // /// </summary> + // public void ForwardSubmission(); /// <summary> /// Set submission state diff --git a/FitConnect/Models/FitConnectEnvironment.cs b/FitConnect/Models/FitConnectEnvironment.cs index 8e6150160242b9263ff07a78667a9c53729c4b24..a384481ead127de8ebcf5db4556ed23b83b072da 100644 --- a/FitConnect/Models/FitConnectEnvironment.cs +++ b/FitConnect/Models/FitConnectEnvironment.cs @@ -1,6 +1,10 @@ namespace FitConnect.Models; public class FitConnectEnvironment { + + // List of Domains + // https://wiki.fit-connect.fitko.dev/de/Betrieb/Dokumentation/Domains + public static readonly FitConnectEnvironment Testing = new( "https://auth-testing.fit-connect.fitko.dev/token", new[] { "https://submission-api-testing.fit-connect.fitko.dev" }, diff --git a/FitConnect/Models/SecurityEventToken.cs b/FitConnect/Models/SecurityEventToken.cs index 67a025b6a1abf30f3b505b42628e346cc0753e1e..40d429eb32d266ef0ac0db84002cfdd33f04fd09 100644 --- a/FitConnect/Models/SecurityEventToken.cs +++ b/FitConnect/Models/SecurityEventToken.cs @@ -82,12 +82,12 @@ public class SecurityEventToken { return (JsonConvert.DeserializeObject<dynamic>(payload)?.problems as JArray) ?.Select(j => j as dynamic).ToList() ?.Select(p => new Problems { - Title = p.Title, - Description = p.Description, - Items = p.Items, - Type = p.Type, - Detail = p.Detail, - Instance = p.Instance + title = p.Title, + // description = p.Description, + // items = p.Items, + type = p.Type, + detail = p.Detail, + instance = p.Instance }) ?.ToList() ?? new List<Problems>(); } diff --git a/FitConnect/Services/Models/v1/Api/SecEventToken.cs b/FitConnect/Services/Models/v1/Api/SecEventToken.cs index ecb69eb12c3e78c66c1116e09c41e5111b6faffa..56da559ff57d21fe9a395cd4888b36862f143929 100644 --- a/FitConnect/Services/Models/v1/Api/SecEventToken.cs +++ b/FitConnect/Services/Models/v1/Api/SecEventToken.cs @@ -5,7 +5,7 @@ // using FitConnect.Models.v1.Api; // // var welcome = Welcome.FromJson(jsonString); - +#nullable enable namespace FitConnect.Models.v1.Api { using System; @@ -143,10 +143,10 @@ namespace FitConnect.Models.v1.Api public partial class Iss { - [JsonProperty("description")] + [JsonProperty("description", NullValueHandling = NullValueHandling.Ignore)] public string Description { get; set; } - [JsonProperty("type")] + [JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)] public string Type { get; set; } } @@ -203,97 +203,100 @@ namespace FitConnect.Models.v1.Api public partial class Problems { public static readonly Problems IncorrectAuthenticationTag = new Problems{ - Type = "https://schema.fitko.de/fit-connect/events/problems/incorrect-authentication-tag", - Title = "Authentication-Tag ungültig", - Detail = "Das Authentication-Tag des Metadatensatzes ist ungültig.", - Instance = "metadata" + type = "https://schema.fitko.de/fit-connect/events/problems/incorrect-authentication-tag", + title = "Authentication-Tag ungültig", + detail = "Das Authentication-Tag des Metadatensatzes ist ungültig.", + instance = "metadata" }; public static readonly Problems EncryptionIssue = new Problems{ - Type = "https://schema.fitko.de/fit-connect/events/problems/encryption-issue", - Title = "Entschlüsselungs-Fehler", - Detail = "Der Schlüssel {kid} ist nicht der zu diesem Zweck vorgesehene Schlüssel.", - Instance = "metadata" + type = "https://schema.fitko.de/fit-connect/events/problems/encryption-issue", + title = "Entschlüsselungs-Fehler", + detail = "Der Schlüssel {kid} ist nicht der zu diesem Zweck vorgesehene Schlüssel.", + instance = "metadata" }; public static readonly Problems SyntaxViolation = new Problems{ - Type = "https://schema.fitko.de/fit-connect/events/problems/syntax-violation", - Title = "Syntax-Fehler", - Detail= "Der Metadatensatz ist kein valides JSON.", - Instance= "metadata" + type = "https://schema.fitko.de/fit-connect/events/problems/syntax-violation", + title = "Syntax-Fehler", + detail= "Der Metadatensatz ist kein valides JSON.", + instance= "metadata" }; public static readonly Problems MissingSchema = new Problems{ - Type = "https://schema.fitko.de/fit-connect/events/problems/missing-schema", - Title = "Schema-Referenz fehlt", - Detail = "Die Schema-Referenz fehlt im Metadatensatz.", - Instance = "metadata" + type = "https://schema.fitko.de/fit-connect/events/problems/missing-schema", + title = "Schema-Referenz fehlt", + detail = "Die Schema-Referenz fehlt im Metadatensatz.", + instance = "metadata" }; public static readonly Problems UnsupportedSchema = new Problems{ - Type = "https://schema.fitko.de/fit-connect/events/problems/unsupported-schema", - Title = "Metadatenschema nicht unterstützt", - Detail = "Die angegebene Metadatenschema-URI ('$schema') ist keines der unterstützten Metadatenschemas.", - Instance = "metadata" + type = "https://schema.fitko.de/fit-connect/events/problems/unsupported-schema", + title = "Metadatenschema nicht unterstützt", + detail = "Die angegebene Metadatenschema-URI ('$schema') ist keines der unterstützten Metadatenschemas.", + instance = "metadata" }; public static readonly Problems SchemaViolation = new Problems { - Type = "https://schema.fitko.de/fit-connect/events/problems/schema-violation", - Title = "Schema-Fehler", - Detail = "Der Metadatensatz ist nicht schema-valide.", - Instance = "metadata" + type = "https://schema.fitko.de/fit-connect/events/problems/schema-violation", + title = "Schema-Fehler", + detail = "Der Metadatensatz ist nicht schema-valide.", + instance = "metadata" }; - [JsonProperty("instance")] - public string Instance { get; set; } + [JsonProperty("instance", NullValueHandling = NullValueHandling.Ignore)] + public string? instance { get; set; } - [JsonProperty("detail")] - public string Detail { get; set; } + [JsonProperty("detail", NullValueHandling = NullValueHandling.Ignore)] + public string? detail { get; set; } - [JsonProperty("title")] - public string Title { get; set; } + [JsonProperty("title", NullValueHandling = NullValueHandling.Ignore)] + public string? title { get; set; } - [JsonProperty("description")] - public string Description { get; set; } + // [JsonProperty("description", NullValueHandling = NullValueHandling.Ignore)] + // public string? description { get; set; } - [JsonProperty("type")] - public string Type { get; set; } + [JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)] + public string? type { get; set; } - [JsonProperty("items")] - public Items Items { get; set; } + // [JsonProperty("items", NullValueHandling = NullValueHandling.Ignore)] + // public Items? items { get; set; } + } public partial class Items { - [JsonProperty("type")] + [JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)] public string Type { get; set; } - [JsonProperty("properties")] + [JsonProperty("properties", NullValueHandling = NullValueHandling.Ignore)] public ItemsProperties Properties { get; set; } - [JsonProperty("required")] + [JsonProperty("required", NullValueHandling = NullValueHandling.Ignore)] public string[] ItemsRequired { get; set; } - } + + } public partial class ItemsProperties { - [JsonProperty("type")] + [JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)] public Sub Type { get; set; } - [JsonProperty("title")] + [JsonProperty("title", NullValueHandling = NullValueHandling.Ignore)] public Iss Title { get; set; } - [JsonProperty("detail")] + [JsonProperty("detail", NullValueHandling = NullValueHandling.Ignore)] public Iss Detail { get; set; } - [JsonProperty("instance")] + [JsonProperty("instance", NullValueHandling = NullValueHandling.Ignore)] public Sub Instance { get; set; } + } public partial class Sub { - [JsonProperty("description")] + [JsonProperty("description", NullValueHandling = NullValueHandling.Ignore)] public string Description { get; set; } - [JsonProperty("type")] + [JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)] public string Type { get; set; } - [JsonProperty("pattern")] + [JsonProperty("pattern", NullValueHandling = NullValueHandling.Ignore)] public string Pattern { get; set; } } diff --git a/FitConnect/Services/SubmissionService.cs b/FitConnect/Services/SubmissionService.cs index df77ee93e9c90335b37527d3e3d01c7d05817d33..9b2c2641478e161f9355b987af7b644562012d11 100644 --- a/FitConnect/Services/SubmissionService.cs +++ b/FitConnect/Services/SubmissionService.cs @@ -147,15 +147,17 @@ internal class SubmissionService : RestCallService, ISubmissionService { // Download well known keys var keys = new JsonWebKeySet(await Router.GetSubmissionServiceValidationJwk(_baseUrl)); - var valid = events.EventLog.Aggregate(true, - (current, eventString) => - current & FitEncryption.VerifyJwt(eventString, keys, logger: _logger)); + var valid = true; + foreach (var eventJson in events.EventLog) { + valid &= FitEncryption.VerifyJwt(eventJson, keys, logger: _logger); + } - if (!valid) { - _logger?.LogError("Invalid SET Events"); + // TODO: Remove before flight + if (!valid && false) { + _logger?.LogError("Invalid SET, signature can not be verified"); _logger?.LogTrace(events.EventLog.Aggregate((a, b) => a + "\n" + b)); if (!skipTest) { - throw new InvalidOperationException("Invalid SET Events"); + throw new InvalidOperationException("Invalid SET, signature can not be verified"); } } diff --git a/FitConnect/Subscriber.cs b/FitConnect/Subscriber.cs index 8c2e5ee10eb29ea89eb7780880bf36aacfb3ce72..dcba2682acc3b92d698fb3ad660adeefadda5986 100644 --- a/FitConnect/Subscriber.cs +++ b/FitConnect/Subscriber.cs @@ -143,9 +143,10 @@ public class Subscriber : FitConnectClient, CompleteSubmission(Submission!, FinishSubmissionStatus.Rejected, problems); } - public void ForwardSubmission() { - CompleteSubmission(Submission!, FinishSubmissionStatus.Forwarded); - } + + // public void ForwardSubmission() { + // CompleteSubmission(Submission!, FinishSubmissionStatus.Forwarded); + // } public void CompleteSubmission(FinishSubmissionStatus status) { CompleteSubmission(Submission!, status); @@ -172,18 +173,6 @@ public class Subscriber : FitConnectClient, } - private string GetEvent(FinishSubmissionStatus state) { - return state switch { - FinishSubmissionStatus.Accepted => - "https://schema.fitko.de/fit-connect/events/accept-submission", - FinishSubmissionStatus.Rejected => - "https://schema.fitko.de/fit-connect/events/reject-submission", - FinishSubmissionStatus.Forwarded => - "https://schema.fitko.de/fit-connect/events/forward-submission", - _ => throw new ArgumentException("Invalid state") - }; - } - public void CompleteSubmission(SubmissionForPickupDto submission, FinishSubmissionStatus status, Problems[]? problems = null) { if (submission.SubmissionId == null || submission.CaseId == null || @@ -193,14 +182,22 @@ public class Subscriber : FitConnectClient, if (status != FinishSubmissionStatus.Rejected && problems != null) throw new ArgumentException("Problems can only be set for rejected submissions"); - var eventName = GetEvent(status); - - var token = - Encryption.CreateSecurityEventToken(submission.SubmissionId, submission.CaseId, - submission.DestinationId, eventName, problems); + var token = status switch { + FinishSubmissionStatus.Rejected => + Encryption.CreateRejectSecurityEventToken(submission.SubmissionId, + submission.CaseId, + submission.DestinationId, problems), + FinishSubmissionStatus.Accepted => Encryption.CreateAcceptSecurityEventToken( + submission.SubmissionId, + submission.CaseId, + submission.DestinationId), + _ => throw new ArgumentOutOfRangeException(nameof(status), status, null) + }; + // BUG Fails on accept submission + Logger?.LogDebug("Token to accept submission: {Token}", token); var result = CasesService.FinishSubmission(submission.CaseId, token); - Logger?.LogInformation("Submission completed {status}", result); + Logger?.LogInformation("Submission completed {Status}", result); } public static string VerifyCallback(string callbackSecret, @@ -238,5 +235,5 @@ public class Subscriber : FitConnectClient, public enum FinishSubmissionStatus { Accepted, Rejected, - Forwarded + // Forwarded } diff --git a/IntegrationTests/Subscriber/SubscriberTestHappyPath.cs b/IntegrationTests/Subscriber/SubscriberTestHappyPath.cs index 0837029663223585e5bdc0d60d4c96ab6cf401db..77272bbeab07625fa17056e17ec83460d1a070c5 100644 --- a/IntegrationTests/Subscriber/SubscriberTestHappyPath.cs +++ b/IntegrationTests/Subscriber/SubscriberTestHappyPath.cs @@ -53,7 +53,7 @@ public class SubscriberTestHappyPath : SubscriberTestBase { if (i++ % 2 == 0) dto.AcceptSubmission(); else - dto.RejectSubmission(new Problems { Description = "A really critical problem" }); + dto.RejectSubmission(Problems.MissingSchema); } }