unipdf/pdf/core/crypt_file_test.go

117 lines
3.4 KiB
Go
Raw Normal View History

/*
* This file is subject to the terms and conditions defined in
* file 'LICENSE.md', which is part of this source code package.
*/
// Integration tests for the PDF crypt support.
package core_test
import (
"os"
"path/filepath"
"testing"
pdfcontent "github.com/unidoc/unidoc/pdf/contentstream"
pdf "github.com/unidoc/unidoc/pdf/model"
)
const aes3Dir = `./testdata`
func TestDecryptAES3(t *testing.T) {
cases := []struct {
file string
pass string
R int
pages int
page1 string
}{
// See https://github.com/mozilla/pdf.js/issues/6010
{
file: "issue6010_1.pdf", pass: "abc", R: 6, pages: 1,
page1: "\nIssue 6010",
},
{
file: "issue6010_2.pdf", pass: "æøå", R: 6, pages: 10,
page1: "\nSample PDF Document\nRobert Maron\nGrzegorz Grudzi\n\xb4\nnski\nFebruary 20, 1999",
},
// See https://github.com/mozilla/pdf.js/pull/6531
{
file: "pr6531_1.pdf", pass: "asdfasdf", R: 6, pages: 1,
},
{
file: "pr6531_2.pdf", pass: "asdfasdf", R: 6, pages: 1,
},
// See https://github.com/sumatrapdfreader/sumatrapdf/issues/294
{
file: "testcase_encry.pdf", pass: "123", R: 5, pages: 1, // owner pass
page1: "\n\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\a\x00\b\n\x00\x01\n\x00\t\x00\n\x00\v",
},
{
file: "testcase_encry.pdf", pass: "456", R: 5, pages: 1, // user pass
page1: "\n\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\a\x00\b\n\x00\x01\n\x00\t\x00\n\x00\v",
},
{
file: "x300.pdf", R: 5, pages: 1,
pass: "rnofajrcudiaplhafbqrkrafphehjlvctmwftvpzvachsulmfkjltliftbfpgabustkjfybeqvwgdfawyghoijxgwuxkkrywybpapsswxcnigwwnpttgvfxtrlnbqzberhrnelvcqjaasothqhtzjoxqttlqrmxfqawyhizoslazxhdqffiweruqjrmpdsxutvevceaormydxhregsadphblbaziucrnsbntzptdzfkzfzlwmxhslywusuajwspvabqwopbxdttwbjappgiaxrkgmsuodkzhbqvqiwummcdu",
page1: " \nTemplate form for pdf_form_add.go\t \nThis PDF is explicitly created as a template\t \tfor adding\t \ta PDF interactive form to.\t \n \nFull \tName: _________________________________________\t \nAddress\t \tLine 1\t: \t__________________\t________________\t____\t \nAddress\t \tLine \t2\t: ________________\t_______\t___________\t____\t \nAge: ______\t \nGender: \t \t[ ] Male [ ] Female\t \nCity: ______________\t \nCountry: ______________\t \nFavorite Color:\t \t \t___________________\t \n \n \n ",
},
}
for _, c := range cases {
c := c
t.Run(c.file, func(t *testing.T) {
f, err := os.Open(filepath.Join(aes3Dir, c.file))
if err != nil {
t.Fatal(err)
}
defer f.Close()
p, err := pdf.NewPdfReader(f)
if err != nil {
t.Fatal(err)
}
if ok, err := p.IsEncrypted(); err != nil {
t.Fatal(err)
} else if !ok {
t.Fatal("document is not encrypted")
}
ok, err := p.Decrypt([]byte(c.pass))
if err != nil {
t.Fatal(err)
} else if !ok {
t.Fatal("wrong password")
}
numPages, err := p.GetNumPages()
if err != nil {
t.Fatal(err)
} else if numPages != c.pages {
t.Errorf("wrong number of pages: %d", numPages)
}
page, err := p.GetPage(1)
if err != nil {
t.Fatal(err)
}
streams, err := page.GetContentStreams()
if err != nil {
t.Fatal(err)
}
content := ""
for _, cstream := range streams {
content += cstream
}
cstreamParser := pdfcontent.NewContentStreamParser(content)
txt, err := cstreamParser.ExtractText()
if err != nil {
t.Fatal(err)
} else if txt != c.page1 {
t.Fatalf("wrong text: %q", txt)
}
})
}
}