diff --git a/horizon/middleware.py b/horizon/middleware.py index 91906e8c71..5c510045d5 100644 --- a/horizon/middleware.py +++ b/horizon/middleware.py @@ -21,9 +21,9 @@ Middleware provided and used by Horizon. """ -import datetime import json import logging +import time from django.conf import settings # noqa from django.contrib.auth import REDIRECT_FIELD_NAME # noqa @@ -61,7 +61,7 @@ class HorizonMiddleware(object): timeout = 1800 last_activity = request.session.get('last_activity', None) - timestamp = datetime.datetime.now() + timestamp = int(time.time()) request.horizon = {'dashboard': None, 'panel': None, 'async_messages': []} @@ -98,7 +98,8 @@ class HorizonMiddleware(object): } ) - if last_activity and (timestamp - last_activity).seconds > timeout: + if (isinstance(last_activity, int) + and (timestamp - last_activity) > timeout): request.session.pop('last_activity') response = HttpResponseRedirect( '%s?next=%s' % (settings.LOGOUT_URL, request.path)) diff --git a/horizon/test/tests/middleware.py b/horizon/test/tests/middleware.py index 3c539b12ef..2a2ad41a07 100644 --- a/horizon/test/tests/middleware.py +++ b/horizon/test/tests/middleware.py @@ -15,7 +15,7 @@ # License for the specific language governing permissions and limitations # under the License. -import datetime +import time from django.conf import settings # noqa @@ -46,8 +46,7 @@ class MiddlewareTests(test.TestCase): timeout = settings.SESSION_TIMEOUT except AttributeError: timeout = 1800 - request.session['last_activity'] =\ - datetime.datetime.now() - datetime.timedelta(seconds=timeout + 10) + request.session['last_activity'] = int(time.time()) - (timeout + 10) mw = middleware.HorizonMiddleware() resp = mw.process_request(request) self.assertEqual(resp.status_code, 302) diff --git a/openstack_dashboard/settings.py b/openstack_dashboard/settings.py index ad36e1afb8..9871152b32 100644 --- a/openstack_dashboard/settings.py +++ b/openstack_dashboard/settings.py @@ -171,10 +171,15 @@ SESSION_COOKIE_HTTPONLY = True SESSION_EXPIRE_AT_BROWSER_CLOSE = True SESSION_COOKIE_SECURE = False SESSION_TIMEOUT = 1800 + # When using cookie-based sessions, log error when the session cookie exceeds # the following size (common browsers drop cookies above a certain size): SESSION_COOKIE_MAX_SIZE = 4093 +# when doing upgrades, it may be wise to stick to PickleSerializer +# TODO(mrunge): remove after Icehouse +SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer' + gettext_noop = lambda s: s LANGUAGES = ( ('en', gettext_noop('English')),