Skip to content

Commit

Permalink
Merge pull request #671 from arbovm/detect-no-stdin-input
Browse files Browse the repository at this point in the history
Don't hang if no stdin or file provided
  • Loading branch information
jhaals committed Nov 14, 2020
2 parents 2b61b6a + 844cf6b commit 0075c5f
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 20 deletions.
44 changes: 29 additions & 15 deletions cmd/yopass/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ func main() {
if viper.IsSet("decrypt") {
err = decrypt(os.Stdout)
} else {
err = encrypt(os.Stdin, os.Stdout)
err = encryptStdinOrFile(os.Stdin, os.Stdout)
}

if err != nil {
Expand Down Expand Up @@ -123,6 +123,33 @@ func decrypt(out io.Writer) error {
return err
}

func encryptStdinOrFile(in *os.File, out io.Writer) error {
if viper.IsSet("file") {
return encryptFileByName(viper.GetString("file"), out)
}
return encryptStdin(in, out)
}

func encryptFileByName(filename string, out io.Writer) error {
var in, err = os.Open(filename)
defer in.Close()
if err != nil {
return fmt.Errorf("Failed to open file: %w", err)
}
return encrypt(in, out)
}

func encryptStdin(in *os.File, out io.Writer) error {
var info, err = in.Stat()
if err != nil {
return fmt.Errorf("Failed to get file info: %w", err)
}
if info.Mode()&os.ModeCharDevice != 0 {
return fmt.Errorf("No filename or piped input to encrypt given")
}
return encrypt(in, out)
}

func encrypt(in io.ReadCloser, out io.Writer) error {
exp := expiration(viper.GetString("expiration"))
if exp == 0 {
Expand All @@ -134,13 +161,7 @@ func encrypt(in io.ReadCloser, out io.Writer) error {
return fmt.Errorf("Failed to generate encryption key: %w", err)
}

pt, err := plaintext(in, viper.GetString("file"))
if err != nil {
return fmt.Errorf("Failed to open file: %w", err)
}
defer pt.Close()

msg, err := yopass.Encrypt(pt, key)
msg, err := yopass.Encrypt(in, key)
if err != nil {
return fmt.Errorf("Failed to encrypt secret: %w", err)
}
Expand All @@ -166,13 +187,6 @@ func encryptionKey(key string) (string, error) {
return yopass.GenerateKey()
}

func plaintext(in io.ReadCloser, filename string) (io.ReadCloser, error) {
if filename != "" {
return os.Open(filename)
}
return in, nil
}

func expiration(s string) int32 {
switch s {
case "1h":
Expand Down
30 changes: 25 additions & 5 deletions cmd/yopass/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ func TestCLI(t *testing.T) {
defer stdin.Close()

out := bytes.Buffer{}
err = encrypt(stdin, &out)
err = encryptStdinOrFile(stdin, &out)
if err != nil {
t.Fatalf("expected no encryption error, got %q", err)
}
Expand Down Expand Up @@ -59,7 +59,7 @@ func TestInvalidExpiration(t *testing.T) {

func TestMissingFileEncryption(t *testing.T) {
viper.Set("file", "xyz")
err := encrypt(nil, nil)
err := encryptStdinOrFile(nil, nil)
if err == nil {
t.Fatal("expected file open error, got none")
}
Expand All @@ -69,6 +69,28 @@ func TestMissingFileEncryption(t *testing.T) {
}
}

func TestDetectsNoStdinInput(t *testing.T) {
err := encryptStdin(os.Stdin, nil)
if err == nil {
t.Fatal("expected error because there is no data piped via stdin, got none")
}
want := "No filename or piped input to encrypt given"
if err.Error() != want {
t.Fatalf("expected %s, got %s", want, err.Error())
}
}

func TestNoStdin(t *testing.T) {
err := encryptStdin(nil, nil)
if err == nil {
t.Fatal("expected error because stdin is absent, got none")
}
want := "Failed to get file info: invalid argument"
if err.Error() != want {
t.Fatalf("expected %s, got %s", want, err.Error())
}
}

func TestCLIFileUpload(t *testing.T) {
if !pingDemoServer() {
t.Skip("skipping CLI integration tests - could not ping demo server")
Expand All @@ -82,10 +104,8 @@ func TestCLIFileUpload(t *testing.T) {
defer os.Remove(file.Name())
defer file.Close()

viper.Set("file", file.Name())

out := bytes.Buffer{}
err = encrypt(nil, &out)
err = encryptFileByName(file.Name(), &out)
if err != nil {
t.Fatalf("expected no encryption error, got %q", err)
}
Expand Down

0 comments on commit 0075c5f

Please sign in to comment.