Skip to content

Commit 75e8c94

Browse files
committed
feat: Improve GPG encryption and decryption handling with enhanced error messages and compression order
1 parent 294257e commit 75e8c94

File tree

2 files changed

+50
-14
lines changed

2 files changed

+50
-14
lines changed

pkg/tar/gpg.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010

1111
// GPGHandler handles GPG encryption, decryption, signing, and verification
1212
type GPGHandler struct {
13-
KeyID string
13+
KeyID string
1414
KeyringPath string
1515
}
1616

@@ -244,8 +244,20 @@ func (r *gpgReader) Read(p []byte) (n int, err error) {
244244
if err == io.EOF {
245245
// Wait for process to complete
246246
if waitErr := r.cmd.Wait(); waitErr != nil {
247+
// Provide more helpful error messages based on common GPG errors
248+
exitErr, ok := waitErr.(*exec.ExitError)
249+
if ok {
250+
switch exitErr.ExitCode() {
251+
case 2:
252+
return n, fmt.Errorf("GPG decryption failed: file may not be encrypted or wrong key used (exit code 2)")
253+
case 9:
254+
return n, fmt.Errorf("GPG decryption failed: no secret key available (exit code 9)")
255+
default:
256+
return n, fmt.Errorf("GPG process failed with exit code %d: %w", exitErr.ExitCode(), waitErr)
257+
}
258+
}
247259
return n, fmt.Errorf("GPG process failed: %w", waitErr)
248260
}
249261
}
250262
return n, err
251-
}
263+
}

pkg/tar/tar.go

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,7 @@ func (ta *TarArchive) Create(sourceDir string) error {
7171

7272
var writer io.Writer = file
7373

74-
// Add gzip compression if enabled
75-
var gzipWriter *gzip.Writer
76-
if ta.Options.Compression {
77-
gzipWriter = gzip.NewWriter(writer)
78-
writer = gzipWriter
79-
defer gzipWriter.Close()
80-
}
81-
82-
// Add GPG encryption if enabled
74+
// Add GPG encryption first (outermost layer)
8375
var encryptedWriter io.WriteCloser
8476
if ta.Options.GPGEncrypt && ta.gpg != nil {
8577
encryptedWriter, err = ta.gpg.Encrypt(writer)
@@ -90,6 +82,14 @@ func (ta *TarArchive) Create(sourceDir string) error {
9082
defer encryptedWriter.Close()
9183
}
9284

85+
// Add gzip compression (middle layer)
86+
var gzipWriter *gzip.Writer
87+
if ta.Options.Compression {
88+
gzipWriter = gzip.NewWriter(writer)
89+
writer = gzipWriter
90+
defer gzipWriter.Close()
91+
}
92+
9393
tarWriter := tar.NewWriter(writer)
9494
defer tarWriter.Close()
9595

@@ -191,8 +191,32 @@ func (ta *TarArchive) Extract(destDir string) error {
191191

192192
var reader io.Reader = file
193193

194-
// Handle GPG decryption if encrypted
194+
// Check if the file is actually encrypted before trying to decrypt
195+
actuallyEncrypted := false
195196
if ta.Options.GPGEncrypt && ta.gpg != nil {
197+
// Read a small header to check if it's encrypted
198+
header := make([]byte, 50)
199+
n, err := file.Read(header)
200+
if err != nil && err != io.EOF {
201+
return fmt.Errorf("failed to read file header: %w", err)
202+
}
203+
204+
actuallyEncrypted = ta.gpg.IsEncrypted(header[:n])
205+
206+
// Reset file position
207+
file.Seek(0, 0)
208+
209+
if ta.Options.Verbose {
210+
if actuallyEncrypted {
211+
fmt.Printf("File is GPG encrypted, decrypting...\n")
212+
} else {
213+
fmt.Printf("File is not encrypted despite .gpg extension\n")
214+
}
215+
}
216+
}
217+
218+
// Handle GPG decryption if actually encrypted
219+
if actuallyEncrypted && ta.gpg != nil {
196220
decryptedReader, err := ta.gpg.Decrypt(reader)
197221
if err != nil {
198222
return fmt.Errorf("failed to decrypt archive: %w", err)
@@ -372,12 +396,12 @@ func IsTarFile(path string) bool {
372396
// ParseTarOptions determines TAR options from file extension
373397
func ParseTarOptions(path string) TarOptions {
374398
path = strings.ToLower(path)
375-
399+
376400
options := TarOptions{
377401
Compression: strings.Contains(path, ".gz") || strings.Contains(path, ".tgz"),
378402
GPGEncrypt: strings.HasSuffix(path, ".gpg"),
379403
GPGSign: false, // This should be set explicitly by user
380404
}
381405

382406
return options
383-
}
407+
}

0 commit comments

Comments
 (0)