Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

plumbing/object: fix pgp signature encoder/decoder #892

Merged
merged 1 commit into from
Aug 7, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 13 additions & 18 deletions plumbing/object/commit.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ import (
)

const (
beginpgp string = "-----BEGIN PGP SIGNATURE-----"
endpgp string = "-----END PGP SIGNATURE-----"
beginpgp string = "-----BEGIN PGP SIGNATURE-----"
endpgp string = "-----END PGP SIGNATURE-----"
headerpgp string = "gpgsig"
)

// Hash represents the hash of an object
Expand Down Expand Up @@ -181,23 +182,13 @@ func (c *Commit) Decode(o plumbing.EncodedObject) (err error) {
}

if pgpsig {
// Check if it's the end of a PGP signature.
if bytes.Contains(line, []byte(endpgp)) {
c.PGPSignature += endpgp + "\n"
pgpsig = false
} else {
// Trim the left padding.
if len(line) > 0 && line[0] == ' ' {
line = bytes.TrimLeft(line, " ")
c.PGPSignature += string(line)
continue
} else {
pgpsig = false
}
continue
}

// Check if it's the beginning of a PGP signature.
if bytes.Contains(line, []byte(beginpgp)) {
c.PGPSignature += beginpgp + "\n"
pgpsig = true
continue
}

if !message {
Expand All @@ -217,6 +208,9 @@ func (c *Commit) Decode(o plumbing.EncodedObject) (err error) {
c.Author.Decode(split[1])
case "committer":
c.Committer.Decode(split[1])
case headerpgp:
c.PGPSignature += string(split[1]) + "\n"
pgpsig = true
}
} else {
c.Message += string(line)
Expand Down Expand Up @@ -269,13 +263,14 @@ func (b *Commit) encode(o plumbing.EncodedObject, includeSig bool) (err error) {
}

if b.PGPSignature != "" && includeSig {
if _, err = fmt.Fprint(w, "pgpsig"); err != nil {
if _, err = fmt.Fprint(w, "\n"+headerpgp); err != nil {
return err
}

// Split all the signature lines and write with a left padding and
// newline at the end.
lines := strings.Split(b.PGPSignature, "\n")
signature := strings.TrimSuffix(b.PGPSignature, "\n")
lines := strings.Split(signature, "\n")
for _, line := range lines {
if _, err = fmt.Fprintf(w, " %s\n", line); err != nil {
return err
Expand Down
32 changes: 32 additions & 0 deletions plumbing/object/commit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,38 @@ RUysgqjcpT8+iQM1PblGfHR4XAhuOqN5Fx06PSaFZhqvWFezJ28/CLyX5q+oIVk=
err = decoded.Decode(encoded)
c.Assert(err, IsNil)
c.Assert(decoded.PGPSignature, Equals, pgpsignature)

// signature in author name

commit.PGPSignature = ""
commit.Author.Name = beginpgp
encoded = &plumbing.MemoryObject{}
decoded = &Commit{}

err = commit.Encode(encoded)
c.Assert(err, IsNil)

err = decoded.Decode(encoded)
c.Assert(err, IsNil)
c.Assert(decoded.PGPSignature, Equals, "")
c.Assert(decoded.Author.Name, Equals, beginpgp)

// broken signature

commit.PGPSignature = beginpgp + "\n" +
"some\n" +
"trash\n" +
endpgp +
"text\n"
encoded = &plumbing.MemoryObject{}
decoded = &Commit{}

err = commit.Encode(encoded)
c.Assert(err, IsNil)

err = decoded.Decode(encoded)
c.Assert(err, IsNil)
c.Assert(decoded.PGPSignature, Equals, commit.PGPSignature)
}

func (s *SuiteCommit) TestStat(c *C) {
Expand Down