o
    i                     @   s   d dl Z d dl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mZ d dlmZ d dlmZ d dlmZ d	Zd
Zeegef Zeeegef ZG dd deZdS )    N)CallableSequence)AnySupportsFloat)SerializationError)CorruptedDataErrorDecryptionErrorEncryptionError)override)AsyncKeyValue)BaseWrapper__encrypted_data____encryption_version__c                       s  e Zd ZdZ	d&dedededededd	f fd
dZ	de
eef de
eef fddZde
eef deeef fddZde
eef d	B de
eef d	B fddZed	ddeded	B de
eef d	B fddZed	ddee ded	B dee
eef d	B  fddZed	ddeded	B dee
eef d	B ed	B f fddZed	ddee ded	B deee
eef d	B ed	B f  fddZed	d	ddede
eef ded	B d ed	B dd	f
d!d"Zed	d	ddee d#ee
eef  ded	B d eed	B  d	B dd	f
d$d%Z  ZS )'BaseEncryptionWrapperaC  Wrapper that encrypts values before storing and decrypts on retrieval.

    This wrapper encrypts the JSON-serialized value using a custom encryption function
    and stores it as a base64-encoded string within a special key in the dictionary.
    This allows encryption while maintaining the dict[str, Any] interface.
    T	key_valueencryption_fndecryption_fnencryption_versionraise_on_decryption_errorreturnNc                    s,   || _ || _|| _|| _|| _t   dS )a0  Initialize the encryption wrapper.

        Args:
            key_value: The store to wrap.
            encryption_fn: The encryption function to use. A callable that takes bytes and returns encrypted bytes.
            decryption_fn: The decryption function to use. A callable that takes bytes and an
                           encryption version int and returns decrypted bytes.
            encryption_version: The encryption version to use.
            raise_on_decryption_error: Whether to raise an exception if decryption fails. Defaults to True.
        N)r   r   r   _encryption_fn_decryption_fnsuper__init__)selfr   r   r   r   r   	__class__ l/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/key_value/aio/wrappers/encryption/base.pyr      s   zBaseEncryptionWrapper.__init__valuec              
   C   s   zt j|dd}|jdd}W n t jtfy( } z
d| }t||d}~ww z| |}t|j	dd}W n t
yL } zd}t||d}~ww t|t| jiS )	zEncrypt a value into the encrypted format.

        The encrypted format looks like:
        {
            "__encrypted_data__": "base64-encoded-encrypted-data",
            "__encryption_version__": 1
        }
        ),:)
separatorsutf-8encodingz$Failed to serialize object to JSON: NasciizFailed to encrypt value)jsondumpsencodeJSONDecodeError	TypeErrorr   r   base64	b64encodedecode	Exceptionr	   _ENCRYPTED_DATA_KEY_ENCRYPTION_VERSION_KEYr   )r   r   json_str
json_bytesemsgencrypted_bytes
base64_strr   r   r   _encrypt_value9   s&   



z$BaseEncryptionWrapper._encrypt_valuec                 C   s   t |vr
d}t||t  }t|tsdt| }t|t|vr(d}t||t }t|ts<dt| }t|||fS )Nzmissing encryption version keyz.expected encryption version to be an int, got zmissing encrypted data keyz)expected encrypted data to be a str, got )r1   r   
isinstanceinttyper0   str)r   r   r5   r   encrypted_datar   r   r   _validate_encrypted_payloadY   s   

z1BaseEncryptionWrapper._validate_encrypted_payloadc           	   
   C   s   |du rdS t |vrt|tr|S z | |\}}tj|dd}| ||}|jdd}t	|W S  t
y?   | jr< Y dS  ty[ } zd}| jrPt||W Y d}~dS d}~ww )z*Decrypt a value from the encrypted format.NT)validater#   r$   zFailed to decrypt value)r0   r9   dictr>   r,   	b64decoder   r.   r'   loadsr   r   r/   r   )	r   r   r   r=   r6   r3   r2   r4   r5   r   r   r   _decrypt_valueo   s*   
z$BaseEncryptionWrapper._decrypt_value)
collectionkeyrD   c                   s"   | j j||dI d H }| |S N)rE   rD   )r   getrC   )r   rE   rD   r   r   r   r   rG      s   
zBaseEncryptionWrapper.getkeysc                   *    j j||dI d H } fdd|D S )NrH   rD   c                       g | ]}  |qS r   rC   .0r   r   r   r   
<listcomp>       z2BaseEncryptionWrapper.get_many.<locals>.<listcomp>)r   get_many)r   rH   rD   valuesr   rO   r   rR         zBaseEncryptionWrapper.get_manyc                   s*   | j j||dI d H \}}| ||fS rF   )r   ttlrC   )r   rE   rD   r   rU   r   r   r   rU      s   zBaseEncryptionWrapper.ttlc                   rI   )NrJ   c                    s   g | ]\}}  ||fqS r   rL   )rN   r   rU   rO   r   r   rP      s    z2BaseEncryptionWrapper.ttl_many.<locals>.<listcomp>)r   ttl_many)r   rH   rD   resultsr   rO   r   rV      rT   zBaseEncryptionWrapper.ttl_many)rD   rU   rU   c                   s&   |  |}| jj||||dI d H S )N)rE   r   rD   rU   )r8   r   put)r   rE   r   rD   rU   encrypted_valuer   r   r   rX      s   
zBaseEncryptionWrapper.putrS   c                   s.    fdd|D } j j||||dI d H S )Nc                    rK   r   )r8   rM   rO   r   r   rP      rQ   z2BaseEncryptionWrapper.put_many.<locals>.<listcomp>)rH   rS   rD   rU   )r   put_many)r   rH   rS   rD   rU   encrypted_valuesr   rO   r   rZ      s   	zBaseEncryptionWrapper.put_many)T)__name__
__module____qualname____doc__r   EncryptionFnDecryptionFnr:   boolr   r@   r<   r   r8   tupler>   rC   r
   rG   listrR   floatrU   rV   r   rX   r   rZ   __classcell__r   r   r   r   r      sV    "" *.6:B8r   )r,   r'   collections.abcr   r   typingr   r   !key_value.shared.errors.key_valuer   +key_value.shared.errors.wrappers.encryptionr   r   r	   typing_extensionsr
   !key_value.aio.protocols.key_valuer   key_value.aio.wrappers.baser   r0   r1   bytesr`   r:   ra   r   r   r   r   r   <module>   s    