From 9b7e967c7f8dc9a49e2550cd70af5cf2ca6b8a60 Mon Sep 17 00:00:00 2001 From: jpic Date: Thu, 17 May 2012 16:54:13 +0200 Subject: [PATCH] Implemented session extension dialog, consistency cleanups --- README.rst | 4 +- session_security/middleware.py | 25 ++++-- session_security/settings.py | 14 ++- .../templates/session_security.html | 90 +++++++++++++++++++ .../templates/session_security/script.js | 10 --- session_security/urls.py | 11 +++ session_security/views.py | 15 ++++ 7 files changed, 146 insertions(+), 23 deletions(-) create mode 100644 session_security/templates/session_security.html delete mode 100644 session_security/templates/session_security/script.js create mode 100644 session_security/urls.py create mode 100644 session_security/views.py diff --git a/README.rst b/README.rst index 464f837..3ec2a8a 100644 --- a/README.rst +++ b/README.rst @@ -1,2 +1,2 @@ -django-session-expiry -===================== \ No newline at end of file +django-session-security +======================= diff --git a/session_security/middleware.py b/session_security/middleware.py index 8962115..6fc3774 100644 --- a/session_security/middleware.py +++ b/session_security/middleware.py @@ -3,20 +3,27 @@ from django import http from django.contrib.auth import logout -from settings import LOGIN_URL, SECONDS +from settings import LOGOUT_URL, LOGIN_URL, EXPIRE_AFTER, WARN_BEFORE class SessionSecurityMiddleware(object): def process_request(self, request): + if not request.user.is_authenticated(): + return + now = datetime.datetime.now() - last_activity = request.session.get('last_activity', now) - delta = now - last_activity - - if delta.seconds > SECONDS and request.path_info != LOGIN_URL: + data = request.session.get('session_security', { + 'LOGOUT_URL': LOGOUT_URL, + 'LOGIN_URL': LOGIN_URL, + 'EXPIRE_AFTER': EXPIRE_AFTER, + 'WARN_BEFORE': WARN_BEFORE, + 'last_activity': now, + }) + + delta = now - data['last_activity'] + if delta.seconds > EXPIRE_AFTER and request.path_info != LOGIN_URL: logout(request) return http.HttpResponseRedirect( '%s?next=%s' % (LOGIN_URL, request.path_info)) - request.session['last_activity'] = now - # javascript should have a margin of 10 for page rendering - request.session['session_expiry_seconds'] = SECONDS - 10 - + data['last_activity'] = now + request.session['session_security'] = data diff --git a/session_security/settings.py b/session_security/settings.py index 679051b..9465dbc 100644 --- a/session_security/settings.py +++ b/session_security/settings.py @@ -2,11 +2,21 @@ from django.conf import settings -__all__ = ['SECONDS', 'LOGIN_URL'] +__all__ = ['EXPIRE_AFTER', 'WARN_BEFORE', 'LOGIN_URL', 'LOGOUT_URL'] -SECONDS = getattr(settings, 'SESSION_EXPIRY_SECONDS', 600) +EXPIRE_AFTER = getattr(settings, 'SESSION_SECURITY_EXPIRE_AFTER', 600) + +WARN_BEFORE = getattr(settings, 'SESSION_SECURITY_WARN_BEFORE', 20) LOGIN_URL = settings.LOGIN_URL +LOGOUT_URL = getattr(settings, 'LOGOUT_URL', False) + +if not LOGOUT_URL: + if 'pinax.apps.account' in settings.INSTALLED_APPS: + LOGOUT_URL = urlresolvers.reverse('acct_logout') + else: + raise Exception('LOGOUT_URL not configured, session_security cannot work') + if not getattr(settings, 'SESSION_EXPIRE_AT_BROWSER_CLOSE', False): warnings.warn('settings.SESSION_EXPIRE_AT_BROWSER_CLOSE is not True') diff --git a/session_security/templates/session_security.html b/session_security/templates/session_security.html new file mode 100644 index 0000000..97a4870 --- /dev/null +++ b/session_security/templates/session_security.html @@ -0,0 +1,90 @@ +{% load i18n %} +{% load url from future %} + + + + + + diff --git a/session_security/templates/session_security/script.js b/session_security/templates/session_security/script.js deleted file mode 100644 index 46ded62..0000000 --- a/session_security/templates/session_security/script.js +++ /dev/null @@ -1,10 +0,0 @@ -{% if request.user.is_authenticated %} - var session_expiry_seconds = {{ request.session.session_expiry_seconds }}; - setTimeout(function() { - alert('You session is about to expire !'); - }, session_expiry_seconds*1000-10*1000); - setTimeout(function() { - alert('Session expired'); - }, session_expiry_seconds*1000); -{% endif %} - diff --git a/session_security/urls.py b/session_security/urls.py new file mode 100644 index 0000000..bfa27b1 --- /dev/null +++ b/session_security/urls.py @@ -0,0 +1,11 @@ +from django.conf.urls.defaults import url, patterns + +from views import ExtendSessionView + +urlpatterns = patterns('', + url( + 'extend/$', + ExtendSessionView.as_view(), + name='session_security_extend_session', + ), +) diff --git a/session_security/views.py b/session_security/views.py new file mode 100644 index 0000000..e1d50ef --- /dev/null +++ b/session_security/views.py @@ -0,0 +1,15 @@ +import datetime + +from django.views import generic +from django import http + +from settings import EXPIRE_AFTER, WARN_BEFORE + +class ExtendSessionView(generic.View): + def post(self, request, *args, **kwargs): + if not request.user.is_authenticated(): + return http.HttpResponseForbidden() + + now = datetime.datetime.now() + request.session['session_security']['last_activity'] = now + return http.HttpResponse()