o
    uvXjF  ã                   @   sÂ   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ zd dlmZ W n ey=   edƒ‚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dS )é    N)Úforms)Úsettings)ÚImproperlyConfigured)Úmodels)ÚRemovedInNextVersionWarning)ÚkeyczarzjUsing an encrypted field requires the Keyczar module. You can obtain Keyczar from http://www.keyczar.org/.c                   @   s   e Zd ZdS )ÚEncryptionWarningN)Ú__name__Ú
__module__Ú__qualname__© r   r   úb/var/www/html/myproject/venv/lib/python3.10/site-packages/django_extensions/db/fields/encrypted.pyr      s    r   c                       sj   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zej	d
k r"dd„ Z
ndd„ Z
ddd„Z‡ fdd„Z‡  ZS )ÚBaseEncryptedFieldz
enc_str:::c                    sx   t jdtdd� ttdd ƒstdƒ‚|  ¡ }| tj¡| _	| 
dd ¡ | _}|r/|  |¡|d< tt| ƒj|i |¤Ž d S )NaY  Please do not use these fields. Since Keyczar is deprecated and authors deleted all code we highly recommend to stop using potentially unsafe abandonware directly these versions of encrypted fields will be removed soon but it's highly likely their names will be reused. Please see github issues/1359 for discussion on possible replacement fieldsé   )Ú
stacklevelÚENCRYPTED_FIELD_KEYS_DIRzZYou must set the settings.ENCRYPTED_FIELD_KEYS_DIR setting to your Keyczar keys directory.Ú
max_length)ÚwarningsÚwarnr   Úgetattrr   r   Úget_crypt_classÚReadr   ÚcryptÚgetÚunencrypted_lengthÚcalculate_crypt_max_lengthÚsuperr   Ú__init__)ÚselfÚargsÚkwargsÚcrypt_classr   ©Ú	__class__r   r   r      s   ù
zBaseEncryptedField.__init__c                 C   s   t | jƒt | j d| ¡ƒ S )NÚx)ÚlenÚprefixr   ÚEncrypt)r   r   r   r   r   r   2   s   z-BaseEncryptedField.calculate_crypt_max_lengthc                 C   s>   t tddƒ}|dkrd}n|dkrd}ntd| ƒ‚t t|ƒS )a  
        Get the Keyczar class to use.

        The class can be customized with the ENCRYPTED_FIELD_MODE setting. By default,
        this setting is DECRYPT_AND_ENCRYPT. Set this to ENCRYPT to disable decryption.
        This is necessary if you are only providing public keys to Keyczar.

        Returns:
            keyczar.Encrypter if ENCRYPTED_FIELD_MODE is ENCRYPT.
            keyczar.Crypter if ENCRYPTED_FIELD_MODE is DECRYPT_AND_ENCRYPT.

        Override this method to customize the type of Keyczar class returned.
        ÚENCRYPTED_FIELD_MODEÚDECRYPT_AND_ENCRYPTÚENCRYPTÚ	EncrypterÚCrypterzKENCRYPTED_FIELD_MODE must be either DECRYPT_AND_ENCRYPT or ENCRYPT, not %s.)r   r   r   r   )r   Ú
crypt_typeÚcrypt_class_namer   r   r   r   9   s   ÿÿ
z"BaseEncryptedField.get_crypt_classc                 C   sx   t | jjtjjƒr|}|S |r8| | j¡r8t| jdƒr4| j 	|t
| jƒd … ¡}tjr2|r2| d¡}|S |}|S |}|S )NÚDecryptúutf-8)Ú
isinstancer   Úprimary_keyr   ÚkeysÚRsaPublicKeyÚ
startswithr&   Úhasattrr/   r%   ÚsixÚPY2Údecode)r   ÚvalueÚretvalr   r   r   Ú	to_pythonR   s   
÷

ýÿzBaseEncryptedField.to_python)r   c                 C   ó
   |   |¡S ©N©r<   )r   r:   Ú
expressionÚ
connectionÚcontextr   r   r   Úfrom_db_valuea   ó   
z BaseEncryptedField.from_db_valuec                 C   r=   r>   r?   )r   r:   r@   rA   r   r   r   rC   d   rD   Fc                 C   s„   |r@|  | j¡s@tjrt|ƒtjjkr| d¡}| j}|r7t	|ƒ|kr7t
 d| jt	|ƒ|f t¡ |d |… }| j| j |¡ }|S )Nr0   z'Truncating field %s from %d to %d bytes)r5   r&   r7   r8   ÚtypeÚtypesÚUnicodeTypeÚencoder   r%   r   r   Únamer   r   r'   )r   r:   rA   Úpreparedr   r   r   r   Úget_db_prep_valueg   s   
ÿÿz$BaseEncryptedField.get_db_prep_valuec                    s,   t t| ƒ ¡ \}}}}| j|d< ||||fS )Nr   )r   r   Údeconstructr   )r   rI   Úpathr   r    r"   r   r   rL   z   s   
zBaseEncryptedField.deconstruct)F)r	   r
   r   r&   r   r   r   r<   ÚdjangoÚVERSIONrC   rK   rL   Ú__classcell__r   r   r"   r   r      s    


r   c                       s$   e Zd Zdd„ Z‡ fdd„Z‡  ZS )ÚEncryptedTextFieldc                 C   ó   dS )NÚ	TextFieldr   ©r   r   r   r   Úget_internal_type�   ó   z$EncryptedTextField.get_internal_typec                    s*   dt ji}| |¡ tt| ƒjdi |¤ŽS )NÚwidgetr   )r   ÚTextareaÚupdater   rQ   Ú	formfield©r   r    Údefaultsr"   r   r   rZ   „   ó   

zEncryptedTextField.formfield)r	   r
   r   rU   rZ   rP   r   r   r"   r   rQ   €   s    rQ   c                       s0   e Zd Z‡ fdd„Zdd„ Z‡ fdd„Z‡  ZS )ÚEncryptedCharFieldc                    s   t t| ƒj|i |¤Ž d S r>   )r   r^   r   )r   r   r    r"   r   r   r   ‹   s   zEncryptedCharField.__init__c                 C   rR   )NÚ	CharFieldr   rT   r   r   r   rU   Ž   rV   z$EncryptedCharField.get_internal_typec                    s*   d| j i}| |¡ tt| ƒjdi |¤ŽS )Nr   r   )r   rY   r   r^   rZ   r[   r"   r   r   rZ   ‘   r]   zEncryptedCharField.formfield)r	   r
   r   r   rU   rZ   rP   r   r   r"   r   r^   Š   s    r^   )r   rN   r7   r   Údjango.confr   Údjango.core.exceptionsr   Ú	django.dbr   Údjango.utils.deprecationr   r   ÚImportErrorÚRuntimeWarningr   ÚFieldr   rQ   r^   r   r   r   r   Ú<module>   s"   ÿi
