From 3492014337de79966a4c26b68bc5b8e2e9996a7d Mon Sep 17 00:00:00 2001 From: Lakin Wecker Date: Mon, 28 Feb 2022 14:27:04 -0700 Subject: [PATCH 1/6] when "disabled", keyring uses a "null" keyring and should be unavailable. --- src/poetry/utils/password_manager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/poetry/utils/password_manager.py b/src/poetry/utils/password_manager.py index fcef51d157e..f3e2d295fe8 100644 --- a/src/poetry/utils/password_manager.py +++ b/src/poetry/utils/password_manager.py @@ -94,7 +94,7 @@ def _check(self) -> None: backend = keyring.get_keyring() name = backend.name.split(" ")[0] - if name == "fail": + if name in ("fail", "null"): logger.debug("No suitable keyring backend found") self._is_available = False elif "plaintext" in backend.name.lower(): @@ -107,7 +107,7 @@ def _check(self) -> None: backends = keyring.backend.get_all_keyring() self._is_available = any( - b.name.split(" ")[0] not in ["chainer", "fail"] + b.name.split(" ")[0] not in ["chainer", "fail", "null"] and "plaintext" not in b.name.lower() for b in backends ) From def90fe626576fef68b9267fa209b24dc38e93a7 Mon Sep 17 00:00:00 2001 From: Lakin Wecker Date: Sun, 10 Apr 2022 21:20:15 -0600 Subject: [PATCH 2/6] Testing that the nullkeyring is unavailable --- tests/conftest.py | 22 +++++++++++++++++++++- tests/utils/test_password_manager.py | 25 ++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index f35ca1bfdc9..b67c7209be3 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -114,9 +114,17 @@ def with_fail_keyring() -> None: keyring.set_keyring(Keyring()) +@pytest.fixture() +def with_null_keyring() -> None: + import keyring + + from keyring.backends.null import Keyring + + keyring.set_keyring(Keyring()) + @pytest.fixture() -def with_chained_keyring(mocker: MockerFixture) -> None: +def with_chained_fail_keyring(mocker: MockerFixture) -> None: from keyring.backends.fail import Keyring mocker.patch("keyring.backend.get_all_keyring", [Keyring()]) @@ -127,6 +135,18 @@ def with_chained_keyring(mocker: MockerFixture) -> None: keyring.set_keyring(ChainerBackend()) +@pytest.fixture() +def with_chained_null_keyring(mocker: MockerFixture) -> None: + from keyring.backends.null import Keyring + + mocker.patch("keyring.backend.get_all_keyring", [Keyring()]) + import keyring + + from keyring.backends.chainer import ChainerBackend + + keyring.set_keyring(ChainerBackend()) + + @pytest.fixture def config_cache_dir(tmp_dir: str) -> Path: path = Path(tmp_dir) / ".cache" / "pypoetry" diff --git a/tests/utils/test_password_manager.py b/tests/utils/test_password_manager.py index 27747cfb484..2ffe344544b 100644 --- a/tests/utils/test_password_manager.py +++ b/tests/utils/test_password_manager.py @@ -188,7 +188,30 @@ def test_keyring_raises_errors_on_keyring_errors( def test_keyring_with_chainer_backend_and_not_compatible_only_should_be_unavailable( - with_chained_keyring: None, + with_chained_fail_keyring: None, +): + key_ring = KeyRing("poetry") + + assert not key_ring.is_available() + + +def test_keyring_with_chainer_backend_and_not_compatible_only_null_should_be_unavailable( + with_chained_null_keyring: None, +): + key_ring = KeyRing("poetry") + + assert not key_ring.is_available() + + +def test_null_keyring_should_be_unavailable( + with_null_keyring: None, +): + key_ring = KeyRing("poetry") + + assert not key_ring.is_available() + +def test_fail_keyring_should_be_unavailable( + with_fail_keyring: None, ): key_ring = KeyRing("poetry") From fd886fea788307d7aff71796ad2a9acbd0e959fe Mon Sep 17 00:00:00 2001 From: Lakin Wecker Date: Sun, 10 Apr 2022 21:39:51 -0600 Subject: [PATCH 3/6] Rename the null version of this test --- tests/utils/test_password_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/utils/test_password_manager.py b/tests/utils/test_password_manager.py index 2ffe344544b..b32596387bf 100644 --- a/tests/utils/test_password_manager.py +++ b/tests/utils/test_password_manager.py @@ -187,7 +187,7 @@ def test_keyring_raises_errors_on_keyring_errors( key_ring.delete_password("foo", "bar") -def test_keyring_with_chainer_backend_and_not_compatible_only_should_be_unavailable( +def test_keyring_with_chainer_backend_and_not_compatible_only_fail_should_be_unavailable( with_chained_fail_keyring: None, ): key_ring = KeyRing("poetry") From 40d92d411c50f84f63cae063bcab72e0da848d8b Mon Sep 17 00:00:00 2001 From: Lakin Wecker Date: Sun, 10 Apr 2022 21:40:08 -0600 Subject: [PATCH 4/6] Fix the mock for the chainer tests --- tests/conftest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index b67c7209be3..5a8c56f8853 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -127,7 +127,7 @@ def with_null_keyring() -> None: def with_chained_fail_keyring(mocker: MockerFixture) -> None: from keyring.backends.fail import Keyring - mocker.patch("keyring.backend.get_all_keyring", [Keyring()]) + mocker.patch("keyring.backend.get_all_keyring", lambda: [Keyring()]) import keyring from keyring.backends.chainer import ChainerBackend @@ -139,7 +139,7 @@ def with_chained_fail_keyring(mocker: MockerFixture) -> None: def with_chained_null_keyring(mocker: MockerFixture) -> None: from keyring.backends.null import Keyring - mocker.patch("keyring.backend.get_all_keyring", [Keyring()]) + mocker.patch("keyring.backend.get_all_keyring", lambda: [Keyring()]) import keyring from keyring.backends.chainer import ChainerBackend From 7d52c7223478ba33ffe7b4d09cc377853717a492 Mon Sep 17 00:00:00 2001 From: Lakin Wecker Date: Mon, 11 Apr 2022 10:19:52 -0600 Subject: [PATCH 5/6] Renaming longer function names for flake8 --- tests/utils/test_password_manager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/utils/test_password_manager.py b/tests/utils/test_password_manager.py index b32596387bf..4649aac6c1c 100644 --- a/tests/utils/test_password_manager.py +++ b/tests/utils/test_password_manager.py @@ -187,7 +187,7 @@ def test_keyring_raises_errors_on_keyring_errors( key_ring.delete_password("foo", "bar") -def test_keyring_with_chainer_backend_and_not_compatible_only_fail_should_be_unavailable( +def test_keyring_with_chainer_backend_and_fail_keyring_should_be_unavailable( with_chained_fail_keyring: None, ): key_ring = KeyRing("poetry") @@ -195,7 +195,7 @@ def test_keyring_with_chainer_backend_and_not_compatible_only_fail_should_be_una assert not key_ring.is_available() -def test_keyring_with_chainer_backend_and_not_compatible_only_null_should_be_unavailable( +def test_keyring_with_chainer_backend_and_null_keyring_should_be_unavailable( with_chained_null_keyring: None, ): key_ring = KeyRing("poetry") From 4d6e2d2ad416058929041fbf8f379c2c328950a1 Mon Sep 17 00:00:00 2001 From: Lakin Wecker Date: Mon, 11 Apr 2022 10:33:31 -0600 Subject: [PATCH 6/6] Adding 2 lines between functions for black. --- tests/conftest.py | 1 + tests/utils/test_password_manager.py | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 5a8c56f8853..fe85fdbee83 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -114,6 +114,7 @@ def with_fail_keyring() -> None: keyring.set_keyring(Keyring()) + @pytest.fixture() def with_null_keyring() -> None: import keyring diff --git a/tests/utils/test_password_manager.py b/tests/utils/test_password_manager.py index 4649aac6c1c..062a0ec134e 100644 --- a/tests/utils/test_password_manager.py +++ b/tests/utils/test_password_manager.py @@ -210,6 +210,7 @@ def test_null_keyring_should_be_unavailable( assert not key_ring.is_available() + def test_fail_keyring_should_be_unavailable( with_fail_keyring: None, ):