U
    d                     @   s   d dl Z d dlZd dlmZ d dl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 dd	lmZ G d
d dZdS )    N)	lru_cache)AnyListOptional)URLError   )PyJWKPyJWKSet)decode_complete)PyJWKClientError)JWKSetCachec                   @   s   e Zd Zdee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,  )uri
cache_keysmax_cached_keyscache_jwk_setlifespanc                 C   sT   || _ d | _|r4|dkr(td| dt|| _nd | _|rPt|d| j| _d S )Nr   z/Lifespan must be greater than 0, the input is "")maxsize)r   jwk_set_cacher   r   r   get_signing_key)selfr   r   r   r   r    r   3/tmp/pip-unpacked-wheel-cf9_iply/jwt/jwks_client.py__init__   s    
zPyJWKClient.__init__)returnc              
   C   s   d }zhz(tj| j}t|}W 5 Q R X W n2 t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 )Nz'Fail to fetch data from the url, err: "r   )
r   puturllibrequesturlopenr   jsonloadr   r   )r   jwk_setresponseer   r   r   
fetch_data)   s    "
zPyJWKClient.fetch_data)refreshr   c                 C   s6   d }| j d k	r|s| j  }|d kr,|  }t|S N)r   getr'   r	   	from_dict)r   r(   datar   r   r   get_jwk_set6   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>B   s   
 z0PyJWKClient.get_signing_keys.<locals>.<listcomp>z2The JWKS endpoint did not contain any signing keys)r-   keysr   )r   r(   r$   signing_keysr   r   r   get_signing_keys@   s    
zPyJWKClient.get_signing_keys)kidr   c                 C   sH   |   }| ||}|sD| j dd}| ||}|sDtd| d|S )NT)r(   z,Unable to find a signing key that matches: "r   )r4   	match_kidr   )r   r5   r3   signing_keyr   r   r   r   M   s    
zPyJWKClient.get_signing_key)tokenr   c                 C   s(   t |ddid}|d }| |dS )NZverify_signatureF)optionsheaderr5   )decode_tokenr   r*   )r   r8   Z
unverifiedr:   r   r   r   get_signing_key_from_jwt]   s    z$PyJWKClient.get_signing_key_from_jwt)r3   r5   r   c                 C   s$   d }| D ]}|j |kr|} q q|S r)   )r/   )r3   r5   r7   keyr   r   r   r6   b   s    
zPyJWKClient.match_kidN)Fr   Tr   )F)F)__name__
__module____qualname__strboolintr   r   r'   r	   r-   r   r   r4   r   r<   staticmethodr   r6   r   r   r   r   r      s$       
r   )r"   urllib.requestr   	functoolsr   typingr   r   r   urllib.errorr   Zapi_jwkr   r	   Zapi_jwtr
   r;   
exceptionsr   r   r   r   r   r   r   r   <module>   s   