diff --git a/EnvelopeGenerator.Application/Common/Dto/PdfSignOptionsDto.cs b/EnvelopeGenerator.Application/Common/Dto/PdfSignOptionsDto.cs index 70bf3ac5..104e2537 100644 --- a/EnvelopeGenerator.Application/Common/Dto/PdfSignOptionsDto.cs +++ b/EnvelopeGenerator.Application/Common/Dto/PdfSignOptionsDto.cs @@ -10,7 +10,7 @@ public sealed record PdfSignOptionsDto /// /// /// - public string UUID { get; set; } = null!; + public long DocumentElementId { get; set; } /// /// diff --git a/EnvelopeGenerator.Application/Common/Dto/PdfSignatureCheckResultDto.cs b/EnvelopeGenerator.Application/Common/Dto/PdfSignatureCheckResultDto.cs index 0c5ba02e..7652ca9e 100644 --- a/EnvelopeGenerator.Application/Common/Dto/PdfSignatureCheckResultDto.cs +++ b/EnvelopeGenerator.Application/Common/Dto/PdfSignatureCheckResultDto.cs @@ -47,7 +47,7 @@ public sealed record PdfSignatureCheckItemDto( string? Filter, string? SubFilter, string? ApplicationName, - string? UUID, + long? DocumentElementId, string? OriginalDocumentSha256, string? MessageDigestHex, string? Error); diff --git a/EnvelopeGenerator.Infrastructure.Crypt/Services/PdfDigitalSignatureService.cs b/EnvelopeGenerator.Infrastructure.Crypt/Services/PdfDigitalSignatureService.cs index 844fa1e8..e84280f0 100644 --- a/EnvelopeGenerator.Infrastructure.Crypt/Services/PdfDigitalSignatureService.cs +++ b/EnvelopeGenerator.Infrastructure.Crypt/Services/PdfDigitalSignatureService.cs @@ -18,7 +18,7 @@ namespace EnvelopeGenerator.Infrastructure.Crypt.Services; public sealed class PdfDigitalSignatureService(IOptions options) : IPdfDigitalSignatureService { - private static readonly Regex SignatureReasonMetaRegex = new(@"\|\s*SFMETA:v1;doc=(?[0-9a-fA-F-]{36});sha256=(?[A-Fa-f0-9]{64})$", RegexOptions.CultureInvariant | RegexOptions.Compiled); + private static readonly Regex SignatureReasonMetaRegex = new(@"\|\s*SFMETA:v1;deid=(?\d+);sha256=(?[A-Fa-f0-9]{64})$", RegexOptions.CultureInvariant | RegexOptions.Compiled); public async Task SignPdfAsync(Stream inputPdf, Stream outputPdf, PdfSignOptionsDto request, Stream? image = null, CancellationToken cancellationToken = default) { @@ -34,7 +34,7 @@ public sealed class PdfDigitalSignatureService(IOptions options) var pkcs11Options = options.Value; - var reasonWithMeta = BuildReasonWithMeta(request.Reason ?? pkcs11Options.DefaultReason, request.UUID, sourceHashHex); + var reasonWithMeta = BuildReasonWithMeta(request.Reason ?? pkcs11Options.DefaultReason, request.DocumentElementId, sourceHashHex); using var signer = new PdfDocumentSigner(workingInput); @@ -166,7 +166,7 @@ public sealed class PdfDigitalSignatureService(IOptions options) Filter: signature.Filter, SubFilter: signature.SubFilter, ApplicationName: null, - UUID: reasonMeta.UUID, + DocumentElementId: reasonMeta.DocumentElementId, OriginalDocumentSha256: reasonMeta.OriginalDocumentSha256, MessageDigestHex: TryExtractMessageDigestHex(signature.Contents), Error: null)); @@ -201,7 +201,7 @@ public sealed class PdfDigitalSignatureService(IOptions options) Filter: signature.Filter, SubFilter: signature.SubFilter, ApplicationName: null, - UUID: reasonMeta.UUID, + DocumentElementId: reasonMeta.DocumentElementId, OriginalDocumentSha256: reasonMeta.OriginalDocumentSha256, MessageDigestHex: null, Error: ex.Message)); @@ -492,11 +492,11 @@ public sealed class PdfDigitalSignatureService(IOptions options) return start + length; } - private static string BuildReasonWithMeta(string? businessReason, string uuid, string sourceHashHex) + private static string BuildReasonWithMeta(string? businessReason, long documentElementId, string sourceHashHex) { var trimmedReason = string.IsNullOrWhiteSpace(businessReason) ? null : businessReason.Trim(); var prefix = string.IsNullOrWhiteSpace(trimmedReason) ? string.Empty : trimmedReason + " "; - return $"{prefix}| SFMETA:v1;doc={uuid};sha256={sourceHashHex}"; + return $"{prefix}| SFMETA:v1;deid={documentElementId};sha256={sourceHashHex}"; } private static string? BuildContactInfo(string? email, string? phone) @@ -553,7 +553,7 @@ public sealed class PdfDigitalSignatureService(IOptions options) string.IsNullOrWhiteSpace(phone) ? null : phone); } - private static (string? BusinessReason, string? UUID, string? OriginalDocumentSha256) ParseReasonMeta(string? reason) + private static (string? BusinessReason, long? DocumentElementId, string? OriginalDocumentSha256) ParseReasonMeta(string? reason) { if (string.IsNullOrWhiteSpace(reason)) return (reason, null, null); @@ -566,9 +566,11 @@ public sealed class PdfDigitalSignatureService(IOptions options) if (string.IsNullOrWhiteSpace(businessReason)) businessReason = null; + long? parsedDocumentElementId = long.TryParse(match.Groups["deid"].Value, out var deid) ? deid : null; + return ( businessReason, - match.Groups["doc"].Value, + parsedDocumentElementId, match.Groups["sha"].Value.ToUpperInvariant()); } }