Skip to content

Commit 7b661f9

Browse files
committed
plumbing: object/{commit,tag} add EncodeWithoutSignature, Implement src-d#1116
Signed-off-by: Antoine GIRARD <[email protected]>
1 parent 923642a commit 7b661f9

File tree

4 files changed

+133
-12
lines changed

4 files changed

+133
-12
lines changed

plumbing/object/commit.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,16 @@ func (b *Commit) Encode(o plumbing.EncodedObject) error {
233233
return b.encode(o, true)
234234
}
235235

236+
// PGPPayload export to a Reader the commit payload that is signed
237+
func (b *Commit) PGPPayload() (io.Reader, error) {
238+
encoded := &plumbing.MemoryObject{}
239+
// Encode commit components, excluding signature and get a reader object.
240+
if err := b.encode(encoded, false); err != nil {
241+
return nil, err
242+
}
243+
return encoded.Reader()
244+
}
245+
236246
func (b *Commit) encode(o plumbing.EncodedObject, includeSig bool) (err error) {
237247
o.SetType(plumbing.CommitObject)
238248
w, err := o.Writer()
@@ -337,12 +347,8 @@ func (c *Commit) Verify(armoredKeyRing string) (*openpgp.Entity, error) {
337347
// Extract signature.
338348
signature := strings.NewReader(c.PGPSignature)
339349

340-
encoded := &plumbing.MemoryObject{}
341350
// Encode commit components, excluding signature and get a reader object.
342-
if err := c.encode(encoded, false); err != nil {
343-
return nil, err
344-
}
345-
er, err := encoded.Reader()
351+
er, err := c.PGPPayload()
346352
if err != nil {
347353
return nil, err
348354
}

plumbing/object/commit_test.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ import (
44
"bytes"
55
"context"
66
"io"
7+
"io/ioutil"
78
"strings"
89
"time"
910

11+
fixtures "gopkg.in/src-d/go-git-fixtures.v3"
1012
"gopkg.in/src-d/go-git.v4/plumbing"
1113
"gopkg.in/src-d/go-git.v4/plumbing/cache"
1214

1315
. "gopkg.in/check.v1"
14-
"gopkg.in/src-d/go-git-fixtures.v3"
1516
"gopkg.in/src-d/go-git.v4/storage/filesystem"
1617
)
1718

@@ -495,3 +496,20 @@ func (s *SuiteCommit) TestMalformedHeader(c *C) {
495496
err = decoded.Decode(encoded)
496497
c.Assert(err, IsNil)
497498
}
499+
500+
func (s *SuiteCommit) TestEncodeWithoutSignature(c *C) {
501+
//Similar to TestString since no signature
502+
er, err := s.Commit.EncodeWithoutSignature()
503+
c.Assert(err, IsNil)
504+
payload, err := ioutil.ReadAll(er)
505+
c.Assert(err, IsNil)
506+
507+
c.Assert(string(payload), Equals, ""+
508+
"tree eba74343e2f15d62adedfd8c883ee0262b5c8021\n"+
509+
"parent 35e85108805c84807bc66a02d91535e1e24b38b9\n"+
510+
"parent a5b8b09e2f8fcb0bb99d3ccb0958157b40890d69\n"+
511+
"author Máximo Cuadros Ortiz <[email protected]> 1427802494 +0200\n"+
512+
"committer Máximo Cuadros Ortiz <[email protected]> 1427802494 +0200\n"+
513+
"\n"+
514+
"Merge branch 'master' of github.com:tyba/git-fixture\n")
515+
}

plumbing/object/tag.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,16 @@ func (t *Tag) Encode(o plumbing.EncodedObject) error {
169169
return t.encode(o, true)
170170
}
171171

172+
// EncodeWithoutSignature export to a Reader the tag payload that is signed
173+
func (t *Tag) PGPPayload() (io.Reader, error) {
174+
encoded := &plumbing.MemoryObject{}
175+
// Encode commit components, excluding signature and get a reader object.
176+
if err := t.encode(encoded, false); err != nil {
177+
return nil, err
178+
}
179+
return encoded.Reader()
180+
}
181+
172182
func (t *Tag) encode(o plumbing.EncodedObject, includeSig bool) (err error) {
173183
o.SetType(plumbing.TagObject)
174184
w, err := o.Writer()
@@ -287,12 +297,8 @@ func (t *Tag) Verify(armoredKeyRing string) (*openpgp.Entity, error) {
287297
// Extract signature.
288298
signature := strings.NewReader(t.PGPSignature)
289299

290-
encoded := &plumbing.MemoryObject{}
291300
// Encode tag components, excluding signature and get a reader object.
292-
if err := t.encode(encoded, false); err != nil {
293-
return nil, err
294-
}
295-
er, err := encoded.Reader()
301+
er, err := t.EncodeWithoutSignature()
296302
if err != nil {
297303
return nil, err
298304
}

plumbing/object/tag_test.go

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,17 @@ package object
33
import (
44
"fmt"
55
"io"
6+
"io/ioutil"
67
"strings"
78
"time"
89

10+
fixtures "gopkg.in/src-d/go-git-fixtures.v3"
911
"gopkg.in/src-d/go-git.v4/plumbing"
1012
"gopkg.in/src-d/go-git.v4/plumbing/cache"
1113
"gopkg.in/src-d/go-git.v4/storage/filesystem"
1214
"gopkg.in/src-d/go-git.v4/storage/memory"
1315

1416
. "gopkg.in/check.v1"
15-
"gopkg.in/src-d/go-git-fixtures.v3"
1617
)
1718

1819
type TagSuite struct {
@@ -375,3 +376,93 @@ sYyf9RfOnw/KUFAQbdtvLx3ikODQC+D3KBtuKI9ISHQfgw==
375376
_, ok := e.Identities["Sunny <[email protected]>"]
376377
c.Assert(ok, Equals, true)
377378
}
379+
380+
func (s *TagSuite) TestDecodeAndVerify(c *C) {
381+
objectText := `object 7dba2f128d1298e385b28b56a7e1c579779eac82
382+
type commit
383+
tag v1.6
384+
tagger Filip Navara <[email protected]> 1555269936 +0200
385+
386+
Hello
387+
388+
world
389+
390+
boo
391+
-----BEGIN PGP SIGNATURE-----
392+
393+
iQEzBAABCAAdFiEEdRIEYXeoLk1t7PBDqeqoMkraaZ4FAlyziT4ACgkQqeqoMkra
394+
aZ502wgAxG4+69l8PYfq45u1R3CCf4x0m5WwcYwvaa4ang0S9mExh/C32NHnpM/V
395+
DbqMpAlFvBlixOsZ8FNWaM8VXnvRWyx64E6WnInxjx9+Wgv2fy5P1N5rtpvi+S2V
396+
iGc0RQJlIloqXr7qPYDrwcbgg6AFg9EPhgJxLyizglu9nYvNsH1InaPXMjzgGX8+
397+
3irnIYEMIrLcKPrCyHo4Q6gdBjEEBF8hFclPJ8OwXBPc6uNYjnDYx0me9TTQYqoG
398+
oGgO/rADU9fy4c/Q1ZQpocba/ca6abRJ9LAx9VXFOSlQrMKLgHCYfqU/MAZXKcZM
399+
6XXOL4+8Z3FJN6CapZKX7cdYB8LJnw==
400+
=t5Px
401+
-----END PGP SIGNATURE-----
402+
403+
`
404+
405+
armoredKeyRing := `
406+
-----BEGIN PGP PUBLIC KEY BLOCK-----
407+
408+
mQENBFyzedYBCADN3lVNUNkrjn0kfwKAxGQOI8a1977UaIq9ktFg+Uv4Jyq2Y59L
409+
ZVx2WYk1iDaRhxhv203HV//CA/Hr4IoPjK53qAkg2bPyi8UuDbL+gU+4Z+IiSeXd
410+
18ZcAbcYt188PWoUq9/82ofO8EiaBbUEEZJjEegLDtX8gxBDG0aI3Yj4Txj73mno
411+
w6+E5HDkgPElmH3oNQcr8iK9U2Kuj+ZAHkzbWL++gDCPiLl2eWf0Cr1nlVsv6YLa
412+
Fsn5vjMGT3dMJFc78ZqCHOeyYK7KHjW1EjzgqeG2eJVay+ZQ5zEx4Fp/dL0RdUSV
413+
U7zslRiraaPxshdhYOjQ0o72RpSkP1G6+8OhABEBAAG0JUZpbGlwIE5hdmFyYSA8
414+
ZmlsaXAubmF2YXJhQGdtYWlsLmNvbT6JAVQEEwEIAD4WIQR1EgRhd6guTW3s8EOp
415+
6qgyStppngUCXLN51gIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAK
416+
CRCp6qgyStppnlzjB/sFu7HqJrTRsnHsoWo2+nDeicXnR0VAhiLvv7uRRw4i90FJ
417+
0zDwjAmIH+po6vPffWRMcWOFVvAwZCX7/XcvDNF9OupFj/aold334+VVN0ha47IQ
418+
g44bJZie9mvLagEsqUXggpKQjd414Tk08aUucfaN9RFJIOGCwF05j2eXOBGR2HTe
419+
FLq3obeObryEPf0c8N/nw4RQ8OOcq98gxiHx5Gk+nLCcJCTvOlc9ULqpJ2a6cZry
420+
kxgSOI9dd74ilRQdpfPvoEeEGSqkY+daf+dhgSMT2mII0UJ6qQeY0DpCZZNsL8dr
421+
PxR4SPRlzLBuJIpnHY21ebOqwOPOLjzR+J2RBufkuQENBFyzedYBCADTCglXrST6
422+
DRz7Uq3zrrrzdCchHH0/+LgYOEoGs82UvdFfigQYGTydmXz27bHKfWNfGIa9IlLF
423+
MhasFueCnKnmfVxnlINRdyAXv7Tmx4mSjuCEmGkvM1nPpdhxWXptnVMqhQMddiMO
424+
N55bElDK2ftPc2s4dBmTItXXbet2kFZiv7MZBZpA4eRAHj5DDSwl8pnQArU50RDZ
425+
q3qYKvAP/z2SLjekcOFtMhZ9BXMvwAW4FWV0ztpfP3LvUUb0T7fSo5cXlm/0eqwa
426+
MUrUlbbwJMDg1/wJ3pbKhZlP+xXNLj5UE86TtfqNqaohOcIBdCsdTUQgbkLVlibP
427+
JmZH7lGDhvi3ABEBAAGJATwEGAEIACYWIQR1EgRhd6guTW3s8EOp6qgyStppngUC
428+
XLN51gIbDAUJA8JnAAAKCRCp6qgyStppntq1B/9bmw4XjEm5KyXwWnlAVGr8skXY
429+
KIJr6drUOOwQzl7rxsJRjUsFdX0IjaZwx303G/23eQMIvVkoaWpHrT0Y7EsTQ55x
430+
+GSuANhEzobks4spzQ66VW9FHRlRr5wg5PTwWnGtV/5QVSTY/zeC9R/AFUJFsDWe
431+
tgHlNrb6MWx5EtypZDpAkubAMvD/QoZHX0oPXYAA2CugD4uSdzjf6Ys3xUuwjKKG
432+
5hvimAg1/Hympq71Znb6Ec1m4ZM22Br7dcWHIX2GWfDPyRG+rYPu4Fk9KKAD4FRz
433+
HdzbB2ak/HxIeCqmHVlmUqa+WfTMUJcsgOm3/ZFPCSoL6l0bz9Z1XVbiyD03
434+
=+gC9
435+
-----END PGP PUBLIC KEY BLOCK-----
436+
`
437+
438+
tagEncodedObject := &plumbing.MemoryObject{}
439+
440+
_, err := tagEncodedObject.Write([]byte(objectText))
441+
tagEncodedObject.SetType(plumbing.TagObject)
442+
c.Assert(err, IsNil)
443+
444+
tag := &Tag{}
445+
err = tag.Decode(tagEncodedObject)
446+
c.Assert(err, IsNil)
447+
448+
_, err = tag.Verify(armoredKeyRing)
449+
c.Assert(err, IsNil)
450+
}
451+
452+
func (s *TagSuite) TestEncodeWithoutSignature(c *C) {
453+
//Similar to TestString since no signature
454+
tag := s.tag(c, plumbing.NewHash("b742a2a9fa0afcfa9a6fad080980fbc26b007c69"))
455+
er, err := tag.EncodeWithoutSignature()
456+
c.Assert(err, IsNil)
457+
payload, err := ioutil.ReadAll(er)
458+
c.Assert(err, IsNil)
459+
460+
c.Assert(string(payload), Equals, ""+
461+
"object f7b877701fbf855b44c0a9e86f3fdce2c298b07f\n"+
462+
"type commit\n"+
463+
"tag annotated-tag\n"+
464+
"tagger Máximo Cuadros <[email protected]> 1474485215 +0200\n"+
465+
"\n"+
466+
"example annotated tag\n",
467+
)
468+
}

0 commit comments

Comments
 (0)