Skip to content

Commit 18c9b6c

Browse files
author
Doug Davis
committed
Add .docker/config.json and support for HTTP Headers
This PR does the following: - migrated ~/.dockerfg to ~/.docker/config.json. The data is migrated but the old file remains in case its needed - moves the auth json in that fie into an "auth" property so we can add new top-level properties w/o messing with the auth stuff - adds support for an HttpHeaders property in ~/.docker/config.json which adds these http headers to all msgs from the cli In a follow-on PR I'll move the config file process out from under "registry" since it not specific to that any more. I didn't do it here because I wanted the diff to be smaller so people can make sure I didn't break/miss any auth code during my edits. Signed-off-by: Doug Davis <[email protected]>
1 parent dacc050 commit 18c9b6c

19 files changed

Lines changed: 360 additions & 81 deletions

File tree

api/client/build.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -286,10 +286,8 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
286286

287287
v.Set("dockerfile", *dockerfileName)
288288

289-
cli.LoadConfigFile()
290-
291289
headers := http.Header(make(map[string][]string))
292-
buf, err := json.Marshal(cli.configFile)
290+
buf, err := json.Marshal(cli.configFile.AuthConfigs)
293291
if err != nil {
294292
return err
295293
}

api/client/cli.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"net"
1010
"net/http"
1111
"os"
12+
"path/filepath"
1213
"reflect"
1314
"strings"
1415
"text/template"
@@ -120,14 +121,6 @@ func (cli *DockerCli) Subcmd(name, signature, description string, exitOnError bo
120121
return flags
121122
}
122123

123-
func (cli *DockerCli) LoadConfigFile() (err error) {
124-
cli.configFile, err = registry.LoadConfig(homedir.Get())
125-
if err != nil {
126-
fmt.Fprintf(cli.err, "WARNING: %s\n", err)
127-
}
128-
return err
129-
}
130-
131124
func (cli *DockerCli) CheckTtyInput(attachStdin, ttyMode bool) error {
132125
// In order to attach to a container tty, input stream for the client must
133126
// be a tty itself: redirecting or piping the client standard input is
@@ -184,9 +177,15 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, keyFile string, proto, a
184177
tr.Dial = (&net.Dialer{Timeout: timeout}).Dial
185178
}
186179

