Created
December 11, 2012 16:44
-
-
Save robrocker7/4260175 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.db import models | |
from django.core.exceptions import ImproperlyConfigured | |
from django import forms | |
from django.conf import settings | |
try: | |
from keyczar import keyczar | |
except ImportError: | |
raise ImportError('Using an encrypted field requires the Keyczar module. You can obtain Keyczar from http://www.keyczar.org/.') | |
class BaseEncryptedField(models.Field): | |
prefix = 'enc_str:::' | |
def __init__(self, *args, **kwargs): | |
if not hasattr(settings, 'ENCRYPTED_FIELD_KEYS_DIR'): | |
raise ImproperlyConfigured('You must set settings.ENCRYPTED_FIELD_KEYS_DIR to your Keyczar keys directory.') | |
self.crypt = keyczar.Crypter.Read(settings.ENCRYPTED_FIELD_KEYS_DIR) | |
super(BaseEncryptedField, self).__init__(*args, **kwargs) | |
def to_python(self, value): | |
if (value.startswith(self.prefix)): | |
retval = self.crypt.Decrypt(value[len(self.prefix):]) | |
else: | |
retval = value | |
return retval | |
def get_db_prep_value(self, value): | |
if not value.startswith(self.prefix): | |
value = self.prefix + self.crypt.Encrypt(value) | |
return value | |
class EncryptedTextField(BaseEncryptedField): | |
__metaclass__ = models.SubfieldBase | |
def get_internal_type(self): | |
return 'TextField' | |
def formfield(self, **kwargs): | |
defaults = {'widget': forms.Textarea} | |
defaults.update(kwargs) | |
return super(EncryptedTextField, self).formfield(**defaults) | |
class EncryptedCharField(BaseEncryptedField): | |
__metaclass__ = models.SubfieldBase | |
def __init__(self, max_length=None, *args, **kwargs): | |
if max_length: | |
max_length += len(self.prefix) | |
super(EncryptedCharField, self).__init__(max_length=max_length, *args, **kwargs) | |
def get_internal_type(self): | |
return "CharField" | |
def formfield(self, **kwargs): | |
defaults = {'max_length': self.max_length} | |
defaults.update(kwargs) | |
return super(EncryptedCharField, self).formfield(**defaults) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment