U
    n/e}                     @   s   d dl Z d dlZd dlmZ d dlZd dlmZ d dlm	Z	m
Z
 d dlmZmZmZmZmZ eeZdd ZG dd	 d	eZG d
d deZdS )    N)	timedelta)total_seconds)ClientErrorTokenRetrievalError)DeferredRefreshableTokenFrozenAuthTokenSSOTokenProviderTokenProviderChain_utc_nowc                 C   s   t | g}t|dS )N)	providers)AioSSOTokenProviderr	   )sessionr    r   6/tmp/pip-unpacked-wheel-8mnez3y6/aiobotocore/tokens.pycreate_token_resolver   s    r   c                   @   s0   e Zd ZefddZdd Zdd Zdd Zd	S )
AioDeferredRefreshableTokenc                 C   s,   || _ || _|| _t | _d | _d | _d S N)_time_fetcher_refresh_usingmethodasyncioLock_refresh_lock_frozen_token_next_refresh)selfr   Zrefresh_usingtime_fetcherr   r   r   __init__   s    
z$AioDeferredRefreshableToken.__init__c                    s   |   I d H  | jS r   )_refreshr   r   r   r   r   get_frozen_token'   s    z,AioDeferredRefreshableToken.get_frozen_tokenc              
      sX   |   }|sd S |dk}|s&| j sT| j4 I d H  |  I d H  W 5 Q I d H R X d S )N	mandatory)_should_refreshr   locked_protected_refresh)r   refresh_typeZblock_for_refreshr   r   r   r   +   s    z$AioDeferredRefreshableToken._refreshc                    s   |   }|sd S z.|  }|t| jd | _|  I d H | _W n. tk
rl   tj	d|dd |dkrh Y nX | 
 rt| jddd S )Nsecondsz5Refreshing token failed during the %s refresh period.Texc_infor!   z$Token has expired and refresh failed)Zprovider	error_msg)r"   r   r   Z_attempt_timeoutr   r   r   	ExceptionloggerwarningZ_is_expiredr   r   )r   r%   nowr   r   r   r$   7   s(    z.AioDeferredRefreshableToken._protected_refreshN)__name__
__module____qualname__r
   r   r    r   r$   r   r   r   r   r      s
   
r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r   c              
      s   | j 4 I d H ,}|j| j|d |d |d dI d H }W 5 Q I d H R X t|d d}| jd | jd |d	 |  | |d |d |d
 d}d|kr|d |d< td |S )NclientIdclientSecretrefreshToken)Z	grantTyper2   r3   r4   Z	expiresInr&   sso_start_urlZ
sso_regionaccessTokenregistrationExpiresAt)ZstartUrlZregionr6   	expiresAtr2   r3   r7   zSSO Token refresh succeeded)Z_clientZcreate_tokenZ_GRANT_TYPEr   _sso_config_nowr,   info)r   tokenclientresponseZ
expires_in	new_tokenr   r   r   _attempt_create_tokenU   s(    


z)AioSSOTokenProvider._attempt_create_tokenc                    s   d} fdd|D }|r2d| }t | d S tj d }t||   dkrjt d|  d S z|  I d H W S  tk
r   t j	dd	d
 Y d S X d S )N)r4   r2   r3   r7   c                    s   g | ]}| kr|qS r   r   ).0kr<   r   r   
<listcomp>t   s      z=AioSSOTokenProvider._refresh_access_token.<locals>.<listcomp>z+Unable to refresh SSO token: missing keys: r7   r   z"SSO token registration expired at z SSO token refresh attempt failedTr(   )
r,   r;   dateutilparserparser   r:   r@   r   r-   )r   r<   keysZmissing_keysmsgZexpiryr   rC   r   _refresh_access_tokenm   s    

z)AioSSOTokenProvider._refresh_access_tokenc                    s   | j d }| j d }td|  | j||d}tj|d }td|  t|| 	  }|| j
k r| |I d H }|d k	r|}|d }| jj|||d t|d |dS )	Nr5   session_namezLoading cached SSO token for )rK   r8   zCached SSO token expires at r6   )
expiration)r9   r,   r;   Z_token_loaderrE   rF   rG   debugr   r:   Z_REFRESH_WINDOWrJ   Z
save_tokenr   )r   Z	start_urlrK   Z
token_dictrL   	remainingZnew_token_dictr   r   r   
_refresher   s*    


   zAioSSOTokenProvider._refresherc                 C   s"   | j d krd S t| j| j| jdS )N)r   )r9   r   ZMETHODrO   r:   r   r   r   r   
load_token   s    
  zAioSSOTokenProvider.load_tokenN)r/   r0   r1   r@   rJ   rO   rP   r   r   r   r   r   T   s   r   )r   loggingdatetimer   Zdateutil.parserrE   Zbotocore.compatr   Zbotocore.exceptionsr   r   Zbotocore.tokensr   r   r   r	   r
   	getLoggerr/   r,   r   r   r   r   r   r   r   <module>   s   
: