î
à^Q\>  ã               @   sì   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	 y d  d l
 m
 Z
 Wn e k
 rŒ e d ƒ ‚ Yn XGd d	 „  d	 e ƒ Z Gd
 d „  d e	 j ƒ Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z d S)é    N)Úforms)Úsettings)ÚImproperlyConfigured)Úmodels)Ú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   úV/var/www/dbchiro/venv/build/django-extensions/django_extensions/db/fields/encrypted.pyr      s   r   c                   sy   e  Z d  Z d Z ‡  f d d †  Z d d „  Z d d „  Z d d	 „  Z d
 d „  Z d d d „ Z	 ‡  f d d †  Z
 ‡  S)ÚBaseEncryptedFieldz
enc_str:::c                s‘   t  t d ƒ s t d ƒ ‚ n  |  j ƒ  } | j t j ƒ |  _ | j d d  ƒ |  _ } | rt |  j	 | ƒ | d <n  t
 t |  ƒ j | | Ž  d  S)NÚENCRYPTED_FIELD_KEYS_DIRzZYou must set the settings.ENCRYPTED_FIELD_KEYS_DIR setting to your Keyczar keys directory.Ú
max_length)Úhasattrr   r   Úget_crypt_classZReadr   ÚcryptÚgetÚunencrypted_lengthÚcalculate_crypt_max_lengthÚsuperr   Ú__init__)ÚselfÚargsÚkwargsZcrypt_classr   )Ú	__class__r   r   r      s    zBaseEncryptedField.__init__c             C   s'   t  |  j ƒ t  |  j j d | ƒ ƒ S)NÚx)ÚlenÚprefixr   ÚEncrypt)r   r   r   r   r   r   &   s    z-BaseEncryptedField.calculate_crypt_max_lengthc             C   sY   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.
        ZENCRYPTED_FIELD_MODEZDECRYPT_AND_ENCRYPTZENCRYPTZ	EncrypterZCrypterzKENCRYPTED_FIELD_MODE must be either DECRYPT_AND_ENCRYPT or ENCRYPT, not %s.)Úgetattrr   r   r   )r   Z
crypt_typeZcrypt_class_namer   r   r   r   -   s    		
z"BaseEncryptedField.get_crypt_classc             C   sª   t  |  j j t j j ƒ r$ | } n‚ | r  | j |  j ƒ r  t |  j d ƒ r— |  j j	 | t
 |  j ƒ d  … ƒ } t j r | r | j d ƒ } q q¦ | } n | } | S)NÚDecryptzutf-8)Ú
isinstancer   Zprimary_keyr   ÚkeysZRsaPublicKeyÚ
startswithr   r   r!   r   ÚsixÚPY2Údecode)r   ÚvalueÚretvalr   r   r   Ú	to_pythonG   s    	%	zBaseEncryptedField.to_pythonc             C   s   |  j  | ƒ S)N)r*   )r   r(   Z
expressionÚ
connectionÚcontextr   r   r   Úfrom_db_valueU   s    z BaseEncryptedField.from_db_valueFc             C   sÉ   | rÅ | j  |  j ƒ rÅ t j rO t | ƒ t j j k rO | j d ƒ } qO n  |  j } | r© t	 | ƒ | k r© t
 j d |  j t	 | ƒ | f t ƒ | d  | … } n  |  j |  j j | ƒ } n  | S)Nzutf-8z'Truncating field %s from %d to %d bytes)r$   r   r%   r&   ÚtypeÚtypesZUnicodeTypeÚencoder   r   ÚwarningsÚwarnÚnamer   r   r   )r   r(   r+   Zpreparedr   r   r   r   Úget_db_prep_valueX   s    			z$BaseEncryptedField.get_db_prep_valuec                s>   t  t |  ƒ j ƒ  \ } } } } |  j | d <| | | | f S)Nr   )r   r   Údeconstructr   )r   r3   Úpathr   r   )r   r   r   r5   k   s    !zBaseEncryptedField.deconstruct)r   r	   r
   r   r   r   r   r*   r-   r4   r5   r   r   )r   r   r      s   r   c                   s.   e  Z d  Z d d „  Z ‡  f d d †  Z ‡  S)ÚEncryptedTextFieldc             C   s   d S)NZ	TextFieldr   )r   r   r   r   Úget_internal_typer   s    z$EncryptedTextField.get_internal_typec                s3   i t  j d 6} | j | ƒ t t |  ƒ j |   S)NZwidget)r   ZTextareaÚupdater   r7   Ú	formfield)r   r   Údefaults)r   r   r   r:   u   s    zEncryptedTextField.formfield)r   r	   r
   r8   r:   r   r   )r   r   r7   q   s   r7   c                   s@   e  Z d  Z ‡  f d d †  Z d d „  Z ‡  f d d †  Z ‡  S)ÚEncryptedCharFieldc                s   t  t |  ƒ j | | Ž  d  S)N)r   r<   r   )r   r   r   )r   r   r   r   |   s    zEncryptedCharField.__init__c             C   s   d S)NZ	CharFieldr   )r   r   r   r   r8      s    z$EncryptedCharField.get_internal_typec                s3   i |  j  d 6} | j | ƒ t t |  ƒ j |   S)Nr   )r   r9   r   r<   r:   )r   r   r;   )r   r   r   r:   ‚   s    zEncryptedCharField.formfield)r   r	   r
   r   r8   r:   r   r   )r   r   r<   {   s   r<   )r1   r%   Zdjangor   Zdjango.confr   Zdjango.core.exceptionsr   Z	django.dbr   r   ÚImportErrorÚRuntimeWarningr   ZFieldr   r7   r<   r   r   r   r   Ú<module>   s   \
