From 69db1cfb7071f6dcf69e187c4ea38d6a63a6f557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Israel=20Saeta=20P=C3=A9rez?= Date: Sat, 10 Jun 2017 16:39:19 +0200 Subject: [PATCH] Allow usernames with plus signs in unblock view (#77) This fixes bug #GH76 where an exception like ``` Reverse for 'defender_unblock_username_view' with arguments '(u'user+test@domain.tld',)' and keyword arguments '{}' not found. 1 pattern(s) tried: [u'admin/defender/blocks/username/(?P[A-Za-z0-9-._@]+)/unblock$'] ``` was raised when trying to access the `/admin/defender/blocks/` URL when a user with a plus sign had been locked out. --- defender/test_urls.py | 4 +++- defender/tests.py | 10 ++++++++++ defender/urls.py | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/defender/test_urls.py b/defender/test_urls.py index d9b2e14..58a94ba 100644 --- a/defender/test_urls.py +++ b/defender/test_urls.py @@ -1,6 +1,8 @@ from django.conf.urls import url, include from django.contrib import admin +from .urls import urlpatterns as original_urlpatterns + urlpatterns = [ url(r'^admin/', include(admin.site.urls)), -] +] + original_urlpatterns diff --git a/defender/tests.py b/defender/tests.py index f64206b..c896214 100644 --- a/defender/tests.py +++ b/defender/tests.py @@ -532,6 +532,16 @@ class AccessAttemptTest(DefenderTestCase): from .admin import AccessAttemptAdmin AccessAttemptAdmin + def test_unblock_view_user_with_plus(self): + """ + There is an available admin view for unblocking a user + with a plus sign in the username. + + Regression test for #GH76. + """ + reverse('defender_unblock_username_view', + kwargs={'username': 'user+test@test.tld'}) + def test_decorator_middleware(self): # because watch_login is called twice in this test (once by the # middleware and once by the decorator) we have half as many attempts diff --git a/defender/urls.py b/defender/urls.py index 42d2852..c808029 100644 --- a/defender/urls.py +++ b/defender/urls.py @@ -6,7 +6,7 @@ urlpatterns = [ name="defender_blocks_view"), url(r'^blocks/ip/(?P[A-Za-z0-9-._]+)/unblock$', unblock_ip_view, name="defender_unblock_ip_view"), - url(r'^blocks/username/(?P[A-Za-z0-9-._@]+)/unblock$', + url(r'^blocks/username/(?P[A-Za-z0-9-._@\+]+)/unblock$', unblock_username_view, name="defender_unblock_username_view"), ]