URL-encode client_id in Azure IMDS token request (#2787)
Co-authored-by: Qi Deng <qdeng@aurascape.ai>
This commit is contained in:
parent
0adf6df131
commit
a50550535d
@ -17,6 +17,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import json
|
import json
|
||||||
from typing import Any, Optional
|
from typing import Any, Optional
|
||||||
|
from urllib.parse import quote
|
||||||
|
|
||||||
|
|
||||||
def _get_azure_response(
|
def _get_azure_response(
|
||||||
@ -29,7 +30,7 @@ def _get_azure_response(
|
|||||||
url += "?api-version=2018-02-01"
|
url += "?api-version=2018-02-01"
|
||||||
url += f"&resource={resource}"
|
url += f"&resource={resource}"
|
||||||
if client_id:
|
if client_id:
|
||||||
url += f"&client_id={client_id}"
|
url += f"&client_id={quote(client_id)}"
|
||||||
headers = {"Metadata": "true", "Accept": "application/json"}
|
headers = {"Metadata": "true", "Accept": "application/json"}
|
||||||
request = Request(url, headers=headers) # noqa: S310
|
request = Request(url, headers=headers) # noqa: S310
|
||||||
try:
|
try:
|
||||||
|
|||||||
@ -150,6 +150,20 @@ class TestGetAzureResponse(unittest.TestCase):
|
|||||||
_, kwargs = mock_open.call_args
|
_, kwargs = mock_open.call_args
|
||||||
self.assertEqual(kwargs["timeout"], 42)
|
self.assertEqual(kwargs["timeout"], 42)
|
||||||
|
|
||||||
|
def test_client_id_is_url_encoded(self):
|
||||||
|
"""Ensure special characters in client_id are percent-encoded."""
|
||||||
|
body = json.dumps({"access_token": "tok", "expires_in": "3600"})
|
||||||
|
with _mock_urlopen(200, body) as mock_open:
|
||||||
|
self._call(client_id="id with spaces&special=chars")
|
||||||
|
|
||||||
|
url = mock_open.call_args[0][0].full_url
|
||||||
|
# '&' and '=' must be percent-encoded so they don't inject extra query params
|
||||||
|
self.assertIn("client_id=id%20with%20spaces%26special%3Dchars", url)
|
||||||
|
# The encoded client_id should not introduce a raw '&'
|
||||||
|
# Count params: api-version, resource, client_id — exactly 3
|
||||||
|
query_string = url.split("?", 1)[1]
|
||||||
|
self.assertEqual(query_string.count("&"), 2)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user