a
    y{Jh}  ã                   @   sŒ   d Z ddlmZmZ ddlmZmZ deeeegef  edœdd„Z	deeeegef  edœd	d
„Z
eedœdd„Zeedœdd„ZdS )aš  
Payload preparing

We have added some utils to make work with payload easier.

Basic encode example:

    .. code-block:: python

        from aiogram.utils.payload import encode_payload

        encoded = encode_payload("foo")

        # result: "Zm9v"

Basic decode it back example:

    .. code-block:: python

        from aiogram.utils.payload import decode_payload

        encoded = "Zm9v"
        decoded = decode_payload(encoded)
        # result: "foo"

Encoding and decoding with your own methods:

    1. Create your own cryptor

        .. code-block:: python

            from Cryptodome.Cipher import AES
            from Cryptodome.Util.Padding import pad, unpad

            class Cryptor:
                def __init__(self, key: str):
                    self.key = key.encode("utf-8")
                    self.mode = AES.MODE_ECB  # never use ECB in strong systems obviously
                    self.size = 32

                @property
                def cipher(self):
                    return AES.new(self.key, self.mode)

                def encrypt(self, data: bytes) -> bytes:
                    return self.cipher.encrypt(pad(data, self.size))

                def decrypt(self, data: bytes) -> bytes:
                    decrypted_data = self.cipher.decrypt(data)
                    return unpad(decrypted_data, self.size)

    2. Pass cryptor callable methods to aiogram payload tools

        .. code-block:: python

            cryptor = Cryptor("abcdefghijklmnop")
            encoded = encode_payload("foo", encoder=cryptor.encrypt)
            decoded = decode_payload(encoded_payload, decoder=cryptor.decrypt)

            # result: decoded == "foo"

é    )Úurlsafe_b64decodeÚurlsafe_b64encode)ÚCallableÚOptionalN)ÚpayloadÚencoderÚreturnc                 C   s4   t | tƒst| ƒ} |  d¡}|dur,||ƒ}t|ƒS )z[Encode payload with encoder.

    Result also will be encoded with URL-safe base64url.
    zutf-8N)Ú
isinstanceÚstrÚencodeÚ_encode_b64)r   r   Zpayload_bytes© r   úG/var/www/shaz/venv/lib/python3.9/site-packages/aiogram/utils/payload.pyÚencode_payloadC   s    

r   )r   Údecoderr   c                 C   s$   t | ƒ}|du r| ¡ S ||ƒ ¡ S )z/Decode URL-safe base64url payload with decoder.N)Ú_decode_b64Údecode)r   r   Zoriginal_payloadr   r   r   Údecode_payloadU   s    r   )r   r   c                 C   s   t | ƒ}| ¡ }| dd¡S )zEncode with URL-safe base64url.ú=Ú )r   r   Úreplace)r   Zbytes_payloadZstr_payloadr   r   r   r   b   s    r   c                 C   s$   | ddt | ƒd   7 } t|  ¡ ƒS )zDecode with URL-safe base64url.r   é   )Úlenr   r   )r   r   r   r   r   i   s    r   )N)N)Ú__doc__Úbase64r   r   Útypingr   r   r
   Úbytesr   r   r   r   r   r   r   r   Ú<module>   s    > þý þý