o
    ӷ6i                     @   s0  d dl Z d dlZd dlZ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mZmZmZmZmZ d dlmZ d dlmZmZ d	d
lmZmZ g dZdZedZ dd Z!ddedfddZ"ddedfddZ#G dd dZ$G dd de$Z%G dd de$Z&G dd de$Z'dS )    N)InvalidSignature)hashes)HMAC)settings)BadSignatureJSONSerializerSignatureExpired
b64_decode
b64_encodeget_cookie_signer)baseconv)force_bytes	force_str   )constant_time_comparesalted_hmac)r   r   r
   r	   base64_hmacr   r   dumpsloadsSignerTimestampSignerBytesSignerFernetSigner<   z^[A-z0-9-_=]*$c                 C   s   t t| || S N)r
   r   finalize)saltvaluekey r   e/var/www/hoanhtaovolam_webdjango/env/lib/python3.10/site-packages/django_cryptography/core/signing.pyr   -      r   zdjango.core.signingFc           	      C   s`   |  | }d}|rt|}t|t|d k r|}d}t|}|r'd| }t||d|S )a  
    Returns URL-safe, sha1 signed base64 compressed JSON string. If key is
    None, settings.SECRET_KEY is used instead.

    If compress is True (not the default) checks if compressing using zlib can
    save some space. Prepends a '.' to signify compression. This is included
    in the signature, to protect against zip bombs.

    Salt can be used to namespace the hash, so that a signed string is
    only valid for a given namespace. Leaving this at the default
    value or re-using a salt value across different parts of your
    application without good cause is a security risk.

    The serializer is expected to return a bytestring.
    F   T   .r   )r   zlibcompresslenr
   r   sign)	objr   r   
serializerr&   datais_compressed
compressedbase64dr   r   r    r   1   s   
r   c                 C   s`   t t||dj| |d}d}|dd dkr|dd }d}t|}|r*t|}| |S )z}
    Reverse of dumps(), raises BadSignature if signature fails.

    The serializer is expected to accept a bytestring.
    r$   )max_ageFNr"   r#   T)r   r   unsignr	   r%   
decompressr   )sr   r   r*   r/   r.   r1   r+   r   r   r    r   T   s   

r   c                   @   s.   e Zd ZdddZdd Zdd Zd	d
 ZdS )r   N:c                 C   sR   |pt j| _t|| _t| jrtd| t|p$| jj	 d| jj
 | _d S )NzJUnsafe Signer separator: %r (cannot be empty or consist of only A-z0-9-_=).)r   
SECRET_KEYr   r   sep_SEP_UNSAFEmatch
ValueError	__class__
__module____name__r   )selfr   r6   r   r   r   r    __init__k   s   

zSigner.__init__c                 C   s   t | jd || j}t|S Nsigner)r   r   r   r   )r=   r   	signaturer   r   r    rA   x   s   zSigner.signaturec                 C   s    t |}| | j | | S r   )r   r6   rA   r=   r   r   r   r    r(   }   s   zSigner.signc                 C   sV   t |}| j|vrtd| j || jd\}}t|| |r%t |S td| )NzNo "%s" found in valuer"   Signature "%s" does not match)r   r6   r   rsplitr   rA   r=   signed_valuer   sigr   r   r    r0      s   
zSigner.unsign)Nr3   Nr<   r;   __qualname__r>   rA   r(   r0   r   r   r   r    r   j   s
    
r   c                       s2   e Zd Zdd Z fddZd fdd	Z  ZS )	r   c                 C   s   t jtt S r   )r   base62encodeinttime)r=   r   r   r    	timestamp   r!   zTimestampSigner.timestampc                    s*   t |}| | j |   }t |S r   )r   r6   rN   superr(   rB   r:   r   r    r(      s   zTimestampSigner.signNc                    st   t  |}|| jd\}}tj|}|dur8t|tj	r#|
 }t | }||kr8td| d| d|S )zk
        Retrieve original value and check it wasn't signed more
        than max_age seconds ago.
        r"   NSignature age  >  seconds)rO   r0   rD   r6   r   rJ   decode
isinstancedatetime	timedeltatotal_secondsrM   r   )r=   r   r/   resultrN   agerP   r   r    r0      s   zTimestampSigner.unsignr   )r<   r;   rI   rN   r(   r0   __classcell__r   r   rP   r    r      s    r   c                   @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )r   Nc                 C   s>   t j}|j| _|pt j| _t|p| jj d| jj	 | _
d S )Nr4   )r   CRYPTOGRAPHY_DIGESTdigest_size_digest_sizer5   r   r   r:   r;   r<   r   )r=   r   r   digestr   r   r    r>      s   
zBytesSigner.__init__c                 C   s   t | jd || j S r?   )r   r   r   r   rB   r   r   r    rA      s   zBytesSigner.signaturec                 C   s   t |}|| | S r   )r   rA   rB   r   r   r    r(      s   zBytesSigner.signc                 C   sH   |d | j   || j  d  }}t|| |r|S tdt| )NrC   )r^   r   rA   r   binascii
b2a_base64rE   r   r   r    r0      s   zBytesSigner.unsign)NNrH   r   r   r   r    r      s
    
r   c                   @   s4   e Zd ZdZdddZdd Zdd Zdd	d
ZdS )r      Nc                 C   s   t  | _t|p
tj| _dS )z5
        :type key: any
        :rtype: None
        N)r   SHA256r_   r   r   r5   r   )r=   r   r   r   r    r>      s   
zFernetSigner.__init__c                 C   s&   t | j| jtjd}|t| |S )z7
        :type value: any
        :rtype: HMAC
        )backend)r   r   r_   r   CRYPTOGRAPHY_BACKENDupdater   )r=   r   hr   r   r    rA      s   zFernetSigner.signaturec                 C   s6   t d| jtt }|t|7 }|| |  S )z8
        :type value: any
        :rtype: bytes
        >cQ)structpackversionrL   rM   r   rA   r   )r=   r   payloadr   r   r    r(      s   zFernetSigner.signc                 C   s   t d| jj}}dt|| | |f }zt ||\}}}}	W n t jy.   tdw || jkr8td|dur_t	|t
jrF| }tt | }
|
|t kr_td|
 d| dz| |d|  |	 W |S  ty   td	t|	 w )
z
        Retrieve original value and check it wasn't signed more
        than max_age seconds ago.

        :type signed_value: bytes
        :type ttl: int | datetime.timedelta
        rh   z	>cQ%ds%dszSignature is not validzSignature version not supportedNrQ   rR   rS   rC   )ri   calcsizer_   r]   r'   unpackerrorr   rk   rU   rV   rW   rX   absrM   _MAX_CLOCK_SKEWr   rA   verifyr   r`   ra   )r=   rF   ttlh_sized_sizefmtrk   rN   r   rG   rZ   r   r   r    r0      s.   
zFernetSigner.unsignr   )r<   r;   rI   rk   r>   rA   r(   r0   r   r   r   r    r      s    
		r   )(r`   rV   reri   rM   r%   cryptography.exceptionsr   cryptography.hazmat.primitivesr   #cryptography.hazmat.primitives.hmacr   django.confr   django.core.signingr   r   r   r	   r
   r   django.utilsr   django.utils.encodingr   r   utils.cryptor   r   __all__rq   compiler7   r   r   r   r   r   r   r   r   r   r   r    <module>   s4     

$
!