U
    –6{i~  ã                   @   s–   d dl Z d dl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 ddlmZmZ ddlmZ dd	lmZmZ dd
lmZ G dd„ dƒZdS )é    N)Ú	lru_cache)Ú
SSLContext)ÚAnyÚDictÚListÚOptional)ÚURLErroré   )ÚPyJWKÚPyJWKSet)Údecode_complete)ÚPyJWKClientConnectionErrorÚPyJWKClientError)ÚJWKSetCachec                
   @   s®   e Zd Zdeeeeeeeeef  eee	 dœdd	„Z
ed
œdd„Zdeedœdd„Zdeee dœdd„Zeedœdd„Zeedœdd„Zeee eee dœdd„ƒZdS )ÚPyJWKClientFé   Té,  Né   )ÚuriÚ
cache_keysÚmax_cached_keysÚcache_jwk_setÚlifespanÚheadersÚtimeoutÚssl_contextc	           	      C   sr   |d kri }|| _ d | _|| _|| _|| _|rR|dkrFtd|› d�ƒ‚t|ƒ| _nd | _|rnt|d�| jƒ| _d S )Nr   z/Lifespan must be greater than 0, the input is "ú")Úmaxsize)	r   Újwk_set_cacher   r   r   r   r   r   Úget_signing_key)	Úselfr   r   r   r   r   r   r   r   © r!   ú3/tmp/pip-unpacked-wheel-6i4o_yj7/jwt/jwks_client.pyÚ__init__   s     
ÿzPyJWKClient.__init__)Úreturnc              
   C   sª   d }zˆzDtjj| j| jd�}tjj|| j| j	d��}t
 |¡}W 5 Q R X W n6 ttfk
r€ } ztd|› d�ƒ‚W 5 d }~X Y n
X |W ¢S W 5 | j d k	r¤| j  |¡ X d S )N)Úurlr   )r   Úcontextz'Fail to fetch data from the url, err: "r   )r   ÚputÚurllibÚrequestÚRequestr   r   Úurlopenr   r   ÚjsonÚloadr   ÚTimeoutErrorr   )r    Újwk_setÚrÚresponseÚer!   r!   r"   Ú
fetch_data2   s"      ÿ
ÿ
zPyJWKClient.fetch_data)Úrefreshr$   c                 C   sH   d }| j d k	r|s| j  ¡ }|d kr,|  ¡ }t|tƒs>tdƒ‚t |¡S )Nz.The JWKS endpoint did not return a JSON object)r   Úgetr3   Ú
isinstanceÚdictr   r   Ú	from_dict)r    r4   Údatar!   r!   r"   Úget_jwk_setD   s    

zPyJWKClient.get_jwk_setc                 C   s*   |   |¡}dd„ |jD ƒ}|s&tdƒ‚|S )Nc                 S   s    g | ]}|j d kr|jr|‘qS ))ÚsigN)Zpublic_key_useÚkey_id)Ú.0Zjwk_set_keyr!   r!   r"   Ú
<listcomp>S   s   
 þz0PyJWKClient.get_signing_keys.<locals>.<listcomp>z2The JWKS endpoint did not contain any signing keys)r:   Úkeysr   )r    r4   r/   Úsigning_keysr!   r!   r"   Úget_signing_keysQ   s    
þzPyJWKClient.get_signing_keys)Úkidr$   c                 C   sH   |   ¡ }|  ||¡}|sD| j dd�}|  ||¡}|sDtd|› d�ƒ‚|S )NT)r4   z,Unable to find a signing key that matches: "r   )rA   Ú	match_kidr   )r    rB   r@   Úsigning_keyr!   r!   r"   r   ^   s    
ÿzPyJWKClient.get_signing_key)Útokenr$   c                 C   s(   t |ddid�}|d }|  | d¡¡S )NZverify_signatureF)ÚoptionsÚheaderrB   )Údecode_tokenr   r5   )r    rE   Z
unverifiedrG   r!   r!   r"   Úget_signing_key_from_jwtn   s    z$PyJWKClient.get_signing_key_from_jwt)r@   rB   r$   c                 C   s$   d }| D ]}|j |kr|} q q|S )N)r<   )r@   rB   rD   Úkeyr!   r!   r"   rC   s   s    
zPyJWKClient.match_kid)Fr   Tr   Nr   N)F)F)Ú__name__Ú
__module__Ú__qualname__ÚstrÚboolÚintr   r   r   r   r#   r3   r   r:   r   r
   rA   r   rI   ÚstaticmethodrC   r!   r!   r!   r"   r      s0          ÷÷#r   )r,   Úurllib.requestr(   Ú	functoolsr   Ússlr   Útypingr   r   r   r   Úurllib.errorr   Zapi_jwkr
   r   Zapi_jwtr   rH   Ú
exceptionsr   r   r   r   r   r!   r!   r!   r"   Ú<module>   s   