Skip to content

Commit

Permalink
Compatibility with Django > 1.10
Browse files Browse the repository at this point in the history
Changes to reflect changes after Django 1.10:

  - is_authenticated is a property
  - authenticate() takes request param
  - change to reverse location
  - login and logout are now class-based views in `django.contrib.auth`
  - added test_middleware to confirm middleware match requests for login
	and logout views
  • Loading branch information
Jordan Reiter authored and Jordan Reiter committed Mar 22, 2020
1 parent b9a7658 commit bf1173a
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 9 deletions.
2 changes: 1 addition & 1 deletion cas/backends.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ class CASBackend(object):
supports_object_permissions = False
supports_inactive_user = False

def authenticate(self, ticket, service):
def authenticate(self, request, ticket, service):
"""
Verifies CAS ticket and gets or creates User object
NB: Use of PT to identify proxy
Expand Down
17 changes: 15 additions & 2 deletions cas/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,18 @@
from django.conf import settings
from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib.auth import logout as do_logout
from django.contrib.auth.views import login, logout
from django.core.urlresolvers import reverse
try:
from django.contrib.auth.views import login, logout
except ImportError:
from django.contrib.auth.views import LoginView, LogoutView
login = LoginView.as_view().view_class
logout = LogoutView.as_view().view_class
from django.http import HttpResponseRedirect, HttpResponseForbidden
from django.core.exceptions import ImproperlyConfigured
try:
from django.urls import reverse
except ImportError:
from django.core.urlresolvers import reverse
try:
from django.utils.deprecation import MiddlewareMixin
except ImportError:
Expand Down Expand Up @@ -49,6 +57,11 @@ def process_view(self, request, view_func, view_args, view_kwargs):
logout.
"""

try:
view_func = view_func.view_class
except AttributeError:
pass

if view_func == login:
return cas_login(request, *view_args, **view_kwargs)
elif view_func == logout:
Expand Down
4 changes: 2 additions & 2 deletions cas/tests/test_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ def test_user_auto_create(self, verify):
backend = CASBackend()

with self.settings(CAS_AUTO_CREATE_USER=False):
user = backend.authenticate('fake', 'fake')
user = backend.authenticate('fake', 'fake', 'fake')
self.assertIsNone(user)

with self.settings(CAS_AUTO_CREATE_USER=True):
user = backend.authenticate('fake', 'fake')
user = backend.authenticate('fake', 'fake', 'fake')
self.assertEquals(user.username, username)
45 changes: 45 additions & 0 deletions cas/tests/test_middleware.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
try:
from unittest import mock
except ImportError:
import mock

from urllib.parse import quote_plus, urlencode

from django.conf import settings
from django.test import TestCase, Client, override_settings, modify_settings



@override_settings(MIDDLEWARE=[
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'cas.middleware.CASMiddleware'
])
class CASBackendTest(TestCase):

def setUp(self):
from cas.tests import factories
self.user = factories.UserFactory.create()
self.client = Client()

def test_login_calls_cas_login(self):
resp = self.client.get('/login/')
self.assertTrue(resp.has_header('Location'))
expected_url = '{}/login?{}'.format(
settings.CAS_SERVER_URL,
urlencode({
'service': 'http://testserver/login/?next={}'.format(quote_plus('/'))
})
)
self.assertRedirects(resp, expected_url, fetch_redirect_response=False)

def test_logout_calls_cas_logout(self):
resp = self.client.get('/logout/')
self.assertTrue(resp.has_header('Location'))
expected_url = '{}/logout?{}'.format(
settings.CAS_SERVER_URL,
urlencode({
'service': 'http://testserver/'
})
)
self.assertRedirects(resp, expected_url, fetch_redirect_response=False)
5 changes: 5 additions & 0 deletions cas/tests/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.urls import path, include

urlpatterns = [
path('', include('django.contrib.auth.urls')),
]
7 changes: 5 additions & 2 deletions cas/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@
from django.conf import settings
from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib import auth
from django.core.urlresolvers import reverse
try:
from django.urls import reverse
except ImportError:
from django.core.urlresolvers import reverse

from cas.models import PgtIOU
from cas.utils import get_cas_server_url
Expand Down Expand Up @@ -166,7 +169,7 @@ def login(request, next_page=None, required=False, gateway=False):
if not next_page:
next_page = _redirect_url(request)

if request.user.is_authenticated():
if request.user.is_authenticated:
return HttpResponseRedirect(next_page)

ticket = request.GET.get('ticket')
Expand Down
4 changes: 2 additions & 2 deletions run_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
'ENGINE': 'django.db.backends.sqlite3',
}
},
#ROOT_URLCONF='mailqueue.urls',
ROOT_URLCONF='cas.tests.urls',
INSTALLED_APPS=('django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
Expand All @@ -30,7 +30,7 @@
'ENGINE': 'django.db.backends.sqlite3',
}
},
#ROOT_URLCONF='mailqueue.urls',
ROOT_URLCONF='cas.tests.urls',
INSTALLED_APPS=('django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
Expand Down

0 comments on commit bf1173a

Please sign in to comment.