
    dd                         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      Zy)    N)	lru_cache)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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y)PyJWKClientNuri
cache_keysmax_cached_keyscache_jwk_setlifespanheaderstimeoutc                     |i }|| _         d | _        || _        || _        |r%|dk  rt	        d| d      t        |      | _        nd | _        |r" t        |      | j                        | _        y y )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   s           1/usr/lib/python3/dist-packages/jwt/jwks_client.py__init__zPyJWKClient.__init__   s     ?G48 1}&EhZqQ  "-X!6D!%D $F9_#EdFZFZ#[D      returnc                    d }	 t         j                  j                  | j                  | j                        }t         j                  j                  || j                        5 }t        j                  |      }d d d        || j                  | j                  j                  |       S S # 1 sw Y   3xY w# t        t        f$ r}t        d| d      d }~ww xY w# | j                  | j                  j                  |       w w xY w)N)urlr   )r   z'Fail to fetch data from the url, err: "r   )urllibrequestRequestr   r   urlopenr   jsonloadr   putr   TimeoutErrorr   )r   jwk_setrresponsees        r   
fetch_datazPyJWKClient.fetch_data/   s    	0&&488T\\&JA''4<<'@ .H))H-. !!-""&&w/ .. .,' 	,9!A> 	 !!-""&&w/ .sB   A B8 $B,:B8 C ,B51B8 8CCCC *Drefreshc                     d }| j                   |s| j                   j                         }|| j                         }t        |t              st        d      t        j                  |      S )Nz.The JWKS endpoint did not return a JSON object)r   getr1   
isinstancedictr   r   	from_dict)r   r2   datas      r   get_jwk_setzPyJWKClient.get_jwk_set?   sa    )'%%))+D<??$D$%"#STT!!$''r!   c                     | j                  |      }|j                  D cg c]  }|j                  dv r|j                  r|  }}|st	        d      |S c c}w )N)sigNz2The JWKS endpoint did not contain any signing keys)r9   keyspublic_key_usekey_idr   )r   r2   r-   jwk_set_keysigning_keyss        r   get_signing_keyszPyJWKClient.get_signing_keysL   sg    ""7+  '||
))]:{?Q?Q 
 
 "#WXX
s   #Akidc                     | j                         }| j                  ||      }|s5| j                  d      }| j                  ||      }|st        d| d      |S )NT)r2   z,Unable to find a signing key that matches: "r   )rA   	match_kidr   )r   rB   r@   signing_keys       r   r   zPyJWKClient.get_signing_keyY   sj    ,,.nn\37000>L..s;K&B3%qI  r!   tokenc                 j    t        |ddi      }|d   }| j                  |j                  d            S )Nverify_signatureF)optionsheaderrB   )decode_tokenr   r4   )r   rF   
unverifiedrJ   s       r   get_signing_key_from_jwtz$PyJWKClient.get_signing_key_from_jwti   s8    !%2De1LM
H%##FJJu$566r!   r@   c                 @    d }| D ]  }|j                   |k(  s|} |S  |S )N)r>   )r@   rB   rE   keys       r   rD   zPyJWKClient.match_kidn   s8     	CzzS !	
 r!   )F   Ti,  N   )F)__name__
__module____qualname__strboolintr   r   r   r    r1   r   r9   r   r
   rA   r   rM   staticmethodrD    r!   r   r   r      s    !!",0\\ \ 	\
 \ \ $sCx.)\ \B0C 0 (4 (H ( e 3 5  7c 7e 7
 U # (5/  r!   r   )r)   urllib.requestr%   	functoolsr   typingr   r   r   r   urllib.errorr   api_jwkr
   r   api_jwtr   rK   
exceptionsr   r   r   r   r   rY   r!   r   <module>ra      s/       , , ! $ 4 D &j jr!   