summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNavaL <mnandri@thoughtworks.com>2016-01-22 16:00:17 +0100
committerNavaL <mnandri@thoughtworks.com>2016-01-22 16:00:17 +0100
commitdacc69ea5cc3a35faf05a95e8976cd9a1fdec621 (patch)
tree79227ee17296b72f9ac1a93b3d8a486fcd21afdb
parentd0c5c8a05327e8af38ab4c3a2f6024ce582c9a99 (diff)
re-introduced logout functionality for multi-user
Issue #576
-rw-r--r--service/pixelated/resources/features_resource.py20
-rw-r--r--service/pixelated/resources/login_resource.py1
-rw-r--r--service/pixelated/resources/logout_resource.py14
-rw-r--r--service/pixelated/resources/root_resource.py6
-rw-r--r--service/pixelated/resources/session.py3
-rw-r--r--service/test/unit/resources/test_logout_resources.py30
6 files changed, 67 insertions, 7 deletions
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