o
    Y¨Êh¶  ã                   @   sì   d dl Z d dlZd dlZd dlmZ zd dlmZmZmZm	Z	m
Z
 W n	 ey+   Y nw ddlmZmZmZmZ ddl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 G d	d
„ d
eƒZ e ƒ Z!e!j"Z"e!j#Z#e!j$Z$e!j%Z%e!j&Z&dS )é    N)ÚMapping)ÚCallableÚDictÚListÚOptionalÚUnioné   )Ú	AlgorithmÚget_default_algorithmsÚ
has_cryptoÚrequires_cryptography)Úbinary_typeÚstring_typesÚ	text_type)ÚDecodeErrorÚInvalidAlgorithmErrorÚInvalidSignatureErrorÚInvalidTokenError)Úbase64url_decodeÚbase64url_encodeÚforce_bytesÚ
merge_dictc                   @   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d„Z
				d dd„Zdd„ Zdd„ Z	d!dd„Zdd„ Zdd„ ZdS )"ÚPyJWSÚJWTNc                 C   sf   t ƒ | _|d urt|ƒnt| jƒ| _t| j ¡ ƒD ]}|| jvr$| j|= q|s)i }t|  ¡ |ƒ| _d S )N)	r
   Ú_algorithmsÚsetÚ_valid_algsÚlistÚkeysr   Ú_get_default_optionsÚoptions)ÚselfÚ
algorithmsr    Úkey© r$   ú=/var/www/html/env/lib/python3.10/site-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_algorithm;   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_algorithmsG   s   
zPyJWS.get_algorithmsÚHS256c                 C   sæ   g }|d u rd}|| j vr	 | j|dœ}|r |  |¡ | |¡ ttj|d|d�ƒ}| t|ƒ¡ | t|ƒ¡ d 	|¡}	z| j
| }
|
 |¡}|
 |	|¡}W n tyf   tsb|tv rbtd| ƒ‚tdƒ‚w | t|ƒ¡ d 	|¡S )NÚnone)ÚtypÚalg)ú,ú:)Ú
separatorsÚclsó   .zFAlgorithm '%s' could not be found. Do you have cryptography installed?úAlgorithm not supported)r   Ú
header_typÚ_validate_headersÚupdater   ÚjsonÚdumpsÚappendr   Újoinr   Úprepare_keyÚsignr/   r   r   ÚNotImplementedError)r!   Úpayloadr#   Ú	algorithmÚheadersÚjson_encoderÚsegmentsÚheaderÚjson_headerÚsigning_inputr-   Ú	signaturer$   r$   r%   ÚencodeM   sD   


ýÿ


ÿÿù	
zPyJWS.encodeÚ Tc                 K   sn   t | j|ƒ}|d }|r|st dt¡ |  |¡\}	}
}}|s)tjdtdd� |	S |r5|  |	|
||||¡ |	S )Nr'   z�It is strongly recommended that you pass in a value for the "algorithms" argument when calling decode(). This argument will be mandatory in a future version.zSThe verify parameter is deprecated. Please use verify_signature in options instead.é   )Ú
stacklevel)r   r    ÚwarningsÚwarnÚDeprecationWarningÚ_loadÚ_verify_signature)r!   Újwtr#   Úverifyr"   r    ÚkwargsÚmerged_optionsr'   rG   rN   rL   rO   r$   r$   r%   Údecode‚   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
        rR   )rW   r>   )r!   rY   rI   r$   r$   r%   Úget_unverified_header¡   s   
zPyJWS.get_unverified_headerc              
   C   sB  t |tƒr
| d¡}tt|ƒtƒstd t¡ƒ‚z| dd¡\}}| 	dd¡\}}W n t
y5   tdƒ‚w zt|ƒ}W n ttjfyJ   tdƒ‚w z
t | d¡¡}W n t
yg } ztd| ƒ‚d }~ww t |tƒsqtdƒ‚zt|ƒ}	W n ttjfy…   td	ƒ‚w zt|ƒ}
W n ttjfyš   td
ƒ‚w |	|||
fS )Nzutf-8z'Invalid token type. Token must be a {0}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)   r   rP   Ú
issubclassÚtyper   r   ÚformatÚrsplitÚsplitr(   r   r*   ÚbinasciiÚErrorr@   Úloadsr]   r   )r!   rY   rN   Úcrypto_segmentÚheader_segmentÚpayload_segmentÚheader_datarL   ÚerG   rO   r$   r$   r%   rW   ¬   sH   

ÿÿÿ€ÿ
ÿÿzPyJWS._loadc           	      C   sj   |  d¡}|d ur||vrtdƒ‚z| j| }| |¡}| |||¡s'tdƒ‚W d S  ty4   tdƒ‚w )Nr6   z&The specified alg value is not allowedzSignature verification failedr<   )Úgetr   r   rD   rZ   r   r/   )	r!   rG   rN   rL   rO   r#   r"   r6   r-   r$   r$   r%   rX   Ó   s   


ÿÿzPyJWS._verify_signaturec                 C   s   d|v r|   |d ¡ d S d S )NÚkid)Ú_validate_kid)r!   rI   r$   r$   r%   r>   å   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!   rm   r$   r$   r%   rn   é   s   
ÿzPyJWS._validate_kid)NN)r3   NN)rQ   TNN)rQ   N)Ú__name__Ú
__module__Ú__qualname__r=   r&   Ústaticmethodr   r.   r1   r2   rP   r]   r^   rW   rX   r>   rn   r$   r$   r$   r%   r      s.    

	
û7
û(
ÿr   )'rd   r@   rT   Úcollectionsr   Útypingr   r   r   r   r   ÚImportErrorr"   r	   r
   r   r   Úcompatr   r   r   Ú
exceptionsr   r   r   r   Úutilsr   r   r   r   Úobjectr   Ú_jws_global_objrP   r]   r.   r1   r^   r$   r$   r$   r%   Ú<module>   s*     ÿ Y
