diff options
| author | Nick Pope <nick.pope@flightdataservices.com> | 2018-03-12 15:48:46 +0000 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-04-19 10:21:24 -0400 |
| commit | df90e462d91d3a77aa89b69d791bf17c2bf7ff9b (patch) | |
| tree | 5e154830e7ecac46e1faa47ff0e7ab3ff96ff701 /tests | |
| parent | c2598a6f4d3ddaf27e9d6d240e7efe664504d6ad (diff) | |
Fixed #29212 -- Doc'd redirect loop if @permission_required used with redirect_authenticated_user.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/auth_tests/test_views.py | 28 | ||||
| -rw-r--r-- | tests/auth_tests/urls.py | 24 |
2 files changed, 50 insertions, 2 deletions
diff --git a/tests/auth_tests/test_views.py b/tests/auth_tests/test_views.py index bb5bd7a087..723fd1142b 100644 --- a/tests/auth_tests/test_views.py +++ b/tests/auth_tests/test_views.py @@ -26,6 +26,7 @@ from django.db import connection from django.http import HttpRequest, QueryDict from django.middleware.csrf import CsrfViewMiddleware, get_token from django.test import Client, TestCase, override_settings +from django.test.client import RedirectCycleError from django.test.utils import patch_logger from django.urls import NoReverseMatch, reverse, reverse_lazy from django.utils.http import urlsafe_base64_encode @@ -883,6 +884,33 @@ class LoginRedirectAuthenticatedUser(AuthViewsTestCase): with self.assertRaisesMessage(ValueError, msg): self.client.get(url) + def test_permission_required_not_logged_in(self): + # Not logged in ... + with self.settings(LOGIN_URL=self.do_redirect_url): + # redirected to login. + response = self.client.get('/permission_required_redirect/', follow=True) + self.assertEqual(response.status_code, 200) + # exception raised. + response = self.client.get('/permission_required_exception/', follow=True) + self.assertEqual(response.status_code, 403) + # redirected to login. + response = self.client.get('/login_and_permission_required_exception/', follow=True) + self.assertEqual(response.status_code, 200) + + def test_permission_required_logged_in(self): + self.login() + # Already logged in... + with self.settings(LOGIN_URL=self.do_redirect_url): + # redirect loop encountered. + with self.assertRaisesMessage(RedirectCycleError, 'Redirect loop detected.'): + self.client.get('/permission_required_redirect/', follow=True) + # exception raised. + response = self.client.get('/permission_required_exception/', follow=True) + self.assertEqual(response.status_code, 403) + # exception raised. + response = self.client.get('/login_and_permission_required_exception/', follow=True) + self.assertEqual(response.status_code, 403) + class LoginSuccessURLAllowedHostsTest(AuthViewsTestCase): def test_success_url_allowed_hosts_same_host(self): diff --git a/tests/auth_tests/urls.py b/tests/auth_tests/urls.py index b69c554bc8..9dc23cee88 100644 --- a/tests/auth_tests/urls.py +++ b/tests/auth_tests/urls.py @@ -1,14 +1,14 @@ from django.conf.urls import url from django.contrib import admin from django.contrib.auth import views -from django.contrib.auth.decorators import login_required +from django.contrib.auth.decorators import login_required, permission_required from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth.urls import urlpatterns as auth_urlpatterns from django.contrib.messages.api import info from django.http import HttpRequest, HttpResponse from django.shortcuts import render from django.template import RequestContext, Template -from django.urls import reverse_lazy +from django.urls import path, reverse_lazy from django.views.decorators.cache import never_cache @@ -62,6 +62,22 @@ def userpage(request): pass +@permission_required('unknown.permission') +def permission_required_redirect(request): + pass + + +@permission_required('unknown.permission', raise_exception=True) +def permission_required_exception(request): + pass + + +@login_required +@permission_required('unknown.permission', raise_exception=True) +def login_and_permission_required_exception(request): + pass + + uid_token = r'(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})' # special urls for auth test cases @@ -119,6 +135,10 @@ urlpatterns = auth_urlpatterns + [ url(r'^login/allowed_hosts/$', views.LoginView.as_view(success_url_allowed_hosts={'otherserver'})), + path('permission_required_redirect/', permission_required_redirect), + path('permission_required_exception/', permission_required_exception), + path('login_and_permission_required_exception/', login_and_permission_required_exception), + # This line is only required to render the password reset with is_admin=True url(r'^admin/', admin.site.urls), ] |
