
    `                        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dS )    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   Nc                     t          j        dt          d           t                                          ||||||           || 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__s	           0lib/python3.11/site-packages/itsdangerous/jws.pyr&   z#JSONWebSignatureSerializer.__init__,   s     	 	
 	
 	
 	
 	!/' 	 	
 	
 	
 !!3N,,,^<<    Fc                    t          |          }d|vrt          d          |                    dd          \  }}	 t          |          }n## t          $ r}t          d|          d }~ww xY w	 t          |          }n## t          $ r}t          d|          d }~ww xY w	 t                                          |t                    }	n## t          $ r}t          d|          d }~ww xY wt          |	t                    st          d	|	
          t                                          ||          }|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_payloadr3   r-   s             r.   r6   z'JSONWebSignatureSerializer.load_payloadL   s   W%%w4555*1--a*@*@'	'77KK 	 	 	L    		(99LL 	 	 	M    		WW))+,)OOFF 	 	 	G    	 &$'' 	RA&QQQQ''&&|
&KK 	#F?"sG   A 
A.A))A.2B 
B"BB"&(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   sn    &!DO!&CCD,BCC
 
 (!DO!#@@)?@@
 
 $66r/   c                 X    	 | 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   sD    	A&~66 	A 	A 	A%&?@@@	As    )c                 p    || j         }|dnd }|| 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    <9D#'<TI{{)  
 
 	
r/   c                 J    |r|                                 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                  }|                    |                     ||                    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   sP    
 !!-00!!$77{{4,,VS99:::r/   c                    |                      |                     || j                                      t	          |                    d          \  }}|                    d          | j        k    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299*Q--HH , 
 

 ::e 3330QQQQ 	#F?"r/   c                 :    d|i}|                      ||||          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      sU         w~..w~..w~..	 N  %
 = = = = = =@( ( ( ( ( (T7 7 7A A 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  Nc                 \     t                      j        |fi | || j        }|| _        d S N)r%   r&   DEFAULT_EXPIRES_IN
expires_in)r+   r,   rp   r]   r-   s       r.   r&   z(TimedJSONWebSignatureSerializer.__init__   s;    ..v...0J$r/   c                     t                                          |          }|                                 }|| j        z   }||d<   ||d<   |S )Niatexp)r%   rR   nowrp   )r+   rQ   r3   rr   rs   r-   s        r.   rR   z+TimedJSONWebSignatureSerializer.make_header   sJ    $$]33hhjjDO#uur/   Fc                    t                                          ||d          \  }}d|vrt          d|          t          d|          }	 t	          |d                   |d<   n# t
          $ r |w xY w|d         dk     r||d         |                                 k     r%t          d||                     |          	          |r||fS |S )
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D4gFFFF"#BGTTT	!u..F5MM 	! 	! 	!  	! %=1  %=488::%%"# //77     	#F?"s   A) )A6c                     |                     d          }t          |t          t          f          r-t	          j        t          |          t          j                  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.
        rr   )tzN)	rX   r7   r   r   r   fromtimestamprw   r   utc)r+   r3   rvs      r.   ry   z.TimedJSONWebSignatureSerializer.get_issue_date   sV     ZZb4/** 	D)#b''hlCCCC	D 	Dr/   c                 B    t          t          j                              S rn   )rw   time)r+   s    r.   rt   z#TimedJSONWebSignatureSerializer.now  s    49;;r/   rn   r_   )r`   ra   rb   rc   ro   r&   rR   rZ   ry   rt   ri   rj   s   @r.   rl   rl      s        	 	 % % % % % %         8D D 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  I  I  I &@ I  I  I  I  I r/   