summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorFolker Bernitt <fbernitt@thoughtworks.com>2016-01-29 10:51:00 +0100
committerFolker Bernitt <fbernitt@thoughtworks.com>2016-01-29 10:51:00 +0100
commitd984d803936399caa393622171453566ff3194e0 (patch)
treefa03acdb8e90c4ebc73a18c3d52b0274cdadc11e /service
parent2c2b3e9d390f3b0dc16014b8fd6417ff7c191a34 (diff)
Fix: Only act on generated keys for current user
- Issue #587
Diffstat (limited to 'service')
-rw-r--r--service/pixelated/bitmask_libraries/session.py23
-rw-r--r--service/test/unit/bitmask_libraries/test_session.py46
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 <http://www.gnu.org/licenses/>.
+
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)