Skip to content

Commit 794c5f3

Browse files
authored
[v2] Apply sigv4a_signing_region_set when SigV4A is resolved via auth scheme preference (#10195)
1 parent cb89b7d commit 794c5f3

3 files changed

Lines changed: 67 additions & 10 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"type": "bugfix",
3+
"category": "auth",
4+
"description": "Fix ``sigv4a_signing_region_set`` config being ignored when SigV4a is selected via ``auth_scheme_preference``. The configured region set is now correctly applied to the signing context regardless of how SigV4a is resolved."
5+
}

awscli/botocore/handlers.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,7 @@ def set_operation_specific_signer(context, signing_name, **kwargs):
167167
return auth_type
168168

169169
if auth_type == 'v4a':
170-
# If sigv4a is chosen, we must add additional signing config for
171-
# global signature.
172-
region = _resolve_sigv4a_region(context)
173-
signing = {'region': region, 'signing_name': signing_name}
174-
if 'signing' in context:
175-
context['signing'].update(signing)
176-
else:
177-
context['signing'] = signing
170+
_set_sigv4a_signing_context(context, signing_name)
178171
signature_version = 'v4a'
179172
else:
180173
signature_version = 'v4'
@@ -201,6 +194,17 @@ def _resolve_sigv4a_region(context):
201194
return region or '*'
202195

203196

197+
def _set_sigv4a_signing_context(context, signing_name):
198+
# SigV4A signs for a region set rather than a single credential scope
199+
# region, so ensure the request context reflects the configured region set.
200+
region = _resolve_sigv4a_region(context)
201+
signing = {'region': region, 'signing_name': signing_name}
202+
if 'signing' in context:
203+
context['signing'].update(signing)
204+
else:
205+
context['signing'] = signing
206+
207+
204208
def decode_console_output(parsed, **kwargs):
205209
if 'Output' in parsed:
206210
try:
@@ -996,7 +1000,9 @@ def remove_bedrock_runtime_invoke_model_with_bidirectional_stream(
9961000
del class_attributes['invoke_model_with_bidirectional_stream']
9971001

9981002

999-
def remove_connecthealth_start_medical_scribe_listening_session(class_attributes, **kwargs):
1003+
def remove_connecthealth_start_medical_scribe_listening_session(
1004+
class_attributes, **kwargs
1005+
):
10001006
"""Operation requires h2 which is currently unsupported in Python"""
10011007
if 'start_medical_scribe_listening_session' in class_attributes:
10021008
del class_attributes['start_medical_scribe_listening_session']
@@ -1272,6 +1278,9 @@ def _set_auth_scheme_preference_signer(context, signing_name, **kwargs):
12721278
register_feature_id('BEARER_SERVICE_ENV_VARS')
12731279
resolved_signature_version = 'bearer'
12741280

1281+
if resolved_signature_version == 'v4a':
1282+
_set_sigv4a_signing_context(context, signing_name)
1283+
12751284
if resolved_signature_version == signature_version:
12761285
return None
12771286
return resolved_signature_version

tests/unit/botocore/test_handlers.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
from botocore.signers import RequestSigner
4949
from botocore.utils import conditionally_calculate_md5
5050

51-
from tests import BaseSessionTest, mock, unittest
51+
from tests import BaseSessionTest, mock, requires_crt, unittest
5252

5353

5454
class TestHandlers(BaseSessionTest):
@@ -1930,6 +1930,49 @@ def test_set_auth_scheme_preference_signer(
19301930
), f"Expected '{expected_signature_version}' but got '{signature_version}'"
19311931

19321932

1933+
@requires_crt()
1934+
def test_set_auth_scheme_preference_signer_v4a_sets_signing_context():
1935+
config = Config(
1936+
signature_version="v4",
1937+
auth_scheme_preference=ClientConfigString("sigv4a"),
1938+
sigv4a_signing_region_set="region_1,region_2",
1939+
)
1940+
context = {
1941+
"client_config": config,
1942+
"auth_options": ["aws.auth#sigv4", "aws.auth#sigv4a"],
1943+
"signing": {"foo": "bar"},
1944+
}
1945+
1946+
signature_version = handlers._set_auth_scheme_preference_signer(
1947+
context, "my-service"
1948+
)
1949+
1950+
assert signature_version == "v4a"
1951+
assert context["signing"] == {
1952+
"foo": "bar",
1953+
"region": "region_1,region_2",
1954+
"signing_name": "my-service",
1955+
}
1956+
1957+
1958+
def test_set_auth_scheme_preference_signer_explicit_v4a_sets_context():
1959+
config = Config(
1960+
signature_version=ClientConfigString("v4a"),
1961+
sigv4a_signing_region_set="*",
1962+
)
1963+
context = {"client_config": config}
1964+
1965+
signature_version = handlers._set_auth_scheme_preference_signer(
1966+
context, "my-service"
1967+
)
1968+
1969+
assert signature_version is None
1970+
assert context["signing"] == {
1971+
"region": "*",
1972+
"signing_name": "my-service",
1973+
}
1974+
1975+
19331976
@pytest.mark.parametrize(
19341977
"signing_name, config_kwargs, auth_options, env_token, expected_signature_version",
19351978
[

0 commit comments

Comments
 (0)