o
    è’Oj7  ã                   @   s  d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZ d dlZ	d dl
mZ d dlmZ d dlmZ d dlmZ d dlmZmZmZmZ d d	lmZmZmZmZmZ e e¡Zd
d„ Z dd„ Z!dd„ Z"dd„ Z#G dd„ deƒZ$G dd„ dƒZ%G dd„ dƒZ&G dd„ dƒZ'G dd„ dƒZ(dS )é    N)ÚdatetimeÚ	timedelta)Ú
NamedTuple)Útzutc)ÚUNSIGNED)Útotal_seconds)ÚConfig)ÚClientErrorÚInvalidConfigErrorÚTokenRetrievalErrorÚUnknownTokenProviderError)ÚCachedPropertyÚJSONFileCacheÚSSOTokenLoaderÚcreate_nested_clientÚget_token_from_environmentc                   C   s   t  tƒ ¡S ©N)r   Únowr   © r   r   úU/var/www/html/pharmsmart-cdr-gen/venv/lib/python3.10/site-packages/botocore/tokens.pyÚ_utc_now+   s   r   c                 C   s   t | ƒt| ƒg}t|d�S )N)Ú	providers)ÚScopedEnvTokenProviderÚSSOTokenProviderÚTokenProviderChain)Úsessionr   r   r   r   Úcreate_token_resolver/   s   þ
r   c                 C   s   t | tƒr
|  d¡S | S )Nz%Y-%m-%dT%H:%M:%SZ)Ú
isinstancer   Ústrftime©Úobjr   r   r   Ú_serialize_utc_timestamp7   s   

r!   c                 C   s   t j| td�S )N)Údefault)ÚjsonÚdumpsr!   r   r   r   r   Ú_sso_json_dumps=   s   r%   c                   @   s&   e Zd ZU eed< dZedB ed< dS )ÚFrozenAuthTokenÚtokenNÚ
expiration)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__r(   r   r   r   r   r   r&   A   s   
 r&   c                   @   sL   e Zd ZdZdZdZefdd„Zdd„ Zdd	„ Z	d
d„ Z
dd„ Zdd„ ZdS )ÚDeferredRefreshableTokené„  iX  é<   c                 C   s,   || _ || _|| _t ¡ | _d | _d | _d S r   )Ú_time_fetcherÚ_refresh_usingÚmethodÚ	threadingÚLockÚ_refresh_lockÚ_frozen_tokenÚ_next_refresh)Úselfr3   Úrefresh_usingÚtime_fetcherr   r   r   Ú__init__O   s   

z!DeferredRefreshableToken.__init__c                 C   s   |   ¡  | jS r   )Ú_refreshr7   ©r9   r   r   r   Úget_frozen_tokenY   s   z)DeferredRefreshableToken.get_frozen_tokenc                 C   sN   |   ¡ }|sd S |dk}| j |¡r%z|  ¡  W | j ¡  d S | j ¡  w d S )NÚ	mandatory)Ú_should_refreshr6   ÚacquireÚ_protected_refreshÚrelease)r9   Úrefresh_typeÚblock_for_refreshr   r   r   r=   ]   s   
üz!DeferredRefreshableToken._refreshc                 C   s€   |   ¡ }|sd S z|  ¡ }|t| jd� | _|  ¡ | _W n ty2   tj	d|dd� |dkr0‚ Y nw |  
¡ r>t| jdd�‚d S )N©Úsecondsz5Refreshing token failed during the %s refresh period.T©Úexc_infor@   z$Token has expired and refresh failed)ÚproviderÚ	error_msg)rA   r1   r   Ú_attempt_timeoutr8   r2   r7   Ú	ExceptionÚloggerÚwarningÚ_is_expiredr   r3   )r9   rE   r   r   r   r   rC   k   s.   ýþú
þþz+DeferredRefreshableToken._protected_refreshc                 C   s.   | j d u rdS | j j}t||  ¡  ƒ}|dkS )NFr   )r7   r(   r   r1   )r9   r(   Ú	remainingr   r   r   rQ   ‡   s
   
z$DeferredRefreshableToken._is_expiredc                 C   sd   | j d u rdS | j j}|d u rd S |  ¡ }|| jk rd S t|| ƒ}|| jk r)dS || jk r0dS d S )Nr@   Úadvisory)r7   r(   r1   r8   r   Ú_mandatory_refresh_timeoutÚ_advisory_refresh_timeout)r9   r(   r   rR   r   r   r   rA   �   s   



z(DeferredRefreshableToken._should_refreshN)r)   r*   r+   rU   rT   rM   r   r<   r?   r=   rC   rQ   rA   r   r   r   r   r.   F   s    
r.   c                   @   sF   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dS )r   Nc                 C   s   |d u rg }|| _ d S r   )Ú
_providers)r9   r   r   r   r   r<   ¨   s   
zTokenProviderChain.__init__c                 C   s   |   |¡}| j ||¡ dS )aÛ  Insert a token provider before an existing provider in the chain.

        :param name: The name of the token provider to insert before
            (e.g. ``env`` or ``sso``). Existing names can be discovered
            by accessing provider ``METHOD`` attributes.
        :type name: str

        :param token_provider: The token provider instance to insert.

        :raises UnknownTokenProviderError: If no provider named
            ``name`` exists in the chain.
        N©Ú_get_provider_offsetrV   Úinsert©r9   ÚnameÚtoken_providerÚoffsetr   r   r   Úinsert_before­   s   
