Hold the encrypt and decrypt result in memory until it is written (closes #143)
check / check (push) Waiting to run
check / check (push) Waiting to run
With --output, secret encrypt and secret decrypt emptied that file before reading any input, so a failed command left it empty, and encrypting a file onto itself gave the encryption of nothing. With --output they now hold the result in memory and open --output, with the same call as before, only once encryption or decryption has succeeded. A failed command leaves --output untouched, and --input can be the same file. Without --output the result still goes to stdout as it is produced. Model: opus-5-5
This commit is contained in:
+39
-17
@@ -1,6 +1,7 @@
|
||||
package cli
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
@@ -188,17 +189,15 @@ func (cli *Instance) Encrypt(secretName, inputFile, outputFile string) error {
|
||||
input = file
|
||||
}
|
||||
|
||||
// Set up output writer
|
||||
// Set up output writer. With --output the result is held in memory
|
||||
// and written only once encryption has succeeded, so a failure leaves
|
||||
// --output untouched and --input can be the same file.
|
||||
output := cli.cmd.OutOrStdout()
|
||||
|
||||
if outputFile != "" {
|
||||
file, err := cli.fs.Create(outputFile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create output file: %w", err)
|
||||
}
|
||||
defer func() { _ = file.Close() }()
|
||||
var result bytes.Buffer
|
||||
|
||||
output = file
|
||||
if outputFile != "" {
|
||||
output = &result
|
||||
}
|
||||
|
||||
// Encrypt the data
|
||||
@@ -217,7 +216,11 @@ func (cli *Instance) Encrypt(secretName, inputFile, outputFile string) error {
|
||||
return fmt.Errorf("failed to finalize encryption: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
if outputFile == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
return cli.writeOutputFile(outputFile, result.Bytes())
|
||||
}
|
||||
|
||||
// Decrypt decrypts data using an age secret key stored in a secret
|
||||
@@ -278,17 +281,15 @@ func (cli *Instance) Decrypt(secretName, inputFile, outputFile string) error {
|
||||
input = file
|
||||
}
|
||||
|
||||
// Set up output writer
|
||||
// Set up output writer. With --output the result is held in memory
|
||||
// and written only once decryption has succeeded, so a failure leaves
|
||||
// --output untouched and --input can be the same file.
|
||||
output := cli.cmd.OutOrStdout()
|
||||
|
||||
if outputFile != "" {
|
||||
file, err := cli.fs.Create(outputFile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create output file: %w", err)
|
||||
}
|
||||
defer func() { _ = file.Close() }()
|
||||
var result bytes.Buffer
|
||||
|
||||
output = file
|
||||
if outputFile != "" {
|
||||
output = &result
|
||||
}
|
||||
|
||||
// Decrypt the data
|
||||
@@ -302,6 +303,27 @@ func (cli *Instance) Decrypt(secretName, inputFile, outputFile string) error {
|
||||
return fmt.Errorf("failed to decrypt data: %w", err)
|
||||
}
|
||||
|
||||
if outputFile == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
return cli.writeOutputFile(outputFile, result.Bytes())
|
||||
}
|
||||
|
||||
// writeOutputFile creates outputFile, or empties it if it exists, and
|
||||
// writes result into it.
|
||||
func (cli *Instance) writeOutputFile(outputFile string, result []byte) error {
|
||||
file, err := cli.fs.Create(outputFile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create output file: %w", err)
|
||||
}
|
||||
defer func() { _ = file.Close() }()
|
||||
|
||||
_, err = file.Write(result)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to write output file: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user