Fix signature validation

This commit is contained in:
Adrian-George Bostan 2019-02-21 00:20:47 +02:00
parent 2bd79b2dab
commit 657fe00a78
4 changed files with 45 additions and 30 deletions

View File

@ -249,21 +249,15 @@ func NewSignatureField(signature *model.PdfSignature, fields []*SignatureLine, o
return nil, errors.New("signature cannot be nil") return nil, errors.New("signature cannot be nil")
} }
field := model.NewPdfFieldSignature(signature)
field.T = core.MakeString("")
apDict, err := genFieldSignatureAppearance(fields, opts) apDict, err := genFieldSignatureAppearance(fields, opts)
if err != nil { if err != nil {
return nil, err return nil, err
} }
widget := model.NewPdfAnnotationWidget() field := model.NewPdfFieldSignature(signature)
widget.Rect = core.MakeArrayFromFloats(opts.Rect) field.Rect = core.MakeArrayFromFloats(opts.Rect)
widget.F = core.MakeInteger(4) field.F = core.MakeInteger(132)
widget.Parent = field.ToPdfObject() field.AP = apDict
widget.AP = apDict
field.Annotations = append(field.Annotations, widget)
return field, nil return field, nil
} }
@ -380,10 +374,13 @@ func genFieldSignatureAppearance(fields []*SignatureLine, opts *SignatureFieldOp
opts.FillColor = model.NewPdfColorDeviceGray(1) opts.FillColor = model.NewPdfColorDeviceGray(1)
} }
cc.Add_q().Add_re(rect[0], rect[1], rectWidth, rectHeight). cc.Add_q().
Add_w(opts.BorderSize).SetStrokingColor(opts.BorderColor). Add_re(rect[0], rect[1], rectWidth, rectHeight).
Add_w(opts.BorderSize).
SetStrokingColor(opts.BorderColor).
SetNonStrokingColor(opts.FillColor). SetNonStrokingColor(opts.FillColor).
Add_B().Add_Q() Add_B().
Add_Q()
// Draw signature. // Draw signature.
cc.Add_q() cc.Add_q()

View File

@ -394,6 +394,7 @@ func (a *PdfAppender) Sign(pageNum int, field *PdfFieldSignature) error {
if signature == nil { if signature == nil {
return errors.New("signature dictionary cannot be nil") return errors.New("signature dictionary cannot be nil")
} }
a.addNewObjects(signature.container)
// Get a copy of the selected page. // Get a copy of the selected page.
pageIndex := pageNum - 1 pageIndex := pageNum - 1
@ -402,17 +403,9 @@ func (a *PdfAppender) Sign(pageNum int, field *PdfFieldSignature) error {
} }
page := a.pages[pageIndex].Duplicate() page := a.pages[pageIndex].Duplicate()
// Initialize signature.
if err := signature.Initialize(); err != nil {
return err
}
a.addNewObjects(signature.container)
// Add signature field annotations to the page annotations. // Add signature field annotations to the page annotations.
for _, annotation := range field.Annotations { field.P = page.ToPdfObject()
annotation.P = page.ToPdfObject() page.Annotations = append(page.Annotations, field.PdfAnnotationWidget.PdfAnnotation)
page.Annotations = append(page.Annotations, annotation.PdfAnnotation)
}
// Add signature field to the form. // Add signature field to the form.
acroForm := a.Reader.AcroForm acroForm := a.Reader.AcroForm

View File

