o
    0³´j#  ã                   @   s´   d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	 ddl
mZmZmZmZ ddlmZmZmZmZ 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dS )
é    N)ÚMapping)ÚAnyÚDictÚListÚOptionalÚTypeé   )Ú	AlgorithmÚget_default_algorithmsÚ
has_cryptoÚrequires_cryptography)ÚDecodeErrorÚInvalidAlgorithmErrorÚInvalidSignatureErrorÚInvalidTokenError)Úbase64url_decodeÚbase64url_encodec                   @   s  e Zd ZdZd-dd„Zedd„ ƒZdd„ Zd	d
„ Zdd„ Z				d.de
dedee dee deeej  defdd„Z			d/dededee dedeeef f
dd„Z			d/dededee dedef
dd„Zdd„ Zd d!„ Z		d0d"d#„Zd$hZd%d&œd'd(„Zd)d*„ Zd+d,„ ZdS )1ÚPyJWSÚJWTNc                 C   sl   t ƒ | _|d urt|ƒnt| jƒ| _t| j ¡ ƒD ]}|| jvr$| j|= q|d u r+i }i |  ¡ ¥|¥| _d S )N)r
   Ú_algorithmsÚsetÚ_valid_algsÚlistÚkeysÚ_get_default_optionsÚoptions)ÚselfÚ
algorithmsr   Úkey© r   ú-/usr/lib/python3/dist-packages/jwt/api_jws.pyÚ__init__   s   ÿ
€zPyJWS.__init__c                   C   s   ddiS )NÚverify_signatureTr   r   r   r   r    r   '   s   zPyJWS._get_default_optionsc                 C   s>   || j v 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   Úalg_idÚalg_objr   r   r    Úregister_algorithm+   s   


zPyJWS.register_algorithmc                 C   s*   || j v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_algorithm8   s   
ÿzPyJWS.unregister_algorithmc                 C   s
   t | jƒS )zM
        Returns a list of supported values for the 'alg' parameter.
        )r   r   )r   r   r   r    Úget_algorithmsF   s   
zPyJWS.get_algorithmsÚHS256Úpayloadr   Ú	algorithmÚheadersÚjson_encoderÚreturnc              
   C   s   g }|d u rd}|rd|v r|d r|d }| j |dœ}|r1| j|dd� | |¡ |d s1|d= tj|d|d� ¡ }| t|ƒ¡ | t|ƒ¡ d	 |¡}	z| j	| }
|
 
|¡}|
 |	|¡}W n ty~ } ztsu|tv rutd
| ƒ|‚tdƒ|‚d }~ww | t|ƒ¡ d	 |¡}| d¡S )NÚnoneÚalg)Útypr5   T©Úencodingr6   )ú,ú:)Ú
separatorsÚclsó   .zFAlgorithm '%s' could not be found. Do you have cryptography installed?úAlgorithm not supportedúutf-8)Ú
header_typÚ_validate_headersÚupdateÚjsonÚdumpsÚencodeÚappendr   Újoinr   Úprepare_keyÚsignr*   r   r   ÚNotImplementedErrorÚdecode)r   r/   r   r0   r1   r2   ÚsegmentsÚheaderÚjson_headerÚsigning_inputr(   Ú	signatureÚeÚencoded_stringr   r   r    rE   L   sL   
ÿþ


ÿÿý
€ù	

zPyJWS.encodeÚ Újwtr   r   c                 K   sp   |d u ri }i | j ¥|¥}|d }|r|stdƒ‚|  |¡\}}	}
}|  |
¡ |r2|  |	|
|||¡ ||
|dœS )Nr"   z\It is required that you pass in a value for the "algorithms" argument when calling decode().)r/   rM   rP   )r   r   Ú_loadrA   Ú_verify_signature)r   rT   r   r   r   ÚkwargsÚmerged_optionsr"   r/   rO   rM   rP   r   r   r    Údecode_completeƒ   s    ÿ
ýzPyJWS.decode_completec                 K   s    | j ||||fi |¤Ž}|d S )Nr/   )rY   )r   rT   r   r   r   rW   Údecodedr   r   r    rK   ¢   s   zPyJWS.decodec                 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
        é   )rU   rA   )r   rT   r1   r   r   r    Úget_unverified_header­   s   
