U
    7~Hj¡,  ã                   @  sâ   d dl mZ d dlZd dlZd dlZd dlmZ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mZmZ ddlmZmZ dd	lmZ er dd
lmZmZ G dd„ dƒZeƒ ZejZejZejZejZej Z ej!Z!ej"Z"dS )é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyé   )Ú	AlgorithmÚget_default_algorithmsÚ
has_cryptoÚrequires_cryptography)ÚPyJWK)ÚDecodeErrorÚInvalidAlgorithmErrorÚInvalidSignatureErrorÚInvalidTokenError)Úbase64url_decodeÚbase64url_encode)ÚRemovedInPyjwt3Warning)ÚAllowedPrivateKeysÚAllowedPublicKeysc                
   @  s"  e Zd ZdZd@ddddœdd„Zed	d
œdd„ƒZddddœdd„Zdddœdd„Zdd
œdd„Z	dddœdd„Z
dAddd dd!d"d"dd#œd$d%„ZdBd'd(ddd)d*d+œd,d-„ZdCd'd(ddd)d.d+œd/d0„Zd'd*d1œd2d3„Zd'd4d1œd5d6„ZdDdd*dd(ddd7œd8d9„Zd*dd:œd;d<„Zd.dd=œd>d?„ZdS )EÚPyJWSZJWTNzlist[str] | Nonezdict[str, Any] | NoneÚNone)Ú
algorithmsÚoptionsÚreturnc                 C  sh   t ƒ | _|d k	rt|ƒnt| jƒ| _t| j ¡ ƒD ]}|| jkr2| j|= q2|d krVi }|  ¡ |–| _d S )N)r   Ú_algorithmsÚsetÚ_valid_algsÚlistÚkeysÚ_get_default_optionsr   )Úselfr   r   Úkey© r!   ú//tmp/pip-unpacked-wheel-_3e6e1a9/jwt/api_jws.pyÚ__init__   s    ÿ

zPyJWS.__init__zdict[str, bool])r   c                   C  s   ddiS )NÚverify_signatureTr!   r!   r!   r!   r"   r   2   s    zPyJWS._get_default_optionsÚstrr   )Úalg_idÚalg_objr   c                 C  s>   || j krtdƒ‚t|tƒs$tdƒ‚|| j |< | j |¡ dS )zW
        Registers a new Algorithm for use when creating and verifying tokens.
        z Algorithm already has a handler.z!Object is not of type `Algorithm`N)r   Ú
ValueErrorÚ
isinstancer   Ú	TypeErrorr   Úadd)r   r&   r'   r!   r!   r"   Úregister_algorithm6   s    


zPyJWS.register_algorithm)r&   r   c                 C  s*   || j krtdƒ‚| j |= | j |¡ dS )z�
        Unregisters an Algorithm for use when creating and verifying tokens
        Throws KeyError if algorithm is not registered.
        zJThe specified algorithm could not be removed because it is not registered.N)r   ÚKeyErrorr   Úremove)r   r&   r!   r!   r"   Úunregister_algorithmC   s    
ÿzPyJWS.unregister_algorithmz	list[str]c                 C  s
   t | jƒS )zM
        Returns a list of supported values for the 'alg' parameter.
        )r   r   )r   r!   r!   r"   Úget_algorithmsQ   s    zPyJWS.get_algorithms)Úalg_namer   c              
   C  s\   z| j | W S  tk
rV } z,ts<|tkr<td|› d�ƒ|‚tdƒ|‚W 5 d}~X Y nX dS )zœ
        For a given string name, return the matching Algorithm object.

        Example usage:

        >>> jws_obj.get_algorithm_by_name("RS256")
        zAlgorithm 'z9' could not be found. Do you have cryptography installed?úAlgorithm not supportedN)r   r-   r   r	   ÚNotImplementedError)r   r1   Úer!   r!   r"   Úget_algorithm_by_nameW   s    
ÿþzPyJWS.get_algorithm_by_nameÚHS256FTÚbytesz AllowedPrivateKeys | str | bytesz
str | Noneztype[json.JSONEncoder] | NoneÚbool)Úpayloadr    Ú	algorithmÚheadersÚjson_encoderÚis_payload_detachedÚsort_headersr   c                 C  s,  g }|d k	r|nd}	|rD|  d¡}
|
r.|d }	|  d¡}|dkrDd}| j|	dœ}|rh|  |¡ | |¡ |d sv|d= |r„d|d< nd|kr’|d= tj|d||d	� ¡ }| t|ƒ¡ |rÀ|}nt|ƒ}| |¡ d
 	|¡}|  
|	¡}| |¡}| ||¡}| t|ƒ¡ |�rd|d< d
 	|¡}| d¡S )NÚnoneÚalgÚb64FT)Útypr@   rB   )ú,ú:)Ú
separatorsÚclsÚ	sort_keysó   .ó    r   úutf-8)ÚgetÚ
header_typÚ_validate_headersÚupdateÚjsonÚdumpsÚencodeÚappendr   Újoinr5   Úprepare_keyÚsignÚdecode)r   r9   r    r:   r;   r<   r=   r>   ÚsegmentsZ
algorithm_Zheaders_algZheaders_b64ÚheaderZjson_headerZmsg_payloadÚsigning_inputr'   Ú	signatureÚencoded_stringr!   r!   r"   rQ   h   sN    





   ÿ





