Skip to content

Commit 6212d93

Browse files
authored
Merge branch 'Azure:dev' into acr_podman
2 parents db42a6b + 609c85b commit 6212d93

502 files changed

Lines changed: 140430 additions & 152798 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/azure-cli-core/azure/cli/core/auth/msal_credentials.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ def acquire_token(self, scopes, claims_challenge=None, **kwargs):
5151
scopes, claims_challenge, kwargs)
5252

5353
if claims_challenge:
54-
logger.warning('Acquiring new access token silently for tenant %s with claims challenge: %s',
55-
self._msal_app.authority.tenant, claims_challenge)
54+
logger.info('Acquiring new access token silently with claims challenge: %s', claims_challenge)
5655
result = self._msal_app.acquire_token_silent_with_error(
5756
scopes, self._account, claims_challenge=claims_challenge, **kwargs)
5857

src/azure-cli-core/azure/cli/core/auth/tests/test_util.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,15 @@ def test_generate_login_command(self):
6868
assert actual == ('az login --tenant "21987a97-4e85-47c5-9a13-9dc3e11b2a9a" '
6969
'--scope "https://management.core.windows.net//.default"')
7070

71+
# tenant, scopes and claims_challenge
72+
actual = _generate_login_command(
73+
tenant='21987a97-4e85-47c5-9a13-9dc3e11b2a9a',
74+
scopes=["https://management.core.windows.net//.default"],
75+
claims_challenge='{"access_token":{"acrs":{"essential":true,"values":["p1"]}}}')
76+
assert actual == ('az logout\n'
77+
'az login --tenant "21987a97-4e85-47c5-9a13-9dc3e11b2a9a" '
78+
'--scope "https://management.core.windows.net//.default" '
79+
'--claims-challenge "eyJhY2Nlc3NfdG9rZW4iOnsiYWNycyI6eyJlc3NlbnRpYWwiOnRydWUsInZhbHVlcyI6WyJwMSJdfX19"')
7180

7281

7382
if __name__ == '__main__':

src/azure-cli-core/azure/cli/core/auth/util.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"To pass a service principal certificate, use --certificate instead.")
2121

2222

23-
def aad_error_handler(error, **kwargs):
23+
def aad_error_handler(error, tenant=None, scopes=None, claims_challenge=None):
2424
""" Handle the error from AAD server returned by ADAL or MSAL. """
2525

2626
# https://learn.microsoft.com/en-us/azure/active-directory/develop/reference-aadsts-error-codes
@@ -41,11 +41,21 @@ def aad_error_handler(error, **kwargs):
4141
error_codes = error.get('error_codes')
4242

4343
# Build recommendation message
44+
recommendation = None
4445
if error_codes and 7000215 in error_codes:
4546
recommendation = PASSWORD_CERTIFICATE_WARNING
4647
else:
47-
login_command = _generate_login_command(**kwargs)
48-
recommendation = "Interactive authentication is needed. Please run:\n{}".format(login_command)
48+
login_command = _generate_login_command(tenant=tenant, scopes=scopes, claims_challenge=claims_challenge)
49+
login_message = ('Run the command below to authenticate interactively; '
50+
'additional arguments may be added as needed:\n'
51+
f'{login_command}')
52+
53+
# During a challenge, the exception will caught by azure-mgmt-core, so we show a warning now
54+
if claims_challenge:
55+
logger.info('Failed to acquire token silently. Error detail: %s', error_description)
56+
logger.warning(login_message)
57+
else:
58+
recommendation = login_message
4959

5060
from azure.cli.core.azclierror import AuthenticationError
5161
raise AuthenticationError(error_description, msal_error=error, recommendation=recommendation)
@@ -69,10 +79,14 @@ def _generate_login_command(tenant=None, scopes=None, claims_challenge=None):
6979

7080
# Rejected by CAE
7181
if claims_challenge:
72-
# Explicit logout is needed: https://github.com/AzureAD/microsoft-authentication-library-for-python/issues/335
73-
return 'az logout\n' + ' '.join(login_command)
82+
from azure.cli.core.util import b64encode
83+
# Base64 encode the claims_challenge to avoid shell interpretation
84+
claims_challenge_encoded = b64encode(claims_challenge)
85+
login_command.extend(['--claims-challenge', f'"{claims_challenge_encoded}"'])
7486

