U
    ù¹cŸ  ã                   @   sæ   d dl Z d dlZd dlZz d dlmZmZmZmZmZ W n e	k
rL   Y nX 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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)ÚCallableÚDictÚListÚOptionalÚUnioné   )Ú	AlgorithmÚget_default_algorithmsÚ
has_cryptoÚrequires_cryptography)ÚMappingÚ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 )"ÚPyJWSZJWTNc                 C   sf   t ƒ | _|d k	rt|ƒnt| jƒ| _t| j ¡ ƒD ]}|| jkr2| j|= q2|sRi }t|  ¡ |ƒ| _d S )N)	r	   Ú_algorithmsÚsetÚ_valid_algsÚlistÚkeysr   Ú_get_default_optionsÚoptions)ÚselfÚ
algorithmsr   Úkey© r#   ú//tmp/pip-unpacked-wheel-eh6jf6x0/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 k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 k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_algorithmsF   s    zPyJWS.get_algorithmsÚHS256c                 C   sì   g }|d krd}|| j kr| j|dœ}|r>|  |¡ | |¡ ttj|d|d�ƒ}| t|ƒ¡ | t|ƒ¡ d 	|¡}	z$| j
| }
|
 |¡}|
 |	|¡}W n6 tk
rÒ   tsÆ|tkrÆtd| ƒ‚ntdƒ‚Y nX | 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ÚheadersZjson_encoderÚsegmentsÚheaderZjson_headerÚsigning_inputr,   Ú	signaturer#   r#   r$   ÚencodeL   s@    


ýÿ


ÿÿzPyJWS.encodeÚ Tc                 K   sl   t | j|ƒ}|d }|r(|s(t dt¡ |  |¡\}	}
}}|sPtjdtdd� n|rh|  |	|
||||¡ |	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   ÚkwargsZmerged_optionsr&   rF   rK   rJ   rL   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
        rO   )rT   r=   )r    rV   rH   r#   r#   r$   Úget_unverified_header    s    
zPyJWS.get_unverified_headerc              
   C   sh  t |tƒr| d¡}tt|ƒtƒs0td t¡ƒ‚z$| dd¡\}}| 	dd¡\}}W n t
k
rp   tdƒ‚Y nX zt|ƒ}W n" ttjfk
r    tdƒ‚Y nX zt | d¡¡}W n. t
k
rä } ztd| ƒ‚W 5 d }~X Y nX t |tƒsøtdƒ‚zt|ƒ}	W n$ ttjfk
�r(   td	ƒ‚Y nX zt|ƒ}
W n$ ttjfk
�rZ   td
ƒ‚Y nX |	|||
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   rM   Ú
issubclassÚtyper   r   ÚformatÚrsplitÚsplitr'   r   r)   ÚbinasciiÚErrorr?   ÚloadsrY   r   )r    rV   rK   Zcrypto_segmentZheader_segmentZpayload_segmentZheader_datarJ   ÚerF   rL   r#   r#   r$   rT   «   s<    

ÿ
zPyJWS._loadc           	      C   sr   |  d¡}|d k	r"||kr"tdƒ‚z.| j| }| |¡}| |||¡sNtdƒ‚W n tk
rl   tdƒ‚Y nX d S )Nr5   z&The specified alg value is not allowedzSignature verification failedr;   )Úgetr   r   rC   rW   r   r.   )	r    rF   rK   rJ   rL   r"   r!   r5   r,   r#   r#   r$   rU   Ò   s    


zPyJWS._verify_signaturec                 C   s   d|kr|   |d ¡ d S )NÚkid)Ú_validate_kid)r    rH   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    re   r#   r#   r$   rf   è   s    
zPyJWS._validate_kid)NN)r2   NN)rN   TNN)rN   N)Ú__name__Ú
__module__Ú__qualname__r<   r%   Ústaticmethodr   r-   r0   r1   rM   rY   rZ   rT   rU   r=   rf   r#   r#   r#   r$   r      s.   

	   û
7    û
(   ÿ
r   )&r`   r?   rQ   Útypingr   r   r   r   r   ÚImportErrorr!   r   r	   r
   r   Úcompatr   r   r   r   Ú
exceptionsr   r   r   r   Úutilsr   r   r   r   Úobjectr   Z_jws_global_objrM   rY   r-   r0   rZ   r#   r#   r#   r$   Ú<module>   s$     Y