From 6b914d1698bcd1dbe52340fed23044eaff57200d Mon Sep 17 00:00:00 2001 From: tigp <24852530+tigp@users.noreply.github.com> Date: Fri, 29 Jun 2018 18:12:49 +0200 Subject: [PATCH] WIP - use another API for signing --- sign.go | 4 ++-- sign/pdfcatalog.go | 19 +++++++++--------- sign/pdfinfo_test.go | 11 ++++++----- sign/pdfsignature.go | 34 +++++++++++++++++++-------------- sign/pdfsignature_test.go | 4 ++-- sign/pdfvisualsignature_test.go | 4 ++-- sign/sign.go | 23 +++++++++++++++++++--- sign/sign_test.go | 12 ++++++------ 8 files changed, 68 insertions(+), 43 deletions(-) diff --git a/sign.go b/sign.go index d4b2e58..f6495f5 100644 --- a/sign.go +++ b/sign.go @@ -123,8 +123,8 @@ func main() { ContactInfo: "Geen", Date: time.Now().Local(), }, - CertType: 2, - Approval: false, + CertType: sign.CertificationSignature, + DocMDPPerm: sign.AllowFillingExistingFormFieldsAndSignatures, }, Signer: pkey, Certificate: cert, diff --git a/sign/pdfcatalog.go b/sign/pdfcatalog.go index 10f8b5b..4c79acb 100644 --- a/sign/pdfcatalog.go +++ b/sign/pdfcatalog.go @@ -30,24 +30,25 @@ func (context *SignContext) createCatalog() (catalog string, err error) { catalog += " /AcroForm <<" catalog += " /Fields [" + strconv.Itoa(int(context.VisualSignData.ObjectId)) + " 0 R]" - if !context.SignData.Signature.Approval { + switch context.SignData.Signature.CertType { + case CertificationSignature, UsageRightsSignature: catalog += " /NeedAppearances false" } - if context.SignData.Signature.CertType > 0 { + switch context.SignData.Signature.CertType { + case CertificationSignature: catalog += " /SigFlags 3" - } else { + case UsageRightsSignature: catalog += " /SigFlags 1" } catalog += " >>" - if !context.SignData.Signature.Approval { - if context.SignData.Signature.CertType > 0 { - catalog += " /Perms << /DocMDP " + strconv.Itoa(int(context.SignData.ObjectId)) + " 0 R >>" - } else { - catalog += " /Perms << /UR3 " + strconv.Itoa(int(context.SignData.ObjectId)) + " 0 R >>" - } + switch context.SignData.Signature.CertType { + case CertificationSignature: + catalog += " /Perms << /DocMDP " + strconv.Itoa(int(context.SignData.ObjectId)) + " 0 R >>" + case UsageRightsSignature: + catalog += " /Perms << /UR3 " + strconv.Itoa(int(context.SignData.ObjectId)) + " 0 R >>" } catalog += " >>" diff --git a/sign/pdfinfo_test.go b/sign/pdfinfo_test.go index f7b71c0..b9cb560 100644 --- a/sign/pdfinfo_test.go +++ b/sign/pdfinfo_test.go @@ -4,8 +4,9 @@ import ( "os" "testing" - "bitbucket.org/digitorus/pdf" "time" + + "bitbucket.org/digitorus/pdf" ) func TestCreateInfoEmpty(t *testing.T) { @@ -37,8 +38,8 @@ func TestCreateInfoEmpty(t *testing.T) { ContactInfo: "Geen", Date: time.Now().Local(), }, - CertType: 2, - Approval: false, + CertType: CertificationSignature, + DocMDPPerm: AllowFillingExistingFormFieldsAndSignatures, }, } @@ -101,8 +102,8 @@ func TestCreateInfo(t *testing.T) { ContactInfo: "Geen", Date: time.Now().Local(), }, - CertType: 2, - Approval: false, + CertType: CertificationSignature, + DocMDPPerm: AllowFillingExistingFormFieldsAndSignatures, }, } diff --git a/sign/pdfsignature.go b/sign/pdfsignature.go index 3ec80c0..ffe0117 100644 --- a/sign/pdfsignature.go +++ b/sign/pdfsignature.go @@ -49,22 +49,28 @@ func (context *SignContext) createSignaturePlaceholder() (dssd string, byte_rang signature_buffer.Write(bytes.Repeat([]byte("0"), int(context.SignatureMaxLength))) signature_buffer.WriteString(">") - if !context.SignData.Signature.Approval { - signature_buffer.WriteString(" /Reference [") // array of signature reference dictionaries + switch context.SignData.Signature.CertType { + case CertificationSignature, UsageRightsSignature: + signature_buffer.WriteString(" /Reference [") // start array of signature reference dictionaries signature_buffer.WriteString(" << /Type /SigRef") - if context.SignData.Signature.CertType > 0 { - signature_buffer.WriteString(" /TransformMethod /DocMDP") - signature_buffer.WriteString(" /TransformParams <<") - signature_buffer.WriteString(" /Type /TransformParams") - signature_buffer.WriteString(" /P " + strconv.Itoa(int(context.SignData.Signature.CertType))) - signature_buffer.WriteString(" /V /1.2") - } else { - signature_buffer.WriteString(" /TransformMethod /UR3") - signature_buffer.WriteString(" /TransformParams <<") - signature_buffer.WriteString(" /Type /TransformParams") - signature_buffer.WriteString(" /V /2.2") - } + } + switch context.SignData.Signature.CertType { + case CertificationSignature: + signature_buffer.WriteString(" /TransformMethod /DocMDP") + signature_buffer.WriteString(" /TransformParams <<") + signature_buffer.WriteString(" /Type /TransformParams") + signature_buffer.WriteString(" /P " + strconv.Itoa(int(context.SignData.Signature.DocMDPPerm))) + signature_buffer.WriteString(" /V /1.2") + case UsageRightsSignature: + signature_buffer.WriteString(" /TransformMethod /UR3") + signature_buffer.WriteString(" /TransformParams <<") + signature_buffer.WriteString(" /Type /TransformParams") + signature_buffer.WriteString(" /V /2.2") + } + + switch context.SignData.Signature.CertType { + case CertificationSignature, UsageRightsSignature: signature_buffer.WriteString(" >>") // close TransformParams signature_buffer.WriteString(" >>") signature_buffer.WriteString(" ]") // end of reference diff --git a/sign/pdfsignature_test.go b/sign/pdfsignature_test.go index ba639e2..5a569f2 100644 --- a/sign/pdfsignature_test.go +++ b/sign/pdfsignature_test.go @@ -40,8 +40,8 @@ func TestCreateSignature(t *testing.T) { ContactInfo: "Geen", Date: now, }, - CertType: 2, - Approval: false, + CertType: CertificationSignature, + DocMDPPerm: AllowFillingExistingFormFieldsAndSignatures, }, } diff --git a/sign/pdfvisualsignature_test.go b/sign/pdfvisualsignature_test.go index bca6507..f7b1b01 100644 --- a/sign/pdfvisualsignature_test.go +++ b/sign/pdfvisualsignature_test.go @@ -40,8 +40,8 @@ func TestVisualSignature(t *testing.T) { ContactInfo: "Geen", Date: now, }, - CertType: 2, - Approval: false, + CertType: CertificationSignature, + DocMDPPerm: AllowFillingExistingFormFieldsAndSignatures, }, } diff --git a/sign/sign.go b/sign/sign.go index 45a86bc..b445197 100644 --- a/sign/sign.go +++ b/sign/sign.go @@ -50,11 +50,23 @@ type InfoData struct { } type SignDataSignature struct { - Approval bool - CertType uint - Info SignDataSignatureInfo + CertType uint + DocMDPPerm uint + Info SignDataSignatureInfo } +const ( + ApprovalSignature = iota + CertificationSignature + UsageRightsSignature +) + +const ( + DoNotAllowAnyChangesPerms = iota + 1 + AllowFillingExistingFormFieldsAndSignatures + AllowFillingExistingFormFieldsAndSignaturesAndCRUDAnnotations +) + type SignDataSignatureInfo struct { Name string Location string @@ -137,6 +149,11 @@ func Sign(input io.ReadSeeker, output io.Writer, rdr *pdf.Reader, size int64, si } func (context *SignContext) SignPDF() error { + // set defaults + if context.SignData.Signature.DocMDPPerm == 0 { + context.SignData.Signature.DocMDPPerm = 1 + } + context.OutputBuffer = filebuffer.New([]byte{}) // Copy old file into new file. diff --git a/sign/sign_test.go b/sign/sign_test.go index e1771e5..03ac50a 100644 --- a/sign/sign_test.go +++ b/sign/sign_test.go @@ -180,8 +180,8 @@ func TestSignPDF(t *testing.T) { ContactInfo: "Geen", Date: time.Now().Local(), }, - CertType: 2, - Approval: false, + CertType: CertificationSignature, + DocMDPPerm: AllowFillingExistingFormFieldsAndSignatures, }, Signer: pkey, Certificate: cert, @@ -253,8 +253,8 @@ func TestSignPDFFile(t *testing.T) { ContactInfo: "Geen", Date: time.Now().Local(), }, - CertType: 2, - Approval: false, + CertType: CertificationSignature, + DocMDPPerm: AllowFillingExistingFormFieldsAndSignatures, }, Signer: pkey, Certificate: cert, @@ -332,8 +332,8 @@ func BenchmarkSignPDF(b *testing.B) { ContactInfo: "Geen", Date: time.Now().Local(), }, - CertType: 2, - Approval: false, + CertType: CertificationSignature, + DocMDPPerm: AllowFillingExistingFormFieldsAndSignatures, }, Signer: pkey, Certificate: cert,