Refactor contact info handling in PDF signing
Replaced the `ContactInfo` property with separate `Email` and `Phone` fields in `PdfSignOptionsDto` and `PdfSignatureCheckItemDto` for better granularity. Updated the `PdfDigitalSignatureService` to handle the new fields, introducing `BuildContactInfo` and `ParseContactInfo` methods for constructing and parsing contact information. Modified the `PdfSignatureController` to reflect these changes, updating request models and the `SignPdfAsync` method. Updated the `README.md` to document the new structure. These changes improve the clarity and structure of contact information handling.
This commit is contained in:
@@ -8,7 +8,8 @@ public sealed record PdfSignOptionsDto
|
||||
public string? Name { get; set; }
|
||||
public string? Reason { get; set; }
|
||||
public string? Location { get; set; }
|
||||
public string? ContactInfo { get; set; }
|
||||
public string? Email { get; set; }
|
||||
public string? Phone { get; set; }
|
||||
public string? ApplicationName { get; set; }
|
||||
public PdfSignatureCertificationLevel? CertificationLevel { get; set; }
|
||||
}
|
||||
|
||||
@@ -29,6 +29,8 @@ public sealed record PdfSignatureCheckItemDto(
|
||||
string? Location,
|
||||
string? DeclaredName,
|
||||
string? ContactInfo,
|
||||
string? Email,
|
||||
string? Phone,
|
||||
string? DigestAlgorithm,
|
||||
string? SignatureAlgorithm,
|
||||
string? SignerName,
|
||||
|
||||
@@ -239,7 +239,7 @@ Sicherheitsregel:
|
||||
- `SignPdfAsync(...)`, `CheckPdfSignatureAsync(...)`, `ExtractOriginalPdfAsync(...)`
|
||||
- `IPkcs11SelfTestStatusProvider`
|
||||
- `PdfSignOptionsDto`
|
||||
- `UUID`, `Reason`, `Name`, `Location`, `ContactInfo`, `SigningTime`, `CertificationLevel`
|
||||
- `UUID`, `Reason`, `Name`, `Location`, `Email`, `Phone`, `CertificationLevel`
|
||||
- `PdfSignatureCheckResultDto` / `PdfSignatureCheckItemDto`
|
||||
- inklusive `BusinessReason`, `UUID`, `OriginalDocumentSha256`
|
||||
- `Pkcs11SelfTestStatusDto`
|
||||
|
||||
@@ -42,7 +42,7 @@ public sealed class PdfDigitalSignatureService(IOptions<Pkcs11Options> options)
|
||||
Name = request.Name ?? pkcs11Options.CertificateLabel,
|
||||
Reason = reasonWithMeta,
|
||||
Location = request.Location,
|
||||
ContactInfo = request.ContactInfo,
|
||||
ContactInfo = BuildContactInfo(request.Email, request.Phone),
|
||||
SigningTime = pkcs11Options.UseUtcSigningTime ? DateTimeOffset.UtcNow : DateTimeOffset.Now,
|
||||
ApplicationName = pkcs11Options.ApplicationName,
|
||||
CertificationLevel = ToDevExpressCertificationLevel(request.CertificationLevel)
|
||||
@@ -108,6 +108,7 @@ public sealed class PdfDigitalSignatureService(IOptions<Pkcs11Options> options)
|
||||
var issuedTo = ParsePrincipal(certificate?.Subject);
|
||||
var issuedBy = ParsePrincipal(certificate?.Issuer);
|
||||
var reasonMeta = ParseReasonMeta(signature.Reason);
|
||||
var contact = ParseContactInfo(signature.ContactInfo);
|
||||
|
||||
items.Add(new PdfSignatureCheckItemDto(
|
||||
CoversWholeDoc: coversWholeDocument,
|
||||
@@ -116,6 +117,8 @@ public sealed class PdfDigitalSignatureService(IOptions<Pkcs11Options> options)
|
||||
Location: signature.Location,
|
||||
DeclaredName: signature.SignerName,
|
||||
ContactInfo: signature.ContactInfo,
|
||||
Email: contact.Email,
|
||||
Phone: contact.Phone,
|
||||
DigestAlgorithm: InferDigestAlgorithm(certificate),
|
||||
SignatureAlgorithm: InferSignatureAlgorithm(certificate),
|
||||
SignerName: issuedTo.CommonName ?? signature.SignerName,
|
||||
@@ -140,6 +143,7 @@ public sealed class PdfDigitalSignatureService(IOptions<Pkcs11Options> options)
|
||||
catch (Exception ex)
|
||||
{
|
||||
var reasonMeta = ParseReasonMeta(signature.Reason);
|
||||
var contact = ParseContactInfo(signature.ContactInfo);
|
||||
|
||||
items.Add(new PdfSignatureCheckItemDto(
|
||||
CoversWholeDoc: false,
|
||||
@@ -148,6 +152,8 @@ public sealed class PdfDigitalSignatureService(IOptions<Pkcs11Options> options)
|
||||
Location: signature.Location,
|
||||
DeclaredName: signature.SignerName,
|
||||
ContactInfo: signature.ContactInfo,
|
||||
Email: contact.Email,
|
||||
Phone: contact.Phone,
|
||||
DigestAlgorithm: null,
|
||||
SignatureAlgorithm: null,
|
||||
SignerName: signature.SignerName,
|
||||
@@ -463,6 +469,60 @@ public sealed class PdfDigitalSignatureService(IOptions<Pkcs11Options> options)
|
||||
return $"{prefix}| SFMETA:v1;doc={uuid};sha256={sourceHashHex}";
|
||||
}
|
||||
|
||||
private static string? BuildContactInfo(string? email, string? phone)
|
||||
{
|
||||
var normalizedEmail = string.IsNullOrWhiteSpace(email) ? null : email.Trim();
|
||||
var normalizedPhone = string.IsNullOrWhiteSpace(phone) ? null : phone.Trim();
|
||||
|
||||
if (normalizedEmail is null && normalizedPhone is null)
|
||||
return null;
|
||||
|
||||
if (normalizedEmail is null)
|
||||
return $"tel:{normalizedPhone}";
|
||||
|
||||
if (normalizedPhone is null)
|
||||
return $"mailto:{normalizedEmail}";
|
||||
|
||||
return $"mailto:{normalizedEmail};tel:{normalizedPhone}";
|
||||
}
|
||||
|
||||
private static (string? Email, string? Phone) ParseContactInfo(string? contactInfo)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(contactInfo))
|
||||
return (null, null);
|
||||
|
||||
string? email = null;
|
||||
string? phone = null;
|
||||
|
||||
foreach (var part in contactInfo.Split(';', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries))
|
||||
{
|
||||
if (part.StartsWith("mailto:", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
email = part[7..].Trim();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (part.StartsWith("tel:", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
phone = part[4..].Trim();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (email is null && part.Contains('@', StringComparison.Ordinal))
|
||||
{
|
||||
email = part.Trim();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (phone is null)
|
||||
phone = part.Trim();
|
||||
}
|
||||
|
||||
return (
|
||||
string.IsNullOrWhiteSpace(email) ? null : email,
|
||||
string.IsNullOrWhiteSpace(phone) ? null : phone);
|
||||
}
|
||||
|
||||
private static (string? BusinessReason, string? UUID, string? OriginalDocumentSha256) ParseReasonMeta(string? reason)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(reason))
|
||||
|
||||
@@ -17,7 +17,8 @@ public class PdfSignatureController(IPdfDigitalSignatureService signatureService
|
||||
public string? Name { get; set; }
|
||||
public string? Reason { get; set; }
|
||||
public string? Location { get; set; }
|
||||
public string? ContactInfo { get; set; }
|
||||
public string? Email { get; set; }
|
||||
public string? Phone { get; set; }
|
||||
}
|
||||
|
||||
public sealed class CheckPdfSignatureForm
|
||||
@@ -52,7 +53,8 @@ public class PdfSignatureController(IPdfDigitalSignatureService signatureService
|
||||
Name = request.Name,
|
||||
Reason = request.Reason,
|
||||
Location = request.Location,
|
||||
ContactInfo = request.ContactInfo,
|
||||
Email = request.Email,
|
||||
Phone = request.Phone,
|
||||
CertificationLevel = PdfSignatureCertificationLevel.FormFillingAndAnnotations
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user