From a695f0ca5ab2b802f084461a957debc8f233cf94 Mon Sep 17 00:00:00 2001 From: Alejandro Brito Monedero Date: Thu, 29 Oct 2015 16:12:30 +0100 Subject: [PATCH] Fix #627 Docker-py couldn't pull private images if the account have non ascii chars in either user or password. It that case an exception ending with no auth credentials. Instead docker client (golang) don't suffer this issue. Also add a test to check the login or password even with non ascii char have a valid auth dictionary Signed-off-by: Alejandro Brito Monedero --- docker/auth/auth.py | 2 +- tests/unit/auth_test.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/docker/auth/auth.py b/docker/auth/auth.py index 2ed894ee7b..416dd7c471 100644 --- a/docker/auth/auth.py +++ b/docker/auth/auth.py @@ -96,7 +96,7 @@ def decode_auth(auth): auth = auth.encode('ascii') s = base64.b64decode(auth) login, pwd = s.split(b':', 1) - return login.decode('ascii'), pwd.decode('ascii') + return login.decode('utf8'), pwd.decode('utf8') def encode_header(auth): diff --git a/tests/unit/auth_test.py b/tests/unit/auth_test.py index 9f4d439ba2..6783038166 100644 --- a/tests/unit/auth_test.py +++ b/tests/unit/auth_test.py @@ -316,3 +316,33 @@ def test_load_config_custom_config_env_with_auths(self): self.assertEqual(cfg['password'], 'izayoi') self.assertEqual(cfg['email'], 'sakuya@scarlet.net') self.assertEqual(cfg.get('auth'), None) + + def test_load_config_custom_config_env_utf8(self): + folder = tempfile.mkdtemp() + self.addCleanup(shutil.rmtree, folder) + + dockercfg_path = os.path.join(folder, 'config.json') + registry = 'https://your.private.registry.io' + auth_ = base64.b64encode( + b'sakuya\xc3\xa6:izayoi\xc3\xa6').decode('ascii') + config = { + 'auths': { + registry: { + 'auth': '{0}'.format(auth_), + 'email': 'sakuya@scarlet.net' + } + } + } + + with open(dockercfg_path, 'w') as f: + json.dump(config, f) + + with mock.patch.dict(os.environ, {'DOCKER_CONFIG': folder}): + cfg = auth.load_config(None) + assert registry in cfg + self.assertNotEqual(cfg[registry], None) + cfg = cfg[registry] + self.assertEqual(cfg['username'], b'sakuya\xc3\xa6'.decode('utf8')) + self.assertEqual(cfg['password'], b'izayoi\xc3\xa6'.decode('utf8')) + self.assertEqual(cfg['email'], 'sakuya@scarlet.net') + self.assertEqual(cfg.get('auth'), None)