o
    ¤ó·i¨7  ã                   @  s  d dl mZ d dlZd dlZd dlZd dlm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mZ dd	lmZmZ dd
lmZmZ er`ddl
mZmZ ddlmZ e ƒ 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)ÚSequence)ÚTYPE_CHECKINGÚAnyé   )Ú	AlgorithmÚget_default_algorithmsÚ
has_cryptoÚrequires_cryptography)ÚPyJWK)ÚDecodeErrorÚInvalidAlgorithmErrorÚInvalidKeyErrorÚInvalidSignatureErrorÚInvalidTokenError)Úbase64url_decodeÚbase64url_encode)ÚInsecureKeyLengthWarningÚRemovedInPyjwt3Warning)ÚAllowedPrivateKeysÚAllowedPublicKeys)Ú
SigOptionsc                   @  sì   e Zd ZU dZ		dPdQd	d
„ZedRdd„ƒZdSdd„ZdTdd„ZdUdd„Z	dVdd„Z
eddddfdWd+d,„Z	-			dXdYd5d6„Z	-			dXdZd8d9„Zd[d:d;„Zd\d=d>„Z	-	d]d^dBdC„ZdDhZdEedF< ddGœd_dIdJ„Zd`dLdM„ZdadNdO„ZdS )bÚPyJWSZJWTNÚ
algorithmsúSequence[str] | NoneÚoptionsúSigOptions | NoneÚreturnÚNonec                 C  st   t ƒ | _|d urt|ƒnt| jƒ| _t| j ¡ ƒD ]}|| jvr$| j|= q|  ¡ | _|d ur8i | j¥|¥| _d S d S )N)r   Ú_algorithmsÚsetÚ_valid_algsÚlistÚkeysÚ_get_default_optionsr   )Úselfr   r   Úkey© r'   úQC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\jwt/api_jws.pyÚ__init__$   s   ÿ
€
ÿzPyJWS.__init__r   c                   C  s
   dddœS )NTF)Úverify_signatureÚenforce_minimum_key_lengthr'   r'   r'   r'   r(   r$   7   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 )zÙ
        Registers a new Algorithm for use when creating and verifying tokens.

        :param str alg_id: the ID of the Algorithm
        :param alg_obj: the Algorithm object
        :type alg_obj: Algorithm
        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_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
        :param str alg_id: the ID of the Algorithm
        :raises 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_algorithmL   s   
ÿzPyJWS.unregister_algorithmú	list[str]c                 C  s
   t | jƒS )zh
        Returns a list of supported values for the `alg` parameter.

        :rtype: list[str]
        N)r"   r!   )r%   r'   r'   r(   Úget_algorithms[   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 )a/  
        For a given string name, return the matching Algorithm object.

        Example usage:
        >>> jws_obj = PyJWS()
        >>> jws_obj.get_algorithm_by_name("RS256")

        :param alg_name: The name of the algorithm to retrieve
        :type alg_name: str
        :rtype: Algorithm
        zAlgorithm 'z9' could not be found. Do you have cryptography installed?úAlgorithm not supportedN)r   r4   r	   r
   ÚNotImplementedError)r%   r9   Úer'   r'   r(   Úget_algorithm_by_namec   s   
ÿþ
€ûzPyJWS.get_algorithm_by_nameFTÚpayloadÚbytesr&   ú(AllowedPrivateKeys | PyJWK | str | bytesÚ	algorithmú
str | NoneÚheadersúdict[str, Any] | NoneÚjson_encoderútype[json.JSONEncoder] | NoneÚis_payload_detachedÚboolÚsort_headersc                 C  s¦  g }|t u rt|tƒr|j}	nd}	n|d u r"t|tƒr|j}	nd}	n|}	|r<| d¡}
|
r1|d }	| d¡}|du r<d}| j|	dœ}|rP| j|dd� | |¡ |d	 sW|d	= |r^d|d< nd|v re|d= tj	|d
||d� 
¡ }| t|ƒ¡ |r||}nt|ƒ}| |¡ d |¡}|  |	¡}t|tƒr—|j}| |¡}| |¡}|r¶| j dd¡r®t|ƒ‚tj|tdd� | ||¡}| t|ƒ¡ |rÉd|d< d |¡}| d¡S )NZHS256ÚnoneÚalgÚb64FT)ÚtyprK   ©ÚencodingrM   )ú,ú:)Ú
separatorsÚclsÚ	sort_keysó   .r+   é   ©Ú
stackleveló    r   úutf-8)Ú_ALGORITHM_UNSETr0   r   Úalgorithm_nameÚgetÚ
header_typÚ_validate_headersÚupdateÚjsonÚdumpsÚencodeÚappendr   Újoinr=   r&   Úprepare_keyÚcheck_key_lengthr   r   ÚwarningsÚwarnr   ÚsignÚdecode)r%   r>   r&   rA   rC   rE   rG   rI   ÚsegmentsZ
algorithm_Zheaders_algZheaders_b64ÚheaderZjson_headerZmsg_payloadÚsigning_inputr.   Úkey_length_msgÚ	signatureÚencoded_stringr'   r'   r(   rc   x   sj   






ÿþ







zPyJWS.encodeÚ Újwtústr | bytesú'AllowedPublicKeys | PyJWK | str | bytesÚdetached_payloadúbytes | NoneÚkwargsúdict[str, Any]c                 K  sÞ   |rt jdt| ¡ ƒ› �tdd� |d u r| j}ni | j¥|¥}|d }|r1|s1t|tƒs1tdƒ‚|  	|¡\}	}
}}|  
|¡ | dd¡du r^|d u rOtd	ƒ‚|}	d
 |
 d
