B
    d                 @   s   d dl Z d dl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)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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timeoutc             C   sl   |d kri }|| _ d | _|| _|| _|rL|dkr@td| dt|| _nd | _|rht|d| j| _d S )Nr   z/Lifespan must be greater than 0, the input is "")maxsize)r   jwk_set_cacher   r   r   r   r   get_signing_key)selfr   r   r   r   r   r   r    r   \/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/jwt/jwks_client.py__init__   s    
zPyJWKClient.__init__)returnc          
   C   s   d }zy@t jj| j| jd}t jj|| jd}t|}W d Q R X W n6 t	t
fk
r| } ztd| dW d d }~X Y nX |S W d | jd k	r| j| X d S )N)urlr   )r   z'Fail to fetch data from the url, err: "r   )urllibrequestRequestr   r   urlopenr   jsonloadr   TimeoutErrorr   r   put)r   jwk_setrresponseer   r   r    
fetch_data/   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   getr0   
isinstancedictr   r
   	from_dict)r   r1   datar   r   r    get_jwk_set?   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>O   s   z0PyJWKClient.get_signing_keys.<locals>.<listcomp>z2The JWKS endpoint did not contain any signing keys)r7   keysr   )r   r1   r,   signing_keysr   r   r    get_signing_keysL   s    

zPyJWKClient.get_signing_keys)kidr"   c             C   sH   |   }| ||}|sD| j dd}| ||}|sDtd| d|S )NT)r1   z,Unable to find a signing key that matches: "r   )r>   	match_kidr   )r   r?   r=   signing_keyr   r   r    r   Y   s    zPyJWKClient.get_signing_key)tokenr"   c             C   s(   t |ddid}|d }| |dS )NZverify_signatureF)optionsheaderr?   )decode_tokenr   r2   )r   rB   Z
unverifiedrD   r   r   r    get_signing_key_from_jwti   s    z$PyJWKClient.get_signing_key_from_jwt)r=   r?   r"   c             C   s&   d }x| D ]}|j |kr
|}P q
W |S )N)r9   )r=   r?   rA   keyr   r   r    r@   n   s    

zPyJWKClient.match_kid)Fr   Tr   Nr   )F)F)__name__
__module____qualname__strboolintr   r   r   r!   r0   r
   r7   r   r	   r>   r   rF   staticmethodr@   r   r   r   r    r      s        (r   )r(   urllib.requestr$   	functoolsr   typingr   r   r   r   urllib.errorr   Zapi_jwkr	   r
   Zapi_jwtr   rE   
exceptionsr   r   r   r   r   r   r   r   r    <module>   s   