
    wdf.                        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e          Z G 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                       e Zd ZdZ eej                   eej                   eej                   e	            dZ
dZeZ	 	 	 	 	 	 ddZddZd Zd	 Zdd
Zd ZddZddZddZdS )JSONWebSignatureSerializerzrThis serializer implements JSON Web Signature (JWS) support. Only
    supports the JWS Compact Serialization.
    )HS256HS384HS512noner   Nc           	          t          j        | ||||||           || 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"   s           U/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/itsdangerous/jws.pyr    z#JSONWebSignatureSerializer.__init__&   sd     	!!/'	
 	
 	
 	
 !!3N,,,^<<    Fc                 T   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          j        | |t                    }	n## t          $ r}t          d|          d }~ww xY wt          |	t                    st          d	|	
          t          j        | ||          }|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+   s
             r&   r.   z'JSONWebSignatureSerializer.load_payload>   s   W%%w4555*1--a*@*@'	'77KK 	 	 	L    	
	(99LL 	 	 	M    	
	,T;4PPPFF 	 	 	G    	
 &$'' 	RA&QQQQ)$TTT 	#F?"sG   A 
A-A((A-1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 )Nr)   )r	   r   dumpsr   )r%   r+   objr3   r4   s        r&   dump_payloadz'JSONWebSignatureSerializer.dump_payload_   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_algorithmh   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   r   )r%   r   r$   rC   s       r&   make_signerz&JSONWebSignatureSerializer.make_signern   sT    <9D#'<TI{{O)  
 
 	
r'   c                 J    |r|                                 ni }| j        |d<   |S )Nalg)copyr"   )r%   header_fieldsr+   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.
        )rI   rD   r$   signr;   )r%   r:   r   rH   r+   r   s         r&   r9   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r2   rF   zAlgorithm mismatch)r+   r1   )r.   rD   r$   unsignr
   getr"   r   )r%   sr   r2   r1   r+   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 )Nr2   )_loads_unsafe_impl)r%   rP   r   r2   kwargss        r&   loads_unsafez'JSONWebSignatureSerializer.loads_unsafe   s&    !=1&&q$???r'   )NNNNNNNF)NN)__name__
__module____qualname____doc__r   hashlibsha256sha384sha512r   r=   r!   r   default_serializerr    r.   r;   r#   rD   rI   r9   rQ   rU    r'   r&   r   r      s3        
 w~..w~..w~..	 N  %
 = = = =0   B7 7 7A A A
 
 
 
  
; ; ; ;   @ @ @ @ @ @r'   r   c                   8    e Zd ZdZdZd
dZd ZddZd Z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                 L    t          j        | |fi | || j        }|| _        d S N)r   r    DEFAULT_EXPIRES_IN
expires_in)r%   r   rf   rT   s       r&   r    z(TimedJSONWebSignatureSerializer.__init__   s6    "+D*GGGGG0J$r'   c                     t                               | |          }|                                 }|| j        z   }||d<   ||d<   |S )Niatexp)r   rI   nowrf   )r%   rH   r+   rh   ri   s        r&   rI   z+TimedJSONWebSignatureSerializer.make_header   sG    +77mLL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 )
NTrM   ri   zMissing expiry date)r1   zExpiry date is not an IntDater   zSignature expired)r1   date_signed)	r   rQ   r   r   int
ValueErrorrj   r   get_issue_date)r%   rP   r   r2   r1   r+   int_date_errors          r&   rQ   z%TimedJSONWebSignatureSerializer.loads   s   4::!T ; 
 
 4gFFFF"#BGTTT	!u..F5MM 	! 	! 	!  	!%=1  %=488::%%"# //77     	#F?"s   	A" "A/c                     |                     d          }t          |t                    r!t          j        t          |                    S d S )Nrh   )rO   r/   r   r   utcfromtimestamprm   )r%   r+   rvs      r&   ro   z.TimedJSONWebSignatureSerializer.get_issue_date   sF    ZZb,'' 	6,SWW555	6 	6r'   c                 B    t          t          j                              S rd   )rm   time)r%   s    r&   rj   z#TimedJSONWebSignatureSerializer.now   s    49;;r'   rd   rV   )
rW   rX   rY   rZ   re   r    rI   rQ   ro   rj   r`   r'   r&   rb   rb      s{        	 	 % % % %     66 6 6
         r'   rb   )r[   ru   r   _compatr   _jsonr   r   encodingr   r	   r
   excr   r   r   r   r   r   r   r   r   r   r   rb   r`   r'   r&   <module>rz      s           ! ! ! ! ! !             # # # # # # # # # # # #                                     ! ! ! ! ! ! " " " " " " ! ! ! ! ! ! ! ! ! ! ! !E@ E@ E@ E@ E@ E@ E@ E@P=  =  =  =  = &@ =  =  =  =  = r'   