File tree 6 files changed +92
-16
lines changed
6 files changed +92
-16
lines changed Original file line number Diff line number Diff line change
1
+ package pgp
2
+
3
+ import (
4
+ "encoding/base64"
5
+ "fmt"
6
+ "io"
7
+ "os"
8
+ "strings"
9
+ )
10
+
11
+ type CLI struct {
12
+ Keyring string `group:"Keyring" help:"Path to GPG keyring" type:"existingfile" env:"EZAPT_KEYRING"`
13
+ KeyringBase64 string `group:"Keyring" help:"GPG keyring as base64" env:"EZAPT_KEYRING_BASE64"`
14
+ }
15
+
16
+ func (c * CLI ) Signer () (* Signer , error ) {
17
+ var keyringReader io.Reader
18
+ if c .KeyringBase64 != "" {
19
+ keyringReader = base64 .NewDecoder (base64 .StdEncoding , strings .NewReader (c .KeyringBase64 ))
20
+ } else if c .Keyring != "" {
21
+ fd , err := os .Open (c .Keyring )
22
+ if err != nil {
23
+ return nil , err
24
+ }
25
+ defer fd .Close ()
26
+ keyringReader = fd
27
+ } else {
28
+ return nil , fmt .Errorf ("no keyring provided" )
29
+ }
30
+
31
+ return NewSigner (keyringReader )
32
+ }
Original file line number Diff line number Diff line change 1
- package publish
1
+ package pgp
2
2
3
3
import (
4
4
"crypto"
@@ -12,13 +12,13 @@ import (
12
12
openpgp "github.com/ProtonMail/go-crypto/openpgp/v2"
13
13
)
14
14
15
- type signer struct {
15
+ type Signer struct {
16
16
entities []* openpgp.Entity
17
17
}
18
18
19
- func newSigner (keychain io.Reader ) (* signer , error ) {
19
+ func NewSigner (keychain io.Reader ) (* Signer , error ) {
20
20
pr := packet .NewReader (keychain )
21
- s := & signer {}
21
+ s := & Signer {}
22
22
for {
23
23
ent , err := openpgp .ReadEntity (pr )
24
24
if err == io .EOF {
@@ -33,12 +33,12 @@ func newSigner(keychain io.Reader) (*signer, error) {
33
33
return s , nil
34
34
}
35
35
36
- type seekable interface {
36
+ type Seekable interface {
37
37
io.Reader
38
38
io.Seeker
39
39
}
40
40
41
- func (s * signer ) DetachSign (in seekable , out io.Writer ) error {
41
+ func (s * Signer ) DetachSign (in Seekable , out io.Writer ) error {
42
42
if len (s .entities ) == 0 {
43
43
return fmt .Errorf ("no entities" )
44
44
}
@@ -51,7 +51,7 @@ func (s *signer) DetachSign(in seekable, out io.Writer) error {
51
51
return nil
52
52
}
53
53
54
- func (s * signer ) ClearSign (in seekable , out io.Writer ) error {
54
+ func (s * Signer ) ClearSign (in Seekable , out io.Writer ) error {
55
55
if len (s .entities ) == 0 {
56
56
return fmt .Errorf ("no entities" )
57
57
}
Original file line number Diff line number Diff line change @@ -6,14 +6,15 @@ import (
6
6
"os"
7
7
"path/filepath"
8
8
9
+ "kastelo.dev/ezapt/internal/pgp"
9
10
"pault.ag/go/debian/deb"
10
11
)
11
12
12
13
type CLI struct {
13
14
Dists string `required:"" help:"Path to dists directory" type:"existingdir" env:"EZAPT_DISTS"`
14
15
KeepVersions int `help:"Number of versions to keep" default:"2" env:"EZAPT_KEEP_VERSIONS"`
15
- Keyring string `required:"" help:"Path to GPG keyring" type:"existingfile" env:"EZAPT_KEYRING"`
16
16
Add string `help:"Path to packages to add" type:"existingdir" env:"EZAPT_ADD"`
17
+ pgp.CLI
17
18
}
18
19
19
20
func (c * CLI ) Run () error {
@@ -38,12 +39,7 @@ func (c *CLI) Run() error {
38
39
return fmt .Errorf ("publish: globbing: %w" , err )
39
40
}
40
41
41
- fd , err := os .Open (c .Keyring )
42
- if err != nil {
43
- return fmt .Errorf ("publish: %w" , err )
44
- }
45
- sign , err := newSigner (fd )
46
- fd .Close ()
42
+ sign , err := c .Signer ()
47
43
if err != nil {
48
44
return fmt .Errorf ("publish: %w" , err )
49
45
}
Original file line number Diff line number Diff line change @@ -10,6 +10,8 @@ import (
10
10
"strings"
11
11
"text/template"
12
12
"time"
13
+
14
+ "kastelo.dev/ezapt/internal/pgp"
13
15
)
14
16
15
17
type release struct {
@@ -143,7 +145,7 @@ func writeRelease(dist string) error {
143
145
return nil
144
146
}
145
147
146
- func signRelease (dist string , s * signer ) error {
148
+ func signRelease (dist string , s * pgp. Signer ) error {
147
149
in , err := os .Open (filepath .Join (dist , "Release" ))
148
150
if err != nil {
149
151
return err
Original file line number Diff line number Diff line change
1
+ package sign
2
+
3
+ import (
4
+ "fmt"
5
+ "os"
6
+
7
+ "kastelo.dev/ezapt/internal/pgp"
8
+ )
9
+
10
+ type CLI struct {
11
+ Files []string `arg:"" help:"Files to sign" type:"existingfile" env:"EZAPT_FILES"`
12
+ pgp.CLI
13
+ }
14
+
15
+ func (c * CLI ) Run () error {
16
+ sign , err := c .Signer ()
17
+ if err != nil {
18
+ return fmt .Errorf ("sign: %w" , err )
19
+ }
20
+
21
+ for _ , file := range c .Files {
22
+ in , err := os .Open (file )
23
+ if err != nil {
24
+ return fmt .Errorf ("open: %w" , err )
25
+ }
26
+ defer in .Close ()
27
+ out , err := os .Create (file + ".asc" )
28
+ if err != nil {
29
+ return fmt .Errorf ("create: %w" , err )
30
+ }
31
+ if err := sign .ClearSign (in , out ); err != nil {
32
+ return fmt .Errorf ("sign: %w" , err )
33
+ }
34
+ if err := out .Close (); err != nil {
35
+ return fmt .Errorf ("close: %w" , err )
36
+ }
37
+ }
38
+
39
+ return nil
40
+ }
Original file line number Diff line number Diff line change @@ -6,10 +6,16 @@ import (
6
6
7
7
"github.com/alecthomas/kong"
8
8
"kastelo.dev/ezapt/internal/publish"
9
+ "kastelo.dev/ezapt/internal/sign"
9
10
)
10
11
12
+ type CLI struct {
13
+ Publish publish.CLI `cmd:"" help:"Publish a repository." default:""`
14
+ Sign sign.CLI `cmd:"" help:"Sign files."`
15
+ }
16
+
11
17
func main () {
12
- var cli publish. CLI
18
+ var cli CLI
13
19
ctx := kong .Parse (& cli )
14
20
if err := ctx .Run (); err != nil {
15
21
slog .Error ("Failed to run" , "error" , err )
You can’t perform that action at this time.
0 commit comments