login: add a --password-stdin argument

This:

* conflicts with --password (naturally)
* conflicts with the absence of --username (both can't be grabbed by the
  stdin)
* strips a trailing newline off the password if it exists

Signed-off-by: Tycho Andersen <tycho@tycho.ws>
This commit is contained in:
Tycho Andersen 2017-06-29 09:10:56 -06:00
parent 6908e58f0f
commit 7d18477bc2
1 changed files with 22 additions and 1 deletions

View File

@ -2,6 +2,8 @@ package registry
import ( import (
"fmt" "fmt"
"io/ioutil"
"strings"
"golang.org/x/net/context" "golang.org/x/net/context"
@ -16,6 +18,7 @@ type loginOptions struct {
serverAddress string serverAddress string
user string user string
password string password string
passwordStdin bool
} }
// NewLoginCommand creates a new `docker login` command // NewLoginCommand creates a new `docker login` command
@ -39,6 +42,7 @@ func NewLoginCommand(dockerCli command.Cli) *cobra.Command {
flags.StringVarP(&opts.user, "username", "u", "", "Username") flags.StringVarP(&opts.user, "username", "u", "", "Username")
flags.StringVarP(&opts.password, "password", "p", "", "Password") flags.StringVarP(&opts.password, "password", "p", "", "Password")
flags.BoolVarP(&opts.passwordStdin, "password-stdin", "", false, "Take the password from stdin")
return cmd return cmd
} }
@ -48,7 +52,24 @@ func runLogin(dockerCli command.Cli, opts loginOptions) error {
clnt := dockerCli.Client() clnt := dockerCli.Client()
if opts.password != "" { if opts.password != "" {
fmt.Fprintln(dockerCli.Err(), "WARNING! Using --password via the CLI is insecure.") fmt.Fprintln(dockerCli.Err(), "WARNING! Using --password via the CLI is insecure. Use --password-stdin.")
if opts.passwordStdin {
return errors.New("--password and --password-stdin are mutually exclusive")
}
}
if opts.passwordStdin {
if opts.user == "" {
return errors.New("Must provide --username with --password-stdin")
}
contents, err := ioutil.ReadAll(dockerCli.In())
if err != nil {
return err
}
opts.password = strings.TrimSuffix(string(contents), "\n")
opts.password = strings.TrimSuffix(opts.password, "\r")
} }
var ( var (