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 @@ def test_admin(self): 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 @@ 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"), ]