From b7ce5db782c0965aae064f7040177a702ca5e930 Mon Sep 17 00:00:00 2001 From: Edgar Geier Date: Tue, 23 Jul 2019 12:38:09 +0200 Subject: [PATCH 1/4] Use fallback uid and gid if os.getuid() and os.getgid() are unavailable --- pre_commit/languages/docker.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index 59a53b4f..8eaf6f4e 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -14,6 +14,8 @@ from pre_commit.util import cmd_output ENVIRONMENT_DIR = 'docker' PRE_COMMIT_LABEL = 'PRE_COMMIT' +FALLBACK_UID = 1000 +FALLBACK_GID = 1000 get_default_version = helpers.basic_get_default_version healthy = helpers.basic_healthy @@ -73,11 +75,25 @@ def install_environment( os.mkdir(directory) +def getuid(): + try: + return os.getuid() + except AttributeError: + return FALLBACK_UID + + +def getgid(): + try: + return os.getgid() + except AttributeError: + return FALLBACK_GID + + def docker_cmd(): # pragma: windows no cover return ( 'docker', 'run', '--rm', - '-u', '{}:{}'.format(os.getuid(), os.getgid()), + '-u', '{}:{}'.format(getuid(), getgid()), # https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container-volumes-from # The `Z` option tells Docker to label the content with a private # unshared label. Only the current container can use a private volume. From b43b6a61ab89cae3c8fdd011c79cbe6d8716d7bb Mon Sep 17 00:00:00 2001 From: Edgar Geier Date: Tue, 23 Jul 2019 15:14:06 +0200 Subject: [PATCH 2/4] Add docker uid and gid fallback tests --- pre_commit/languages/docker.py | 4 ++-- tests/languages/docker_test.py | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index 8eaf6f4e..8f7c72df 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -75,14 +75,14 @@ def install_environment( os.mkdir(directory) -def getuid(): +def getuid(): # pragma: windows no cover try: return os.getuid() except AttributeError: return FALLBACK_UID -def getgid(): +def getgid(): # pragma: windows no cover try: return os.getgid() except AttributeError: diff --git a/tests/languages/docker_test.py b/tests/languages/docker_test.py index 9f7f55cf..43b7d1ce 100644 --- a/tests/languages/docker_test.py +++ b/tests/languages/docker_test.py @@ -13,3 +13,17 @@ def test_docker_is_running_process_error(): side_effect=CalledProcessError(*(None,) * 4), ): assert docker.docker_is_running() is False + + +def test_docker_fallback_uid(): + def invalid_attribute(): + raise AttributeError + with mock.patch('os.getuid', invalid_attribute): + assert docker.getuid() == docker.FALLBACK_UID + + +def test_docker_fallback_gid(): + def invalid_attribute(): + raise AttributeError + with mock.patch('os.getgid', invalid_attribute): + assert docker.getgid() == docker.FALLBACK_GID From a21a4f46c79f6531f2a305f58dacce12f46d27fb Mon Sep 17 00:00:00 2001 From: Edgar Geier Date: Tue, 23 Jul 2019 15:35:19 +0200 Subject: [PATCH 3/4] Fix missing create=True attribute in docker tests --- tests/languages/docker_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/languages/docker_test.py b/tests/languages/docker_test.py index 43b7d1ce..a4cfbac1 100644 --- a/tests/languages/docker_test.py +++ b/tests/languages/docker_test.py @@ -18,12 +18,12 @@ def test_docker_is_running_process_error(): def test_docker_fallback_uid(): def invalid_attribute(): raise AttributeError - with mock.patch('os.getuid', invalid_attribute): + with mock.patch('os.getuid', invalid_attribute, create=True): assert docker.getuid() == docker.FALLBACK_UID def test_docker_fallback_gid(): def invalid_attribute(): raise AttributeError - with mock.patch('os.getgid', invalid_attribute): + with mock.patch('os.getgid', invalid_attribute, create=True): assert docker.getgid() == docker.FALLBACK_GID From d4a9ff4d1f044d17040fa0b4b93ea93a8da4888e Mon Sep 17 00:00:00 2001 From: Edgar Geier Date: Thu, 25 Jul 2019 11:20:03 +0200 Subject: [PATCH 4/4] Simplify docker user fallback implementation and test --- pre_commit/languages/docker.py | 17 ++++------------- tests/languages/docker_test.py | 17 +++++++---------- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index 8f7c72df..4517050b 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -14,8 +14,6 @@ from pre_commit.util import cmd_output ENVIRONMENT_DIR = 'docker' PRE_COMMIT_LABEL = 'PRE_COMMIT' -FALLBACK_UID = 1000 -FALLBACK_GID = 1000 get_default_version = helpers.basic_get_default_version healthy = helpers.basic_healthy @@ -75,25 +73,18 @@ def install_environment( os.mkdir(directory) -def getuid(): # pragma: windows no cover +def get_docker_user(): # pragma: windows no cover try: - return os.getuid() + return '{}:{}'.format(os.getuid(), os.getgid()) except AttributeError: - return FALLBACK_UID - - -def getgid(): # pragma: windows no cover - try: - return os.getgid() - except AttributeError: - return FALLBACK_GID + return '1000:1000' def docker_cmd(): # pragma: windows no cover return ( 'docker', 'run', '--rm', - '-u', '{}:{}'.format(getuid(), getgid()), + '-u', get_docker_user(), # https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container-volumes-from # The `Z` option tells Docker to label the content with a private # unshared label. Only the current container can use a private volume. diff --git a/tests/languages/docker_test.py b/tests/languages/docker_test.py index a4cfbac1..1a96e69d 100644 --- a/tests/languages/docker_test.py +++ b/tests/languages/docker_test.py @@ -15,15 +15,12 @@ def test_docker_is_running_process_error(): assert docker.docker_is_running() is False -def test_docker_fallback_uid(): +def test_docker_fallback_user(): def invalid_attribute(): raise AttributeError - with mock.patch('os.getuid', invalid_attribute, create=True): - assert docker.getuid() == docker.FALLBACK_UID - - -def test_docker_fallback_gid(): - def invalid_attribute(): - raise AttributeError - with mock.patch('os.getgid', invalid_attribute, create=True): - assert docker.getgid() == docker.FALLBACK_GID + with mock.patch.multiple( + 'os', create=True, + getuid=invalid_attribute, + getgid=invalid_attribute, + ): + assert docker.get_docker_user() == '1000:1000'