|
|
|
import re
|
|
|
|
|
|
|
|
from flask import current_app
|
|
|
|
from mongoengine.base import BaseField
|
|
|
|
from Crypto.PublicKey import RSA
|
|
|
|
from Crypto.Cipher import PKCS1_OAEP
|
|
|
|
|
|
|
|
|
|
|
|
class EncryptedStringField(BaseField):
|
|
|
|
"""A unicode encrypted string field."""
|
|
|
|
keyPair = None
|
|
|
|
|
|
|
|
def __init__(self, **kwargs):
|
|
|
|
|
|
|
|
self.keyPair = RSA.importKey(open(current_app.config.get('priv_key_path')).read())
|
|
|
|
|
|
|
|
super().__init__(**kwargs)
|
|
|
|
|
|
|
|
def __get__(self, instance, owner):
|
|
|
|
value = instance._data.get(self.name)
|
|
|
|
encryptor = PKCS1_OAEP.new(self.keyPair.publickey())
|
|
|
|
return encryptor.decrypt(value)
|
|
|
|
|
|
|
|
def __set__(self, instance, value):
|
|
|
|
|
|
|
|
key = self.name
|
|
|
|
encryptor = PKCS1_OAEP.new(self.keyPair.publickey())
|
|
|
|
|
|
|
|
instance._data[key] = encryptor.encrypt(value)
|
|
|
|
instance._mark_as_changed(key)
|
|
|
|
|
|
|
|
def to_python(self, value):
|
|
|
|
if isinstance(value, str):
|
|
|
|
return value
|
|
|
|
try:
|
|
|
|
value = value.decode("utf-8")
|
|
|
|
except Exception:
|
|
|
|
pass
|
|
|
|
return value
|
|
|
|
|
|
|
|
def lookup_member(self, member_name):
|
|
|
|
return None
|
|
|
|
|
|
|
|
def prepare_query_value(self, op, value):
|
|
|
|
return super().prepare_query_value(op, value)
|