Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import os
import json
import ctypes as ct
from .._constants import VSCODE_CREDENTIALS_SECTION


def _c_str(string):
Expand Down Expand Up @@ -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()
Expand All @@ -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")
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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
30 changes: 3 additions & 27 deletions sdk/identity/azure-identity/tests/test_vscode_credential.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand All @@ -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"
15 changes: 15 additions & 0 deletions sdk/identity/azure-identity/tests/test_vscode_credential_async.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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")