From a7103623af8ffe746633bb4b7538ee499e08d331 Mon Sep 17 00:00:00 2001 From: Andrey Smirnov Date: Fri, 13 Mar 2015 21:46:32 +0300 Subject: [PATCH] .changes files parsing. #71 --- deb/changes.go | 72 +++++++++++++++++++++++++++++++++++++++++++++ deb/changes_test.go | 67 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 deb/changes.go create mode 100644 deb/changes_test.go diff --git a/deb/changes.go b/deb/changes.go new file mode 100644 index 00000000..913dee9c --- /dev/null +++ b/deb/changes.go @@ -0,0 +1,72 @@ +package deb + +import ( + "fmt" + "github.com/smira/aptly/utils" + "os" +) + +// Changes is a result of .changes file parsing +type Changes struct { + Changes string + Distribution string + Files PackageFiles +} + +// ParseChangesFile does optional signature verification and parses changes files +func ParseChangesFile(path string, acceptUnsigned, ignoreSignature bool, verifier utils.Verifier) (*Changes, error) { + input, err := os.Open(path) + if err != nil { + return nil, err + } + defer input.Close() + + isClearSigned, err := verifier.IsClearSigned(input) + if err != nil { + return nil, err + } + + input.Seek(0, 0) + + if !isClearSigned && !acceptUnsigned { + return nil, fmt.Errorf(".changes file is not signed and unsigned processing hasn't been enabled") + } + + if isClearSigned && !ignoreSignature { + err = verifier.VerifyClearsigned(input) + if err != nil { + return nil, err + } + input.Seek(0, 0) + } + + var text *os.File + + if isClearSigned { + text, err = verifier.ExtractClearsigned(input) + if err != nil { + return nil, err + } + defer text.Close() + } else { + text = input + } + + reader := NewControlFileReader(text) + stanza, err := reader.ReadStanza() + if err != nil { + return nil, err + } + + result := &Changes{ + Distribution: stanza["Distribution"], + Changes: stanza["Changes"], + } + + result.Files, err = result.Files.ParseSumFields(stanza) + if err != nil { + return nil, err + } + + return result, nil +} diff --git a/deb/changes_test.go b/deb/changes_test.go new file mode 100644 index 00000000..eae5ee18 --- /dev/null +++ b/deb/changes_test.go @@ -0,0 +1,67 @@ +package deb + +import ( + . "gopkg.in/check.v1" + "os" + "path/filepath" +) + +type ChangesSuite struct { +} + +var _ = Suite(&ChangesSuite{}) + +func (s *ChangesSuite) TestParseChanges(c *C) { + dir := c.MkDir() + path := filepath.Join(dir, "calamares.changes") + + f, err := os.Create(path) + c.Assert(err, IsNil) + + f.WriteString(changesFile) + f.Close() + + changes, err := ParseChangesFile(path, true, true, &NullVerifier{}) + c.Check(err, IsNil) + + c.Check(changes.Distribution, Equals, "sid") + c.Check(changes.Files, HasLen, 4) + c.Check(changes.Files[0].Filename, Equals, "calamares_0+git20141127.99.dsc") + c.Check(changes.Files[0].Checksums.Size, Equals, int64(1106)) + c.Check(changes.Files[0].Checksums.MD5, Equals, "05fd8f3ffe8f362c5ef9bad2f936a56e") + c.Check(changes.Files[0].Checksums.SHA1, Equals, "79f10e955dab6eb25b7f7bae18213f367a3a0396") + c.Check(changes.Files[0].Checksums.SHA256, Equals, "35b3280a7b1ffe159a276128cb5c408d687318f60ecbb8ab6dedb2e49c4e82dc") +} + +var changesFile = `Format: 1.8 +Date: Thu, 27 Nov 2014 13:24:53 +0000 +Source: calamares +Binary: calamares calamares-dbg +Architecture: source amd64 +Version: 0+git20141127.99 +Distribution: sid +Urgency: medium +Maintainer: Rohan Garg +Changed-By: Rohan +Description: + calamares - distribution-independent installer framework + calamares-dbg - distribution-independent installer framework -- debug symbols +Changes: + calamares (0+git20141127.99) sid; urgency=medium + . + * Update from git +Checksums-Sha1: + 79f10e955dab6eb25b7f7bae18213f367a3a0396 1106 calamares_0+git20141127.99.dsc + 294c28e2c8e34e72ca9ee0d9da5c14f3bf4188db 2694800 calamares_0+git20141127.99.tar.xz + d6c26c04b5407c7511f61cb3e3de60c4a1d6c4ff 1698924 calamares_0+git20141127.99_amd64.deb + a3da632d193007b0d4a1aff73159fde1b532d7a8 12835902 calamares-dbg_0+git20141127.99_amd64.deb +Checksums-Sha256: + 35b3280a7b1ffe159a276128cb5c408d687318f60ecbb8ab6dedb2e49c4e82dc 1106 calamares_0+git20141127.99.dsc + 5576b9caaf814564830f95561227e4f04ee87b31da22c1371aab155cbf7ce395 2694800 calamares_0+git20141127.99.tar.xz + 2e6e2f232ed7ffe52369928ebdf5436d90feb37840286ffba79e87d57a43a2e9 1698924 calamares_0+git20141127.99_amd64.deb + 8dd926080ed7bad2e2439e37e49ce12d5f1357c5041b7da4d860a1041f878a8a 12835902 calamares-dbg_0+git20141127.99_amd64.deb +Files: + 05fd8f3ffe8f362c5ef9bad2f936a56e 1106 devel optional calamares_0+git20141127.99.dsc + 097e55c81abd8e5f30bb2eed90c2c1e9 2694800 devel optional calamares_0+git20141127.99.tar.xz + 827fb3b12534241e119815d331e8197b 1698924 devel optional calamares_0+git20141127.99_amd64.deb + e6f8ce70f564d1f68cb57758b15b13e3 12835902 debug optional calamares-dbg_0+git20141127.99_amd64.deb`