a
    !f                     @   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 u 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   P/var/www/html/python-backend/venv/lib/python3.9/site-packages/jwt/jwks_client.py__init__   s    

zPyJWKClient.__init__)returnc              
   C   s   d }zzTt jj| j| jd}t jj|| jd}t|}W d    n1 sN0    Y  W n8 t	t
fy } ztd| dW Y d }~n&d }~0 0 |W | jd ur| j| S W | jd ur| j| n| jd ur| j| 0 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 ur|s| j  }|d u 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 v r|jr|qS ))sigN)Zpublic_key_usekey_id).0Zjwk_set_keyr   r   r    
<listcomp>N   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 }| D ]}|j |kr|} q q|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   