summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTulio Casagrande <tcasagra@thoughtworks.com>2017-02-10 14:12:04 -0200
committerTulio Casagrande <tcasagra@thoughtworks.com>2017-02-10 16:28:44 -0200
commit29034222ca16c29e9301b769802a2e49446e9075 (patch)
tree036c55124cd593529e851010152ad6a11ba2c1c4
parentcf7d2c516a897e6b19e0e11fd8c104e68a0951ad (diff)
[#907] Add login status to session
-rw-r--r--service/pixelated/resources/login_resource.py14
-rw-r--r--service/pixelated/resources/session.py15
-rw-r--r--service/test/unit/resources/test_login_resource.py45
3 files changed, 68 insertions, 6 deletions
diff --git a/service/pixelated/resources/login_resource.py b/service/pixelated/resources/login_resource.py
index 424e051b..ddc22b2a 100644
--- a/service/pixelated/resources/login_resource.py
+++ b/service/pixelated/resources/login_resource.py
@@ -149,15 +149,19 @@ class LoginResource(BaseResource):
defer.returnValue(user_auth)
def _complete_bootstrap(self, user_auth, request):
- def login_error(error):
+ def login_error(error, session):
log.error('Login error during %s services setup: %s \n %s' % (user_auth.username, error.getErrorMessage(), error.getTraceback()))
+ session.login_error()
- def set_session_cookies(_):
- session = IPixelatedSession(request.getSession())
+ def set_session_cookies(_, session):
session.user_uuid = user_auth.uuid
+ session.login_completed()
language = parse_accept_language(request.getAllHeaders())
password = request.args['password'][0]
+ session = IPixelatedSession(request.getSession())
+ session.login_started()
+
d = self._bootstrap_user_services.setup(user_auth, password, language)
- d.addCallback(set_session_cookies)
- d.addErrback(login_error)
+ d.addCallback(set_session_cookies, session)
+ d.addErrback(login_error, session)
diff --git a/service/pixelated/resources/session.py b/service/pixelated/resources/session.py
index 9ade8d29..84f2ebeb 100644
--- a/service/pixelated/resources/session.py
+++ b/service/pixelated/resources/session.py
@@ -21,6 +21,7 @@ from twisted.web.server import Session
class IPixelatedSession(Interface):
user_uuid = Attribute('The uuid of the currently logged in user')
+ login_status = Attribute('The status during user login')
class PixelatedSession(object):
@@ -28,12 +29,26 @@ class PixelatedSession(object):
def __init__(self, session):
self.user_uuid = None
+ self.login_status = None
def is_logged_in(self):
return self.user_uuid is not None
def expire(self):
self.user_uuid = None
+ self.login_status = None
+
+ def login_started(self):
+ self.login_status = 'started'
+
+ def login_completed(self):
+ self.login_status = 'completed'
+
+ def login_error(self):
+ self.login_status = 'error'
+
+ def check_login_status(self):
+ return self.login_status
registerAdapter(PixelatedSession, Session, IPixelatedSession)
diff --git a/service/test/unit/resources/test_login_resource.py b/service/test/unit/resources/test_login_resource.py
index cec57123..6dea7abb 100644
--- a/service/test/unit/resources/test_login_resource.py
+++ b/service/test/unit/resources/test_login_resource.py
@@ -259,7 +259,7 @@ class TestLoginPOST(unittest.TestCase):
@patch('pixelated.config.leap.BootstrapUserServices.setup')
@patch('pixelated.authentication.Authenticator.authenticate')
- def test_successful_adds_cookies_to_indicat_logged_in_status_when_services_are_loaded(self, mock_authenticate, mock_user_bootstrap_setup):
+ def test_successful_adds_cookies_to_indicate_logged_in_status_when_services_are_loaded(self, mock_authenticate, mock_user_bootstrap_setup):
mock_authenticate.return_value = self.user_auth
irrelevant = None
mock_user_bootstrap_setup.return_value = defer.succeed(irrelevant)
@@ -271,3 +271,46 @@ class TestLoginPOST(unittest.TestCase):
d.addCallback(assert_login_setup_service_for_user)
return d
+
+ @patch('pixelated.resources.session.PixelatedSession.login_started')
+ @patch('pixelated.authentication.Authenticator.authenticate')
+ def test_session_adds_login_started_status_after_authentication(self, mock_authenticate, mock_login_started):
+ mock_authenticate.return_value = self.user_auth
+
+ d = self.web.get(self.request)
+
+ def assert_login_started_called(_):
+ mock_login_started.assert_called_once()
+
+ d.addCallback(assert_login_started_called)
+ return d
+
+ @patch('pixelated.resources.session.PixelatedSession.login_completed')
+ @patch('pixelated.config.leap.BootstrapUserServices.setup')
+ @patch('pixelated.authentication.Authenticator.authenticate')
+ def test_session_adds_login_completed_status_when_services_setup_finishes(self, mock_authenticate, mock_user_bootstrap_setup, mock_login_completed):
+ mock_authenticate.return_value = self.user_auth
+ mock_user_bootstrap_setup.return_value = defer.succeed(None)
+
+ d = self.web.get(self.request)
+
+ def assert_login_completed_called(_):
+ mock_login_completed.assert_called_once()
+
+ d.addCallback(assert_login_completed_called)
+ return d
+
+ @patch('pixelated.resources.session.PixelatedSession.login_error')
+ @patch('pixelated.config.leap.BootstrapUserServices.setup')
+ @patch('pixelated.authentication.Authenticator.authenticate')
+ def test_session_adds_login_error_status_when_services_setup_gets_error(self, mock_authenticate, mock_user_bootstrap_setup, mock_login_error):
+ mock_authenticate.return_value = self.user_auth
+ mock_user_bootstrap_setup.return_value = defer.fail(Exception('Could not setup user services'))
+
+ d = self.web.get(self.request)
+
+ def assert_login_error_called(_):
+ mock_login_error.assert_called_once()
+
+ d.addCallback(assert_login_error_called)
+ return d