o
    ǯhL                     @   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 d dlZdd Zd	d
 Ze Zdd Zdd Zdd ZG dd deZG dd deejjjZG dd deejjjZG dd deejjjZG dd deejjj Z!G dd deejjj"Z#G dd deejjj$Z%G dd  d eZ&G d!d" d"e&ejjj'Z(G d#d$ d$e&ejjj)Z*G d%d& d&e&ejjj+Z,G d'd( d(e&ejjj-Z.G d)d* d*e&ejjj/Z0dS )+    N)settings)
validators)ImproperlyConfigured)timezone)cached_propertyc                 C   s   t j| S )zf
    If the key is a string we need to ensure that it can be decoded
    :param key:
    :return:
    )cryptographyfernetFernet)key r   Z/var/www/Befach/backend/venv/lib/python3.10/site-packages/encrypted_model_fields/fields.py	parse_key   s   r   c               
   C   s   t tdd } | d u rtdzt| ttfrdd | D }nt| g}W n ty9 } z	tdt| d }~ww t	|dkrDtdt
j|S )NFIELD_ENCRYPTION_KEYz0FIELD_ENCRYPTION_KEY must be defined in settingsc                 S   s   g | ]}t |qS r   )r   ).0kr   r   r   
<listcomp>    s    zget_crypter.<locals>.<listcomp>z*FIELD_ENCRYPTION_KEY defined incorrectly: r   z/No keys defined in setting FIELD_ENCRYPTION_KEY)getattrr   r   
isinstancetuplelistr   	Exceptionstrlenr   r   MultiFernet)configured_keyskeyser   r   r   get_crypter   s   
r   c                 C   s   t | dS Nutf-8)CRYPTERencryptencode)sr   r   r   encrypt_str0   s   r$   c                 C   s   t | ddS r   )r    decryptr"   decode)tr   r   r   decrypt_str5   s   r(   c                 C   s   t td|  S )Na)r   r$   )nr   r   r   calc_encrypted_length:   s   r+   c                       sD   e Zd Z fddZdd Z fddZdd Z fd	d
Z  ZS )EncryptedMixinc                    sb   |d u r|S t |ttfr)t |tr|d}zt|}W n tjjy(   Y nw tt	| 
|S r   )r   bytesr   r&   r(   r   r   InvalidTokensuperr,   	to_python)selfvalue	__class__r   r   r0   A   s   

zEncryptedMixin.to_pythonc                 O   s
   |  |S N)r0   )r1   r2   argskwargsr   r   r   from_db_valueO   s   
zEncryptedMixin.from_db_valuec                    s0   t t| ||}|d u r|S tt|dS r   )r/   r,   get_db_prep_saver$   r   r&   r1   r2   
connectionr3   r   r   r9   R   s   zEncryptedMixin.get_db_prep_savec                 C   s   dS )N	TextFieldr   )r1   r   r   r   get_internal_typeZ   s   z EncryptedMixin.get_internal_typec                    s0   t t|  \}}}}d|v r|d= ||||fS )N
max_length)r/   r,   deconstruct)r1   namepathr6   r7   r3   r   r   r?   ]   s   zEncryptedMixin.deconstruct)	__name__
__module____qualname__r0   r8   r9   r=   r?   __classcell__r   r   r3   r   r,   @   s    r,   c                   @      e Zd ZdS )EncryptedCharFieldNrB   rC   rD   r   r   r   r   rG   f       rG   c                   @   rF   )EncryptedTextFieldNrH   r   r   r   r   rJ   j   rI   rJ   c                   @   rF   )EncryptedDateFieldNrH   r   r   r   r   rK   n   rI   rK   c                       s   e Zd Z fddZ  ZS )EncryptedDateTimeFieldc                    s@   t t| |}|d urtjrt|rt }t||}|S r5   )	r/   rL   r0   r   USE_TZr   is_naiveget_default_timezone
make_aware)r1   r2   default_timezoner3   r   r   r0   t   s
   z EncryptedDateTimeField.to_python)rB   rC   rD   r0   rE   r   r   r3   r   rL   r   s    rL   c                   @   rF   )EncryptedEmailFieldNrH   r   r   r   r   rR   ~   rI   rR   c                   @   s   e Zd Zdd ZdS )EncryptedBooleanFieldc                 C   s8   |d u r|S |du rd}n|du rd}t t|dS )NT1F0r   )r$   r   r&   r:   r   r   r   r9      s   z&EncryptedBooleanField.get_db_prep_saveN)rB   rC   rD   r9   r   r   r   r   rS      s    rS   c                   @   s   e Zd ZdZedd ZdS )EncryptedNumberMixin   c                 C   sn   g }| j jdd  }tjjj|\}}|d ur |t	| |d ur,|t
| tt| j| j|S )N	   )r4   rB   djangodbr;   opsinteger_field_rangeappendr   MinValueValidatorMaxValueValidatorr   	itertoolschaindefault_validators_validators)r1   range_validatorsinternal_type	min_value	max_valuer   r   r   r      s   zEncryptedNumberMixin.validatorsN)rB   rC   rD   r>   r   r   r   r   r   r   rV      s    rV   c                   @   s   e Zd ZdZdS )EncryptedIntegerFieldzhAn IntegerField that is encrypted before inserting into a database using the python cryptography libraryN)rB   rC   rD   descriptionr   r   r   r   rh      s    rh   c                   @   rF   )EncryptedPositiveIntegerFieldNrH   r   r   r   r   rj      rI   rj   c                   @   rF   )EncryptedSmallIntegerFieldNrH   r   r   r   r   rk      rI   rk   c                   @   rF   )"EncryptedPositiveSmallIntegerFieldNrH   r   r   r   r   rl      s    rl   c                   @   rF   )EncryptedBigIntegerFieldNrH   r   r   r   r   rm      rI   rm   )1r`   	django.dbrY   django.db.modelsdjango.confr   django.corer   django.core.exceptionsr   django.utilsr   django.utils.functionalr   cryptography.fernetr   r   r   r    r$   r(   r+   objectr,   rZ   models	CharFieldrG   r<   rJ   	DateFieldrK   DateTimeFieldrL   
EmailFieldrR   BooleanFieldrS   rV   IntegerFieldrh   PositiveIntegerFieldrj   SmallIntegerFieldrk   PositiveSmallIntegerFieldrl   BigIntegerFieldrm   r   r   r   r   <module>   s<    	&

