U
    íˆjc  ã                   @  s’   d dl mZ d dlZd dlZd dlmZ ddlmZmZm	Z	 ddl
mZmZmZmZmZ ddlmZ G dd	„ d	ƒZG d
d„ dƒZG dd„ dƒZdS )é    )ÚannotationsN)ÚAnyé   )Úget_default_algorithmsÚ
has_cryptoÚrequires_cryptography)ÚInvalidKeyErrorÚMissingCryptographyErrorÚ
PyJWKErrorÚPyJWKSetErrorÚ
PyJWTError)ÚJWKDictc                   @  s†   e Zd Zdddddœdd„Zedddd dœd	d
„ƒZedddd dœdd„ƒZeddœdd„ƒZeddœdd„ƒZ	eddœdd„ƒZ
dS )ÚPyJWKNr   z
str | NoneÚNone)Újwk_dataÚ	algorithmÚreturnc                 C  s~  t ƒ | _|| _| j dd ¡}|s0td| j› �ƒ‚|sNt| jtƒrN| j dd ¡}|�s| j dd ¡}|dkr¶|dksv|s|d}n8|dkrŠd	}n*|d
kr˜d}n|dkr¦d}ntd|› �ƒ‚nf|dkrÄd}nX|dkrÒd}nJ|dk�r|sðtd| j› �ƒ‚|dkrþd}ntd|› �ƒ‚ntd|› �ƒ‚t�s:|tk�r:t	|› d�ƒ‚|| _
|| jk�rZ| j| | _ntd| j› �ƒ‚| j | j¡| _d S )NÚktyzkty is not found: ZalgÚcrvZECzP-256ZES256zP-384ZES384zP-521ZES512Z	secp256k1ZES256KzUnsupported crv: ZRSAZRS256ÚoctZHS256ZOKPzcrv is not found: ZEd25519ZEdDSAzUnsupported kty: z) requires 'cryptography' to be installed.z%Unable to find an algorithm for key: )r   Z_algorithmsÚ	_jwk_dataÚgetr   Ú
isinstanceÚdictr   r   r	   Zalgorithm_nameZ	Algorithmr
   Zfrom_jwkÚkey)Úselfr   r   r   r   © r   ú//tmp/pip-unpacked-wheel-v1078ij7/jwt/api_jwk.pyÚ__init__   sN    
ÿzPyJWK.__init__)Úobjr   r   c                 C  s
   t | |ƒS ©N)r   )r   r   r   r   r   Ú	from_dictH   s    zPyJWK.from_dictÚstr)Údatar   r   c                 C  s   t  | ¡}t ||¡S r    )ÚjsonÚloadsr   r!   )r#   r   r   r   r   r   Ú	from_jsonL   s    
zPyJWK.from_json©r   c                 C  s   | j  dd ¡S )Nr   ©r   r   ©r   r   r   r   Úkey_typeQ   s    zPyJWK.key_typec                 C  s   | j  dd ¡S )NÚkidr(   r)   r   r   r   Úkey_idU   s    zPyJWK.key_idc                 C  s   | j  dd ¡S )NZuser(   r)   r   r   r   Úpublic_key_useY   s    zPyJWK.public_key_use)N)N)N)Ú__name__Ú
__module__Ú__qualname__r   Ústaticmethodr!   r&   Úpropertyr*   r,   r-   r   r   r   r   r      s   5r   c                   @  sT   e Zd Zdddœdd„Zedd dœdd	„ƒZed
d dœdd„ƒZd
ddœdd„ZdS )ÚPyJWKSetzlist[JWKDict]r   )Úkeysr   c                 C  s–   g | _ |stdƒ‚t|tƒs$tdƒ‚|D ]R}z| j  t|ƒ¡ W q( tk
rx } zt|tƒr`|‚W Y ¢q(W 5 d }~X Y q(X q(t| j ƒdkr’tdƒ‚d S )Nz$The JWK Set did not contain any keyszInvalid JWK Set valuer   zUThe JWK Set did not contain any usable keys. Perhaps 'cryptography' is not installed?)	r4   r   r   ÚlistÚappendr   r   r	   Úlen)r   r4   r   Úerrorr   r   r   r   _   s     

ÿzPyJWKSet.__init__zdict[str, Any])r   r   c                 C  s   |   dg ¡}t|ƒS )Nr4   )r   r3   )r   r4   r   r   r   r!   v   s    zPyJWKSet.from_dictr"   )r#   r   c                 C  s   t  | ¡}t |¡S r    )r$   r%   r3   r!   )r#   r   r   r   r   r&   {   s    
zPyJWKSet.from_jsonr   )r+   r   c                 C  s0   | j D ]}|j|kr|  S qtd|› �ƒ‚d S )Nzkeyset has no key for kid: )r4   r,   ÚKeyError)r   r+   r   r   r   r   Ú__getitem__€   s    


zPyJWKSet.__getitem__N)r.   r/   r0   r   r1   r!   r&   r:   r   r   r   r   r3   ^   s   r3   c                   @  s6   e Zd Zddœdd„Zddœdd„Zddœd	d
„ZdS )ÚPyJWTSetWithTimestampr3   ©Újwk_setc                 C  s   || _ t ¡ | _d S r    )r=   ÚtimeÚ	monotonicÚ	timestamp)r   r=   r   r   r   r   ˆ   s    zPyJWTSetWithTimestamp.__init__r'   c                 C  s   | j S r    r<   r)   r   r   r   Úget_jwk_setŒ   s    z!PyJWTSetWithTimestamp.get_jwk_setÚfloatc                 C  s   | j S r    )r@   r)   r   r   r   Úget_timestamp�   s    z#PyJWTSetWithTimestamp.get_timestampN)r.   r/   r0   r   rA   rC   r   r   r   r   r;   ‡   s   r;   )Ú
__future__r   r$   r>   Útypingr   Z
algorithmsr   r   r   Ú
exceptionsr   r	   r
   r   r   Útypesr   r   r3   r;   r   r   r   r   Ú<module>   s   L)