changeset 1718:f78bee8eec78 beta

reduce cookie size for better support of client side sessions
author Marcin Kuzminski <marcin@python-works.com>
date Fri, 25 Nov 2011 19:25:10 +0200
parents 7ff304d3028f
children 4a28aff31a15
files rhodecode/controllers/admin/settings.py rhodecode/controllers/login.py rhodecode/lib/auth.py rhodecode/lib/base.py rhodecode/tests/__init__.py rhodecode/tests/functional/test_login.py
diffstat 6 files changed, 39 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/controllers/admin/settings.py	Fri Nov 25 17:41:42 2011 +0200
+++ b/rhodecode/controllers/admin/settings.py	Fri Nov 25 19:25:10 2011 +0200
@@ -47,8 +47,7 @@
 from rhodecode.model.scm import ScmModel
 from rhodecode.model.user import UserModel
 from rhodecode.model.db import User
-from rhodecode.model.notification import NotificationModel, \
-    EmailNotificationModel
+from rhodecode.model.notification import EmailNotificationModel
 
 log = logging.getLogger(__name__)
 
--- a/rhodecode/controllers/login.py	Fri Nov 25 17:41:42 2011 +0200
+++ b/rhodecode/controllers/login.py	Fri Nov 25 19:25:10 2011 +0200
@@ -58,7 +58,7 @@
             return redirect(url('home'))
 
         if request.POST:
-            #import Login Form validator class
+            # import Login Form validator class
             login_form = LoginForm()
             try:
                 c.form_result = login_form.to_python(dict(request.POST))
@@ -67,11 +67,12 @@
                 user = User.get_by_username(username, case_insensitive=True)
                 auth_user = AuthUser(user.user_id)
                 auth_user.set_authenticated()
-                session['rhodecode_user'] = auth_user
+                cs = auth_user.get_cookie_store()
+                session['rhodecode_user'] = cs
                 session.save()
 
-                log.info('user %s is now authenticated and stored in session',
-                         username)
+                log.info('user %s is now authenticated and stored in '
+                         'session, session attrs %s' % (username, cs))
                 user.update_lastlogin()
 
                 if c.came_from:
--- a/rhodecode/lib/auth.py	Fri Nov 25 17:41:42 2011 +0200
+++ b/rhodecode/lib/auth.py	Fri Nov 25 19:25:10 2011 +0200
@@ -134,7 +134,7 @@
     :param str_:
     :param salt:
     """
-    
+
     if salt is None:
         salt = _RandomNameSequence().next()
 
@@ -252,7 +252,7 @@
         return None
 
     user.update_lastlogin()
-    log.debug('User %s is now logged in by container authentication', 
+    log.debug('User %s is now logged in by container authentication',
               user.username)
     return user
 
@@ -303,13 +303,13 @@
         user_model = UserModel()
         self.anonymous_user = User.get_by_username('default')
         is_user_loaded = False
-        
+
         # try go get user by api key
         if self._api_key and self._api_key != self.anonymous_user.api_key:
             log.debug('Auth User lookup by API KEY %s', self._api_key)
             is_user_loaded = user_model.fill_data(self, api_key=self._api_key)
         # lookup by userid    
-        elif (self.user_id is not None and 
+        elif (self.user_id is not None and
               self.user_id != self.anonymous_user.user_id):
             log.debug('Auth User lookup by USER ID %s', self.user_id)
             is_user_loaded = user_model.fill_data(self, user_id=self.user_id)
@@ -326,7 +326,7 @@
         if not is_user_loaded:
             # if we cannot authenticate user try anonymous
             if self.anonymous_user.active is True:
-                user_model.fill_data(self,user_id=self.anonymous_user.user_id)
+                user_model.fill_data(self, user_id=self.anonymous_user.user_id)
                 # then we set this user is logged in
                 self.is_authenticated = True
             else:
@@ -356,6 +356,17 @@
         if self.user_id != self.anonymous_user.user_id:
             self.is_authenticated = authenticated
 
+    def get_cookie_store(self):
+        return {'username':self.username,
+                'user_id': self.user_id,
+                'is_authenticated':self.is_authenticated}
+
+    @classmethod
+    def from_cookie_store(cls, cookie_store):
+        user_id = cookie_store.get('user_id')
+        username = cookie_store.get('username')
+        api_key = cookie_store.get('api_key')
+        return AuthUser(user_id, api_key, username)
 
 def set_available_permissions(config):
     """