d¡d |	g¡}
|ri|  |
||||¡ |	||dœS )Nzypassing additional kwargs to decode_complete() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs: rV   rW   r*   z\It is required that you pass in a value for the "algorithms" argument when calling decode().rL   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.rU   r   r   )r>   rm   rp   )rh   ri   Útupler#   r   r   r0   r   r   Ú_loadr_   r]   re   ÚrsplitÚ_verify_signature)r%   rs   r&   r   r   rv   rx   Zmerged_optionsr*   r>   rn   rm   rp   r'   r'   r(   Údecode_completeÒ   s>   	
þûÿ
ÿýzPyJWS.decode_completer   c                 K  s>   |rt jdt| ¡ ƒ› �tdd� | j|||||d�}|d S )Nzppassing additional kwargs to decode() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs: rV   rW   )rv   r>   )rh   ri   rz   r#   r   r~   )r%   rs   r&   r   r   rv   rx   Ú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
        rV   N)r{   r_   )r%   rs   rC   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 )NrZ   z$Invalid token type. Token must be a rU   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)r0   r-   rc   r?   r   r|   Úsplitr/   r   r1   ÚbinasciiÚErrorra   ÚloadsÚdict)r%   rs   rn   Zcrypto_segmentZheader_segmentZpayload_segmentÚerrZheader_datarm   r<   r>   rp   r'   r'   r(   r{   &  sL   



€ÿ
€ÿ€ÿ

€ÿ
€ÿzPyJWS._loadrn   rm   rp   c              
   C  sþ   |d u rt |tƒr|jg}z|d }W n ty   tdƒd ‚w |r*|d ur.||vr.tdƒ‚t |tƒr:|j}|j}nz|  |¡}W n tyR }	 ztdƒ|	‚d }	~	ww | 	|¡}| 
|¡}
|
rr| j dd¡rjt|
ƒ‚tj|
tdd� | |||¡s}td	ƒ‚d S )
NrK   zAlgorithm not specifiedz&The specified alg value is not allowedr:   r+   Fé   rW   zSignature verification failed)r0   r   r\   r4   r   r   r&   r=   r;   rf   rg   r   r]   r   rh   ri   r   Úverifyr   )r%   rn   rm   rp   r&   r   rK   r.   Zprepared_keyr<   ro   r'   r'   r(   r}   L  s6   
ÿ

€ÿ

ÿzPyJWS._verify_signaturerL   zset[str]Ú_supported_critrN   rO   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%   rC   rO   r'   r'   r(   r_   u  s
   ÿzPyJWS._validate_headersr‹   c                 C  s   t |tƒs	tdƒ‚d S )Nz(Key ID header parameter must be a string)r0   r-   r   )r%   r‹   r'   r'   r(   r�   }  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 )NrŒ   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)r0   r"   Úlenr   r-   rŠ   )r%   rC   rŒ   Úextr'   r'   r(   rŽ   �  s   


ÿÿûzPyJWS._validate_crit)NN)r   r   r   r   r   r   )r   r   )r,   r-   r.   r   r   r   )r,   r-   r   r   )r   r7   )r9   r-   r   r   )r>   r?   r&   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rH   r   r-   )rr   NNN)rs   rt   r&   ru   r   r   r   r   rv   rw   rx   ry   r   ry   )rs   rt   r&   ru   r   r   r   r   rv   rw   rx   ry   r   r   )rs   rt   r   ry   )rs   rt   r   r�   )rr   N)rn   r?   rm   ry   rp   r?   r&   ru   r   r   r   r   )rC   ry   rO   rH   r   r   )r‹   r   r   r   )rC   ry   r   r   )Ú__name__Ú
__module__Ú__qualname__r^   r)   Ústaticmethodr$   r3   r6   r8   r=   r[   rc   r~   rk   r€   r{   r}   rŠ   Ú__annotations__r_   r�   rŽ   r'   r'   r'   r(   r   !   sJ   
 ý



ø]ú6ú

+ú'ÿ
r   )+Ú
__future__r   rƒ   ra   rh   Úcollections.abcr   Útypingr   r   r   r   r   r	   r
   Zapi_jwkr   Ú
exceptionsr   r   r   r   r   Úutilsr   r   r   r   r   r   Útypesr   Úobjectr[   r   Z_jws_global_objrc   r~   rk   r3   r6   r=   r€   r'   r'   r'   r(   Ú<module>   s4      q
