Skip to content

Commit 991344e

Browse files
committed
feat: #105 dedicated secret key for data encryption - Part 1
1 parent 73e98f7 commit 991344e

3 files changed

Lines changed: 39 additions & 1 deletion

File tree

django_email_learning/models.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from django.conf import settings
66
from django.db import models
77
from django.core.validators import MaxValueValidator
8+
from django.core.exceptions import ImproperlyConfigured
89
from cryptography.fernet import Fernet
910
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
1011
from cryptography.hazmat.primitives import hashes
@@ -79,7 +80,13 @@ def _fernet(self) -> Fernet:
7980
kdf = PBKDF2HMAC(
8081
algorithm=hashes.SHA256(), length=32, salt=FIXED_SALT, iterations=100000
8182
)
82-
key = base64.urlsafe_b64encode(kdf.derive(settings.SECRET_KEY.encode()))
83+
try:
84+
secret = settings.DJANGO_EMAIL_LEARNING["ENCRYPTION_SECRET_KEY"]
85+
except (AttributeError, KeyError):
86+
raise ImproperlyConfigured(
87+
"DJANGO_EMAIL_LEARNING['ENCRYPTION_SECRET_KEY'] must be set in settings.py"
88+
)
89+
key = base64.urlsafe_b64encode(kdf.derive(secret.encode()))
8390
return Fernet(key)
8491

8592
def _encrypt_password(self, password: str) -> str:

django_service/settings.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@
9898
}
9999
}
100100

101+
DJANGO_EMAIL_LEARNING = {
102+
"ENCRYPTION_SECRET_KEY": "your-very-secure-and-random-key",
103+
}
104+
101105
LOGGING = {
102106
"version": 1,
103107
"disable_existing_loggers": False,

tests/test_models/test_imap_connection.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django_email_learning.models import ImapConnection
2+
from django.core.exceptions import ImproperlyConfigured
23
import pytest
34

45

@@ -39,3 +40,29 @@ def test_imap_invalid_server_validation(invalid_server, imap_connection):
3940
def test_imap_valid_server_validation(valid_server, imap_connection):
4041
imap_connection.server = valid_server
4142
imap_connection.full_clean() # Should not raise
43+
44+
45+
def test_raise_improperly_configured_if_django_email_learning_config_missing(
46+
settings, db
47+
):
48+
delattr(settings, "DJANGO_EMAIL_LEARNING")
49+
with pytest.raises(ImproperlyConfigured):
50+
ImapConnection.objects.create(
51+
server="imap.example.com",
52+
port=993,
53+
email="user@example.com",
54+
password="my_secret_password",
55+
organization_id=1,
56+
)
57+
58+
59+
def test_raise_improperly_configured_if_encryption_key_missing(settings, db):
60+
settings.DJANGO_EMAIL_LEARNING = {}
61+
with pytest.raises(ImproperlyConfigured):
62+
ImapConnection.objects.create(
63+
server="imap.example.com",
64+
port=993,
65+
email="user@example.com",
66+
password="my_secret_password",
67+
organization_id=1,
68+
)

0 commit comments

Comments
 (0)