75-
return ' '.join(login_command)
87+
# Explicit logout is preferred, making sure MSAL cache is purged:
88+
# https://github.com/AzureAD/microsoft-authentication-library-for-python/issues/335
89+
return 'az logout\n' + ' '.join(login_command)
7690

7791

7892
def resource_to_scopes(resource):
@@ -113,7 +127,7 @@ def scopes_to_resource(scopes):
113127
return scope
114128

115129

116-
def check_result(result, **kwargs):
130+
def check_result(result, tenant=None, scopes=None, claims_challenge=None):
117131
"""Parse the result returned by MSAL:
118132
119133
1. Check if the MSAL result contains a valid access token.
@@ -132,7 +146,7 @@ def check_result(result, **kwargs):
132146
set_msal_telemetry(result['msal_telemetry'])
133147

134148
if 'error' in result:
135-
aad_error_handler(result, **kwargs)
149+
aad_error_handler(result, tenant=tenant, scopes=scopes, claims_challenge=claims_challenge)
136150

137151
# For user authentication
138152
if 'id_token_claims' in result:

src/azure-cli-core/azure/cli/core/profiles/_shared.py

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -186,10 +186,7 @@ def default_api_version(self):
186186
ResourceType.MGMT_RESOURCE_PRIVATELINKS: '2020-05-01',
187187
ResourceType.MGMT_RESOURCE_MANAGEDAPPLICATIONS: '2019-07-01',
188188
ResourceType.MGMT_NETWORK_PRIVATEDNS: None,
189-
ResourceType.MGMT_KEYVAULT: SDKProfile('2024-11-01', {
190-
'vaults': '2023-02-01',
191-
'managed_hsms': '2024-11-01'
192-
}),
189+
ResourceType.MGMT_KEYVAULT: None,
193190
ResourceType.MGMT_AUTHORIZATION: SDKProfile('2022-04-01', {
194191
'role_definitions': '2022-05-01-preview',
195192
'provider_operations_metadata': '2018-01-01-preview'
@@ -219,18 +216,18 @@ def default_api_version(self):
219216
ResourceType.DATA_STORAGE_QUEUE: '2018-03-28',
220217
ResourceType.DATA_COSMOS_TABLE: '2017-04-17',
221218
ResourceType.DATA_STORAGE_TABLE: None,
222-
ResourceType.MGMT_SERVICEBUS: '2022-10-01-preview',
223-
ResourceType.MGMT_EVENTHUB: '2022-01-01-preview',
219+
ResourceType.MGMT_SERVICEBUS: None,
220+
ResourceType.MGMT_EVENTHUB: None,
224221
ResourceType.MGMT_MONITOR: None,
225222
ResourceType.MGMT_MSI: '2023-01-31',
226-
ResourceType.MGMT_APPSERVICE: '2023-01-01',
223+
ResourceType.MGMT_APPSERVICE: '2024-11-01',
227224
ResourceType.MGMT_IOTHUB: '2023-06-30-preview',
228225
ResourceType.MGMT_IOTDPS: '2021-10-15',
229226
ResourceType.MGMT_IOTCENTRAL: '2021-11-01-preview',
230227
ResourceType.MGMT_ARO: '2023-11-22',
231228
ResourceType.MGMT_DATABOXEDGE: '2021-02-01-preview',
232229
ResourceType.MGMT_CUSTOMLOCATION: '2021-03-15-preview',
233-
ResourceType.MGMT_CONTAINERSERVICE: SDKProfile('2025-04-01'),
230+
ResourceType.MGMT_CONTAINERSERVICE: SDKProfile('2025-05-01'),
234231
ResourceType.MGMT_APPCONTAINERS: '2022-10-01',
235232
}
236233
}
@@ -259,10 +256,6 @@ def default_api_version(self):
259256
'VERSION_2025_03_01_PREVIEW': "2025-03-01-preview",
260257
'VERSION_2025_04_01': "2025-04-01"
261258
},
262-
ResourceType.MGMT_CONTAINERSERVICE: {
263-
# src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_custom.py:50
264-
'ManagedClusterAddonProfile': '2020-03-01',
265-
},
266259
ResourceType.MGMT_MSI: {
267260
'user_assigned_identities': '2022-01-31-preview',
268261
}

src/azure-cli-testsdk/azure/cli/testsdk/utilities.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,12 @@ def _replace_email_address(self, text):
223223
def process_request(self, request):
224224
request.uri = self._replace_email_address(request.uri)
225225
if request.body:
226-
body = _byte_to_str(request.body)
227-
request.body = self._replace_email_address(body)
226+
try:
227+
body = _byte_to_str(request.body)
228+
request.body = self._replace_email_address(body)
229+
except UnicodeDecodeError:
230+
# If the body is not a string, we cannot decode it, so we skip the replacement
231+
pass
228232
return request
229233

230234
def process_response(self, response):

src/azure-cli/azure/cli/command_modules/acs/tests/latest/recordings/test_aks_abort.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ interactions:
1515
User-Agent:
1616
- AZURECLI/2.72.0 azsdk-python-core/1.31.0 Python/3.10.11 (Windows-10-10.0.26100-SP0)
1717
method: GET
18-
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest000001/providers/Microsoft.ContainerService/managedClusters/cliakstest000002?api-version=2025-04-01
18+
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest000001/providers/Microsoft.ContainerService/managedClusters/cliakstest000002?api-version=2025-05-01
1919
response:
2020
body:
2121
string: '{"error":{"code":"ResourceNotFound","message":"The Resource ''Microsoft.ContainerService/managedClusters/cliakstest000002''
@@ -125,7 +125,7 @@ interactions:
125125
User-Agent:
126126
- AZURECLI/2.72.0 azsdk-python-core/1.31.0 Python/3.10.11 (Windows-10-10.0.26100-SP0)
127127
method: PUT
128-
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest000001/providers/Microsoft.ContainerService/managedClusters/cliakstest000002?api-version=2025-04-01
128+
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest000001/providers/Microsoft.ContainerService/managedClusters/cliakstest000002?api-version=2025-05-01
129129
response:
130130
body:
131131
string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest000001/providers/Microsoft.ContainerService/managedClusters/cliakstest000002\",\n
@@ -221,7 +221,7 @@ interactions:
221221
User-Agent:
222222
- AZURECLI/2.72.0 azsdk-python-core/1.31.0 Python/3.10.11 (Windows-10-10.0.26100-SP0)
223223
method: GET
224-
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest000001/providers/Microsoft.ContainerService/managedClusters/cliakstest000002?api-version=2025-04-01
224+
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest000001/providers/Microsoft.ContainerService/managedClusters/cliakstest000002?api-version=2025-05-01
225225
response:
226226
body:
227227
string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest000001/providers/Microsoft.ContainerService/managedClusters/cliakstest000002\",\n
@@ -313,7 +313,7 @@ interactions:
313313
User-Agent:
314314
- AZURECLI/2.72.0 azsdk-python-core/1.31.0 Python/3.10.11 (Windows-10-10.0.26100-SP0)
315315
method: POST
316-
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest000001/providers/Microsoft.ContainerService/managedclusters/cliakstest000002/abort?api-version=2025-04-01
316+
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest000001/providers/Microsoft.ContainerService/managedclusters/cliakstest000002/abort?api-version=2025-05-01
317317
response:
318318
body:
319319
string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest000001/providers/Microsoft.ContainerService/managedClusters/cliakstest000002\",\n
@@ -565,7 +565,7 @@ interactions:
565565
User-Agent:
566566
- AZURECLI/2.72.0 azsdk-python-core/1.31.0 Python/3.10.11 (Windows-10-10.0.26100-SP0)
567567
method: GET
568-
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest000001/providers/Microsoft.ContainerService/managedClusters/cliakstest000002?api-version=2025-04-01
568+
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest000001/providers/Microsoft.ContainerService/managedClusters/cliakstest000002?api-version=2025-05-01
569569
response:
570570
body:
571571
string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest000001/providers/Microsoft.ContainerService/managedClusters/cliakstest000002\",\n

0 commit comments

Comments
 (0)