U
    bh                     @   s   d 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edZG dd dZdddde
dfddZdS )zSecure serializer.    )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_authz c                   @   sL   e Zd ZdZdddedfddZdd Zdd	 Zefd
dZ	e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certZ
cert_storedigest
serializer r   A/tmp/pip-unpacked-wheel-kcem4wq5/celery/security/serialization.py__init__   s
    
zSecureSerializer.__init__c              
   C   s   | j dk	st| jdk	sttdtfP t|| jd\}}}t|}| j|||| j 	|| j
| j dW  5 Q R  S Q R X dS )z%Serialize data structure into string.NzUnable to serialize: {0!r}r   )	signaturesigner)r   AssertionErrorr   r   	Exceptionr   r   r   _packsignr   Zget_id)r   datacontent_typecontent_encodingbodyr   r   r    	serialize   s     
zSecureSerializer.serializec              	   C   sz   | j dk	sttdtfB | |}|d |d |d   }}}| j | ||| j W 5 Q R X 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   r&   _unpackverifyr   r   )r   r)   payloadr#   r$   r,   r   r   r    deserialize0   s    

 
 zSecureSerializer.deserializec                 C   s.   | dd t|t||||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'   <   s    
  zSecureSerializer._packc                 C   sN   t t|}|j|dd}t |d t |d t|d t|d |d dS )N   )maxsplitr   r         )r$   r#   r*   r+   r,   )r	   r   splitr   )r   r1   r7   Zraw_payloadvr   r   r    r/   D   s    



zSecureSerializer._unpack)__name__
__module____qualname____doc__r   r!   r-   r2   DEFAULT_SEPARATORr'   r/   r   r   r   r    r      s    

r   Nr   c                 C   sJ   t | ot| |d|ot||o$t|||d}tjd|j|jddd dS )zRegister security serializer.)passwordr"   authzapplication/datazutf-8)r*   r+   N)r   r   r   r   r   registerr-   r2   )r   key_passwordr   storer   r   r4   r   r   r    r   P   s    

 r   )rB   Zkombu.serializationr   r   r   Zkombu.utils.encodingr   r   r   Zcelery.app.defaultsr   Zcelery.utils.serializationr	   r
   Zcertificater   r   r   r   utilsr   r   __all__rC   r   r   r   r   r   r    <module>   s   <