From d984d803936399caa393622171453566ff3194e0 Mon Sep 17 00:00:00 2001 From: Folker Bernitt Date: Fri, 29 Jan 2016 10:51:00 +0100 Subject: Fix: Only act on generated keys for current user - Issue #587 --- service/pixelated/bitmask_libraries/session.py | 23 ++++++++--- .../test/unit/bitmask_libraries/test_session.py | 46 +++++++++++++++++++++- 2 files changed, 62 insertions(+), 7 deletions(-) diff --git a/service/pixelated/bitmask_libraries/session.py b/service/pixelated/bitmask_libraries/session.py index a88eff11..4b4d693a 100644 --- a/service/pixelated/bitmask_libraries/session.py +++ b/service/pixelated/bitmask_libraries/session.py @@ -18,6 +18,7 @@ import traceback import sys import os import requests +import logging from twisted.internet import reactor, defer from pixelated.bitmask_libraries.certs import LeapCertificate @@ -30,11 +31,14 @@ from .smtp import LeapSMTPConfig from .soledad import SoledadFactory from leap.common.events import ( - register, + register, unregister, catalog as events ) +log = logging.getLogger(__name__) + + SESSIONS = {} @@ -49,7 +53,9 @@ class LeapSession(object): self.soledad = soledad self.nicknym = nicknym self.fresh_account = False - register(events.KEYMANAGER_FINISHED_KEY_GENERATION, self._set_fresh_account) + self.incoming_mail_fetcher = None + self.account = None + register(events.KEYMANAGER_FINISHED_KEY_GENERATION, self._set_fresh_account, uid=self.account_email()) @defer.inlineCallbacks def initial_sync(self): @@ -72,15 +78,18 @@ class LeapSession(object): account = IMAPAccount(user_mail, soledad) return account - def _set_fresh_account(self, *args): - self.fresh_account = True + def _set_fresh_account(self, email_address): + log.debug('Key for email %s has been generated' % email_address) + if email_address == self.account_email(): + self.fresh_account = True def account_email(self): name = self.user_auth.username return self.provider.address_for(name) def close(self): - self.stop_background_jobs + self.stop_background_jobs() + unregister(events.KEYMANAGER_FINISHED_KEY_GENERATION, uid=self.account_email()) @defer.inlineCallbacks def _create_incoming_mail_fetcher(self, nicknym, soledad, account, user_mail): @@ -91,7 +100,9 @@ class LeapSession(object): user_mail)) def stop_background_jobs(self): - reactor.callFromThread(self.incoming_mail_fetcher.stopService) + if self.incoming_mail_fetcher: + reactor.callFromThread(self.incoming_mail_fetcher.stopService) + self.incoming_mail_fetcher = None def sync(self): try: diff --git a/service/test/unit/bitmask_libraries/test_session.py b/service/test/unit/bitmask_libraries/test_session.py index 887da83e..eb969e3c 100644 --- a/service/test/unit/bitmask_libraries/test_session.py +++ b/service/test/unit/bitmask_libraries/test_session.py @@ -13,12 +13,13 @@ # # You should have received a copy of the GNU Affero General Public License # along with Pixelated. If not, see . + from mock import patch from mock import MagicMock from pixelated.bitmask_libraries.session import LeapSession from test_abstract_leap import AbstractLeapTest -from twisted.internet import defer +from leap.common.events.catalog import KEYMANAGER_FINISHED_KEY_GENERATION class SessionTest(AbstractLeapTest): @@ -49,6 +50,49 @@ class SessionTest(AbstractLeapTest): yield session.sync() self.soledad_session.sync.assert_called_once() + def test_session_registers_to_generated_keys(self): + email = 'someone@somedomain.tld' + self.provider.address_for.return_value = email + with patch('pixelated.bitmask_libraries.session.register') as register_mock: + session = self._create_session() + + register_mock.assert_called_once_with(KEYMANAGER_FINISHED_KEY_GENERATION, session._set_fresh_account, uid=email) + + @patch('pixelated.bitmask_libraries.session.register') + def test_close_unregisters_from_generate_keys_events(self, _): + email = 'someone@somedomain.tld' + self.provider.address_for.return_value = email + session = self._create_session() + + with patch('pixelated.bitmask_libraries.session.unregister') as unregister_mock: + session.close() + + unregister_mock.assert_called_once_with(KEYMANAGER_FINISHED_KEY_GENERATION, uid=email) + + @patch('pixelated.bitmask_libraries.session.register') + def test_session_fresh_is_initially_false(self, _): + session = self._create_session() + + self.assertFalse(session.fresh_account) + + @patch('pixelated.bitmask_libraries.session.register') + def test_session_sets_status_to_fresh_on_key_generation_event(self, _): + session = self._create_session() + self.provider.address_for.return_value = 'someone@somedomain.tld' + + session._set_fresh_account('someone@somedomain.tld') + + self.assertTrue(session.fresh_account) + + @patch('pixelated.bitmask_libraries.session.register') + def test_session_does_not_set_status_fresh_for_unkown_emails(self, _): + session = self._create_session() + self.provider.address_for.return_value = 'someone@somedomain.tld' + + session._set_fresh_account('another_email@somedomain.tld') + + self.assertFalse(session.fresh_account) + def _create_session(self): return LeapSession(self.provider, self.auth, self.mail_store, self.soledad_session, self.nicknym, self.smtp_mock) -- cgit v1.2.3