ÿØÿà JFIF      ÿÛ C      

!"$"$ÿÛ C  ÿÂ p " ÿÄ              ÿÄ             ÿÚ    ÕÔË®
(%	aA*‚XYD¡(J„¡E¢RE,P€XYae )(E¤²€B¤R¥	BQ¤¢ X«)X…€¤   @  

  ..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     ÿØÿà JFIF      ÿÛ C      

!"$"$ÿÛ C  ÿÂ p " ÿÄ              ÿÄ             ÿÚ    ÕÔË®
(%	aA*‚XYD¡(J„¡E¢RE,P€XYae )(E¤²€B¤R¥	BQ¤¢ X«)X…€¤   @  

  ..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     o
    li#                     @   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 )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
           )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"      
