diff options
| author | Jakob Unterwurzacher | 2019-03-03 13:25:30 +0100 | 
|---|---|---|
| committer | Jakob Unterwurzacher | 2019-03-03 13:25:30 +0100 | 
| commit | cf27037f20723e934320edeff7f8aa356bdca467 (patch) | |
| tree | b12428d172325fcfb517af26f7985651ef70e902 /internal | |
| parent | 61940a9c0666eba8be21de4f1cd182912f74f929 (diff) | |
Allow multiple -extpass arguments
To support arguments containing spaces, -extpass can now
be passed multiple times.
https://github.com/rfjakob/gocryptfs/issues/289
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/readpassword/extpass_test.go | 34 | ||||
| -rw-r--r-- | internal/readpassword/passfile_test.go | 1 | ||||
| -rw-r--r-- | internal/readpassword/passfile_test_files/file with spaces.txt | 1 | ||||
| -rw-r--r-- | internal/readpassword/read.go | 19 | 
4 files changed, 44 insertions, 11 deletions
| diff --git a/internal/readpassword/extpass_test.go b/internal/readpassword/extpass_test.go index 037d111..b4ca8fa 100644 --- a/internal/readpassword/extpass_test.go +++ b/internal/readpassword/extpass_test.go @@ -18,7 +18,7 @@ func TestMain(m *testing.M) {  func TestExtpass(t *testing.T) {  	p1 := "ads2q4tw41reg52" -	p2 := string(readPasswordExtpass("echo " + p1)) +	p2 := string(readPasswordExtpass([]string{"echo " + p1}))  	if p1 != p2 {  		t.Errorf("p1=%q != p2=%q", p1, p2)  	} @@ -26,7 +26,33 @@ func TestExtpass(t *testing.T) {  func TestOnceExtpass(t *testing.T) {  	p1 := "lkadsf0923rdfi48rqwhdsf" -	p2 := string(Once("echo "+p1, "", "")) +	p2 := string(Once([]string{"echo " + p1}, "", "")) +	if p1 != p2 { +		t.Errorf("p1=%q != p2=%q", p1, p2) +	} +} + +// extpass with two arguments +func TestOnceExtpass2(t *testing.T) { +	p1 := "foo" +	p2 := string(Once([]string{"echo", p1}, "", "")) +	if p1 != p2 { +		t.Errorf("p1=%q != p2=%q", p1, p2) +	} +} + +// extpass with three arguments +func TestOnceExtpass3(t *testing.T) { +	p1 := "foo bar baz" +	p2 := string(Once([]string{"echo", "foo", "bar", "baz"}, "", "")) +	if p1 != p2 { +		t.Errorf("p1=%q != p2=%q", p1, p2) +	} +} + +func TestOnceExtpassSpaces(t *testing.T) { +	p1 := "mypassword" +	p2 := string(Once([]string{"cat", "passfile_test_files/file with spaces.txt"}, "", ""))  	if p1 != p2 {  		t.Errorf("p1=%q != p2=%q", p1, p2)  	} @@ -34,7 +60,7 @@ func TestOnceExtpass(t *testing.T) {  func TestTwiceExtpass(t *testing.T) {  	p1 := "w5w44t3wfe45srz434" -	p2 := string(Once("echo "+p1, "", "")) +	p2 := string(Once([]string{"echo " + p1}, "", ""))  	if p1 != p2 {  		t.Errorf("p1=%q != p2=%q", p1, p2)  	} @@ -46,7 +72,7 @@ func TestTwiceExtpass(t *testing.T) {  // https://talks.golang.org/2014/testing.slide#23 .  func TestExtpassEmpty(t *testing.T) {  	if os.Getenv("TEST_SLAVE") == "1" { -		readPasswordExtpass("echo") +		readPasswordExtpass([]string{"echo"})  		return  	}  	cmd := exec.Command(os.Args[0], "-test.run=TestExtpassEmpty$") diff --git a/internal/readpassword/passfile_test.go b/internal/readpassword/passfile_test.go index 30f976f..cb7fa44 100644 --- a/internal/readpassword/passfile_test.go +++ b/internal/readpassword/passfile_test.go @@ -14,6 +14,7 @@ func TestPassfile(t *testing.T) {  		{"mypassword.txt", "mypassword"},  		{"mypassword_garbage.txt", "mypassword"},  		{"mypassword_missing_newline.txt", "mypassword"}, +		{"file with spaces.txt", "mypassword"},  	}  	for _, tc := range testcases {  		pw := readPassFile("passfile_test_files/" + tc.file) diff --git a/internal/readpassword/passfile_test_files/file with spaces.txt b/internal/readpassword/passfile_test_files/file with spaces.txt new file mode 100644 index 0000000..48d23cf --- /dev/null +++ b/internal/readpassword/passfile_test_files/file with spaces.txt @@ -0,0 +1 @@ +mypassword diff --git a/internal/readpassword/read.go b/internal/readpassword/read.go index 0378e53..060100b 100644 --- a/internal/readpassword/read.go +++ b/internal/readpassword/read.go @@ -24,11 +24,11 @@ const (  // Once tries to get a password from the user, either from the terminal, extpass  // or stdin. Leave "prompt" empty to use the default "Password: " prompt. -func Once(extpass string, passfile string, prompt string) []byte { +func Once(extpass []string, passfile string, prompt string) []byte {  	if passfile != "" {  		return readPassFile(passfile)  	} -	if extpass != "" { +	if len(extpass) != 0 {  		return readPasswordExtpass(extpass)  	}  	if prompt == "" { @@ -42,11 +42,11 @@ func Once(extpass string, passfile string, prompt string) []byte {  // Twice is the same as Once but will prompt twice if we get the password from  // the terminal. -func Twice(extpass string, passfile string) []byte { +func Twice(extpass []string, passfile string) []byte {  	if passfile != "" {  		return readPassFile(passfile)  	} -	if extpass != "" { +	if len(extpass) != 0 {  		return readPasswordExtpass(extpass)  	}  	if !terminal.IsTerminal(int(os.Stdin.Fd())) { @@ -99,9 +99,14 @@ func readPasswordStdin(prompt string) []byte {  // readPasswordExtpass executes the "extpass" program and returns the first line  // of the output.  // Exits on read error or empty result. -func readPasswordExtpass(extpass string) []byte { -	tlog.Info.Println("Reading password from extpass program") -	parts := strings.Split(extpass, " ") +func readPasswordExtpass(extpass []string) []byte { +	var parts []string +	if len(extpass) == 1 { +		parts = strings.Split(extpass[0], " ") +	} else { +		parts = extpass +	} +	tlog.Info.Printf("Reading password from extpass program %q, arguments: %q\n", parts[0], parts[1:])  	cmd := exec.Command(parts[0], parts[1:]...)  	cmd.Stderr = os.Stderr  	pipe, err := cmd.StdoutPipe() | 
