From 053d51e8c6484f95b43c7b45e5b42fcb3e89784c Mon Sep 17 00:00:00 2001 From: NavaL Date: Thu, 19 May 2016 11:51:43 +0200 Subject: when invalid soledad auth token, it logs user out if multi-user and stops the reactor if single-user mode Issue #689 --- service/pixelated/application.py | 25 +++++++++++++++++-------- service/test/unit/test_application.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 8 deletions(-) (limited to 'service') diff --git a/service/pixelated/application.py b/service/pixelated/application.py index 69af27b9..2474b79b 100644 --- a/service/pixelated/application.py +++ b/service/pixelated/application.py @@ -78,6 +78,9 @@ class SingleUserServicesFactory(object): def services(self, user_id): return self._services + def log_out_user(self, user_id): + reactor.stop() + class UserAgentMode(object): def __init__(self, is_single_user): @@ -132,23 +135,29 @@ def initialize(): services_factory = _create_service_factory(args) resource = RootResource(services_factory) - deferred = _start_mode(args, resource, services_factory) + start_async = _start_mode(args, resource, services_factory) + add_top_level_system_callbacks(start_async, services_factory) + log.info('Running the reactor') + reactor.run() + + +def add_top_level_system_callbacks(deferred, services_factory): def _quit_on_error(failure): failure.printTraceback() reactor.stop() - def _register_shutdown_on_token_expire(leap_session): - register(events.SOLEDAD_INVALID_AUTH_TOKEN, lambda *unused: reactor.stop()) + def _log_user_out(user_data): + log.info('Invalid soledad token, logging out %s' % user_data) + services_factory.log_out_user(user_data['uuid']) + + def _log_user_out_on_token_expire(leap_session): + register(events.SOLEDAD_INVALID_AUTH_TOKEN, _log_user_out) return leap_session - deferred.addCallback(_register_shutdown_on_token_expire) + deferred.addCallback(_log_user_out_on_token_expire) deferred.addErrback(_quit_on_error) - log.info('Running the reactor') - - reactor.run() - def _start_mode(args, resource, services_factory): if services_factory.mode.is_single_user: diff --git a/service/test/unit/test_application.py b/service/test/unit/test_application.py index 5f7f9c74..7fb2b9ff 100644 --- a/service/test/unit/test_application.py +++ b/service/test/unit/test_application.py @@ -1,5 +1,6 @@ import unittest +from leap.common.events import catalog as events from mock import patch, MagicMock, ANY import pixelated @@ -73,3 +74,34 @@ class ApplicationTest(unittest.TestCase): d.addCallback(_assert) return d + + @patch('leap.common.events.client') + @patch('pixelated.application.reactor') + @patch('pixelated.application.services.Services') + def test_should_log_user_out_if_invalid_soledad_token(self, services_mock, reactor_mock, events_mock): + app_mock = MagicMock() + services_factory_mock = MagicMock() + + mock_service_log_user_out = MagicMock(return_value=None) + services_factory_mock.log_out_user = mock_service_log_user_out + + leap_session = MagicMock() + register_mock = events_mock.register + register_mock.register.return_value = None + + config = ApplicationTest.MockConfig(12345, '127.0.0.1') + d = pixelated.application.start_user_agent_in_single_user_mode(app_mock, services_factory_mock, config.home, leap_session) + + pixelated.application.add_top_level_system_callbacks(d, services_factory_mock) + + def _assert_user_logged_out(_): + used_arguments = register_mock.call_args[0] + self.assertIsNotNone(used_arguments) + soledad_invalid_auth_event = used_arguments[0] + self.assertEqual(soledad_invalid_auth_event, events.SOLEDAD_INVALID_AUTH_TOKEN) + used_log_out_method = used_arguments[1] + used_log_out_method({'uuid': 'some_uuid'}) + mock_service_log_user_out.assert_called_once_with('some_uuid') + + d.addCallback(_assert_user_logged_out) + return d -- cgit v1.2.3