
_P_U                 @   s   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	 d d l
 m Z m Z d d l m Z m Z m Z Gd d	   d	 e  Z e   Z e j Z e j Z e j Z e j Z e j Z d S)
    N)Mapping   )	Algorithmget_default_algorithms)	text_type)DecodeErrorInvalidAlgorithmError)base64url_decodebase64url_encode
merge_dictc               @   s   e  Z d  Z d Z d d d d  Z e d d    Z d d   Z d	 d
   Z d d   Z	 d d d d d  Z
 d d d d d d  Z d d   Z d d   Z d d d d  Z d S)PyJWSZJWTNc             C   s   t    |  _ | d  k	 r$ t |  n t |  j  |  _ x6 t |  j j    D] } | |  j k rL |  j | =qL W| s{ i  } t |  j   |  |  _ d  S)N)	r   _algorithmsset_valid_algslistkeysr   _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   sW   | |  j  k r t d   t | t  s6 t d   | |  j  | <|  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   s9   | |  j  k r t d   |  j  | =|  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_algorithm2   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_algorithms>   s    zPyJWS.get_algorithmsZHS256c             C   s  g  } | d  k r d } | |  j  k r' d |  j d | i } | rO | j |  t j | d d d | j d  } | j t |   | j t |   d	 j |  }	 y2 |  j	 | }
 |
 j
 |  } |
 j |	 |  } Wn t k
 r t d
   Yn X| j t |   d	 j |  S)NZnonetypalgZ
separators,:clszutf-8   .zAlgorithm not supported)r(   r)   )r   
header_typupdatejsondumpsencodeappendr
   joinr   prepare_keyZsignr"   NotImplementedError)r   payloadr   	algorithmZheadersZjson_encoderZsegmentsheaderZjson_headersigning_inputr    	signaturer   r   r   r0   D   s.    		zPyJWS.encode Tc             K   su   |  j  |  \ } } }	 }
 | ra t |  j |  } | j d  rq |  j | | |	 |
 | |  n t j d t  | S)Nr   z?The verify parameter is deprecated. Please use options instead.)_loadr   r   get_verify_signaturewarningswarnDeprecationWarning)r   Zjwsr   verifyr   r   kwargsr5   r8   r7   r9   Zmerged_optionsr   r   r   decodek   s    	zPyJWS.decodec             C   s   |  j  |  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
           )r;   )r   jwtr   r   r   get_unverified_headerz   s    zPyJWS.get_unverified_headerc          2   C   s  t  | t  r | j d  } y4 | j d d  \ } } | j d d  \ } } Wn t k
 rr t d   Yn Xy t |  } Wn' t t	 j
 f k
 r t d   Yn Xy t j | j d   } Wn5 t k
 r } z t d |   WYd  d  } ~ Xn Xt  | t  st d   y t |  }	 Wn' t t	 j
 f k
 rUt d   Yn Xy t |  }
 Wn' t t	 j
 f k
 rt d	   Yn X|	 | | |
 f S)
Nzutf-8r+   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   r0   rsplitsplitr   r   r	   r   binasciiErrorr.   loadsrC   r   )r   rE   r8   Zcrypto_segmentZheader_segmentZpayload_segmentZheader_datar7   er5   r9   r   r   r   r;      s4    #zPyJWS._loadc       	      C   s   | d } | d  k	 r. | | k r. t  d   yA |  j | } | j |  } | j | | |  sn t d   Wn t k
 r t  d   Yn Xd  S)Nr'   z&The specified alg value is not allowedzSignature verification failedzAlgorithm not supported)r   r   r3   rA   r   r"   )	r   r5   r8   r7   r9   r   r   r'   r    r   r   r   r=      s    
zPyJWS._verify_signature)__name__
__module____qualname__r,   r   staticmethodr   r!   r$   r%   r0   rC   rF   r;   r=   r   r   r   r   r      s   &$r   )rI   r.   r>   collectionsr   r   r   r   compatr   
exceptionsr   r   Zutilsr	   r
   r   objectr   Z_jws_global_objr0   rC   r!   r$   rF   r   r   r   r   <module>   s   					