o
    2c                     @   s   d dl Z 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 ddlmZ G dd deZG dd deZdS )    N)datetime)timezone)Decimal)Real   )_CompactJSON)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 fdd	Zd f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  ZS )JSONWebSignatureSerializerzThis serializer implements JSON Web Signature (JWS) support. Only
    supports the JWS Compact Serialization.

    .. deprecated:: 2.0
        Will be removed in ItsDangerous 2.1. Use a dedicated library
        such as authlib.
    )HS256HS384HS512noner   Nc                    sL   t jdtdd t j||||||d |d u r| j}|| _| || _d S )NzsJWS support is deprecated and will be removed in ItsDangerous 2.1. Use a dedicated JWS/JWT library such as authlib.   )
stacklevel)salt
serializerserializer_kwargssignersigner_kwargs)	warningswarnDeprecationWarningsuper__init__default_algorithmalgorithm_namemake_algorithm	algorithm)self
secret_keyr   r   r   r   r   r%   	__class__ F/var/www/html/gps/gps/lib/python3.10/site-packages/itsdangerous/jws.pyr#   ,   s"   
	z#JSONWebSignatureSerializer.__init__Fc           
   
      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_payloadr0   r*   r,   r-   r3   L   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(   r0   objr8   r9   r,   r,   r-   dump_payloadv   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&      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   secret_keys)r(   r   r'   rE   r,   r,   r-   make_signer   s   z&JSONWebSignatureSerializer.make_signerc                 C   s   |r|  ni }| j|d< |S )Nalg)copyr%   )r(   header_fieldsr0   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.
        )rK   rG   r'   signr?   )r(   r>   r   rJ   r0   r   r,   r,   r-   r=      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r7   rH   zAlgorithm mismatch)r0   r6   )r3   rG   r'   unsignr
   getr%   r   )r(   sr   r7   r6   r0   r,   r,   r-   loads   s   
z JSONWebSignatureSerializer.loadsc                 C   s   d|i}|  ||||S )Nr7   )_loads_unsafe_impl)r(   rP   r   r7   kwargsr,   r,   r-   loads_unsafe   s   z'JSONWebSignatureSerializer.loads_unsafe)NNNNNNNF)NN)__name__
__module____qualname____doc__r   hashlibsha256sha384sha512r   r@   r$   r   default_serializerr#   r3   r?   r&   rG   rK   r=   rQ   rT   __classcell__r,   r,   r*   r-   r      s0    	 *	


	r   c                       sP   e Zd ZdZdZd fdd	Z fddZd fd	d
	Zdd Zdd Z	  Z
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                    s,   t  j|fi | |d u r| j}|| _d S N)r"   r#   DEFAULT_EXPIRES_IN
expires_in)r(   r)   rc   rS   r*   r,   r-   r#      s   
z(TimedJSONWebSignatureSerializer.__init__c                    s2   t  |}|  }|| j }||d< ||d< |S )Niatexp)r"   rK   nowrc   )r(   rJ   r0   rd   re   r*   r,   r-   rK      s   
z+TimedJSONWebSignatureSerializer.make_headerFc                    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 )
NTrM   re   zMissing expiry date)r6   zExpiry date is not an IntDater   zSignature expired)r6   date_signed)	r"   rQ   r   r   int
ValueErrorrf   r   get_issue_date)r(   rP   r   r7   r6   r0   int_date_errorr*   r,   r-   rQ      s(   z%TimedJSONWebSignatureSerializer.loadsc                 C   s0   | d}t|ttfrtjt|tjdS dS )aR  If the header contains the ``iat`` field, return the date the
        signature was issued, as a timezone-aware
        :class:`datetime.datetime` in UTC.

        .. versionchanged:: 2.0
            The timestamp is returned as a timezone-aware ``datetime``
            in UTC rather than a naive ``datetime`` assumed to be UTC.
        rd   )tzN)	rO   r4   r   r   r   fromtimestamprh   r   utc)r(   r0   rvr,   r,   r-   rj      s   
	z.TimedJSONWebSignatureSerializer.get_issue_datec                 C   s   t t S ra   )rh   time)r(   r,   r,   r-   rf     s   z#TimedJSONWebSignatureSerializer.nowra   rU   )rV   rW   rX   rY   rb   r#   rK   rQ   rj   rf   r_   r,   r,   r*   r-   r`      s    r`   )rZ   rp   r   r   r   decimalr   numbersr   _jsonr   encodingr   r	   r
   excr   r   r   r   r   r   r   r   r   r   r   r`   r,   r,   r,   r-   <module>   s,     $