U
    ڲg~                     @   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-ecrjo5d0/jwt/jwks_client.py__init__   s     
zPyJWKClient.__init__)returnc              
   C   s   d }zzDt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   