Skip to content

Commit bc5d7c8

Browse files
committed
Modernize auth management
Signed-off-by: Joffrey F <[email protected]>
1 parent 9a67e20 commit bc5d7c8

File tree

8 files changed

+294
-237
lines changed

8 files changed

+294
-237
lines changed

docker/api/build.py

Lines changed: 9 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -293,41 +293,22 @@ def _set_auth_headers(self, headers):
293293
# Send the full auth configuration (if any exists), since the build
294294
# could use any (or all) of the registries.
295295
if self._auth_configs:
296-
auth_cfgs = self._auth_configs
297-
auth_data = {}
298-
if auth_cfgs.get('credsStore'):
299-
# Using a credentials store, we need to retrieve the
300-
# credentials for each registry listed in the config.json file
301-
# Matches CLI behavior: https://github.com/docker/docker/blob/
302-
# 67b85f9d26f1b0b2b240f2d794748fac0f45243c/cliconfig/
303-
# credentials/native_store.go#L68-L83
304-
for registry in auth_cfgs.get('auths', {}).keys():
305-
auth_data[registry] = auth.resolve_authconfig(
306-
auth_cfgs, registry,
307-
credstore_env=self.credstore_env,
308-
)
309-
else:
310-
for registry in auth_cfgs.get('credHelpers', {}).keys():
311-
auth_data[registry] = auth.resolve_authconfig(
312-
auth_cfgs, registry,
313-
credstore_env=self.credstore_env
314-
)
315-
for registry, creds in auth_cfgs.get('auths', {}).items():
316-
if registry not in auth_data:
317-
auth_data[registry] = creds
318-
# See https://github.com/docker/docker-py/issues/1683
319-
if auth.INDEX_NAME in auth_data:
320-
auth_data[auth.INDEX_URL] = auth_data[auth.INDEX_NAME]
296+
auth_data = self._auth_configs.get_all_credentials()
297+
298+
# See https://github.com/docker/docker-py/issues/1683
299+
if auth.INDEX_URL not in auth_data and auth.INDEX_URL in auth_data:
300+
auth_data[auth.INDEX_URL] = auth_data.get(auth.INDEX_NAME, {})
321301

322302
log.debug(
323303
'Sending auth config ({0})'.format(
324304
', '.join(repr(k) for k in auth_data.keys())
325305
)
326306
)
327307

328-
headers['X-Registry-Config'] = auth.encode_header(
329-
auth_data
330-
)
308+
if auth_data:
309+
headers['X-Registry-Config'] = auth.encode_header(
310+
auth_data
311+
)
331312
else:
332313
log.debug('No auth config found')
333314

docker/api/daemon.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,15 @@ def login(self, username, password=None, email=None, registry=None,
124124
# If dockercfg_path is passed check to see if the config file exists,
125125
# if so load that config.
126126
if dockercfg_path and os.path.exists(dockercfg_path):
127-
self._auth_configs = auth.load_config(dockercfg_path)
127+
self._auth_configs = auth.load_config(
128+
dockercfg_path, credstore_env=self.credstore_env
129+
)
128130
elif not self._auth_configs:
129-
self._auth_configs = auth.load_config()
131+
self._auth_configs = auth.load_config(
132+
credstore_env=self.credstore_env
133+
)
130134

131-
authcfg = auth.resolve_authconfig(
132-
self._auth_configs, registry, credstore_env=self.credstore_env,
133-
)
135+
authcfg = self._auth_configs.resolve_authconfig(registry)
134136
# If we found an existing auth config for this registry and username
135137
# combination, we can return it immediately unless reauth is requested.
136138
if authcfg and authcfg.get('username', None) == username \
@@ -146,9 +148,7 @@ def login(self, username, password=None, email=None, registry=None,
146148

147149
response = self._post_json(self._url('/auth'), data=req_data)
148150
if response.status_code == 200:
149-
if 'auths' not in self._auth_configs:
150-
self._auth_configs['auths'] = {}
151-
self._auth_configs['auths'][registry or auth.INDEX_NAME] = req_data
151+
self._auth_configs.add_auth(registry or auth.INDEX_NAME, req_data)
152152
return self._result(response, json=True)
153153

154154
def ping(self):

0 commit comments

Comments
 (0)