180+
configFile, e := registry.LoadConfig(filepath.Join(homedir.Get(), ".docker"))
181+
if e != nil {
182+
fmt.Fprintf(err, "WARNING: Error loading config file:%v\n", e)
183+
}
184+
187185
return &DockerCli{
188186
proto: proto,
189187
addr: addr,
188+
configFile: configFile,
190189
in: in,
191190
out: out,
192191
err: err,

api/client/create.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,6 @@ func (cli *DockerCli) pullImageCustomOut(image string, out io.Writer) error {
3737
return err
3838
}
3939

40-
// Load the auth config file, to be able to pull the image
41-
cli.LoadConfigFile()
42-
4340
// Resolve the Auth config relevant for this server
4441
authConfig := cli.configFile.ResolveAuthConfig(repoInfo.Index)
4542
buf, err := json.Marshal(authConfig)

api/client/hijack.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,13 @@ func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.Rea
142142
if err != nil {
143143
return err
144144
}
145+
146+
// Add CLI Config's HTTP Headers BEFORE we set the Docker headers
147+
// then the user can't change OUR headers
148+
for k, v := range cli.configFile.HttpHeaders {
149+
req.Header.Set(k, v)
150+
}
151+
145152
req.Header.Set("User-Agent", "Docker-Client/"+dockerversion.VERSION)
146153
req.Header.Set("Content-Type", "text/plain")
147154
req.Header.Set("Connection", "Upgrade")

api/client/info.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,7 @@ func (cli *DockerCli) CmdInfo(args ...string) error {
6868
}
6969

7070
if info.IndexServerAddress != "" {
71-
cli.LoadConfigFile()
72-
u := cli.configFile.Configs[info.IndexServerAddress].Username
71+
u := cli.configFile.AuthConfigs[info.IndexServerAddress].Username
7372
if len(u) > 0 {
7473
fmt.Fprintf(cli.out, "Username: %v\n", u)
7574
fmt.Fprintf(cli.out, "Registry: %v\n", info.IndexServerAddress)

api/client/login.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@ import (
66
"fmt"
77
"io"
88
"os"
9-
"path"
109
"strings"
1110

1211
"github.com/docker/docker/api/types"
13-
"github.com/docker/docker/pkg/homedir"
1412
flag "github.com/docker/docker/pkg/mflag"
1513
"github.com/docker/docker/pkg/term"
1614
"github.com/docker/docker/registry"
@@ -56,8 +54,7 @@ func (cli *DockerCli) CmdLogin(args ...string) error {
5654
return string(line)
5755
}
5856

59-
cli.LoadConfigFile()
60-
authconfig, ok := cli.configFile.Configs[serverAddress]
57+
authconfig, ok := cli.configFile.AuthConfigs[serverAddress]
6158
if !ok {
6259
authconfig = registry.AuthConfig{}
6360
}
@@ -113,12 +110,14 @@ func (cli *DockerCli) CmdLogin(args ...string) error {
113110
authconfig.Password = password
114111
authconfig.Email = email
115112
authconfig.ServerAddress = serverAddress
116-
cli.configFile.Configs[serverAddress] = authconfig
113+
cli.configFile.AuthConfigs[serverAddress] = authconfig
117114

118-
stream, statusCode, err := cli.call("POST", "/auth", cli.configFile.Configs[serverAddress], nil)
115+
stream, statusCode, err := cli.call("POST", "/auth", cli.configFile.AuthConfigs[serverAddress], nil)
119116
if statusCode == 401 {
120-
delete(cli.configFile.Configs, serverAddress)
121-
registry.SaveConfig(cli.configFile)
117+
delete(cli.configFile.AuthConfigs, serverAddress)
118+
if err2 := cli.configFile.Save(); err2 != nil {
119+
fmt.Fprintf(cli.out, "WARNING: could not save config file: %v\n", err2)
120+
}
122121
return err
123122
}
124123
if err != nil {
@@ -127,12 +126,15 @@ func (cli *DockerCli) CmdLogin(args ...string) error {
127126

128127
var response types.AuthResponse
129128
if err := json.NewDecoder(stream).Decode(&response); err != nil {
130-
cli.configFile, _ = registry.LoadConfig(homedir.Get())
129+
// Upon error, remove entry
130+
delete(cli.configFile.AuthConfigs, serverAddress)
131131
return err
132132
}
133133

134-
registry.SaveConfig(cli.configFile)
135-
fmt.Fprintf(cli.out, "WARNING: login credentials saved in %s.\n", path.Join(homedir.Get(), registry.CONFIGFILE))
134+
if err := cli.configFile.Save(); err != nil {
135+
return fmt.Errorf("Error saving config file: %v", err)
136+
}
137+
fmt.Fprintf(cli.out, "WARNING: login credentials saved in %s\n", cli.configFile.Filename())
136138

137139
if response.Status != "" {
138140
fmt.Fprintf(cli.out, "%s\n", response.Status)

api/client/logout.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,13 @@ func (cli *DockerCli) CmdLogout(args ...string) error {
2222
serverAddress = cmd.Arg(0)
2323
}
2424

25-
cli.LoadConfigFile()
26-
if _, ok := cli.configFile.Configs[serverAddress]; !ok {
25+
if _, ok := cli.configFile.AuthConfigs[serverAddress]; !ok {
2726
fmt.Fprintf(cli.out, "Not logged in to %s\n", serverAddress)
2827
} else {
2928
fmt.Fprintf(cli.out, "Remove login credentials for %s\n", serverAddress)
30-
delete(cli.configFile.Configs, serverAddress)
29+
delete(cli.configFile.AuthConfigs, serverAddress)
3130

32-
if err := registry.SaveConfig(cli.configFile); err != nil {
31+
if err := cli.configFile.Save(); err != nil {
3332
return fmt.Errorf("Failed to save docker config: %v", err)
3433
}
3534
}

api/client/pull.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,6 @@ func (cli *DockerCli) CmdPull(args ...string) error {
4242
return err
4343
}
4444

45-
cli.LoadConfigFile()
46-
4745
_, _, err = cli.clientRequestAttemptLogin("POST", "/images/create?"+v.Encode(), nil, cli.out, repoInfo.Index, "pull")
4846
return err
4947
}

api/client/push.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ func (cli *DockerCli) CmdPush(args ...string) error {
2020

2121
name := cmd.Arg(0)
2222

23-
cli.LoadConfigFile()
24-
2523
remote, tag := parsers.ParseRepositoryTag(name)
2624

2725
// Resolve the Repository name from fqn to RepositoryInfo

api/client/search.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,6 @@ func (cli *DockerCli) CmdSearch(args ...string) error {
4444
return err
4545
}
4646

47-
cli.LoadConfigFile()
48-
4947
rdr, _, err := cli.clientRequestAttemptLogin("GET", "/images/search?"+v.Encode(), nil, nil, repoInfo.Index, "search")
5048
if err != nil {
5149
return err

0 commit comments

Comments
 (0)