
    [h~                         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          ZdS )    N)	lru_cache)
SSLContext)AnyDictListOptional)URLError   )PyJWKPyJWKSet)decode_complete)PyJWKClientConnectionErrorPyJWKClientError)JWKSetCachec                      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Z
defdZddedefdZddedee         fdZdedefdZdedefdZedee         dedee         fd            ZdS )PyJWKClientF   T,  N   uri
cache_keysmax_cached_keyscache_jwk_setlifespanheaderstimeoutssl_contextc	                    |i }|| _         d | _        || _        || _        || _        |r.|dk    rt          d| d          t          |          | _        nd | _        |r% t          |          | 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   s	            ^/var/www/api.easyaligner.net/htdocs/venv_linux/lib/python3.11/site-packages/jwt/jwks_client.py__init__zPyJWKClient.__init__   s     ?G48& 		& 1}}&QhQQQ   "-X!6!6D!%D 	\ $F9_#E#E#EdFZ#[#[D   	\ 	\    returnc                    d }	 t           j                            | j        | j                  }t           j                            || j        | j                  5 }t          j	        |          }d d d            n# 1 swxY w Y   || j
        | j
                            |           S S # t          t          f$ r}t          d| d          d }~ww xY w# | j
        | j
                            |           w w xY w)N)urlr   )r   contextz'Fail to fetch data from the url, err: "r   )urllibrequestRequestr   r   urlopenr   r   jsonloadr!   putr	   TimeoutErrorr   )r#   jwk_setrresponsees        r$   
fetch_datazPyJWKClient.fetch_data2   sV   	0&&48T\&JJA''4<1A (   .)H--. . . . . . . . . . . . . . . !-"&&w//// . ,' 	 	 	,>!>>>  	 !-"&&w//// .sN   AB+ A<0B+ <B  B+ B B+ C +C<CCC $C;refreshc                     d }| j         |s| j                                         }||                                 }t          |t                    st          d          t          j        |          S )Nz.The JWKS endpoint did not return a JSON object)r!   getr7   
isinstancedictr   r   	from_dict)r#   r8   datas      r$   get_jwk_setzPyJWKClient.get_jwk_setD   sp    )')%))++D<??$$D$%% 	U"#STTT!$'''r&   c                 t    |                      |          }d |j        D             }|st          d          |S )Nc                 2    g | ]}|j         d v |j        |S ))sigN)public_key_usekey_id).0jwk_set_keys     r$   
<listcomp>z0PyJWKClient.get_signing_keys.<locals>.<listcomp>S   s8     
 
 
)]::{?Q: :::r&   z2The JWKS endpoint did not contain any signing keys)r?   keysr   )r#   r8   r3   signing_keyss       r$   get_signing_keyszPyJWKClient.get_signing_keysQ   sU    ""7++
 
&|
 
 
  	Y"#WXXXr&   kidc                     |                                  }|                     ||          }|sA|                      d          }|                     ||          }|st          d| d          |S )NT)r8   z,Unable to find a signing key that matches: "r   )rJ   	match_kidr   )r#   rK   rI   signing_keys       r$   r"   zPyJWKClient.get_signing_key^   s    ,,..nn\377 	000>>L..s;;K &I3III   r&   tokenc                     t          |ddi          }|d         }|                     |                    d                    S )Nverify_signatureF)optionsheaderrK   )decode_tokenr"   r:   )r#   rO   
unverifiedrS   s       r$   get_signing_key_from_jwtz$PyJWKClient.get_signing_key_from_jwtn   sD    !%2De1LMMM
H%##FJJu$5$5666r&   rI   c                 2    d }| D ]}|j         |k    r|} n|S )N)rD   )rI   rK   rN   keys       r$   rM   zPyJWKClient.match_kids   s:     	 	CzS  ! ! r&   )Fr   Tr   Nr   N)F)__name__
__module____qualname__strboolintr   r   r   r   r%   r7   r   r?   r   r   rJ   r"   rV   staticmethodrM    r&   r$   r   r      s        !!",0,0!\ !\!\ !\ 	!\
 !\ !\ $sCx.)!\ !\ j)!\ !\ !\ !\F0C 0 0 0 0$( (4 (H ( ( ( (  e    3 5     7c 7e 7 7 7 7
 U # (5/    \  r&   r   )r/   urllib.requestr+   	functoolsr   sslr   typingr   r   r   r   urllib.errorr	   api_jwkr   r   api_jwtr   rT   
exceptionsr   r   r!   r   r   r`   r&   r$   <module>ri      s                    , , , , , , , , , , , , ! ! ! ! ! ! $ $ $ $ $ $ $ $ 4 4 4 4 4 4 D D D D D D D D & & & & & &n n n n n n n n n nr&   