z TokenProviderChain.insert_beforec                 C   s    |   |¡}| j |d |¡ dS )aÙ  Insert a token provider after an existing provider in the chain.

        :param name: The name of the token provider to insert after
            (e.g. ``env`` or ``sso``). Existing names can be discovered
            by accessing provider ``METHOD`` attributes.
        :type name: str

        :param token_provider: The token provider instance to insert.

        :raises UnknownTokenProviderError: If no provider named
            ``name`` exists in the chain.
        é   NrW   rZ   r   r   r   Úinsert_after½   s   
zTokenProviderChain.insert_afterc                 C   s6   dd„ | j D ƒ}||vrdS | |¡}| j  |¡ dS )zÕRemove a token provider from the chain by name.

        If no provider with the given name exists, this is a no-op.

        :param name: The name of the token provider to remove.
        :type name: str
        c                 S   ó   g | ]}|j ‘qS r   ©ÚMETHOD©Ú.0Úpr   r   r   Ú
<listcomp>Õ   ó    z-TokenProviderChain.remove.<locals>.<listcomp>N)rV   ÚindexÚpop)r9   r[   Úavailable_methodsr]   r   r   r   ÚremoveÍ   s
   
zTokenProviderChain.removec                 C   s   | j |  |¡ S )zèReturn a token provider by name.

        :param name: The name of the provider to retrieve.
        :type name: str

        :raises UnknownTokenProviderError: If no provider named
            ``name`` exists in the chain.
        )rV   rX   ©r9   r[   r   r   r   Úget_providerÜ   s   	zTokenProviderChain.get_providerc                 C   s2   zdd„ | j D ƒ |¡W S  ty   t|d�‚w )Nc                 S   ra   r   rb   rd   r   r   r   rg   é   rh   z;TokenProviderChain._get_provider_offset.<locals>.<listcomp>)r[   )rV   ri   Ú
ValueErrorr   rm   r   r   r   rX   ç   s
   
