summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFolker Bernitt <fbernitt@thoughtworks.com>2016-01-18 15:39:59 +0100
committerFolker Bernitt <fbernitt@thoughtworks.com>2016-01-18 15:39:59 +0100
commitc5d61bc8001b16e3dcedda9fd1229c27cca4bd3b (patch)
treea36fb87a31b7692d124b959ba32ba49f48a14ed8
parent0b06feff629f91d2fa4e7bdbe3b8e46b412e6158 (diff)
Refactory KeyResource to get services from session
- Issue #576 - Only first step (other services not changed yet) - Faked session access for now
-rw-r--r--service/pixelated/application.py25
-rw-r--r--service/pixelated/resources/__init__.py17
-rw-r--r--service/pixelated/resources/keys_resource.py14
-rw-r--r--service/pixelated/resources/root_resource.py4
-rw-r--r--service/test/support/integration/app_test_client.py9
-rw-r--r--service/test/unit/resources/test_keys_resources.py11
6 files changed, 68 insertions, 12 deletions
diff --git a/service/pixelated/application.py b/service/pixelated/application.py
index 7c8af78d..17dbacbf 100644
--- a/service/pixelated/application.py
+++ b/service/pixelated/application.py
@@ -41,6 +41,27 @@ import logging
log = logging.getLogger(__name__)
+class ServicesFactory(object):
+
+ def __init__(self):
+ self._services_by_user = {}
+
+ def is_logged_in(self, user_id):
+ return user_id in self._services_by_user
+
+ def services(self, user_id):
+ return self._services_by_user[user_id]
+
+ def log_out_user(self, user_id):
+ if self.is_logged_in(user_id):
+ services = self._services_by_user[user_id]
+ services.close()
+ del self._services_by_user[user_id]
+
+ def add_session(self, user_id, services):
+ self._services_by_user[user_id] = services
+
+
@defer.inlineCallbacks
def start_user_agent(root_resource, leap_home, leap_session):
log.info('Bootstrap done, loading services for user %s' % leap_session.user_auth.username)
@@ -51,7 +72,11 @@ def start_user_agent(root_resource, leap_home, leap_session):
if leap_session.fresh_account:
yield add_welcome_mail(leap_session.mail_store)
+ servicesFactory = ServicesFactory()
+ servicesFactory.add_session(leap_session.user_auth.uuid, services)
+
root_resource.initialize(
+ servicesFactory,
services.keymanager,
services.search_engine,
services.mail_service,
diff --git a/service/pixelated/resources/__init__.py b/service/pixelated/resources/__init__.py
index c65e19f3..556469c1 100644
--- a/service/pixelated/resources/__init__.py
+++ b/service/pixelated/resources/__init__.py
@@ -16,6 +16,8 @@
import json
+from twisted.web.resource import Resource
+
class SetEncoder(json.JSONEncoder):
def default(self, obj):
@@ -37,3 +39,18 @@ def respond_json_deferred(entity, request, status_code=200):
request.code = status_code
request.write(json_response)
request.finish()
+
+
+class BaseResource(Resource):
+
+ def __init__(self, services_factory):
+ Resource.__init__(self)
+ self._services_factory = services_factory
+
+ def keymanager(self, request):
+ user_id = self._get_user_id_from_request()
+ return self._services_factory.services(user_id).keymanager
+
+ def _get_user_id_from_request(self):
+ # currently we are faking this
+ return self._services_factory._services_by_user.keys()[0]
diff --git a/service/pixelated/resources/keys_resource.py b/service/pixelated/resources/keys_resource.py
index 6df95b28..d6f469fe 100644
--- a/service/pixelated/resources/keys_resource.py
+++ b/service/pixelated/resources/keys_resource.py
@@ -1,18 +1,18 @@
from email.utils import parseaddr
-from pixelated.resources import respond_json_deferred
+from pixelated.resources import respond_json_deferred, BaseResource
from twisted.web import server
-from twisted.web.resource import Resource
-class KeysResource(Resource):
+class KeysResource(BaseResource):
isLeaf = True
- def __init__(self, keymanager):
- Resource.__init__(self)
- self._keymanager = keymanager
+ def __init__(self, services_factory):
+ BaseResource.__init__(self, services_factory)
def render_GET(self, request):
+ _keymanager = self.keymanager(request)
+
def finish_request(key):
if key.private:
respond_json_deferred(None, request, status_code=401)
@@ -23,7 +23,7 @@ class KeysResource(Resource):
respond_json_deferred(None, request, status_code=404)
_, key_to_find = parseaddr(request.args.get('search')[0])
- d = self._keymanager.fetch_key(key_to_find)
+ d = _keymanager.fetch_key(key_to_find)
d.addCallback(finish_request)
d.addErrback(key_not_found)
diff --git a/service/pixelated/resources/root_resource.py b/service/pixelated/resources/root_resource.py
index 56da5cc7..fac63bd7 100644
--- a/service/pixelated/resources/root_resource.py
+++ b/service/pixelated/resources/root_resource.py
@@ -36,11 +36,11 @@ class RootResource(Resource):
return self
return Resource.getChild(self, path, request)
- def initialize(self, keymanager, search_engine, mail_service, draft_service, feedback_service):
+ def initialize(self, services_factory, keymanager, search_engine, mail_service, draft_service, feedback_service):
self.account_email = mail_service.account_email
self.putChild('assets', File(self._static_folder))
- self.putChild('keys', KeysResource(keymanager))
+ self.putChild('keys', KeysResource(services_factory))
self.putChild(AttachmentsResource.BASE_URL, AttachmentsResource(mail_service))
self.putChild('contacts', ContactsResource(search_engine))
self.putChild('features', FeaturesResource())
diff --git a/service/test/support/integration/app_test_client.py b/service/test/support/integration/app_test_client.py
index 40c24418..16344171 100644
--- a/service/test/support/integration/app_test_client.py
+++ b/service/test/support/integration/app_test_client.py
@@ -33,6 +33,7 @@ from twisted.web.resource import getChildForRequest
# from twisted.web.server import Site as PixelatedSite
from pixelated.adapter.mailstore.leap_attachment_store import LeapAttachmentStore
from pixelated.adapter.services.feedback_service import FeedbackService
+from pixelated.application import ServicesFactory
from pixelated.config.site import PixelatedSite
from pixelated.adapter.mailstore import LeapMailStore
@@ -85,8 +86,14 @@ class AppTestClient(object):
self.search_engine.index_mails(mails)
self.resource = RootResource()
+
+ self.service_factory = ServicesFactory()
+ services = mock()
+ services.keymanager = self.keymanager
+ self.service_factory.add_session('someuserid', services)
+
self.resource.initialize(
- self.keymanager, self.search_engine, self.mail_service, self.draft_service, self.feedback_service)
+ self.service_factory, self.keymanager, self.search_engine, self.mail_service, self.draft_service, self.feedback_service)
def _render(self, request, as_json=True):
def get_str(_str):
diff --git a/service/test/unit/resources/test_keys_resources.py b/service/test/unit/resources/test_keys_resources.py
index 1990efe8..a737bc16 100644
--- a/service/test/unit/resources/test_keys_resources.py
+++ b/service/test/unit/resources/test_keys_resources.py
@@ -1,7 +1,9 @@
import json
import ast
-from mockito import mock, when
+from mockito import mock, when, any as ANY
from leap.keymanager import OpenPGPKey, KeyNotFound
+
+from pixelated.application import ServicesFactory
from pixelated.resources.keys_resource import KeysResource
import twisted.trial.unittest as unittest
from twisted.web.test.requesthelper import DummyRequest
@@ -13,7 +15,12 @@ class TestKeysResource(unittest.TestCase):
def setUp(self):
self.keymanager = mock()
- self.web = DummySite(KeysResource(self.keymanager))
+ self.servicesFactory = mock()
+ self.services = mock()
+ self.services.keymanager = self.keymanager
+ self.servicesFactory._services_by_user = {'someuserid': self.keymanager}
+ when(self.servicesFactory).services(ANY()).thenReturn(self.services)
+ self.web = DummySite(KeysResource(self.servicesFactory))
def test_returns_404_if_key_not_found(self):
request = DummyRequest(['/keys'])