11package command
22
33import (
4- "bufio"
54 "context"
65 "fmt"
7- "io"
86 "os"
97 "runtime"
108 "strings"
@@ -18,7 +16,6 @@ import (
1816 "github.com/docker/docker/api/types"
1917 registrytypes "github.com/docker/docker/api/types/registry"
2018 "github.com/docker/docker/registry"
21- "github.com/moby/term"
2219 "github.com/pkg/errors"
2320)
2421
@@ -44,7 +41,7 @@ func RegistryAuthenticationPrivilegedFunc(cli Cli, index *registrytypes.IndexInf
4441 default :
4542 }
4643
47- err = ConfigureAuth (cli , "" , "" , & authConfig , isDefaultRegistry )
44+ err = ConfigureAuth (ctx , cli , "" , "" , & authConfig , isDefaultRegistry )
4845 if err != nil {
4946 return "" , err
5047 }
@@ -90,7 +87,7 @@ func GetDefaultAuthConfig(cfg *configfile.ConfigFile, checkCredStore bool, serve
9087}
9188
9289// ConfigureAuth handles prompting of user's username and password if needed
93- func ConfigureAuth (cli Cli , flUser , flPassword string , authconfig * registrytypes.AuthConfig , isDefaultRegistry bool ) error {
90+ func ConfigureAuth (ctx context. Context , cli Cli , flUser , flPassword string , authconfig * registrytypes.AuthConfig , isDefaultRegistry bool ) error {
9491 // On Windows, force the use of the regular OS stdin stream.
9592 //
9693 // See:
@@ -125,9 +122,15 @@ func ConfigureAuth(cli Cli, flUser, flPassword string, authconfig *registrytypes
125122 fmt .Fprintln (cli .Out ())
126123 }
127124 }
128- promptWithDefault (cli .Out (), "Username" , authconfig .Username )
125+
126+ var prompt string
127+ if authconfig .Username == "" {
128+ prompt = "Username: "
129+ } else {
130+ prompt = fmt .Sprintf ("Username (%s): " , authconfig .Username )
131+ }
129132 var err error
130- flUser , err = readInput ( cli .In ())
133+ flUser , err = PromptForInput ( ctx , cli .In (), cli . Out (), prompt )
131134 if err != nil {
132135 return err
133136 }
@@ -139,16 +142,13 @@ func ConfigureAuth(cli Cli, flUser, flPassword string, authconfig *registrytypes
139142 return errors .Errorf ("Error: Non-null Username Required" )
140143 }
141144 if flPassword == "" {
142- oldState , err := term . SaveState (cli .In (). FD ())
145+ restoreInput , err := DisableInputEcho (cli .In ())
143146 if err != nil {
144147 return err
145148 }
146- fmt .Fprintf (cli .Out (), "Password: " )
147- _ = term .DisableEcho (cli .In ().FD (), oldState )
148- defer func () {
149- _ = term .RestoreTerminal (cli .In ().FD (), oldState )
150- }()
151- flPassword , err = readInput (cli .In ())
149+ defer restoreInput ()
150+
151+ flPassword , err = PromptForInput (ctx , cli .In (), cli .Out (), "Password: " )
152152 if err != nil {
153153 return err
154154 }
@@ -164,25 +164,6 @@ func ConfigureAuth(cli Cli, flUser, flPassword string, authconfig *registrytypes
164164 return nil
165165}
166166
167- // readInput reads, and returns user input from in. It tries to return a
168- // single line, not including the end-of-line bytes, and trims leading
169- // and trailing whitespace.
170- func readInput (in io.Reader ) (string , error ) {
171- line , _ , err := bufio .NewReader (in ).ReadLine ()
172- if err != nil {
173- return "" , errors .Wrap (err , "error while reading input" )
174- }
175- return strings .TrimSpace (string (line )), nil
176- }
177-
178- func promptWithDefault (out io.Writer , prompt string , configDefault string ) {
179- if configDefault == "" {
180- fmt .Fprintf (out , "%s: " , prompt )
181- } else {
182- fmt .Fprintf (out , "%s (%s): " , prompt , configDefault )
183- }
184- }
185-
186167// RetrieveAuthTokenFromImage retrieves an encoded auth token given a complete
187168// image. The auth configuration is serialized as a base64url encoded RFC4648,
188169// section 5) JSON string for sending through the X-Registry-Auth header.
0 commit comments