diff --git a/core/middleware.py b/core/middleware.py index 5f5c945b..fe4087c3 100644 --- a/core/middleware.py +++ b/core/middleware.py @@ -21,6 +21,7 @@ from django.contrib.auth import get_user from django.contrib.auth.middleware import ( AuthenticationMiddleware as DjangoAuthenticationMiddleware, ) +from django.http import HttpResponse from django.utils.functional import SimpleLazyObject module, klass = settings.AUTH_ANONYMOUS_MODEL.rsplit(".", 1) @@ -70,3 +71,7 @@ class SignalRequestMiddleware: def __call__(self, request): _threadlocal.request = request return self.get_response(request) + + +def custom_honeypot_error(request, context): + return HttpResponse("Upon reading this, the http client was enlightened.") diff --git a/core/tests.py b/core/tests.py index a5e885bf..5be0b2e6 100644 --- a/core/tests.py +++ b/core/tests.py @@ -80,13 +80,15 @@ class TestUserRegistration: assert response.status_code == 200 error_html = f'' assertInHTML(error_html, str(response.content.decode())) + assert not User.objects.filter(email=payload["email"]).exists() - def test_register_honeypot_fail(self, client, valid_payload): + def test_register_honeypot_fail(self, client: Client, valid_payload): payload = valid_payload | { settings.HONEYPOT_FIELD_NAME: settings.HONEYPOT_VALUE + "random" } response = client.post(reverse("core:register"), payload) - assert response.status_code == 400 + assert response.status_code == 200 + assert not User.objects.filter(email=payload["email"]).exists() def test_register_user_form_fail_already_exists( self, client: Client, valid_payload @@ -152,7 +154,8 @@ class TestUserLogin: settings.HONEYPOT_FIELD_NAME: settings.HONEYPOT_VALUE + "incorrect", }, ) - assert response.status_code == 400 + assert response.status_code == 200 + assert response.wsgi_request.user.is_anonymous def test_login_success(self, client, user): """ @@ -167,6 +170,7 @@ class TestUserLogin: }, ) assertRedirects(response, reverse("core:index")) + assert response.wsgi_request.user == user @pytest.mark.parametrize( diff --git a/sith/settings.py b/sith/settings.py index ab311a85..f668d73a 100644 --- a/sith/settings.py +++ b/sith/settings.py @@ -41,6 +41,7 @@ import os import sys import sentry_sdk +from django.utils.module_loading import import_string from django.utils.translation import gettext_lazy as _ from sentry_sdk.integrations.django import DjangoIntegration @@ -58,6 +59,12 @@ SECRET_KEY = "(4sjxvhz@m5$0a$j0_pqicnc$s!vbve)z+&++m%g%bjhlz4+g2" HONEYPOT_FIELD_NAME = "body2" HONEYPOT_VALUE = "content" +# Make honeypot errors less suspicious +# Since the app is not loaded yet, we wrap the import_string function in a lambda call to lazy load it +HONEYPOT_RESPONDER = lambda request, context: import_string( + "core.middleware.custom_honeypot_error" +)(request, context) + # SECURITY WARNING: don't run with debug turned on in production! DEBUG = False TESTING = "pytest" in sys.modules