diff options
author | Aurélien Bompard <aurelien@bompard.org> | 2013-02-12 09:40:48 +0100 |
---|---|---|
committer | Aurélien Bompard <aurelien@bompard.org> | 2013-02-12 10:47:51 +0100 |
commit | 0b0395fe000957b336d0ece6b23af0083a0853ab (patch) | |
tree | f3e04da6c601c345f98f954df9b948aac08e1c0d /hyperkitty/middleware.py | |
parent | 13d11029ba45fa49855b3e346e3425ac1dce0702 (diff) | |
download | hyperkitty-0b0395fe000957b336d0ece6b23af0083a0853ab.tar.gz hyperkitty-0b0395fe000957b336d0ece6b23af0083a0853ab.tar.xz hyperkitty-0b0395fe000957b336d0ece6b23af0083a0853ab.zip |
SSL redirect middleware
Redirect the login page to SSL, and keep browsing in SSL while the user
is logged in.
Diffstat (limited to 'hyperkitty/middleware.py')
-rw-r--r-- | hyperkitty/middleware.py | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/hyperkitty/middleware.py b/hyperkitty/middleware.py index 4952db2..7a92e25 100644 --- a/hyperkitty/middleware.py +++ b/hyperkitty/middleware.py @@ -29,3 +29,43 @@ class PaginationMiddleware(object): request.page = int(request.REQUEST['page']) except (KeyError, ValueError, TypeError): request.page = 1 + + + +# http://stackoverflow.com/questions/2799450/django-https-for-just-login-page + +from django.conf import settings +from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect, get_host + +SSL = 'SSL' + +class SSLRedirect(object): + + def process_view(self, request, view_func, view_args, view_kwargs): + secure = view_kwargs.pop(SSL, False) + if request.user.is_authenticated(): + secure = True + if settings.DEBUG: # Development server (runserver) + secure = False + + if not secure == self._is_secure(request): + return self._redirect(request, secure) + + def _is_secure(self, request): + if request.is_secure(): + return True + + #Handle the Webfaction case until this gets resolved in the request.is_secure() + if 'HTTP_X_FORWARDED_SSL' in request.META: + return request.META['HTTP_X_FORWARDED_SSL'] == 'on' + + return False + + def _redirect(self, request, secure): + protocol = secure and "https" or "http" + newurl = "%s://%s%s" % (protocol, get_host(request), request.get_full_path()) + if settings.DEBUG and request.method == 'POST': + raise RuntimeError, \ + """Django can't perform a SSL redirect while maintaining POST data. + Please structure your views so that redirects only occur during GETs.""" + return HttpResponsePermanentRedirect(newurl) |