mirror of
https://github.com/haiwen/seahub.git
synced 2025-08-23 09:11:15 +00:00
81 lines
2.8 KiB
Python
81 lines
2.8 KiB
Python
|
|
||
|
|
||
|
from django.conf import settings
|
||
|
from django.contrib import auth
|
||
|
from django.contrib.auth.decorators import login_required
|
||
|
from django.core.exceptions import ImproperlyConfigured
|
||
|
from django.http import HttpResponse
|
||
|
from django.shortcuts import redirect
|
||
|
from django.utils.decorators import method_decorator
|
||
|
from django.views.generic import TemplateView
|
||
|
|
||
|
from urllib import quote
|
||
|
|
||
|
#Logout settings.
|
||
|
from shibboleth.app_settings import LOGOUT_URL, LOGOUT_REDIRECT_URL, LOGOUT_SESSION_KEY
|
||
|
|
||
|
class ShibbolethView(TemplateView):
|
||
|
"""
|
||
|
This is here to offer a Shib protected page that we can
|
||
|
route users through to login.
|
||
|
"""
|
||
|
template_name = 'shibboleth/user_info.html'
|
||
|
|
||
|
@method_decorator(login_required)
|
||
|
def dispatch(self, request, *args, **kwargs):
|
||
|
"""
|
||
|
Django docs say to decorate the dispatch method for
|
||
|
class based views.
|
||
|
https://docs.djangoproject.com/en/dev/topics/auth/
|
||
|
"""
|
||
|
return super(ShibbolethView, self).dispatch(request, *args, **kwargs)
|
||
|
|
||
|
def get(self, request, **kwargs):
|
||
|
"""Process the request."""
|
||
|
next = self.request.GET.get('next', None)
|
||
|
if next is not None:
|
||
|
return redirect(next)
|
||
|
return super(ShibbolethView, self).get(request)
|
||
|
|
||
|
def get_context_data(self, **kwargs):
|
||
|
context = super(ShibbolethView, self).get_context_data(**kwargs)
|
||
|
context['user'] = self.request.user
|
||
|
return context
|
||
|
|
||
|
class ShibbolethLoginView(TemplateView):
|
||
|
"""
|
||
|
Pass the user to the Shibboleth login page.
|
||
|
Some code borrowed from:
|
||
|
https://github.com/stefanfoulis/django-class-based-auth-views.
|
||
|
"""
|
||
|
redirect_field_name = "target"
|
||
|
|
||
|
def get(self, *args, **kwargs):
|
||
|
#Remove session value that is forcing Shibboleth reauthentication.
|
||
|
self.request.session.pop(LOGOUT_SESSION_KEY, None)
|
||
|
login = settings.LOGIN_URL + '?target=%s' % quote(self.request.GET.get(self.redirect_field_name))
|
||
|
return redirect(login)
|
||
|
|
||
|
class ShibbolethLogoutView(TemplateView):
|
||
|
"""
|
||
|
Pass the user to the Shibboleth logout page.
|
||
|
Some code borrowed from:
|
||
|
https://github.com/stefanfoulis/django-class-based-auth-views.
|
||
|
"""
|
||
|
redirect_field_name = "target"
|
||
|
|
||
|
def get(self, *args, **kwargs):
|
||
|
#Log the user out.
|
||
|
auth.logout(self.request)
|
||
|
#Set session key that middleware will use to force
|
||
|
#Shibboleth reauthentication.
|
||
|
self.request.session[LOGOUT_SESSION_KEY] = True
|
||
|
#Get target url in order of preference.
|
||
|
target = LOGOUT_REDIRECT_URL or\
|
||
|
quote(self.request.GET.get(self.redirect_field_name)) or\
|
||
|
quote(request.build_absolute_uri())
|
||
|
logout = LOGOUT_URL % target
|
||
|
return redirect(logout)
|
||
|
|
||
|
|