@@ -576,7 +587,8 @@
         self.repo_name = None
 
     def __call__(self, check_Location=''):
-        user = session.get('rhodecode_user', False)
+        cookie_store = session.get('rhodecode_user')
+        user = AuthUser.from_cookie_store(cookie_store)
         if not user:
             return False
         self.user_perms = user.permissions
--- a/rhodecode/lib/base.py	Fri Nov 25 17:41:42 2011 +0200
+++ b/rhodecode/lib/base.py	Fri Nov 25 19:25:10 2011 +0200
@@ -9,15 +9,16 @@
 from pylons.controllers.util import redirect
 from pylons.templating import render_mako as render
 
-from rhodecode import __version__
+from rhodecode import __version__, BACKENDS
+
 from rhodecode.lib import str2bool
 from rhodecode.lib.auth import AuthUser, get_container_username
 from rhodecode.lib.utils import get_repo_slug
 from rhodecode.model import meta
-from rhodecode.model.scm import ScmModel
-from rhodecode import BACKENDS
+
 from rhodecode.model.db import Repository
 from rhodecode.model.notification import NotificationModel
+from rhodecode.model.scm import ScmModel
 
 log = logging.getLogger(__name__)
 
@@ -46,21 +47,22 @@
         try:
             # make sure that we update permissions each time we call controller
             api_key = request.GET.get('api_key')
-            user_id = getattr(session.get('rhodecode_user'), 'user_id', None)
+            cookie_store = session.get('rhodecode_user') or {}
+            user_id = cookie_store.get('user_id', None)
             username = get_container_username(environ, config)
 
             auth_user = AuthUser(user_id, api_key, username)
             self.rhodecode_user = c.rhodecode_user = auth_user
             if not self.rhodecode_user.is_authenticated and \
                        self.rhodecode_user.user_id is not None:
-                self.rhodecode_user.set_authenticated(
-                                        getattr(session.get('rhodecode_user'),
-                                       'is_authenticated', False))
-            session['rhodecode_user'] = self.rhodecode_user
+                self.rhodecode_user\
+                    .set_authenticated(cookie_store.get('is_authenticated'))
+
+            session['rhodecode_user'] = self.rhodecode_user.get_cookie_store()
             session.save()
             return WSGIController.__call__(self, environ, start_response)
         finally:
-            log.debug('Request time: %.3fs' % (time.time()-start))
+            log.debug('Request time: %.3fs' % (time.time() - start))
             meta.Session.remove()
 
 
--- a/rhodecode/tests/__init__.py	Fri Nov 25 17:41:42 2011 +0200
+++ b/rhodecode/tests/__init__.py	Fri Nov 25 19:25:10 2011 +0200
@@ -79,7 +79,8 @@
             self.fail('could not login using %s %s' % (username, password))
 
         self.assertEqual(response.status, '302 Found')
-        self.assertEqual(response.session['rhodecode_user'].username, username)
+        self.assertEqual(response.session['rhodecode_user'].get('username'),
+                         username)
         return response.follow()
 
     def _get_logged_user(self):
--- a/rhodecode/tests/functional/test_login.py	Fri Nov 25 17:41:42 2011 +0200
+++ b/rhodecode/tests/functional/test_login.py	Fri Nov 25 19:25:10 2011 +0200
@@ -17,7 +17,7 @@
                                  {'username':'test_admin',
                                   'password':'test12'})
         self.assertEqual(response.status, '302 Found')
-        self.assertEqual(response.session['rhodecode_user'].username ,
+        self.assertEqual(response.session['rhodecode_user'].get('username') ,
                          'test_admin')
         response = response.follow()
         self.assertTrue('%s repository' % HG_REPO in response.body)
@@ -28,7 +28,7 @@
                                   'password':'test12'})
 
         self.assertEqual(response.status, '302 Found')
-        self.assertEqual(response.session['rhodecode_user'].username ,
+        self.assertEqual(response.session['rhodecode_user'].get('username') ,
                          'test_regular')
         response = response.follow()
         self.assertTrue('%s repository' % HG_REPO in response.body)