From 025afa1987e10495399c3c0ce28565f245a96a71 Mon Sep 17 00:00:00 2001 From: naohide anahara <57.x.mas@gmail.com> Date: Fri, 6 May 2022 22:55:52 +0900 Subject: [PATCH] Fix get_prep_value and to_python function --- encrypted_fields/fields.py | 22 ++++++++-------------- package_test/tests.py | 21 +++++++++++++-------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/encrypted_fields/fields.py b/encrypted_fields/fields.py index 8e4dc2b..56acc52 100644 --- a/encrypted_fields/fields.py +++ b/encrypted_fields/fields.py @@ -2,7 +2,7 @@ import base64 from django.utils import timezone import warnings -from cryptography.fernet import Fernet, MultiFernet +from cryptography.fernet import Fernet, MultiFernet, InvalidToken from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC @@ -49,6 +49,7 @@ class EncryptedFieldMixin(object): return "TextField" def get_prep_value(self, value): + value = super().get_prep_value(value) if value: if not isinstance(value, str): value = str(value) @@ -70,7 +71,12 @@ class EncryptedFieldMixin(object): or hasattr(self, "_already_decrypted") ): return value - value = self.f.decrypt(bytes(value, "utf-8")).decode("utf-8") + try: + value = self.f.decrypt(bytes(value, "utf-8")).decode("utf-8") + except InvalidToken: + pass + except UnicodeEncodeError: + pass return super(EncryptedFieldMixin, self).to_python(value) def clean(self, value, model_instance): @@ -97,18 +103,6 @@ class EncryptedDateTimeField(EncryptedFieldMixin, models.DateTimeField): class EncryptedIntegerField(EncryptedFieldMixin, models.IntegerField): - def get_prep_value(self, value): - if value is None: - return None - try: - value = int(value) - except (TypeError, ValueError) as e: - raise e.__class__( - "Field '%s' expected a number but got %r." % (self.name, value), - ) from e - else: - return super().get_prep_value(value) - @cached_property def validators(self): return [*self.default_validators, *self._validators] diff --git a/package_test/tests.py b/package_test/tests.py index 9e9c2c2..55ebc17 100644 --- a/package_test/tests.py +++ b/package_test/tests.py @@ -3,6 +3,7 @@ import re from django.db import connection from django.test import TestCase, override_settings from django.utils import timezone +from django.core.exceptions import ValidationError from .models import TestModel @@ -64,8 +65,9 @@ class FieldTest(TestCase): plaintext = "text" - model.datetime = plaintext - model.save() + with self.assertRaises(ValidationError): + model.datetime = plaintext + model.save() def test_integer_field_encrypted(self): plaintext = 42 @@ -103,8 +105,9 @@ class FieldTest(TestCase): plaintext = "text" - model.date = plaintext - model.save() + with self.assertRaises(ValidationError): + model.date = plaintext + model.save() def test_float_field_encrypted(self): plaintext = 42.44 @@ -123,8 +126,9 @@ class FieldTest(TestCase): plaintext = "text" - model.floating = plaintext - model.save() + with self.assertRaises(ValueError): + model.floating = plaintext + model.save() def test_email_field_encrypted(self): plaintext = "test@gmail.com" @@ -168,8 +172,9 @@ class FieldTest(TestCase): plaintext = "text" - model.boolean = plaintext - model.save() + with self.assertRaises(ValidationError): + model.boolean = plaintext + model.save() class RotatedSaltTestCase(TestCase):