o
    i.                     @   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.
    )HS256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#   K/var/www/edux/Edux_v2/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_payloadjson_headere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/   r0   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!   r<   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.
        )rA   r=   r!   signr6   )r"   r5   r   r@   r'   r   r#   r#   r$   r4      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*   r=   r!   unsignr	   getr   r   )r"   sr   r.   r-   r'   r#   r#   r$   loads   s   
z JSONWebSignatureSerializer.loadsc                 C   s   d|i}|  ||||S )Nr.   )_loads_unsafe_impl)r"   rF   r   r.   kwargsr#   r#   r$   loads_unsafe   s   z'JSONWebSignatureSerializer.loads_unsafe)NNNNNNNF)NN)__name__
__module____qualname____doc__r   hashlibsha256sha384sha512r   r7   r   r   default_serializerr   r*   r6   r    r=   rA   r4   rG   rJ   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   rX   rI   r#   r#   r$   r      s   
z(TimedJSONWebSignatureSerializer.__init__c                 C   s2   t | |}|  }|| j }||d< ||d< |S )Niatexp)r   rA   nowrX   )r"   r@   r'   rY   rZ   r#   r#   r$   rA      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 )
NTrC   rZ   zMissing expiry date)r-   zExpiry date is not an IntDater   zSignature expired)r-   date_signed)	r   rG   r   r   int
ValueErrorr[   r   get_issue_date)r"   rF   r   r.   r-   r'   int_date_errorr#   r#   r$   rG      s,   
z%TimedJSONWebSignatureSerializer.loadsc                 C   s&   | d}t|trtt|S d S )NrY   )rE   r+   r   r   utcfromtimestampr]   )r"   r'   rvr#   r#   r$   r_      s   

z.TimedJSONWebSignatureSerializer.get_issue_datec                 C   s   t t S rV   )r]   time)r"   r#   r#   r$   r[      s   z#TimedJSONWebSignatureSerializer.nowrV   rK   )
rL   rM   rN   rO   rW   r   rA   rG   r_   r[   r#   r#   r#   r$   rU      s    

rU   )rP   rc   r   _compatr   _jsonr   r   encodingr   r   r	   excr
   r   r   r   r   r   r   r   r   r   r   rU   r#   r#   r#   r$   <module>   s(     	