ÿz'TokenProviderChain._get_provider_offsetc                 K   s0   | j D ]}|jdi |¤Ž}|d ur|  S qd S )Nr   )rV   Ú
load_token)r9   ÚkwargsrK   r'   r   r   r   rp   í   s   
ÿzTokenProviderChain.load_tokenr   )
r)   r*   r+   r<   r^   r`   rl   rn   rX   rp   r   r   r   r   r   §   s    
r   c                   @   sŽ   e Zd ZdZdZej ej dddd¡¡Z	ddgZ
dZeZd	ed	fd
d„Zdd„ Zedd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zd	S )r   Ússor/   ú~z.awsÚcacheÚsso_start_urlÚ
sso_regionÚrefresh_tokenNc                 C   sR   || _ |d u r| j| jtd�}|| _|| _t| jd�| _|p%| j  d¡p%d| _	d S )N)Ú
dumps_func)rt   Úprofiler"   )
Ú_sessionÚDEFAULT_CACHE_CLSÚ_SSO_TOKEN_CACHE_DIRr%   Ú_nowÚ_cacher   Ú_token_loaderÚget_config_variableÚ_profile_name)r9   r   rt   r;   Úprofile_namer   r   r   r<     s   þ
ÿýzSSOTokenProvider.__init__c           
      C   sÈ   | j j}| di ¡}| di ¡}| | ji ¡}d|vrd S |d }| |d ¡}|s8d| j› d|› d�}t|d�‚g }| jD ]}	|	|vrH| |	¡ q=|rZd| j› d|› d	�}t|d�‚||d
 |d dœS )NÚprofilesÚsso_sessionsÚsso_sessionzThe profile "z7" is configured to use the SSO token provider but the "z+" sso_session configuration does not exist.)rL   zZ" is configured to use the SSO token provider but is missing the following configuration: Ú.rv   ru   )Úsession_namerv   ru   )rz   Úfull_configÚgetr�   r
   Ú_SSO_CONFIG_VARSÚappend)
r9   Úloaded_configrƒ   r„   Úprofile_configÚsso_session_nameÚ
sso_configrL   Úmissing_configsÚvarr   r   r   Ú_load_sso_config  s:   
ÿÿ


€
þÿ
ýz!SSOTokenProvider._load_sso_configc                 C   s   |   ¡ S r   )r’   r>   r   r   r   Ú_sso_config;  s   zSSOTokenProvider._sso_configc                 C   s"   t | jd td�}t| jd|d�S )Nrv   )Úregion_nameÚsignature_versionzsso-oidc)Úconfig)r   r“   r   r   rz   )r9   r–   r   r   r   Ú_client?  s
   þzSSOTokenProvider._clientc                 C   sŠ   | j j| j|d |d |d d�}t|d d�}| jd | jd |d	 |  ¡ | |d |d |d
 dœ}d|v r>|d |d< t d¡ |S )NÚclientIdÚclientSecretÚrefreshToken)Ú	grantTyper˜   r™   rš   Ú	expiresInrG   ru   rv   ÚaccessTokenÚregistrationExpiresAt)ÚstartUrlÚregionr�   Ú	expiresAtr˜   r™   rž   zSSO Token refresh succeeded)r—   Úcreate_tokenÚ_GRANT_TYPEr   r“   r}   rO   Úinfo)r9   r'   ÚresponseÚ
expires_inÚ	new_tokenr   r   r   Ú_attempt_create_tokenG  s&   ü
ø

z&SSOTokenProvider._attempt_create_tokenc                    s–   d}‡ fdd„|D ƒ}|rd|› �}t  |¡ d S tj ˆ d ¡}t||  ¡  ƒdkr3t  d|¡ d S z|  ˆ ¡W S  tyJ   t j	dd	d
� Y d S w )N)rš   r˜   r™   rž   c                    s   g | ]}|ˆ vr|‘qS r   r   )re   Úk©r'   r   r   rg   e  s    z:SSOTokenProvider._refresh_access_token.<locals>.<listcomp>z+Unable to refresh SSO token: missing keys: rž   r   z$SSO token registration expired at %sz SSO token refresh attempt failedTrI   )
rO   r¤   ÚdateutilÚparserÚparser   r}   r¨   r	   rP   )r9   r'   ÚkeysÚmissing_keysÚmsgÚexpiryr   rª   r   Ú_refresh_access_token^  s    

þz&SSOTokenProvider._refresh_access_tokenc                 C   s¤   | j d }| j d }t d|¡ | j||d�}tj |d ¡}t d|¡ t||  	¡  ƒ}|| j
k rJ|  |¡}|d urJ|}|d }| jj|||d� t|d |d�S )	Nru   r‡   zLoading cached SSO token for %s)r‡   r¡   zCached SSO token expires at %sr�   )r(   )r“   rO   r¤   r   r«   r¬   r­   Údebugr   r}   Ú_REFRESH_WINDOWr²   Ú
save_tokenr&   )r9   Ú	start_urlr‡   Ú
token_dictr(   rR   Únew_token_dictr   r   r   Ú
_refresherv  s$   



ÿÿzSSOTokenProvider._refresherc                 K   s"   | j d u rd S t| j| j| jd�S )N)r;   )r“   r.   rc   r¹   r}   )r9   rq   r   r   r   rp   Œ  s
   
ÿzSSOTokenProvider.load_token)r)   r*   r+   rc   r´   ÚosÚpathÚ
expanduserÚjoinr|   rŠ   r£   r   r{   r   r<   r’   r   r“   r—   r¨   r²   r¹   rp   r   r   r   r   r   õ   s,    ÿþ
ÿ'

r   c                   @   s&   e Zd ZdZdZddd„Zdd„ ZdS )	r   zn
    Token provider that loads tokens from environment variables scoped to
    a specific `signing_name`.
    ÚenvNc                 C   s   || _ |d u r
tj}|| _d S r   )rz   rº   Úenviron)r9   r   r¿   r   r   r   r<   �  s   
zScopedEnvTokenProvider.__init__c                 K   s@   |  d¡}|d u rd S t|| jƒ}|d urt d¡ t|ƒS d S )NÚsigning_namez%Found token in environment variables.)r‰   r   r¿   rO   r¤   r&   )r9   rq   rÀ   r'   r   r   r   rp   £  s   

þz!ScopedEnvTokenProvider.load_tokenr   )r)   r*   r+   Ú__doc__rc   r<   rp   r   r   r   r   r   •  s
    
r   ))r#   Úloggingrº   r4   r   r   Útypingr   Údateutil.parserr«   Údateutil.tzr   Úbotocorer   Úbotocore.compatr   Úbotocore.configr   Úbotocore.exceptionsr	   r
   r   r   Úbotocore.utilsr   r   r   r   r   Ú	getLoggerr)   rO   r   r   r!   r%   r&   r.   r   r   r   r   r   r   r   Ú<module>   s0   
aN !