o
    ÒèFh¡,  ã                   @  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rPd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		dHdId	d
„ZedJdd„ƒZdKdd„ZdLdd„ZdMdd„Z	dNdd„Z
					dOdPd+d,„Z	-			dQdRd4d5„Z	-			dQdSd7d8„ZdTd9d:„ZdUd<d=„Z	-	dVdWdAdB„ZdXdCdD„ZdYdFdG„ZdS )ZÚPyJWSÚJWTNÚ
algorithmsúlist[str] | NoneÚoptionsúdict[str, Any] | NoneÚreturnÚNonec                 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_optionsr   )Úselfr   r   Úkey© r$   úD/var/www/html/loop/nvenv/lib/python3.10/site-packages/jwt/api_jws.pyÚ__init__   s   ÿ
€zPyJWS.__init__údict[str, bool]c                   C  s   ddiS )NÚverify_signatureTr$   r$   r$   r$   r%   r!   2   s   zPyJWS._get_default_optionsÚalg_idÚstrÚalg_objr   c                 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"   r)   r+   r$   r$   r%   Úregister_algorithm6   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_algorithmC   s   
ÿzPyJWS.unregister_algorithmú	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_namec              
   C  sN   z| j | W S  ty& } zts|tv rtd|› d�ƒ|‚tdƒ|‚d}~ww )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   r1   r   r	   ÚNotImplementedError)r"   r6   Úer$   r$   r%   Úget_algorithm_by_nameW   s   
ÿþ
€ûzPyJWS.get_algorithm_by_nameÚHS256FTÚpayloadÚbytesr#   ú AllowedPrivateKeys | str | bytesÚ	algorithmú
str | NoneÚheadersÚjson_encoderútype[json.JSONEncoder] | NoneÚis_payload_detachedÚboolÚsort_headersc                 C  s*  g }|d ur|nd}	|r"|  d¡}
|
r|d }	|  d¡}|du r"d}| j|	dœ}|r4|  |¡ | |¡ |d s;|d= |rBd|d< nd|v rI|d= tj|d||d	� ¡ }| t|ƒ¡ |r`|}nt|ƒ}| |¡ d
 	|¡}|  
|	¡}| |¡}| ||¡}| t|ƒ¡ |r‹d|d< d
 	|¡}| d¡S )NÚnoneÚalgÚb64FT)ÚtyprH   rJ   )ú,ú:)Ú
separatorsÚclsÚ	sort_keysó   .ó    r   úutf-8)ÚgetÚ
header_typÚ_validate_headersÚupdateÚjsonÚdumpsÚencodeÚappendr   Újoinr:   Úprepare_keyÚsignÚdecode)r"   r<   r#   r?   rA   rB   rD   rF   ÚsegmentsÚ
algorithm_Úheaders_algÚheaders_b64ÚheaderÚjson_headerÚmsg_payloadÚsigning_inputr+   Ú	signatureÚencoded_stringr$   r$   r%   rY   h   sL   





ÿþ





zPyJWS.encodeÚ Újwtústr | bytesú'AllowedPublicKeys | PyJWK | str | bytesÚdetached_payloadúbytes | Noneúdict[str, Any]c                 K  sÌ   |rt  dt| ¡ ƒ› �t¡ |d u ri }i | j¥|¥}|d }|r-|s-t|tƒs-tdƒ‚|  	|¡\}	}
}}| 
dd¡du rU|d u rFt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().rI   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.rP   r   r   )r<   rc   rg   )ÚwarningsÚwarnÚtupler    r   r   r-   r
   r   Ú_loadrS   r[   ÚrsplitÚ_verify_signature)r"   rj   r#   r   r   rm   ÚkwargsÚmerged_optionsr(   r<   rf   rc   rg   r$   r$   r%   Údecode_complete­   s:   	
þüÿÿý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: )rm   r<   )rp   rq   rr   r    r   rx   )r"   rj   r#   r   r   rm   rv   Údecodedr$   r$   r%   r^   Ú   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
        é   )rs   rU   )r"   rj   rA   r$   r$   r%   Úget_unverified_headerï   s   
zPyJWS.get_unverified_headerú*tuple[bytes, bytes, dict[str, Any], bytes]c              
   C  sl  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yp }	 ztd|	› �ƒ|	‚d }	~	ww t |tƒszt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 )NrR   z$Invalid token type. Token must be a rP   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*   rY   r=   r   rt   Úsplitr,   r   r.   ÚbinasciiÚErrorrW   ÚloadsÚdict)r"   rj   rf   Úcrypto_segmentÚheader_segmentÚpayload_segmentÚerrÚheader_datarc   r9   r<   rg   r$   r$   r%   rs   ú   sL   



€ÿ
€ÿ€ÿ

€ÿ
€ÿzPyJWS._loadrf   rc   rg   c           
   
   C  sÈ   |d u rt |tƒr|jg}z|d }W n ty   tdƒ‚w |r)|d ur-||vr-tdƒ‚t |tƒr9|j}|j}nz|  |¡}W n tyQ }	 ztdƒ|	‚d }	~	ww | 	|¡}| 
|||¡sbtdƒ‚d S )NrH   zAlgorithm not specifiedz&The specified alg value is not allowedr7   zSignature verification failed)r-   r
   Úalgorithm_namer1   r   r   r#   r:   r8   r\   Úverifyr   )
r"   rf   rc   rg   r#   r   rH   r+   Úprepared_keyr9   r$   r$   r%   ru      s,   ÿ

€ÿ
ÿzPyJWS._verify_signaturec                 C  s   d|v r|   |d ¡ d S d S )NÚkid)Ú_validate_kid)r"   rA   r$   r$   r%   rU   ?  s   ÿzPyJWS._validate_headersrŠ   c                 C  s   t |tƒs	tdƒ‚d S )Nz(Key ID header parameter must be a string)r-   r*   r   )r"   rŠ   r$   r$   r%   r‹   C  s   
ÿzPyJWS._validate_kid)NN)r   r   r   r   r   r   )r   r'   )r)   r*   r+   r   r   r   )r)   r*   r   r   )r   r4   )r6   r*   r   r   )r;   NNFT)r<   r=   r#   r>   r?   r@   rA   r   rB   rC   rD   rE   rF   rE   r   r*   )ri   NNN)rj   rk   r#   rl   r   r   r   r   rm   rn   r   ro   )rj   rk   r#   rl   r   r   r   r   rm   rn   r   r   )rj   rk   r   ro   )rj   rk   r   r|   )ri   N)rf   r=   rc   ro   rg   r=   r#   rl   r   r   r   r   )rA   ro   r   r   )rŠ   r   r   r   )Ú__name__Ú
__module__Ú__qualname__rT   r&   Ústaticmethodr!   r0   r3   r5   r:   rY   rx   r^   r{   rs   ru   rU   r‹   r$   r$   r$   r%   r      sD    ý



øHú0ú

+ú
r   )#Ú
__future__r   r~   rW   rp   Útypingr   r   r   r   r   r   r	   Úapi_jwkr
   Ú
exceptionsr   r   r   r   Úutilsr   r   r   r   r   r   Ú_jws_global_objrY   rx   r^   r0   r3   r:   r{   r$   r$   r$   r%   Ú<module>   s.      .
