diff --git a/sdk/identity/azure-identity/azure/identity/_credentials/linux_vscode_adapter.py b/sdk/identity/azure-identity/azure/identity/_credentials/linux_vscode_adapter.py index f13802275f47..bfd45faeb484 100644 --- a/sdk/identity/azure-identity/azure/identity/_credentials/linux_vscode_adapter.py +++ b/sdk/identity/azure-identity/azure/identity/_credentials/linux_vscode_adapter.py @@ -5,7 +5,6 @@ import os import json import ctypes as ct -from .._constants import VSCODE_CREDENTIALS_SECTION def _c_str(string): @@ -66,12 +65,7 @@ def _get_refresh_token(service_name, account_name): if sys.version_info[0] < 3: raise NotImplementedError("Not supported on Python 2.7") - try: - import platform - distro = platform.uname() - if sys.version_info >= (3, 8) and not ("redhat" in distro or "ubuntu" in distro): - raise NotImplementedError("Not supported") - except Exception: # pylint: disable=broad-except + if sys.version_info >= (3, 8): raise NotImplementedError("Not supported") err = ct.c_int() @@ -96,9 +90,5 @@ def _get_refresh_token(service_name, account_name): def get_credentials(): - try: - environment_name = _get_user_settings() - credentials = _get_refresh_token(VSCODE_CREDENTIALS_SECTION, environment_name) - return credentials - except Exception: # pylint: disable=broad-except - return None + # Disable linux support for further investigation + raise NotImplementedError("Not supported") diff --git a/sdk/identity/azure-identity/azure/identity/_credentials/vscode_credential.py b/sdk/identity/azure-identity/azure/identity/_credentials/vscode_credential.py index c40636c24e96..f2bfd660711a 100644 --- a/sdk/identity/azure-identity/azure/identity/_credentials/vscode_credential.py +++ b/sdk/identity/azure-identity/azure/identity/_credentials/vscode_credential.py @@ -52,9 +52,13 @@ def get_token(self, *scopes, **kwargs): return token if not self._refresh_token: - self._refresh_token = get_credentials() - if not self._refresh_token: - raise CredentialUnavailableError(message="No Azure user is logged in to Visual Studio Code.") + try: + self._refresh_token = get_credentials() + if not self._refresh_token: + raise CredentialUnavailableError(message="No Azure user is logged in to Visual Studio Code.") + except NotImplementedError: # pylint:disable=try-except-raise + raise CredentialUnavailableError(message="Not supported") + token = self._client.obtain_token_by_refresh_token(scopes, self._refresh_token, **kwargs) return token diff --git a/sdk/identity/azure-identity/azure/identity/aio/_credentials/vscode_credential.py b/sdk/identity/azure-identity/azure/identity/aio/_credentials/vscode_credential.py index fcf392421294..e2fdce06f19b 100644 --- a/sdk/identity/azure-identity/azure/identity/aio/_credentials/vscode_credential.py +++ b/sdk/identity/azure-identity/azure/identity/aio/_credentials/vscode_credential.py @@ -56,9 +56,12 @@ async def get_token(self, *scopes, **kwargs): return token if not self._refresh_token: - self._refresh_token = get_credentials() - if not self._refresh_token: - raise CredentialUnavailableError(message="No Azure user is logged in to Visual Studio Code.") + try: + self._refresh_token = get_credentials() + if not self._refresh_token: + raise CredentialUnavailableError(message="No Azure user is logged in to Visual Studio Code.") + except NotImplementedError: # pylint:disable=try-except-raise + raise CredentialUnavailableError(message="Not supported") token = await self._client.obtain_token_by_refresh_token(scopes, self._refresh_token, **kwargs) return token diff --git a/sdk/identity/azure-identity/tests/test_vscode_credential.py b/sdk/identity/azure-identity/tests/test_vscode_credential.py index 66789026155c..e6dc70fffd00 100644 --- a/sdk/identity/azure-identity/tests/test_vscode_credential.py +++ b/sdk/identity/azure-identity/tests/test_vscode_credential.py @@ -106,32 +106,14 @@ def test_no_obtain_token_if_cached(): @pytest.mark.skipif(not sys.platform.startswith("linux"), reason="This test only runs on Linux") def test_distro(): - from azure.identity._credentials.linux_vscode_adapter import _get_refresh_token - expected_token = AccessToken("token", 42) - mock_client = mock.Mock(spec=object) - mock_client.obtain_token_by_refresh_token = mock.Mock(return_value=expected_token) - mock_client.get_cached_access_token = mock.Mock(return_value="VALUE") - - with mock.patch("platform.uname", - return_value=('Linux', 'redhat', '4.18.0-193.el8.x86_64', - '#1 SMP Fri Mar 27 14:35:58 UTC 2020', 'x86_64', 'x86_64')): - credential = VSCodeCredential(_client=mock_client) - token = credential.get_token("scope") + mock_client.obtain_token_by_refresh_token = mock.Mock(return_value=None) + mock_client.get_cached_access_token = mock.Mock(return_value=None) - with mock.patch("platform.uname", - return_value=('Linux', 'ubuntu', '5.3.0-1022-azure', - '#23~18.04.1-Ubuntu SMP Mon May 11 11:55:56 UTC 2020', 'x86_64', 'x86_64')): + with pytest.raises(CredentialUnavailableError): credential = VSCodeCredential(_client=mock_client) token = credential.get_token("scope") - with mock.patch("platform.uname", - return_value=('Linux', 'deb', '4.19.0-9-cloud-amd64', - '#1 SMP Debian 4.19.118-2 (2020-04-29)', 'x86_64', '')): - if sys.version_info[0] == 3 and sys.version_info[1] == 8: - with pytest.raises(NotImplementedError): - credential = _get_refresh_token("test", "test") - @pytest.mark.skipif(not sys.platform.startswith("darwin"), reason="This test only runs on MacOS") def test_mac_keychain_valid_value(): @@ -147,9 +129,3 @@ def test_mac_keychain_error(): credential = VSCodeCredential() with pytest.raises(CredentialUnavailableError): token = credential.get_token("scope") - - -@pytest.mark.skipif(not sys.platform.startswith("linux"), reason="This test only runs on Linux") -def test_get_token(): - with mock.patch("azure.identity._credentials.linux_vscode_adapter._get_refresh_token", return_value="VALUE"): - assert get_credentials() == "VALUE" diff --git a/sdk/identity/azure-identity/tests/test_vscode_credential_async.py b/sdk/identity/azure-identity/tests/test_vscode_credential_async.py index edd59dcc0b3d..6bdbb430044c 100644 --- a/sdk/identity/azure-identity/tests/test_vscode_credential_async.py +++ b/sdk/identity/azure-identity/tests/test_vscode_credential_async.py @@ -4,6 +4,7 @@ # ------------------------------------ from unittest import mock +import sys from azure.core.credentials import AccessToken from azure.identity import CredentialUnavailableError from azure.identity.aio import VSCodeCredential @@ -105,3 +106,17 @@ async def test_no_obtain_token_if_cached(): credential = VSCodeCredential(_client=mock_client) token = await credential.get_token("scope") assert token_by_refresh_token.call_count == 0 + + +@pytest.mark.skipif(not sys.platform.startswith("linux"), reason="This test only runs on Linux") +@pytest.mark.asyncio +async def test_distro(): + + mock_client = mock.Mock(spec=object) + token_by_refresh_token = mock.Mock(return_value=None) + mock_client.obtain_token_by_refresh_token = wrap_in_future(token_by_refresh_token) + mock_client.get_cached_access_token = mock.Mock(return_value=None) + + with pytest.raises(CredentialUnavailableError): + credential = VSCodeCredential(_client=mock_client) + token = await credential.get_token("scope")