-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtlog.go
102 lines (96 loc) · 2.29 KB
/
tlog.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package main
import (
"bufio"
"bytes"
"errors"
"fmt"
"io"
"log"
"strings"
pgperrors "github.com/ProtonMail/go-crypto/openpgp/errors"
)
func VerifyPushCert(content []byte) (string, error) {
p, err := DecodePushCertbuf(content)
if err != nil {
return "", err
}
ent, err := p.Verify(Keyring)
if err != nil {
return "", err
}
for s := range ent.Identities {
return s, nil
}
return "", nil
}
// TODO: Generalize the revlist parsing
// Since the revlist is either in a file or part of the
// tlog entry we need figure out how to nicely abstract it
func RevlistParser(revlist io.Reader) [][]byte {
r := bufio.NewReader(revlist)
var ret [][]byte
for {
line, err := r.ReadBytes('\n')
if errors.Is(err, io.EOF) {
break
} else if err != nil {
return nil
}
split := bytes.SplitN(line, []byte{' '}, 2)
ret = append(ret, split[0])
}
return ret
}
func WorkRevisions(files MimeFiles) (string, []Revision) {
var wc []Revision
entry, err := DecodeTLogEntry(bytes.NewReader(files[0].Content))
if err != nil {
log.Fatal(err)
}
var r io.Reader
for _, change := range entry.Changes {
// If there is a revision list we find that instead
if strings.HasPrefix(change.Log, "revlist") {
for _, f := range files {
if f.Filename == change.Log {
r = bytes.NewBuffer(f.Content)
revlist := RevlistParser(r)
for _, rev := range revlist {
wc = append(wc, Revision{Who: entry.User, Repository: entry.Repo, Commit: fmt.Sprintf("%s", rev)})
}
}
}
} else {
r = strings.NewReader(change.Log)
revlist := RevlistParser(r)
for _, rev := range revlist {
wc = append(wc, Revision{Who: entry.User, Repository: entry.Repo, Commit: fmt.Sprintf("%s", rev)})
}
}
}
return entry.User, wc
}
func WorkTLog(h string, files MimeFiles) *TLogCommit {
var tlog TLogCommit
tlog.Commit = h
user, wc := WorkRevisions(files)
tlog.User = user
tlog.Revisions = wc
// Some commits are just plain single file entries
if len(files) < 2 {
return &tlog
}
if files[1].Filename != "git-push-certificate.txt" {
return &tlog
}
tlog.Signature = true
cert := files[1].Content
issuer, err := VerifyPushCert(cert)
if errors.Is(err, pgperrors.ErrUnknownIssuer) {
tlog.Unknown = true
} else if err == nil {
tlog.Valid = true
}
tlog.SigIssuer = issuer
return &tlog
}