o
    >h                  
   @   s  d dl Z d dlZd dlZd dlZd dlZz
d dlmZmZ W n ey+   d ZZY nw G dd de	Z
G dd de jZG dd deZG d	d
 d
eZzd dlZW n eym Z zG dd deZW Y dZ[ndZ[ww G dd deZG dd dZe Zede ede dS )    N)FernetMultiFernetc                   @   s   e Zd ZdZdS )SerializerDoesNotExistz'The requested serializer was not found.N)__name__
__module____qualname____doc__ r	   r	   z/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/channels_redis/serializers.pyr          r   c                   @   sX   e Zd Z			dddZdd Zdd Zejd	d
 Zejdd Z	dd Z
dd ZdS )BaseMessageSerializerNr   c                 C   s   || _ || _| | d S N)random_prefix_lengthexpiry_setup_encryption)selfsymmetric_encryption_keysr   r   r	   r	   r
   __init__   s   zBaseMessageSerializer.__init__c                    sT   |r%t |ttfrtdtd u rtd fdd|D }t| _d S d  _d S )Nz9symmetric_encryption_keys must be a list of possible keys<Cannot run with encryption without 'cryptography' installed.c                    s   g | ]}  |qS r	   )make_fernet).0keyr   r	   r
   
<listcomp>(   s    z;BaseMessageSerializer._setup_encryption.<locals>.<listcomp>)
isinstancestrbytes
ValueErrorr   crypter)r   r   sub_fernetsr	   r   r
   r      s   
z'BaseMessageSerializer._setup_encryptionc                 C   s@   t du rtdt|tr|d}tt|	 }t |S )zT
        Given a single encryption key, returns a Fernet instance using it.
        Nr   utf-8)
r   r   r   r   encodebase64urlsafe_b64encodehashlibsha256digest)r   r   formatted_keyr	   r	   r
   r   -   s   

z!BaseMessageSerializer.make_fernetc                 O      t r   NotImplementedErrorr   messageargskwargsr	   r	   r
   as_bytes;      zBaseMessageSerializer.as_bytesc                 O   r(   r   r)   r+   r	   r	   r
   
from_bytes?   r0   z BaseMessageSerializer.from_bytesc                 C   sH   |  |}| jr| j|}| jdkr"td| j | jd| }|S )z6
        Serializes message to a byte string.
        r      big)r/   r   encryptr   randomgetrandbitsto_bytes)r   r,   r	   r	   r
   	serializeC   s   

zBaseMessageSerializer.serializec                 C   sP   | j dkr|| j d }| jr#| jdu r| jn| jd }| j||}| |S )z2
        Deserializes from a byte string.
        r   N
   )r   r   r   decryptr1   )r   r,   ttlr	   r	   r
   deserializeU   s   

z!BaseMessageSerializer.deserialize)Nr   N)r   r   r   r   r   r   abcabstractmethodr/   r1   r8   r<   r	   r	   r	   r
   r      s    


r   c                   @   s   e Zd ZdZdd ZdS )MissingSerializerNc                 O   s   | j r   )	exception)r   r-   r.   r	   r	   r
   r   f   s   zMissingSerializer.__init__)r   r   r   r@   r   r	   r	   r	   r
   r?   c   s    r?   c                   @   s   e Zd Zdd ZeejZdS )JSONSerializerc                 O   s"   t j|g|R i |}|dS )Nr    )jsondumpsr!   r+   r	   r	   r
   r/   o   s   
zJSONSerializer.as_bytesN)r   r   r   r/   staticmethodrB   loadsr1   r	   r	   r	   r
   rA   j   s    rA   c                   @   s   e Zd ZeZdS MsgPackSerializerN)r   r   r   excr@   r	   r	   r	   r
   rG   {   r   rG   c                   @   s    e Zd ZeejZeejZdS rF   )	r   r   r   rD   msgpackpackbr/   unpackbr1   r	   r	   r	   r
   rG      s    
c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	SerializersRegistryzO
    Serializers registry inspired by that of ``django.core.serializers``.
    c                 C   s
   i | _ d S r   )	_registryr   r	   r	   r
   r      s   
zSerializersRegistry.__init__c                 C   s>   t |trt|tst|drt|dsJ d|| j|< dS )z<
        Register a new serializer for given format
        r8   r<   z
            `serializer_class` should be a class which implements `serialize` and `deserialize` method
            or a subclass of `channels_redis.serializers.BaseMessageSerializer`
        N)r   type
issubclassr   hasattrrM   )r   formatserializer_classr	   r	   r
   register_serializer   s   
z'SerializersRegistry.register_serializerc                 O   s4   z| j | }W n ty   t|w ||i |S r   )rM   KeyErrorr   )r   rQ   r-   r.   rR   r	   r	   r
   get_serializer   s   z"SerializersRegistry.get_serializerN)r   r   r   r   r   rS   rU   r	   r	   r	   r
   rL      s
    rL   rB   rI   )r=   r"   r$   rB   r5   cryptography.fernetr   r   ImportErrorrT   r   ABCr   r?   rA   rI   rH   rG   rL   registryrS   r	   r	   r	   r
   <module>   s2    R"