o
    [h.                     @   s   d dl Z d dlZd dlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z
 dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ G dd deZG dd deZdS )    N)datetime   )number_types)_CompactJSON)json)base64_decode)base64_encode)
want_bytes)BadData)	BadHeader)
BadPayload)BadSignature)SignatureExpired)
Serializer)HMACAlgorithm)NoneAlgorithmc                   @   s   e Zd ZdZeejeejeeje	 dZ
dZeZ						dddZddd	Zd
d Zdd ZdddZdd ZdddZdddZdddZdS )JSONWebSignatureSerializerzrThis serializer implements JSON Web Signature (JWS) support. Only
    supports the JWS Compact Serialization.
    )ZHS256ZHS384HS512noner   Nc              	   C   s<   t j| ||||||d |d u r| j}|| _| || _d S )N)
secret_keysalt
serializerserializer_kwargssignersigner_kwargs)r   __init__default_algorithmalgorithm_namemake_algorithm	algorithm)selfr   r   r   r   r   r   r    r!   w/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/itsdangerous/jws.pyr   &   s   
	z#JSONWebSignatureSerializer.__init__Fc           
   
   C   s   t |}d|vrtd|dd\}}zt|}W n ty, } ztd|dd }~ww zt|}W n tyE } ztd|dd }~ww z
tj| |td}	W n t	yb } ztd|dd }~ww t
|	tsntd	|	d
tj| ||d}|r|||	fS |S )N   .zNo "." found in valuer   z:Could not base64 decode the header because of an exception)original_errorz;Could not base64 decode the payload because of an exception)r   z5Could not unserialize header because it was malformedz#Header payload is not a JSON object)header)r	   r   splitr   	Exceptionr   r   load_payloadr   r
   
isinstancedict)
r    payloadr   return_headerbase64d_headerbase64d_payloadZjson_headereZjson_payloadr%   r!   r!   r"   r(   >   sJ   
z'JSONWebSignatureSerializer.load_payloadc                 C   s@   t | jj|fi | j}t | jj|fi | j}|d | S )Nr#   )r   r   dumpsr   )r    r%   objr-   r.   r!   r!   r"   dump_payload_   s   z'JSONWebSignatureSerializer.dump_payloadc                 C   s$   z| j | W S  ty   tdw )NzAlgorithm not supported)jws_algorithmsKeyErrorNotImplementedError)r    r   r!   r!   r"   r   h   s
   z)JSONWebSignatureSerializer.make_algorithmc                 C   sB   |d u r| j }|d u rdnd }|d u r| j}| j| j|d||dS )Nr   .)r   sepkey_derivationr   )r   r   r   r   )r    r   r   r8   r!   r!   r"   make_signern   s   z&JSONWebSignatureSerializer.make_signerc                 C   s   |r|  ni }| j|d< |S )Nalg)copyr   )r    header_fieldsr%   r!   r!   r"   make_header|   s   
z&JSONWebSignatureSerializer.make_headerc                 C   s*   |  |}| || j}|| ||S )zLike :meth:`.Serializer.dumps` but creates a JSON Web
        Signature. It also allows for specifying additional fields to be
        included in the JWS header.
        )r=   r9   r   signr2   )r    r1   r   r<   r%   r   r!   r!   r"   r0      s   
z JSONWebSignatureSerializer.dumpsc                 C   sT   | j | || jt|dd\}}|d| jkr"td||d|r(||fS |S )z{Reverse of :meth:`dumps`. If requested via ``return_header``
        it will return a tuple of payload and header.
        Tr,   r:   zAlgorithm mismatch)r%   r+   )r(   r9   r   Zunsignr	   getr   r   )r    sr   r,   r+   r%   r!   r!   r"   loads   s   
z JSONWebSignatureSerializer.loadsc                 C   s   d|i}|  ||||S )Nr,   )Z_loads_unsafe_impl)r    rA   r   r,   kwargsr!   r!   r"   loads_unsafe   s   z'JSONWebSignatureSerializer.loads_unsafe)NNNNNNNF)NN)__name__
__module____qualname____doc__r   hashlibsha256sha384sha512r   r3   r   r   Zdefault_serializerr   r(   r2   r   r9   r=   r0   rB   rD   r!   r!   r!   r"   r      s0    

!	


	r   c                   @   s@   e Zd ZdZdZdddZdd Zdd	d
Zdd Zdd Z	dS )TimedJSONWebSignatureSerializera  Works like the regular :class:`JSONWebSignatureSerializer` but
    also records the time of the signing and can be used to expire
    signatures.

    JWS currently does not specify this behavior but it mentions a
    possible extension like this in the spec. Expiry date is encoded
    into the header similar to what's specified in `draft-ietf-oauth
    -json-web-token <http://self-issued.info/docs/draft-ietf-oauth-json
    -web-token.html#expDef>`_.
    i  Nc                 K   s,   t j| |fi | |d u r| j}|| _d S N)r   r   DEFAULT_EXPIRES_IN
expires_in)r    r   rQ   rC   r!   r!   r"   r      s   
z(TimedJSONWebSignatureSerializer.__init__c                 C   s2   t | |}|  }|| j }||d< ||d< |S )Niatexp)r   r=   nowrQ   )r    r<   r%   rR   rS   r!   r!   r"   r=      s   
z+TimedJSONWebSignatureSerializer.make_headerFc                 C   s   t j| ||dd\}}d|vrtd|dtd|d}z
t|d |d< W n	 ty.   |w |d dk r7||d |  k rItd|| |d	|rO||fS |S )
NTr?   rS   zMissing expiry date)r+   zExpiry date is not an IntDater   zSignature expired)r+   Zdate_signed)	r   rB   r   r   int
ValueErrorrT   r   get_issue_date)r    rA   r   r,   r+   r%   Zint_date_errorr!   r!   r"   rB      s,   
z%TimedJSONWebSignatureSerializer.loadsc                 C   s&   | d}t|trtt|S d S )NrR   )r@   r)   r   r   utcfromtimestamprU   )r    r%   rvr!   r!   r"   rW      s   

z.TimedJSONWebSignatureSerializer.get_issue_datec                 C   s   t t S rO   )rU   time)r    r!   r!   r"   rT      s   z#TimedJSONWebSignatureSerializer.nowrO   rE   )
rF   rG   rH   rI   rP   r   r=   rB   rW   rT   r!   r!   r!   r"   rN      s    

rN   )rJ   rZ   r   Z_compatr   _jsonr   r   encodingr   r   r	   excr
   r   r   r   r   r   r   r   r   r   r   rN   r!   r!   r!   r"   <module>   s(     	