o
    sh                     @   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"deded	ed
ededeeeef  dedee	 fddZ
defddZd#dedefddZd#dedee fddZdedefddZdedefddZedee dedee fd d!ZdS )$PyJWKClientF   T,  N   uri
cache_keysmax_cached_keyscache_jwk_setlifespanheaderstimeoutssl_contextc	           	      C   sv   |d u ri }|| _ d | _|| _|| _|| _|r)|dkr#td| dt|| _nd | _|r9t|d| j| _d S 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!   c/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/jwt/jwks_client.py__init__   s&   

zPyJWKClient.__init__returnc              
   C   s   d }zSz,t jj| j| jd}t jj|| j| jd}t	|}W d    n1 s)w   Y  W n t
tfyF } z	td| d|d }~ww |W | jd urU| j| S S | jd urb| j| w w )N)urlr   )r   contextz'Fail to fetch data from the url, err: "r   )urllibrequestRequestr   r   urlopenr   r   jsonloadr   TimeoutErrorr   r   put)r    jwk_setrresponseer!   r!   r"   
fetch_data4   s0   


zPyJWKClient.fetch_datarefreshc                 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   getr3   
isinstancedictr   r   	from_dict)r    r4   datar!   r!   r"   get_jwk_setF   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)public_key_usekey_id).0jwk_set_keyr!   r!   r"   
<listcomp>U   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_keysS   s   
zPyJWKClient.get_signing_keyskidc                 C   sH   |   }| ||}|s"| j dd}| ||}|s"td| d|S )NT)r4   z,Unable to find a signing key that matches: "r   )rC   	match_kidr   )r    rD   rB   signing_keyr!   r!   r"   r   `   s   
zPyJWKClient.get_signing_keytokenc                 C   s(   t |ddid}|d }| |dS )Nverify_signatureF)optionsheaderrD   )decode_tokenr   r5   )r    rG   
unverifiedrJ   r!   r!   r"   get_signing_key_from_jwtp   s   z$PyJWKClient.get_signing_key_from_jwtrB   c                 C   s&   d }| D ]}|j |kr|} |S q|S )N)r=   )rB   rD   rF   keyr!   r!   r"   rE   u   s   
zPyJWKClient.match_kid)Fr   Tr   Nr   N)F)__name__
__module____qualname__strboolintr   r   r   r   r#   r3   r   r:   r   r
   rC   r   rM   staticmethodrE   r!   r!   r!   r"   r      s@    	
%$r   )r+   urllib.requestr'   	functoolsr   sslr   typingr   r   r   r   urllib.errorr   api_jwkr
   r   api_jwtr   rK   
exceptionsr   r   r   r   r   r!   r!   r!   r"   <module>   s    