@@ -24,22 +24,47 @@ class AwsCredentials(NativeResource):
2424 Args:
2525 access_key_id (str): Access key ID
2626 secret_access_key (str): Secret access key
27- session_token (Optional[str]): Session token
27+ session_token (Optional[str]): Optional security token associated with
28+ the credentials.
29+ expiration (Optional[datetime.datetime]): Optional expiration datetime,
30+ that the credentials will no longer be valid past.
31+ Converted to UTC timezone and rounded down to nearest second.
32+ If not set, then credentials do not expire.
2833
2934 Attributes:
3035 access_key_id (str): Access key ID
3136 secret_access_key (str): Secret access key
32- session_token (Optional[str]): Session token
37+ session_token (Optional[str]): Security token associated with
38+ the credentials. None if not set.
39+ expiration (Optional[datetime.datetime]): Expiration datetime,
40+ that the credentials will no longer be valid past.
41+ None if credentials do not expire.
42+ Timezone is always UTC.
3343 """
3444 __slots__ = ()
3545
36- def __init__ (self , access_key_id , secret_access_key , session_token = None ):
46+ # C layer uses UINT64_MAX as timestamp for non-expiring credentials
47+ _NONEXPIRING_TIMESTAMP = 0xFFFFFFFFFFFFFFFF
48+
49+ def __init__ (self , access_key_id , secret_access_key , session_token = None , expiration = None ):
3750 assert isinstance (access_key_id , str )
3851 assert isinstance (secret_access_key , str )
3952 assert isinstance (session_token , str ) or session_token is None
4053
54+ # C layer uses large int as timestamp for non-expiring credentials
55+ if expiration is None :
56+ expiration_timestamp = self ._NONEXPIRING_TIMESTAMP
57+ else :
58+ expiration_timestamp = int (expiration .timestamp ())
59+ if expiration_timestamp < 0 or expiration_timestamp >= self ._NONEXPIRING_TIMESTAMP :
60+ raise OverflowError ("expiration datetime out of range" )
61+
4162 super ().__init__ ()
42- self ._binding = _awscrt .credentials_new (access_key_id , secret_access_key , session_token )
63+ self ._binding = _awscrt .credentials_new (
64+ access_key_id ,
65+ secret_access_key ,
66+ session_token ,
67+ expiration_timestamp )
4368
4469 @classmethod
4570 def _from_binding (cls , binding ):
@@ -61,6 +86,15 @@ def secret_access_key(self):
6186 def session_token (self ):
6287 return _awscrt .credentials_session_token (self ._binding )
6388
89+ @property
90+ def expiration (self ):
91+ timestamp = _awscrt .credentials_expiration_timestamp_seconds (self ._binding )
92+ # C layer uses large int as timestamp for non-expiring credentials
93+ if timestamp == self ._NONEXPIRING_TIMESTAMP :
94+ return None
95+ else :
96+ return datetime .datetime .fromtimestamp (timestamp , tz = datetime .timezone .utc )
97+
6498 def __deepcopy__ (self , memo ):
6599 # AwsCredentials is immutable, so just return self.
66100 return self
0 commit comments