Skip to content

Commit d148ddf

Browse files
Max Jonas Wernerhiddeco
authored andcommitted
pgp: better error reporting for missing GPG binary
The error returned by `gpgExec` has just been swallowed. Now it is stringified and returned together with any output to stderr. Signed-off-by: Max Jonas Werner <mail@makk.es>
1 parent 511046d commit d148ddf

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

pgp/keysource.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ package pgp //import "github.com/getsops/sops/v3/pgp"
99
import (
1010
"bytes"
1111
"encoding/hex"
12+
"errors"
1213
"fmt"
1314
"io"
1415
"os"
@@ -131,9 +132,21 @@ func (d GnuPGHome) Import(armoredKey []byte) error {
131132
}
132133

133134
args := []string{"--batch", "--import"}
134-
_, stderr, err := gpgExec(d.String(), args, bytes.NewReader(armoredKey))
135+
_, stderrBuf, err := gpgExec(d.String(), args, bytes.NewReader(armoredKey))
135136
if err != nil {
136-
return fmt.Errorf("failed to import armored key data into GnuPG keyring: %s", strings.TrimSpace(stderr.String()))
137+
stderr := stderrBuf.String()
138+
errStr := err.Error()
139+
var sb strings.Builder
140+
sb.WriteString("failed to import armored key data into GnuPG keyring")
141+
if len(stderr) > 0 {
142+
fmt.Fprintf(&sb, ": %s", stderr)
143+
if len(errStr) > 0 {
144+
fmt.Fprintf(&sb, ": %s", errStr)
145+
}
146+
} else if len(errStr) > 0 {
147+
fmt.Fprintf(&sb, ": %s", errStr)
148+
}
149+
return errors.New(sb.String())
137150
}
138151
return nil
139152
}

pgp/keysource_test.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,27 @@ func TestGnuPGHome_Import(t *testing.T) {
6666
_, stderr, err = gpgExec(gnuPGHome.String(), []string{"--list-secret-keys", mockFingerprint}, nil)
6767
assert.NoErrorf(t, err, stderr.String())
6868

69-
assert.Error(t, gnuPGHome.Import([]byte("invalid armored data")))
69+
err = gnuPGHome.Import([]byte("invalid armored data"))
70+
assert.Error(t, err)
71+
assert.ErrorContains(t, err, "gpg: no valid OpenPGP data found.\ngpg: Total number processed: 0\n: exit status 2")
7072
assert.Error(t, GnuPGHome("").Import(b))
7173
}
7274

75+
func TestGnuPGHome_Import_With_Missing_Binary(t *testing.T) {
76+
t.Setenv(SopsGpgExecEnv, "/does/not/exist")
77+
78+
gnuPGHome, err := NewGnuPGHome()
79+
assert.NoError(t, err)
80+
t.Cleanup(func() {
81+
_ = os.RemoveAll(gnuPGHome.String())
82+
})
83+
84+
b, err := os.ReadFile(mockPublicKey)
85+
assert.NoError(t, err)
86+
err = gnuPGHome.Import(b)
87+
assert.ErrorContains(t, err, "failed to import armored key data into GnuPG keyring: fork/exec /does/not/exist: no such file or directory")
88+
}
89+
7390
func TestGnuPGHome_ImportFile(t *testing.T) {
7491
gnuPGHome, err := NewGnuPGHome()
7592
assert.NoError(t, err)

0 commit comments

Comments
 (0)