@ -457,6 +457,10 @@ func TestAppenderSignPage4(t *testing.T) {
signature.SetReason("TestAppenderSignPage4") signature.SetReason("TestAppenderSignPage4")
signature.SetDate(time.Now(), "") signature.SetDate(time.Now(), "")
if err := signature.Initialize(); err != nil {
return
}
sigField := model.NewPdfFieldSignature(signature) sigField := model.NewPdfFieldSignature(signature)
sigField.T = core.MakeString("Signature1") sigField.T = core.MakeString("Signature1")
@ -541,6 +545,10 @@ func TestAppenderSignMultiple(t *testing.T) {
signature.SetReason("TestAppenderSignPage4") signature.SetReason("TestAppenderSignPage4")
signature.SetDate(time.Now(), "") signature.SetDate(time.Now(), "")
if err := signature.Initialize(); err != nil {
return
}
sigField := model.NewPdfFieldSignature(signature) sigField := model.NewPdfFieldSignature(signature)
sigField.T = core.MakeString("Signature1") sigField.T = core.MakeString("Signature1")
@ -619,6 +627,10 @@ func TestSignatureAppearance(t *testing.T) {
signature.SetReason("TestSignatureAppearance Reason") signature.SetReason("TestSignatureAppearance Reason")
signature.SetDate(time.Now(), "") signature.SetDate(time.Now(), "")
if err := signature.Initialize(); err != nil {
return
}
numPages, err := pdfReader.GetNumPages() numPages, err := pdfReader.GetNumPages()
if err != nil { if err != nil {
t.Errorf("Fail: %v\n", err) t.Errorf("Fail: %v\n", err)
@ -644,6 +656,8 @@ func TestSignatureAppearance(t *testing.T) {
}, },
opts, opts,
) )
sigField.T = core.MakeString(fmt.Sprintf("Signature %d", pageNum))
sigField.F = core.MakeInteger(132)
if err = appender.Sign(pageNum, sigField); err != nil { if err = appender.Sign(pageNum, sigField); err != nil {
t.Errorf("Fail: %v\n", err) t.Errorf("Fail: %v\n", err)
@ -667,6 +681,8 @@ func TestSignatureAppearance(t *testing.T) {
}, },
opts, opts,
) )
sigField.T = core.MakeString(fmt.Sprintf("Signature2 %d", pageNum))
sigField.F = core.MakeInteger(132)
if err = appender.Sign(pageNum, sigField); err != nil { if err = appender.Sign(pageNum, sigField); err != nil {
log.Fatalf("Fail: %v\n", err) log.Fatalf("Fail: %v\n", err)
@ -691,6 +707,8 @@ func TestSignatureAppearance(t *testing.T) {
}, },
opts, opts,
) )
sigField.T = core.MakeString(fmt.Sprintf("Signature3 %d", pageNum))
sigField.F = core.MakeInteger(132)
if err = appender.Sign(pageNum, sigField); err != nil { if err = appender.Sign(pageNum, sigField); err != nil {
log.Fatalf("Fail: %v\n", err) log.Fatalf("Fail: %v\n", err)

View File

@ -433,6 +433,7 @@ func (ch *PdfFieldChoice) ToPdfObject() core.PdfObject {
// the name of the signer and verifying document contents. // the name of the signer and verifying document contents.
type PdfFieldSignature struct { type PdfFieldSignature struct {
*PdfField *PdfField
*PdfAnnotationWidget
V *PdfSignature V *PdfSignature
Lock *core.PdfIndirectObject Lock *core.PdfIndirectObject
@ -441,22 +442,28 @@ type PdfFieldSignature struct {
// NewPdfFieldSignature returns an initialized signature field. // NewPdfFieldSignature returns an initialized signature field.
func NewPdfFieldSignature(signature *PdfSignature) *PdfFieldSignature { func NewPdfFieldSignature(signature *PdfSignature) *PdfFieldSignature {
field := &PdfFieldSignature{ field := &PdfFieldSignature{}
PdfField: NewPdfField(), field.PdfField = NewPdfField()
V: signature,
}
field.PdfField.SetContext(field) field.PdfField.SetContext(field)
field.FT = core.MakeName("Sig")
field.PdfAnnotationWidget = NewPdfAnnotationWidget()
field.PdfAnnotationWidget.SetContext(field)
field.PdfAnnotationWidget.container = field.PdfField.container
field.T = core.MakeString("")
field.V = signature
return field return field
} }
// ToPdfObject returns an indirect object containing the signature field dictionary. // ToPdfObject returns an indirect object containing the signature field dictionary.
func (sig *PdfFieldSignature) ToPdfObject() core.PdfObject { func (sig *PdfFieldSignature) ToPdfObject() core.PdfObject {
// Set general field attributes // Set general field attributes.
if sig.PdfAnnotationWidget != nil {
sig.PdfAnnotationWidget.ToPdfObject()
}
sig.PdfField.ToPdfObject() sig.PdfField.ToPdfObject()
// Handle signature field specific attributes // Handle signature field specific attributes.
container := sig.container container := sig.container
d := container.PdfObject.(*core.PdfObjectDictionary) d := container.PdfObject.(*core.PdfObjectDictionary)