@@ -14,34 +14,32 @@ func ReadPasswordInput() (string, error) {
1414}
1515
1616func ReadPasswordFromReader (reader io.Reader ) (string , error ) {
17- if file , ok := reader .(* os.File ); ok {
18- stat , err := file .Stat ()
19- if err != nil {
20- return "" , fmt .Errorf ("failed to stat stdin: %w" , err )
21- }
22-
23- if (stat .Mode () & os .ModeCharDevice ) == 0 {
24- data , err := io .ReadAll (file )
25- if err != nil {
26- return "" , fmt .Errorf ("failed to read from stdin: %w" , err )
27- }
28- password := string (data )
29- if strings .TrimSpace (password ) == "" {
30- return "" , fmt .Errorf ("empty password provided" )
31- }
32- return password , nil
33- }
34-
35- fmt .Fprint (os .Stderr , "Enter password: " )
36- passwordBytes , err := term .ReadPassword (int (file .Fd ()))
37- fmt .Fprintln (os .Stderr )
38- if err != nil {
39- return "" , fmt .Errorf ("failed to read password: %w" , err )
40- }
41-
42- return string (passwordBytes ), nil
17+ file , ok := reader .(* os.File )
18+ if ! ok {
19+ return readPasswordFromStream (reader )
4320 }
4421
22+ stat , err := file .Stat ()
23+ if err != nil {
24+ return "" , fmt .Errorf ("failed to stat stdin: %w" , err )
25+ }
26+
27+ isTerminal := (stat .Mode () & os .ModeCharDevice ) != 0
28+ if ! isTerminal {
29+ return readPasswordFromStream (file )
30+ }
31+
32+ fmt .Fprint (os .Stderr , "Enter password: " )
33+ passwordBytes , err := term .ReadPassword (int (file .Fd ()))
34+ fmt .Fprintln (os .Stderr )
35+ if err != nil {
36+ return "" , fmt .Errorf ("failed to read password: %w" , err )
37+ }
38+
39+ return string (passwordBytes ), nil
40+ }
41+
42+ func readPasswordFromStream (reader io.Reader ) (string , error ) {
4543 data , err := io .ReadAll (reader )
4644 if err != nil {
4745 return "" , fmt .Errorf ("failed to read from stdin: %w" , err )
0 commit comments