Merge pull request #45269 from xilabao/update-gopass

Automatic merge from submit-queue (batch tested with PRs 45269, 46219, 45966)

update gopass to fix format error

```
#kubectl get no
Please enter Username: admin
Please enter Password: ********
                               NAME        STATUS    AGE       VERSION
127.0.0.1   Ready     28s       v1.7.0-alpha.2.357+904b02075623d7-dirty
```
`godep update github.com/howeyc/gopass/` can fix it.
This commit is contained in:
Kubernetes Submit Queue 2017-05-25 07:20:59 -07:00 committed by GitHub
commit 587eacec71
7 changed files with 37 additions and 18 deletions

2
Godeps/Godeps.json generated
View File

@ -1698,7 +1698,7 @@
}, },
{ {
"ImportPath": "github.com/howeyc/gopass", "ImportPath": "github.com/howeyc/gopass",
"Rev": "3ca23474a7c7203e0a0a070fd33508f6efdb9b3d" "Rev": "bf9dde6d0d2c004a008c27aaee91170c786f6db8"
}, },
{ {
"ImportPath": "github.com/imdario/mergo", "ImportPath": "github.com/imdario/mergo",

View File

@ -468,7 +468,7 @@
}, },
{ {
"ImportPath": "github.com/howeyc/gopass", "ImportPath": "github.com/howeyc/gopass",
"Rev": "3ca23474a7c7203e0a0a070fd33508f6efdb9b3d" "Rev": "bf9dde6d0d2c004a008c27aaee91170c786f6db8"
}, },
{ {
"ImportPath": "github.com/imdario/mergo", "ImportPath": "github.com/imdario/mergo",

View File

@ -148,7 +148,7 @@
}, },
{ {
"ImportPath": "github.com/howeyc/gopass", "ImportPath": "github.com/howeyc/gopass",
"Rev": "3ca23474a7c7203e0a0a070fd33508f6efdb9b3d" "Rev": "bf9dde6d0d2c004a008c27aaee91170c786f6db8"
}, },
{ {
"ImportPath": "github.com/imdario/mergo", "ImportPath": "github.com/imdario/mergo",

View File

@ -224,7 +224,7 @@
}, },
{ {
"ImportPath": "github.com/howeyc/gopass", "ImportPath": "github.com/howeyc/gopass",
"Rev": "3ca23474a7c7203e0a0a070fd33508f6efdb9b3d" "Rev": "bf9dde6d0d2c004a008c27aaee91170c786f6db8"
}, },
{ {
"ImportPath": "github.com/imdario/mergo", "ImportPath": "github.com/imdario/mergo",

View File

@ -216,7 +216,7 @@
}, },
{ {
"ImportPath": "github.com/howeyc/gopass", "ImportPath": "github.com/howeyc/gopass",
"Rev": "3ca23474a7c7203e0a0a070fd33508f6efdb9b3d" "Rev": "bf9dde6d0d2c004a008c27aaee91170c786f6db8"
}, },
{ {
"ImportPath": "github.com/imdario/mergo", "ImportPath": "github.com/imdario/mergo",

View File

@ -216,7 +216,7 @@
}, },
{ {
"ImportPath": "github.com/howeyc/gopass", "ImportPath": "github.com/howeyc/gopass",
"Rev": "3ca23474a7c7203e0a0a070fd33508f6efdb9b3d" "Rev": "bf9dde6d0d2c004a008c27aaee91170c786f6db8"
}, },
{ {
"ImportPath": "github.com/imdario/mergo", "ImportPath": "github.com/imdario/mergo",

View File

@ -7,9 +7,14 @@ import (
"os" "os"
) )
var defaultGetCh = func() (byte, error) { type FdReader interface {
io.Reader
Fd() uintptr
}
var defaultGetCh = func(r io.Reader) (byte, error) {
buf := make([]byte, 1) buf := make([]byte, 1)
if n, err := os.Stdin.Read(buf); n == 0 || err != nil { if n, err := r.Read(buf); n == 0 || err != nil {
if err != nil { if err != nil {
return 0, err return 0, err
} }
@ -28,9 +33,10 @@ var (
) )
// getPasswd returns the input read from terminal. // getPasswd returns the input read from terminal.
// If prompt is not empty, it will be output as a prompt to the user
// If masked is true, typing will be matched by asterisks on the screen. // If masked is true, typing will be matched by asterisks on the screen.
// Otherwise, typing will echo nothing. // Otherwise, typing will echo nothing.
func getPasswd(masked bool) ([]byte, error) { func getPasswd(prompt string, masked bool, r FdReader, w io.Writer) ([]byte, error) {
var err error var err error
var pass, bs, mask []byte var pass, bs, mask []byte
if masked { if masked {
@ -38,26 +44,33 @@ func getPasswd(masked bool) ([]byte, error) {
mask = []byte("*") mask = []byte("*")
} }
if isTerminal(os.Stdin.Fd()) { if isTerminal(r.Fd()) {
if oldState, err := makeRaw(os.Stdin.Fd()); err != nil { if oldState, err := makeRaw(r.Fd()); err != nil {
return pass, err return pass, err
} else { } else {
defer restore(os.Stdin.Fd(), oldState) defer func() {
restore(r.Fd(), oldState)
fmt.Fprintln(w)
}()
} }
} }
if prompt != "" {
fmt.Fprint(w, prompt)
}
// Track total bytes read, not just bytes in the password. This ensures any // Track total bytes read, not just bytes in the password. This ensures any
// errors that might flood the console with nil or -1 bytes infinitely are // errors that might flood the console with nil or -1 bytes infinitely are
// capped. // capped.
var counter int var counter int
for counter = 0; counter <= maxLength; counter++ { for counter = 0; counter <= maxLength; counter++ {
if v, e := getch(); e != nil { if v, e := getch(r); e != nil {
err = e err = e
break break
} else if v == 127 || v == 8 { } else if v == 127 || v == 8 {
if l := len(pass); l > 0 { if l := len(pass); l > 0 {
pass = pass[:l-1] pass = pass[:l-1]
fmt.Print(string(bs)) fmt.Fprint(w, string(bs))
} }
} else if v == 13 || v == 10 { } else if v == 13 || v == 10 {
break break
@ -66,7 +79,7 @@ func getPasswd(masked bool) ([]byte, error) {
break break
} else if v != 0 { } else if v != 0 {
pass = append(pass, v) pass = append(pass, v)
fmt.Print(string(mask)) fmt.Fprint(w, string(mask))
} }
} }
@ -74,18 +87,24 @@ func getPasswd(masked bool) ([]byte, error) {
err = ErrMaxLengthExceeded err = ErrMaxLengthExceeded
} }
fmt.Println()
return pass, err return pass, err
} }
// GetPasswd returns the password read from the terminal without echoing input. // GetPasswd returns the password read from the terminal without echoing input.
// The returned byte array does not include end-of-line characters. // The returned byte array does not include end-of-line characters.
func GetPasswd() ([]byte, error) { func GetPasswd() ([]byte, error) {
return getPasswd(false) return getPasswd("", false, os.Stdin, os.Stdout)
} }
// GetPasswdMasked returns the password read from the terminal, echoing asterisks. // GetPasswdMasked returns the password read from the terminal, echoing asterisks.
// The returned byte array does not include end-of-line characters. // The returned byte array does not include end-of-line characters.
func GetPasswdMasked() ([]byte, error) { func GetPasswdMasked() ([]byte, error) {
return getPasswd(true) return getPasswd("", true, os.Stdin, os.Stdout)
}
// GetPasswdPrompt prompts the user and returns the password read from the terminal.
// If mask is true, then asterisks are echoed.
// The returned byte array does not include end-of-line characters.
func GetPasswdPrompt(prompt string, mask bool, r FdReader, w io.Writer) ([]byte, error) {
return getPasswd(prompt, mask, r, w)
} }