From dacc69ea5cc3a35faf05a95e8976cd9a1fdec621 Mon Sep 17 00:00:00 2001 From: NavaL Date: Fri, 22 Jan 2016 16:00:17 +0100 Subject: re-introduced logout functionality for multi-user Issue #576 --- service/pixelated/resources/features_resource.py | 20 +++++++++++---- service/pixelated/resources/login_resource.py | 1 + service/pixelated/resources/logout_resource.py | 14 ++++++++++ service/pixelated/resources/root_resource.py | 6 +++-- service/pixelated/resources/session.py | 3 +++ .../test/unit/resources/test_logout_resources.py | 30 ++++++++++++++++++++++ 6 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 service/pixelated/resources/logout_resource.py create mode 100644 service/test/unit/resources/test_logout_resources.py diff --git a/service/pixelated/resources/features_resource.py b/service/pixelated/resources/features_resource.py index 958c1414..c8cad2d3 100644 --- a/service/pixelated/resources/features_resource.py +++ b/service/pixelated/resources/features_resource.py @@ -18,21 +18,31 @@ from pixelated.resources import respond_json import os from twisted.web.resource import Resource +from pixelated.resources.logout_resource import LogoutResource + class FeaturesResource(Resource): DISABLED_FEATURES = ['draftReply'] isLeaf = True - def render_GET(self, request): - dispatcher_features = {} - - if os.environ.get('DISPATCHER_LOGOUT_URL'): - dispatcher_features['logout'] = os.environ.get('DISPATCHER_LOGOUT_URL') + def __init__(self, multi_user=False): + Resource.__init__(self) + self._multi_user = multi_user + def render_GET(self, request): + dispatcher_features = self._dispatcher_features() disabled_features = self._disabled_features() return respond_json( {'disabled_features': disabled_features, 'dispatcher_features': dispatcher_features}, request) + def _dispatcher_features(self): + dispatcher_features = {} + if os.environ.get('DISPATCHER_LOGOUT_URL'): + dispatcher_features['logout'] = os.environ.get('DISPATCHER_LOGOUT_URL') + if self._multi_user: + dispatcher_features['logout'] = '/%s' % LogoutResource.BASE_URL + return dispatcher_features + def _disabled_features(self): disabled_features = [default_disabled_feature for default_disabled_feature in self.DISABLED_FEATURES] if os.environ.get('FEEDBACK_URL') is None: diff --git a/service/pixelated/resources/login_resource.py b/service/pixelated/resources/login_resource.py index b0e8ac3b..b249a67e 100644 --- a/service/pixelated/resources/login_resource.py +++ b/service/pixelated/resources/login_resource.py @@ -30,6 +30,7 @@ log = logging.getLogger(__name__) class LoginResource(BaseResource): + BASE_URL = 'login' def __init__(self, services_factory, portal=None): BaseResource.__init__(self, services_factory) diff --git a/service/pixelated/resources/logout_resource.py b/service/pixelated/resources/logout_resource.py new file mode 100644 index 00000000..9fd16451 --- /dev/null +++ b/service/pixelated/resources/logout_resource.py @@ -0,0 +1,14 @@ +from pixelated.resources import BaseResource +from twisted.web import util + +from pixelated.resources.login_resource import LoginResource + + +class LogoutResource(BaseResource): + BASE_URL = "logout" + isLeaf = True + + def render_GET(self, request): + session = self.get_session(request) + session.expire() + return util.redirectTo("/%s" % LoginResource.BASE_URL, request) diff --git a/service/pixelated/resources/root_resource.py b/service/pixelated/resources/root_resource.py index a1ed876e..61df0f39 100644 --- a/service/pixelated/resources/root_resource.py +++ b/service/pixelated/resources/root_resource.py @@ -23,6 +23,7 @@ from pixelated.resources.contacts_resource import ContactsResource from pixelated.resources.features_resource import FeaturesResource from pixelated.resources.feedback_resource import FeedbackResource from pixelated.resources.login_resource import LoginResource +from pixelated.resources.logout_resource import LogoutResource from pixelated.resources.user_settings_resource import UserSettingsResource from pixelated.resources.mail_resource import MailResource from pixelated.resources.mails_resource import MailsResource @@ -60,13 +61,14 @@ class RootResource(BaseResource): self.putChild('keys', KeysResource(self._services_factory)) self.putChild(AttachmentsResource.BASE_URL, AttachmentsResource(self._services_factory)) self.putChild('contacts', ContactsResource(self._services_factory)) - self.putChild('features', FeaturesResource()) + self.putChild('features', FeaturesResource(portal)) self.putChild('tags', TagsResource(self._services_factory)) self.putChild('mails', MailsResource(self._services_factory)) self.putChild('mail', MailResource(self._services_factory)) self.putChild('feedback', FeedbackResource(self._services_factory)) self.putChild('user-settings', UserSettingsResource(self._services_factory)) - self.putChild('login', LoginResource(self._services_factory, portal)) + self.putChild(LoginResource.BASE_URL, LoginResource(self._services_factory, portal)) + self.putChild(LogoutResource.BASE_URL, LogoutResource(self._services_factory)) self._mode = MODE_RUNNING diff --git a/service/pixelated/resources/session.py b/service/pixelated/resources/session.py index 76b54901..9ade8d29 100644 --- a/service/pixelated/resources/session.py +++ b/service/pixelated/resources/session.py @@ -32,5 +32,8 @@ class PixelatedSession(object): def is_logged_in(self): return self.user_uuid is not None + def expire(self): + self.user_uuid = None + registerAdapter(PixelatedSession, Session, IPixelatedSession) diff --git a/service/test/unit/resources/test_logout_resources.py b/service/test/unit/resources/test_logout_resources.py new file mode 100644 index 00000000..bb0aea9e --- /dev/null +++ b/service/test/unit/resources/test_logout_resources.py @@ -0,0 +1,30 @@ +from mock import patch +from mockito import mock +from twisted.trial import unittest +from twisted.web.test.requesthelper import DummyRequest + +from pixelated.resources.logout_resource import LogoutResource +from test.unit.resources import DummySite + + +class TestLogoutResource(unittest.TestCase): + def setUp(self): + self.services_factory = mock() + self.resource = LogoutResource(self.services_factory) + self.web = DummySite(self.resource) + + @patch('twisted.web.util.redirectTo') + def test_logout(self, mock_redirect): + request = DummyRequest(['/logout']) + + mock_redirect.return_value = 'haha' + + d = self.web.get(request) + + def expire_session_and_redirect(_): + session = self.resource.get_session(request) + self.assertFalse(session.is_logged_in()) + mock_redirect.assert_called_once_with('/login', request) + + d.addCallback(expire_session_and_redirect) + return d -- cgit v1.2.3