o
    sh-                     @  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 dd	lmZmZ dd
lmZ erVd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)Sequence)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		dGdHd	d
ZedIddZdJddZdKddZdLddZ	dMddZ
					dNdOd*d+Z	,			dPdQd3d4Z	,			dPdRd6d7ZdSd8d9ZdTd;d<Z	,	dUdVd@dAZdWdBdCZdXdEdFZdS )YPyJWSJWTN
algorithmsSequence[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%   _/var/www/html/construction_image-detection-poc/venv/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"   3   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_algorithm7   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_algorithmD   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_algorithmsR   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   r2   r	   r
   NotImplementedError)r#   r7   er%   r%   r&   get_algorithm_by_nameX   s   

zPyJWS.get_algorithm_by_nameFTpayloadbytesr$   (AllowedPrivateKeys | PyJWK | str | bytes	algorithm
str | Noneheadersjson_encodertype[json.JSONEncoder] | Noneis_payload_detachedboolsort_headersc                 C  sN  g }|d u rt |tr|j}	nd}	n|}	|r,|d}
|
r!|d }	|d}|du r,d}| j|	d}|r>| | || |d sE|d= |rLd|d< nd|v rS|d= tj|d||d		 }|
t| |rj|}nt|}|
| d
|}| |	}t |tr|j}||}|||}|
t| |rd|d< d
|}|dS )NHS256algb64FT)typrH   rJ   ),:)
separatorscls	sort_keys   .    r   utf-8)r.   r   algorithm_nameget
header_typ_validate_headersupdatejsondumpsencodeappendr   joinr;   r$   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&   rZ   i   sX   













zPyJWS.encode jwtstr | bytes'AllowedPublicKeys | PyJWK | str | bytesdetached_payloadbytes | Nonedict[str, Any]c                 K  s   |rt jdt|  tdd |d u ri }i | j|}|d }|r/|s/t|ts/td| 	|\}	}
}}|
dddu rW|d u rHtd	|}	d
|
d
dd |	g}
|rb| |
|||| |	||dS )Nzypassing additional kwargs to decode_complete() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs:    
stacklevelr)   z\It is required that you pass in a value for the "algorithms" argument when calling decode().rI   TFzIt 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<   rd   rh   )warningswarntupler!   r   r   r.   r   r   _loadrT   r\   rsplit_verify_signature)r#   rk   r$   r   r   rn   kwargsmerged_optionsr)   r<   rg   rd   rh   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: rq   rr   )rn   r<   )rt   ru   rv   r!   r   r|   )r#   rk   r$   r   r   rn   rz   decodedr%   r%   r&   r_      s   	

zPyJWS.decodec                 C  s   |  |d }| | |S )zReturns 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
        rq   )rw   rV   )r#   rk   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+   rZ   r=   r   rx   splitr-   r   r/   binasciiErrorrX   loadsdict)r#   rk   rg   crypto_segmentheader_segmentpayload_segmenterrheader_datard   r:   r<   rh   r%   r%   r&   rw     sL   







zPyJWS._loadrg   rd   rh   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 |	|}|
|||sctdd S )NrH   zAlgorithm not specifiedz&The specified alg value is not allowedr8   zSignature verification failed)r.   r   rS   r2   r   r   r$   r;   r9   r]   verifyr   )
r#   rg   rd   rh   r$   r   rH   r,   prepared_keyr:   r%   r%   r&   ry   +  s,   



zPyJWS._verify_signaturec                 C  s   d|v r|  |d  d S d S )Nkid)_validate_kid)r#   rA   r%   r%   r&   rV   J  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   N  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   r5   )r7   r+   r   r   )NNNFT)r<   r=   r$   r>   r?   r@   rA   r   rB   rC   rD   rE   rF   rE   r   r+   )rj   NNN)rk   rl   r$   rm   r   r   r   r   rn   ro   r   rp   )rk   rl   r$   rm   r   r   r   r   rn   ro   r   r   )rk   rl   r   rp   )rk   rl   r   r   )rj   N)rg   r=   rd   rp   rh   r=   r$   rm   r   r   r   r   )rA   rp   r   r   )r   r   r   r   )__name__
__module____qualname__rU   r'   staticmethodr"   r1   r4   r6   r;   rZ   r|   r_   r~   rw   ry   rV   r   r%   r%   r%   r&   r      sD    



P1

+
r   )%
__future__r   r   rX   rt   collections.abcr   typingr   r   r   r   r   r	   r
   api_jwkr   
exceptionsr   r   r   r   utilsr   r   r   r   r   r   _jws_global_objrZ   r|   r_   r1   r4   r;   r~   r%   r%   r%   r&   <module>   s0      8
