
    2Bf                        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e      Z G d de      Zy)    N)datetime)timezone)Decimal)Real   )_CompactJSON)base64_decode)base64_encode)
want_bytes)BadData)	BadHeader)
BadPayload)BadSignature)SignatureExpired)
Serializer)HMACAlgorithm)NoneAlgorithmc                        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	Zd fd	Zd Zd ZddZd	 Zdd
ZddZddZ x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   c                     t        j                  dt        d       t        |   ||||||       || j
                  }|| _        | j                  |      | _        y )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__s	           P/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/itsdangerous/jws.pyr&   z#JSONWebSignatureSerializer.__init__,   sq     	 	
 	!/' 	 	
 !!33N,,,^<    c                    t        |      }d|vrt        d      |j                  dd      \  }}	 t        |      }	 t        |      }	 t        
|   |t              }	t        |	t              st        d	|	
      t        
|   ||      }|r||	fS |S # t        $ r}t        d|      d }~ww xY w# t        $ r}t        d|      d }~ww xY w# t        $ r}t        d|      d }~ww xY w)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_payloadr3   r-   s             r.   r6   z'JSONWebSignatureSerializer.load_payloadL   s   W%w455*1--a*@'	'7K	(9L	W)+,)OF &$'A&QQ'&|
&KF?"=  	L  	  	M  	  	G  	sF   B B3 
C 	B0B++B03	C<C		C	C,C''C,c                     t         | j                  j                  |fi | j                        }t         | j                  j                  |fi | j                        }|dz   |z   S )Nr1   )r
   r   dumpsr   )r+   r3   objr;   r<   s        r.   dump_payloadz'JSONWebSignatureSerializer.dump_payloadv   sh    &!DOO!!&CD,B,BC
 (!DOO!!#@)?)?@
 $66r/   c                 R    	 | j                   |   S # t        $ r t        d      w xY w)NzAlgorithm not supported)jws_algorithmsKeyErrorNotImplementedError)r+   r(   s     r.   r)   z)JSONWebSignatureSerializer.make_algorithm   s6    	A&&~66 	A%&?@@	As    &c                     || j                   }|dnd }|| j                  }| j                  | j                  |d||      S )Nr   .)r   sepkey_derivationr*   )r   r*   r    secret_keys)r+   r   r*   rK   s       r.   make_signerz&JSONWebSignatureSerializer.make_signer   sU    <99D#'<TI{{)  
 	
r/   c                 L    |r|j                         ni }| j                  |d<   |S )Nalg)copyr(   )r+   header_fieldsr3   s      r.   make_headerz&JSONWebSignatureSerializer.make_header   s(    )6##%B++ur/   c                     | j                  |      }| j                  || j                        }|j                  | 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.
        )rR   rM   r*   signrC   )r+   rB   r   rQ   r3   r    s         r.   rA   z JSONWebSignatureSerializer.dumps   sF    
 !!-0!!$7{{4,,VS9::r/   c                     | j                  | j                  || j                        j                  t	        |            d      \  }}|j                  d      | j                  k7  rt        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:   rO   zAlgorithm mismatch)r3   r9   )r6   rM   r*   unsignr   getr(   r   )r+   sr   r:   r9   r3   s         r.   loadsz JSONWebSignatureSerializer.loads   s~     ++T4>>299*Q-H , 

 ::e 3 330QQF?"r/   c                 2    d|i}| j                  ||||      S )Nr:   )_loads_unsafe_impl)r+   rY   r   r:   kwargss        r.   loads_unsafez'JSONWebSignatureSerializer.loads_unsafe   s#    !=1&&q$??r/   )NNNNNNNF)NN)__name__
__module____qualname____doc__r   hashlibsha256sha384sha512r   rE   r'   r   default_serializerr&   r6   rC   r)   rM   rR   rA   rZ   r^   __classcell__r-   s   @r.   r   r      s     w~~.w~~.w~~.	N  %
 =@(T7A
"
;"@r/   r   c                   J     e Zd ZdZdZd fd	Z fdZd	 fd	Zd Zd Z	 x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  c                 P    t        |   |fi | || j                  }|| _        y N)r%   r&   DEFAULT_EXPIRES_IN
expires_in)r+   r,   rp   r]   r-   s       r.   r&   z(TimedJSONWebSignatureSerializer.__init__   s-    .v.00J$r/   c                 x    t         |   |      }| j                         }|| j                  z   }||d<   ||d<   |S )Niatexp)r%   rR   nowrp   )r+   rQ   r3   rr   rs   r-   s        r.   rR   z+TimedJSONWebSignatureSerializer.make_header   sB    $]3hhjDOO#uur/   c                 6   t         |   ||d      \  }}d|vrt        d|      t        d|      }	 t	        |d         |d<   |d   dk  r||d   | j                         k  rt        d|| j                  |      	      |r||fS |S # t
        $ r |w xY w)
NTrV   rs   zMissing expiry date)r9   zExpiry date is not an IntDater   zSignature expired)r9   date_signed)	r%   rZ   r   r   int
ValueErrorrt   r   get_issue_date)r+   rY   r   r:   r9   r3   int_date_errorr-   s          r.   rZ   z%TimedJSONWebSignatureSerializer.loads   s    '-4t-D4gFF"#BGT	!u.F5M %=1  %=488:%"# //7  F?"!  	!  	!s   B Bc                     |j                  d      }t        |t        t        f      r.t	        j
                  t        |      t        j                        S y)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.
        rr   )tzN)	rX   r7   r   r   r   fromtimestamprw   r   utc)r+   r3   rvs      r.   ry   z.TimedJSONWebSignatureSerializer.get_issue_date   s@     ZZb4/*))#b'hllCC +r/   c                 <    t        t        j                               S rn   )rw   time)r+   s    r.   rt   z#TimedJSONWebSignatureSerializer.now  s    499;r/   rn   r_   )r`   ra   rb   rc   ro   r&   rR   rZ   ry   rt   ri   rj   s   @r.   rl   rl      s*    	 %8D r/   rl   )rd   r   r"   r   r   decimalr   numbersr   _jsonr   encodingr	   r
   r   excr   r   r   r   r   r   r   r    r   r   r   rl    r/   r.   <module>r      s^            # #       ! " ! !`@ `@FI &@ I r/   