o
    wvXjÈ  ã                   @   s°   d Z ddlmZmZ ddlmZmZmZ ddl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 dd	lmZ dd
lmZmZ dZG dd„ deƒZdddedfdd„ZdS )zSecure serializer.é    )Úabsolute_importÚunicode_literals)ÚdumpsÚloadsÚregistry)Úbytes_to_strÚensure_bytesÚstr_to_bytes)ÚDEFAULT_SECURITY_DIGEST)Ú	b64decodeÚ	b64encodeé   )ÚCertificateÚFSCertStore)Ú
PrivateKey)Úget_digest_algorithmÚreraise_errors)ÚSecureSerializerÚregister_authc                   @   sT   e Zd ZdZdddedfdd„Zdd„ Zdd	„ Zed
ƒfdd„Z	ed
ƒfdd„Z
dS )r   zSigned serializer.NÚjsonc                 C   s&   || _ || _|| _t|ƒ| _|| _d S ©N)Ú_keyÚ_certÚ_cert_storer   Ú_digestÚ_serializer)ÚselfÚkeyÚcertÚ
cert_storeÚdigestÚ
serializer© r"   úZ/var/www/html/myproject/venv/lib/python3.10/site-packages/celery/security/serialization.pyÚ__init__   s
   

zSecureSerializer.__init__c              	   C   s’   | j dusJ ‚| jdusJ ‚tdtfƒ�+ tt|ƒ| jd�\}}}t|ƒ}| j|||| j  	|| j
¡| j ¡ d�W  d  ƒ S 1 sBw   Y  dS )z%Serialize data structure into string.NzUnable to serialize: {0!r}©r!   )Ú	signatureÚsigner)r   r   r   Ú	Exceptionr   r   r   r   Ú_packÚsignr   Úget_id)r   ÚdataÚcontent_typeÚcontent_encodingÚbodyr"   r"   r#   Ú	serialize   s   
ÿ
þ$øzSecureSerializer.serializec                 C   s’   | j dusJ ‚tdtfƒ�& |  |¡}|d |d |d }}}| j |  ||| j¡ W d  ƒ n1 s6w   Y  tt|ƒ|d |d dd	�S )
z'Deserialize data structure from string.NzUnable to deserialize: {0!r}r&   r'   r/   r-   r.   T)Úforce)r   r   r(   Ú_unpackÚverifyr   r   r   )r   r,   Úpayloadr&   r'   r/   r"   r"   r#   Údeserialize-   s   

þûÿzSecureSerializer.deserializez c                 C   s&   |  dd„ |||||fD ƒ¡}t|ƒS )Nc                 s   s   � | ]}t |ƒV  qd S r   )r   )Ú.0Úsr"   r"   r#   Ú	<genexpr>;   s   € 
ÿz)SecureSerializer._pack.<locals>.<genexpr>)Újoinr   )r   r/   r-   r.   r'   r&   ÚsepÚfieldsr"   r"   r#   r)   9   s   
ÿÿzSecureSerializer._packc                 C   sœ   t t|ƒƒ}| |¡}|d |… }| j| }| ¡ jd? }t|ƒ}|| }	|	| }
||	|
… }||
| d …  |¡}||t|d ƒt|d ƒt|d ƒdœS )Né   r   r   é   )r'   r&   r-   r.   r/   )	r   r   Úfindr   Ú
get_pubkeyÚkey_sizeÚlenÚsplitr   )r   r4   r:   Úraw_payloadÚ	first_sepr'   Úsigner_certÚsig_lenÚsep_lenÚsignature_start_positionÚsignature_end_positionr&   Úvr"   r"   r#   r2   A   s$   

ÿ


ûzSecureSerializer._unpack)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r$   r0   r5   r	   r)   r2   r"   r"   r"   r#   r      s    
ÿ
ÿr   Nr   c                 C   sF   t | ot| ƒ|ot|ƒ|ot|ƒ||d�}tjd|j|jddd� dS )zRegister security serializer.r%   Úauthzapplication/datazutf-8)r-   r.   N)r   r   r   r   r   Úregisterr0   r5   )r   r   Ústorer    r!   r7   r"   r"   r#   r   ^   s   

ý
þr   )rN   Ú
__future__r   r   Úkombu.serializationr   r   r   Úkombu.utils.encodingr   r   r	   Úcelery.app.defaultsr
   Úcelery.utils.serializationr   r   Úcertificater   r   r   r   Úutilsr   r   Ú__all__Úobjectr   r   r"   r"   r"   r#   Ú<module>   s   Lþ