From c5d61bc8001b16e3dcedda9fd1229c27cca4bd3b Mon Sep 17 00:00:00 2001 From: Folker Bernitt Date: Mon, 18 Jan 2016 15:39:59 +0100 Subject: Refactory KeyResource to get services from session - Issue #576 - Only first step (other services not changed yet) - Faked session access for now --- service/pixelated/application.py | 25 ++++++++++++++++++++++ service/pixelated/resources/__init__.py | 17 +++++++++++++++ service/pixelated/resources/keys_resource.py | 14 ++++++------ service/pixelated/resources/root_resource.py | 4 ++-- .../test/support/integration/app_test_client.py | 9 +++++++- service/test/unit/resources/test_keys_resources.py | 11 ++++++++-- 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']) -- cgit v1.2.3