WIP - use another API for signing

This commit is contained in:
tigp
2018-06-29 18:12:49 +02:00
parent af18f0bd57
commit 6b914d1698
8 changed files with 68 additions and 43 deletions

View File

@@ -123,8 +123,8 @@ func main() {
ContactInfo: "Geen", ContactInfo: "Geen",
Date: time.Now().Local(), Date: time.Now().Local(),
}, },
CertType: 2, CertType: sign.CertificationSignature,
Approval: false, DocMDPPerm: sign.AllowFillingExistingFormFieldsAndSignatures,
}, },
Signer: pkey, Signer: pkey,
Certificate: cert, Certificate: cert,

View File

@@ -30,24 +30,25 @@ func (context *SignContext) createCatalog() (catalog string, err error) {
catalog += " /AcroForm <<" catalog += " /AcroForm <<"
catalog += " /Fields [" + strconv.Itoa(int(context.VisualSignData.ObjectId)) + " 0 R]" 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" catalog += " /NeedAppearances false"
} }
if context.SignData.Signature.CertType > 0 { switch context.SignData.Signature.CertType {
case CertificationSignature:
catalog += " /SigFlags 3" catalog += " /SigFlags 3"
} else { case UsageRightsSignature:
catalog += " /SigFlags 1" catalog += " /SigFlags 1"
} }
catalog += " >>" catalog += " >>"
if !context.SignData.Signature.Approval { switch context.SignData.Signature.CertType {
if context.SignData.Signature.CertType > 0 { case CertificationSignature:
catalog += " /Perms << /DocMDP " + strconv.Itoa(int(context.SignData.ObjectId)) + " 0 R >>" catalog += " /Perms << /DocMDP " + strconv.Itoa(int(context.SignData.ObjectId)) + " 0 R >>"
} else { case UsageRightsSignature:
catalog += " /Perms << /UR3 " + strconv.Itoa(int(context.SignData.ObjectId)) + " 0 R >>" catalog += " /Perms << /UR3 " + strconv.Itoa(int(context.SignData.ObjectId)) + " 0 R >>"
}
} }
catalog += " >>" catalog += " >>"

View File

@@ -4,8 +4,9 @@ import (
"os" "os"
"testing" "testing"
"bitbucket.org/digitorus/pdf"
"time" "time"
"bitbucket.org/digitorus/pdf"
) )
func TestCreateInfoEmpty(t *testing.T) { func TestCreateInfoEmpty(t *testing.T) {
@@ -37,8 +38,8 @@ func TestCreateInfoEmpty(t *testing.T) {
ContactInfo: "Geen", ContactInfo: "Geen",
Date: time.Now().Local(), Date: time.Now().Local(),
}, },
CertType: 2, CertType: CertificationSignature,
Approval: false, DocMDPPerm: AllowFillingExistingFormFieldsAndSignatures,
}, },
} }
@@ -101,8 +102,8 @@ func TestCreateInfo(t *testing.T) {
ContactInfo: "Geen", ContactInfo: "Geen",
Date: time.Now().Local(), Date: time.Now().Local(),
}, },
CertType: 2, CertType: CertificationSignature,
Approval: false, DocMDPPerm: AllowFillingExistingFormFieldsAndSignatures,
}, },
} }

View File

@@ -49,22 +49,28 @@ func (context *SignContext) createSignaturePlaceholder() (dssd string, byte_rang
signature_buffer.Write(bytes.Repeat([]byte("0"), int(context.SignatureMaxLength))) signature_buffer.Write(bytes.Repeat([]byte("0"), int(context.SignatureMaxLength)))
signature_buffer.WriteString(">") signature_buffer.WriteString(">")
if !context.SignData.Signature.Approval { switch context.SignData.Signature.CertType {
signature_buffer.WriteString(" /Reference [") // array of signature reference dictionaries case CertificationSignature, UsageRightsSignature:
signature_buffer.WriteString(" /Reference [") // start array of signature reference dictionaries
signature_buffer.WriteString(" << /Type /SigRef") 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(" >>") // close TransformParams
signature_buffer.WriteString(" >>") signature_buffer.WriteString(" >>")
signature_buffer.WriteString(" ]") // end of reference signature_buffer.WriteString(" ]") // end of reference

View File

@@ -40,8 +40,8 @@ func TestCreateSignature(t *testing.T) {
ContactInfo: "Geen", ContactInfo: "Geen",
Date: now, Date: now,
}, },
CertType: 2, CertType: CertificationSignature,
Approval: false, DocMDPPerm: AllowFillingExistingFormFieldsAndSignatures,
}, },
} }

View File

@@ -40,8 +40,8 @@ func TestVisualSignature(t *testing.T) {
ContactInfo: "Geen", ContactInfo: "Geen",
Date: now, Date: now,
}, },
CertType: 2, CertType: CertificationSignature,
Approval: false, DocMDPPerm: AllowFillingExistingFormFieldsAndSignatures,
}, },
} }

View File

@@ -50,11 +50,23 @@ type InfoData struct {
} }
type SignDataSignature struct { type SignDataSignature struct {
Approval bool CertType uint
CertType uint DocMDPPerm uint
Info SignDataSignatureInfo Info SignDataSignatureInfo
} }
const (
ApprovalSignature = iota
CertificationSignature
UsageRightsSignature
)
const (
DoNotAllowAnyChangesPerms = iota + 1
AllowFillingExistingFormFieldsAndSignatures
AllowFillingExistingFormFieldsAndSignaturesAndCRUDAnnotations
)
type SignDataSignatureInfo struct { type SignDataSignatureInfo struct {
Name string Name string
Location 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 { func (context *SignContext) SignPDF() error {
// set defaults
if context.SignData.Signature.DocMDPPerm == 0 {
context.SignData.Signature.DocMDPPerm = 1
}
context.OutputBuffer = filebuffer.New([]byte{}) context.OutputBuffer = filebuffer.New([]byte{})
// Copy old file into new file. // Copy old file into new file.

View File

@@ -180,8 +180,8 @@ func TestSignPDF(t *testing.T) {
ContactInfo: "Geen", ContactInfo: "Geen",
Date: time.Now().Local(), Date: time.Now().Local(),
}, },
CertType: 2, CertType: CertificationSignature,
Approval: false, DocMDPPerm: AllowFillingExistingFormFieldsAndSignatures,
}, },
Signer: pkey, Signer: pkey,
Certificate: cert, Certificate: cert,
@@ -253,8 +253,8 @@ func TestSignPDFFile(t *testing.T) {
ContactInfo: "Geen", ContactInfo: "Geen",
Date: time.Now().Local(), Date: time.Now().Local(),
}, },
CertType: 2, CertType: CertificationSignature,
Approval: false, DocMDPPerm: AllowFillingExistingFormFieldsAndSignatures,
}, },
Signer: pkey, Signer: pkey,
Certificate: cert, Certificate: cert,
@@ -332,8 +332,8 @@ func BenchmarkSignPDF(b *testing.B) {
ContactInfo: "Geen", ContactInfo: "Geen",
Date: time.Now().Local(), Date: time.Now().Local(),
}, },
CertType: 2, CertType: CertificationSignature,
Approval: false, DocMDPPerm: AllowFillingExistingFormFieldsAndSignatures,
}, },
Signer: pkey, Signer: pkey,
Certificate: cert, Certificate: cert,