zPyJWS.get_unverified_headerc              
   C   sj  t |tƒr
| d¡}t |tƒstdt› �ƒ‚z| dd¡\}}| dd¡\}}W n ty9 } ztdƒ|‚d }~ww zt|ƒ}W n t	t
jfyT } ztdƒ|‚d }~ww zt |¡}W n tyo }	 ztd|	 ƒ|	‚d }	~	ww t |tƒsytdƒ‚zt|ƒ}
W n t	t
jfy“ } ztd	ƒ|‚d }~ww zt|ƒ}W n t	t
jfy® } ztd
ƒ|‚d }~ww |
|||fS )Nr?   z$Invalid token type. Token must be a r=   r   zNot enough segmentszInvalid header paddingzInvalid header string: %sz,Invalid header string: must be a json objectzInvalid payload paddingzInvalid crypto padding)r$   ÚstrrE   Úbytesr   ÚrsplitÚsplitr#   r   r%   ÚbinasciiÚErrorrC   Úloadsr   )r   rT   rO   Úcrypto_segmentÚheader_segmentÚpayload_segmentÚerrÚheader_datarM   rQ   r/   rP   r   r   r    rU   ¸   sL   



€ÿ
€ÿ€ÿ

€ÿ
€ÿzPyJWS._loadc           	   
   C   sv   |  d¡}|d ur||vrtdƒ‚z| j| }| |¡}| |||¡s'tdƒ‚W d S  ty: } ztdƒ|‚d }~ww )Nr5   z&The specified alg value is not allowedzSignature verification failedr>   )Úgetr   r   rH   Úverifyr   r*   )	r   rO   rM   rP   r   r   r5   r(   rQ   r   r   r    rV   Þ   s   
	

ÿ
€ÿzPyJWS._verify_signatureÚb64Fr7   c                C   s8   d|v r|   |d ¡ |sd|v r|  |¡ d S d S d S )NÚkidÚcrit)Ú_validate_kidÚ_validate_crit)r   r1   r8   r   r   r    rA   ù   s
   ÿzPyJWS._validate_headersc                 C   s   t |tƒs	tdƒ‚d S )Nz(Key ID header parameter must be a string)r$   r]   r   )r   rl   r   r   r    rn     s   
ÿzPyJWS._validate_kidc                 C   sv   |d }t |tƒrt|ƒdkrtdƒ‚|D ]#}t |tƒs tdƒ‚|| jvr,td|› �ƒ‚||vr8td|› d�ƒ‚qd S )Nrm   r   z/Invalid 'crit' header: must be a non-empty listz-Invalid 'crit' header: values must be stringsz Unsupported critical extension: zCritical extension 'z' is missing from headers)r$   r   Úlenr   r]   Ú_supported_crit)r   r1   rm   Úextr   r   r    ro     s   


ÿÿûzPyJWS._validate_crit)NN)r.   NN)rS   NN)rS   N)Ú__name__Ú
__module__Ú__qualname__r@   r!   Ústaticmethodr   r)   r,   r-   r^   r]   r   r   r   rC   ÚJSONEncoderrE   r   r   rY   rK   r\   rU   rV   rq   rA   rn   ro   r   r   r   r    r      s|    


úþýüûú
ù:ûþýüû

ù"ûþýüû
ù+
úÿr   )ra   rC   Úcollections.abcr   Útypingr   r   r   r   r   r   r	   r
   r   r   Ú
exceptionsr   r   r   r   Úutilsr   r   r   Ú_jws_global_objrE   rY   rK   r)   r,   r\   r   r   r   r    Ú<module>   s"      