zPyJWS.encodeÚ zstr | bytesz'AllowedPublicKeys | PyJWK | str | byteszbytes | Nonezdict[str, Any])Újwtr    r   r   Údetached_payloadr   c                 K  sÈ   |rt  dt| ¡ ƒ› �t¡ |d kr*i }| j|–}|d }|rV|sVt|tƒsVtdƒ‚|  	|¡\}	}
}}| 
dd¡dkr¦|d krˆtdƒ‚|}	d |
 dd	¡d
 |	g¡}
|r¼|  |
||||¡ |	||dœS )Nzypassing additional kwargs to decode_complete() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs: r$   z\It is required that you pass in a value for the "algorithms" argument when calling decode().rA   TFzƒIt is required that you pass in a value for the "detached_payload" argument to decode a message having the b64 header set to false.rH   r   r   )r9   rX   rZ   )ÚwarningsÚwarnÚtupler   r   r   r)   r
   r   Ú_loadrK   rS   ÚrsplitÚ_verify_signature)r   r]   r    r   r   r^   ÚkwargsZmerged_optionsr$   r9   rY   rX   rZ   r!   r!   r"   Údecode_complete­   s6    	ü
ÿÿýzPyJWS.decode_completer   c                 K  s:   |rt  dt| ¡ ƒ› �t¡ | j|||||d�}|d S )Nzppassing additional kwargs to decode() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs: )r^   r9   )r_   r`   ra   r   r   rf   )r   r]   r    r   r   r^   re   Údecodedr!   r!   r"   rV   Ú   s    	ü    ÿzPyJWS.decode)r]   r   c                 C  s   |   |¡d }|  |¡ |S )zÎReturns back the JWT header parameters as a dict()

        Note: The signature is not verified so the header parameters
        should not be fully trusted until signature verification is complete
        é   )rb   rM   )r   r]   r;   r!   r!   r"   Úget_unverified_headerï   s    
zPyJWS.get_unverified_headerz*tuple[bytes, bytes, dict[str, Any], bytes]c              
   C  s¤  t |tƒr| d¡}t |tƒs,tdt› �ƒ‚z$| dd¡\}}| dd¡\}}W n, tk
r| } ztdƒ|‚W 5 d }~X Y nX zt|ƒ}W n2 t	t
jfk
r¼ } ztdƒ|‚W 5 d }~X Y nX zt |¡}W n2 tk
rþ }	 ztd|	› �ƒ|	‚W 5 d }	~	X Y nX t |tƒ�stdƒ‚zt|ƒ}
W n4 t	t
jfk
�rT } ztd	ƒ|‚W 5 d }~X Y nX zt|ƒ}W n4 t	t
jfk
�r– } ztd
ƒ|‚W 5 d }~X Y nX |
|||fS )NrJ   z$Invalid token type. Token must be a rH   r   zNot enough segmentszInvalid header paddingzInvalid header string: z,Invalid header string: must be a json objectzInvalid payload paddingzInvalid crypto padding)r)   r%   rQ   r7   r   rc   Úsplitr(   r   r*   ÚbinasciiÚErrorrO   ÚloadsÚdict)r   r]   rY   Zcrypto_segmentZheader_segmentZpayload_segmentÚerrZheader_datarX   r4   r9   rZ   r!   r!   r"   rb   ú   s8    


"zPyJWS._load)rY   rX   rZ   r    r   r   c           
   
   C  sØ   |d krt |tƒr|jg}z|d }W n tk
rB   tdƒ‚Y nX |rX|d k	r`||kr`tdƒ‚t |tƒrx|j}|j}nFz|  |¡}W n, tk
r² }	 ztdƒ|	‚W 5 d }	~	X Y nX | 	|¡}| 
|||¡sÔtdƒ‚d S )Nr@   zAlgorithm not specifiedz&The specified alg value is not allowedr2   zSignature verification failed)r)   r
   Zalgorithm_namer-   r   r   r    r5   r3   rT   Úverifyr   )
r   rY   rX   rZ   r    r   r@   r'   Zprepared_keyr4   r!   r!   r"   rd      s$    

zPyJWS._verify_signature)r;   r   c                 C  s   d|kr|   |d ¡ d S )NÚkid)Ú_validate_kid)r   r;   r!   r!   r"   rM   ?  s    zPyJWS._validate_headers)rq   r   c                 C  s   t |tƒstdƒ‚d S )Nz(Key ID header parameter must be a string)r)   r%   r   )r   rq   r!   r!   r"   rr   C  s    
zPyJWS._validate_kid)NN)r6   NNFT)r\   NNN)r\   NNN)r\   N)Ú__name__Ú
__module__Ú__qualname__rL   r#   Ústaticmethodr   r,   r/   r0   r5   rQ   rf   rV   ri   rb   rd   rM   rr   r!   r!   r!   r"   r      sB     ý     øH    ú0    ú+  úr   )#Ú
__future__r   rk   rO   r_   Útypingr   r   r   r   r   r   r	   Zapi_jwkr
   Ú
exceptionsr   r   r   r   Úutilsr   r   r   r   r   r   Z_jws_global_objrQ   rf   rV   r,   r/   r5   ri   r!   r!   r!   r"   Ú<module>   s,     .