add dependencies

This commit is contained in:
Your Name 2024-06-29 12:14:46 -04:00 committed by Henri Dickson
parent 3795081098
commit 6eaf5397bc
5 changed files with 49 additions and 4 deletions

View file

@ -1,13 +1,18 @@
# pyright: reportIncompatibleMethodOverride=false, reportFunctionMemberAccess=false
import copy
from base64 import b64decode, b64encode
from datetime import date, datetime
from functools import partialmethod
from hashlib import sha256
from importlib import import_module
import django
from cryptography.fernet import Fernet, MultiFernet
from django.conf import settings
from django.core.exceptions import FieldError
from django.db.models import fields
from django.db.models import Value, fields
from django.utils import dateparse, timezone
from django.utils.encoding import force_bytes
from django.utils.translation import gettext_lazy as _
# from django.db.models import JSONField as DJANGO_JSONField
@ -16,6 +21,28 @@ from django.utils.translation import gettext_lazy as _
from django_jsonform.models.fields import ArrayField as DJANGO_ArrayField
from django_jsonform.models.fields import JSONField as DJANGO_JSONField
def _get_crypter():
configured_keys = [settings.SECRET_KEY] + settings.SECRET_KEY_FALLBACKS
keys = [Fernet(b64encode(sha256(force_bytes(k)).digest())) for k in configured_keys]
if len(keys) == 0:
raise ValueError("No keys defined")
return MultiFernet(keys)
CRYPTER = _get_crypter()
def encrypt_str(s: str) -> str:
# be sure to encode the string to bytes
return CRYPTER.encrypt(s.encode("utf-8")).decode("utf-8")
def decrypt_str(t: str) -> str:
# be sure to decode the bytes to a string
return CRYPTER.decrypt(t.encode("utf-8")).decode("utf-8")
__all__ = (
"BooleanField",
"CharField",
@ -29,6 +56,7 @@ __all__ = (
"IPAddressField",
"GenericIPAddressField",
"NullBooleanField",
"EncryptedTextField",
"TextField",
"TimeField",
"URLField",
@ -81,9 +109,6 @@ class JSONFieldDescriptor(object):
setattr(instance, self.field.json_field_name, json_value)
fields.CharField
class JSONFieldMixin(object):
"""
Override django.db.model.fields.Field.contribute_to_class
@ -226,6 +251,16 @@ class TextField(JSONFieldMixin, fields.TextField):
pass
class EncryptedTextField(JSONFieldMixin, fields.TextField):
def to_json(self, value):
if value:
return encrypt_str(str(value))
def from_json(self, value):
if value:
return decrypt_str(value)
class TimeField(JSONFieldMixin, fields.TimeField):
def to_json(self, value):
if value:

View file

@ -1,6 +1,7 @@
from django.test import TestCase
from catalog.book.tests import *
from catalog.common.jsondata import decrypt_str, encrypt_str
from catalog.game.tests import *
from catalog.movie.tests import *
from catalog.music.tests import *
@ -39,3 +40,9 @@ class CatalogCase(TestCase):
self.hyperion_print.merge_to(self.hyperion_ebook)
resloved = Item.get_by_url(self.hyperion_hardcover.url, True)
self.assertEqual(resloved, self.hyperion_ebook)
def test_encypted_field(self):
o = "Hello, World!"
e = encrypt_str(o)
d = decrypt_str(e)
self.assertEqual(o, d)

View file

@ -55,6 +55,7 @@ dependencies = [
"urlman",
"validators",
"deepmerge>=1.1.1",
"django-typed-models>=0.14.0",
]
[tool.rye]

View file

@ -103,6 +103,7 @@ django-slack==5.19.0
django-stubs==5.0.2
django-stubs-ext==5.0.2
# via django-stubs
django-typed-models==0.14.0
django-tz-detect==0.5.0
django-user-messages==1.0.0
djlint==1.34.1

View file

@ -82,6 +82,7 @@ django-rq==2.10.2
django-sass-processor==1.4.1
django-simple-history==3.7.0
django-slack==5.19.0
django-typed-models==0.14.0
django-tz-detect==0.5.0
django-user-messages==1.0.0
dnspython==2.6.1