Skip to content

Commit 7009ebe

Browse files
authored
Align with upstream (#1308)
1 parent 17feaa1 commit 7009ebe

File tree

5 files changed

+29
-61
lines changed

5 files changed

+29
-61
lines changed

CHANGES.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
Changes
22
-------
3+
4+
2.21.0 (2025-02-27)
5+
^^^^^^^^^^^^^^^^^^^
6+
* make `AioDeferredRefreshableCredentials` subclass of `DeferredRefreshableCredentials`
7+
* make `AioSSOCredentialFetcher` subclass of `SSOCredentialFetcher`
8+
39
2.20.1.dev0 (2025-02-24)
410
^^^^^^^^^^^^^^^^^^^^^^^^
511
* upstream http response header fixes to be more in-line with botocore

aiobotocore/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '2.20.1.dev0'
1+
__version__ = '2.21.0'

aiobotocore/args.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ def get_client_args(
4747
partition = endpoint_config['metadata'].get('partition', None)
4848
socket_options = final_args['socket_options']
4949
configured_endpoint_url = final_args['configured_endpoint_url']
50-
5150
signing_region = endpoint_config['signing_region']
5251
endpoint_region_name = endpoint_config['region_name']
5352

aiobotocore/credentials.py

Lines changed: 12 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
import asyncio
2-
import datetime
3-
import json
42
import logging
53
import os
64
import subprocess
75
from copy import deepcopy
8-
from hashlib import sha1
96

107
import botocore.compat
118
from botocore import UNSIGNED
@@ -27,6 +24,7 @@
2724
CredentialResolver,
2825
CredentialRetrievalError,
2926
Credentials,
27+
DeferredRefreshableCredentials,
3028
EnvProvider,
3129
InstanceMetadataProvider,
3230
InvalidConfigError,
@@ -39,6 +37,7 @@
3937
RefreshableCredentials,
4038
RefreshWithMFAUnsupportedError,
4139
SharedCredentialProvider,
40+
SSOCredentialFetcher,
4241
SSOProvider,
4342
SSOTokenLoader,
4443
UnauthorizedSSOTokenError,
@@ -50,7 +49,6 @@
5049
parse,
5150
resolve_imds_endpoint_mode,
5251
)
53-
from dateutil.tz import tzutc
5452

5553
from aiobotocore._helpers import resolve_awaitable
5654
from aiobotocore.config import AioConfig
@@ -364,7 +362,9 @@ async def get_frozen_credentials(self):
364362
return self._frozen_credentials
365363

366364

367-
class AioDeferredRefreshableCredentials(AioRefreshableCredentials):
365+
class AioDeferredRefreshableCredentials(
366+
DeferredRefreshableCredentials, AioRefreshableCredentials
367+
):
368368
def __init__(self, refresh_using, method, time_fetcher=_local_now):
369369
self._refresh_using = refresh_using
370370
self._access_key = None
@@ -376,11 +376,6 @@ def __init__(self, refresh_using, method, time_fetcher=_local_now):
376376
self.method = method
377377
self._frozen_credentials = None
378378

379-
def refresh_needed(self, refresh_in=None):
380-
if self._frozen_credentials is None:
381-
return True
382-
return super().refresh_needed(refresh_in)
383-
384379

385380
class AioCachedCredentialFetcher(CachedCredentialFetcher):
386381
async def _get_credentials(self):
@@ -747,11 +742,14 @@ async def _resolve_source_credentials(self, role_config, profile_name):
747742
async def _resolve_credentials_from_profile(self, profile_name):
748743
profiles = self._loaded_config.get('profiles', {})
749744
profile = profiles[profile_name]
750-
751745
if (
752746
self._has_static_credentials(profile)
753747
and not self._profile_provider_builder
754748
):
749+
# This is only here for backwards compatibility. If this provider
750+
# isn't given a profile provider builder we still want to be able
751+
# handle the basic static credential case as we would before the
752+
# provile provider builder parameter was added.
755753
return self._resolve_static_credentials_from_profile(profile)
756754
elif self._has_static_credentials(
757755
profile
@@ -770,7 +768,6 @@ async def _resolve_credentials_from_profile(self, profile_name):
770768
error_msg=error_message % profile_name,
771769
)
772770
return credentials
773-
774771
return await self._load_creds_via_assume_role(profile_name)
775772

776773
def _resolve_static_credentials_from_profile(self, profile):
@@ -971,52 +968,9 @@ async def load_credentials(self):
971968
return None
972969

973970

974-
class AioSSOCredentialFetcher(AioCachedCredentialFetcher):
975-
_UTC_DATE_FORMAT = '%Y-%m-%dT%H:%M:%SZ'
976-
977-
def __init__(
978-
self,
979-
start_url,
980-
sso_region,
981-
role_name,
982-
account_id,
983-
client_creator,
984-
token_loader=None,
985-
cache=None,
986-
expiry_window_seconds=None,
987-
token_provider=None,
988-
sso_session_name=None,
989-
):
990-
self._client_creator = client_creator
991-
self._sso_region = sso_region
992-
self._role_name = role_name
993-
self._account_id = account_id
994-
self._start_url = start_url
995-
self._token_loader = token_loader
996-
self._token_provider = token_provider
997-
self._sso_session_name = sso_session_name
998-
super().__init__(cache, expiry_window_seconds)
999-
1000-
def _create_cache_key(self):
1001-
args = {
1002-
'roleName': self._role_name,
1003-
'accountId': self._account_id,
1004-
}
1005-
if self._sso_session_name:
1006-
args['sessionName'] = self._sso_session_name
1007-
else:
1008-
args['startUrl'] = self._start_url
1009-
1010-
args = json.dumps(args, sort_keys=True, separators=(',', ':'))
1011-
argument_hash = sha1(args.encode('utf-8')).hexdigest()
1012-
return self._make_file_safe(argument_hash)
1013-
1014-
def _parse_timestamp(self, timestamp_ms):
1015-
# fromtimestamp expects seconds so: milliseconds / 1000 = seconds
1016-
timestamp_seconds = timestamp_ms / 1000.0
1017-
timestamp = datetime.datetime.fromtimestamp(timestamp_seconds, tzutc())
1018-
return timestamp.strftime(self._UTC_DATE_FORMAT)
1019-
971+
class AioSSOCredentialFetcher(
972+
SSOCredentialFetcher, AioCachedCredentialFetcher
973+
):
1020974
async def _get_credentials(self):
1021975
"""Get credentials by calling SSO get role credentials."""
1022976
config = Config(

tests/test_patches.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
ContainerProvider,
1919
CredentialResolver,
2020
Credentials,
21+
DeferredRefreshableCredentials,
2122
EnvProvider,
2223
InstanceMetadataProvider,
2324
OriginalEC2Provider,
@@ -242,7 +243,12 @@
242243
RefreshableCredentials.get_frozen_credentials: {
243244
'f661c84a8b759786e011f0b1e8a468a0c6294e36'
244245
},
245-
SSOCredentialFetcher: {'fa2a1dd73e0ec37e250c97f55a7b2c341a7f836a'},
246+
DeferredRefreshableCredentials.__init__: {
247+
'd18601140386cfaa6718d0e0d38a0816cd151d35',
248+
},
249+
SSOCredentialFetcher._get_credentials: {
250+
'8b330f4b299aece9232577f066060e28d369f3e9',
251+
},
246252
SSOProvider.load: {'67aba81dd1def437f2035f5e20b0720b328d970a'},
247253
CachedCredentialFetcher._get_credentials: {
248254
'02a7d13599d972e3f258d2b53f87eeda4cc3e3a4'
@@ -455,6 +461,9 @@
455461
Session._create_credential_resolver: {
456462
'87e98d201c72d06f7fbdb4ebee2dce1c09de0fb2'
457463
},
464+
Session.set_credentials: {
465+
'63a10f97f417d3df8aae8a5444db4c8a6ebe06ad',
466+
},
458467
Session.get_credentials: {'718da08b630569e631f93aedd65f1d9215bfc30b'},
459468
get_session: {'c47d588f5da9b8bde81ccc26eaef3aee19ddd901'},
460469
Session.get_service_data: {

0 commit comments

Comments
 (0)