o
    h ŽiÐ  ã                   @  s–   d dl mZ d dlZd dlZd dlmZ d dlmZ d dl	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 )é    )ÚannotationsN)Ú	lru_cache)Ú
SSLContext)ÚAny)ÚURLErroré   )ÚPyJWKÚPyJWKSet)Údecode_complete)ÚPyJWKClientConnectionErrorÚPyJWKClientError)ÚJWKSetCachec                   @  sj   e Zd Z							d.d/dd„Zd0dd„Zd1d2dd„Zd1d3d d!„Zd4d$d%„Zd5d(d)„Ze	d6d,d-„ƒZ
dS )7ÚPyJWKClientFé   Té,  Né   ÚuriÚstrÚ
cache_keysÚboolÚmax_cached_keysÚintÚcache_jwk_setÚlifespanÚfloatÚheadersúdict[str, Any] | NoneÚtimeoutÚssl_contextúSSLContext | Nonec	           
      C  sz   |d u ri }|| _ d | _|| _|| _|| _|r)|dkr#td|› d�ƒ‚t|ƒ| _nd | _|r;t|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#   © r%   úYC:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\site-packages\jwt/jwks_client.pyÚ__init__   s$   
ÿ
üzPyJWKClient.__init__Úreturnr   c              
   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_data5   s0   
ÿý€
ÿþ€ÿ
ÿÿ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"   Úgetr7   Ú
isinstanceÚdictr   r	   Ú	from_dict)r$   r8   Údatar%   r%   r&   Úget_jwk_setG   s   


zPyJWKClient.get_jwk_setúlist[PyJWK]c                 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>V   s    ýýÿz0PyJWKClient.get_signing_keys.<locals>.<listcomp>z2The JWKS endpoint did not contain any signing keys)r>   Úkeysr   )r$   r8   r3   Úsigning_keysr%   r%   r&   Úget_signing_keysT   s   
þzPyJWKClient.get_signing_keysÚkidr   c                 C  sH   |   ¡ }|  ||¡}|s"| j dd�}|  ||¡}|s"td|› d�ƒ‚|S )NT)r8   z,Unable to find a signing key that matches: "r    )rF   Ú	match_kidr   )r$   rG   rE   Úsigning_keyr%   r%   r&   r#   a   s   
ÿzPyJWKClient.get_signing_keyÚtokenústr | bytesc                 C  s(   t |ddid�}|d }|  | d¡¡S )NZverify_signatureF)ÚoptionsÚheaderrG   )Údecode_tokenr#   r9   )r$   rJ   Z
unverifiedrM   r%   r%   r&   Úget_signing_key_from_jwtq   s   z$PyJWKClient.get_signing_key_from_jwtrE   úPyJWK | Nonec                 C  s&   d }| D ]}|j |kr|} |S q|S )N)rA   )rE   rG   rI   Úkeyr%   r%   r&   rH   v   s   
üzPyJWKClient.match_kid)Fr   Tr   Nr   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r(   r   )F)r8   r   r(   r	   )r8   r   r(   r?   )rG   r   r(   r   )rJ   rK   r(   r   )rE   r?   rG   r   r(   rP   )Ú__name__Ú
__module__Ú__qualname__r'   r7   r>   rF   r#   rO   ÚstaticmethodrH   r%   r%   r%   r&   r      s     ÷
$

r   )Ú
__future__r   r/   Úurllib.requestr+   Ú	functoolsr   Ússlr   Útypingr   Úurllib.errorr   Zapi_jwkr   r	   Zapi_jwtr
   rN   Ú
exceptionsr   r   r"   r   r   r%   r%   r%   r&   Ú<module>   s    