diff --git a/src/WireMock.Net.Abstractions/Models/IDigitalSignature.cs b/src/WireMock.Net.Abstractions/Models/IDigitalSignature.cs new file mode 100644 index 00000000..843b0018 --- /dev/null +++ b/src/WireMock.Net.Abstractions/Models/IDigitalSignature.cs @@ -0,0 +1,41 @@ +// Copyright © WireMock.Net + +using System.Threading.Tasks; +using WireMock.Util; + +namespace WireMock.Models; + +/// +/// A delegate encapsulating logic for fetching or generating a private key. +/// +/// An async task containing the value of the private key. +public delegate Task PrivateKeyCallback(); + +/// +/// A delegate encapsulating logic for fetching or generating a digital signature. +/// +/// The value of the private key returned by . +/// The body data associated with the request. +/// An async task containing the value of the digital signature. +public delegate Task DigitalSignatureCallback(string privateKey, IBodyData? bodyData); + +/// +/// An interface encapsulating logic for generating a digital signature. +/// +public interface IDigitalSignature +{ + /// + /// The header name to use for the digital signature. + /// + string HeaderName { get; set; } + + /// + /// The callback used to fetch or generate the private key. + /// + PrivateKeyCallback PrivateKeyCallback { get; set; } + + /// + /// The callback used to fetch or generate the digital signature. + /// + DigitalSignatureCallback DigitalSignatureCallback { get; set; } +} \ No newline at end of file diff --git a/src/WireMock.Net.Abstractions/Models/IWebhookRequest.cs b/src/WireMock.Net.Abstractions/Models/IWebhookRequest.cs index 5acee5e0..54380e1d 100644 --- a/src/WireMock.Net.Abstractions/Models/IWebhookRequest.cs +++ b/src/WireMock.Net.Abstractions/Models/IWebhookRequest.cs @@ -60,4 +60,14 @@ public interface IWebhookRequest /// Gets or sets the maximum random delay in milliseconds. /// int? MaximumRandomDelay { get; set; } + + /// + /// Gets or sets the value used to determine if digital signatures are generated. + /// + bool? UseDigitalSignatures { get; set; } + + /// + /// Gets or sets the values used generate digital signatures. + /// + IDigitalSignature[]? DigitalSignatures { get; set; } } \ No newline at end of file diff --git a/src/WireMock.Net/Http/WebhookSender.cs b/src/WireMock.Net/Http/WebhookSender.cs index 95947e45..fe7e0288 100644 --- a/src/WireMock.Net/Http/WebhookSender.cs +++ b/src/WireMock.Net/Http/WebhookSender.cs @@ -78,6 +78,31 @@ IResponseMessage originalResponseMessage webhookRequestUrl = webhookRequest.Url; } + // Add digital signatures to header (if required) + if (webhookRequest.UseDigitalSignatures == true) + { + if (webhookRequest.DigitalSignatures is not null) + { + foreach (var digitalSignature in webhookRequest.DigitalSignatures) + { + var privateKey = await digitalSignature.PrivateKeyCallback(); + var signature = await digitalSignature.DigitalSignatureCallback(privateKey, bodyData); + + // headers may be null here + headers ??= new Dictionary>(); + + if (headers.ContainsKey(digitalSignature.HeaderName)) + { + headers[digitalSignature.HeaderName].Add(signature); + } + else + { + headers[digitalSignature.HeaderName] = new WireMockList(signature); + } + } + } + } + // Create RequestMessage var requestMessage = new RequestMessage( new UrlDetails(webhookRequestUrl), diff --git a/src/WireMock.Net/Models/DigitalSignature.cs b/src/WireMock.Net/Models/DigitalSignature.cs new file mode 100644 index 00000000..5bec6880 --- /dev/null +++ b/src/WireMock.Net/Models/DigitalSignature.cs @@ -0,0 +1,20 @@ +// Copyright © WireMock.Net + +using System.Threading.Tasks; + +namespace WireMock.Models; + +/// +/// A class encapsulating logic for generating a digital signature. +/// +public class DigitalSignature : IDigitalSignature +{ + /// + public string HeaderName { get; set; } = ""; + + /// + public PrivateKeyCallback PrivateKeyCallback { get; set; } = async () => await Task.FromResult(""); + + /// + public DigitalSignatureCallback DigitalSignatureCallback { get; set; } = async (privateKey, bodyData) => await Task.FromResult(""); +} diff --git a/src/WireMock.Net/Models/WebhookRequest.cs b/src/WireMock.Net/Models/WebhookRequest.cs index 9c6e0978..062618f5 100644 --- a/src/WireMock.Net/Models/WebhookRequest.cs +++ b/src/WireMock.Net/Models/WebhookRequest.cs @@ -40,4 +40,10 @@ public class WebhookRequest : IWebhookRequest /// public int? MaximumRandomDelay { get; set; } + + /// + public bool? UseDigitalSignatures { get; set; } + + /// + public IDigitalSignature[]? DigitalSignatures { get; set; } } \ No newline at end of file