diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2018-07-17 11:38:20 -0700 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2018-07-26 10:32:39 -0700 |
commit | 55dc0791df3ce268e0ff53c49f9d81cd0bd93aae (patch) | |
tree | 9f9d0960e793b8a1dcad113b0c3af765410afb91 | |
parent | ab6f986e0df10a1d260aea869745e43369a63ace (diff) |
command/envelope: use asyncio coroutines instead of twisted inlineCallbacks
-rw-r--r-- | alot/commands/envelope.py | 24 | ||||
-rw-r--r-- | alot/commands/utils.py | 14 | ||||
-rw-r--r-- | tests/commands/envelope_test.py | 6 | ||||
-rw-r--r-- | tests/commands/utils_tests.py | 22 |
4 files changed, 28 insertions, 38 deletions
diff --git a/alot/commands/envelope.py b/alot/commands/envelope.py index 80e13fba..e6d139d5 100644 --- a/alot/commands/envelope.py +++ b/alot/commands/envelope.py @@ -11,8 +11,6 @@ import re import tempfile import textwrap -from twisted.internet.defer import inlineCallbacks - from . import Command, registerCommand from . import globals from . import utils @@ -167,8 +165,7 @@ class SendCommand(Command): self.envelope = envelope self.envelope_buffer = None - @inlineCallbacks - def apply(self, ui): + async def apply(self, ui): if self.mail is None: if self.envelope is None: # needed to close later @@ -184,7 +181,7 @@ class SendCommand(Command): warning = 'A modified version of ' * mod warning += 'this message has been sent at %s.' % when warning += ' Do you want to resend?' - if (yield ui.choice(warning, cancel='no', + if (await ui.choice(warning, cancel='no', msg_position='left')) == 'no': return @@ -201,7 +198,7 @@ class SendCommand(Command): warning = textwrap.dedent("""\ Any BCC recipients will not be able to decrypt this message. Do you want to send anyway?""").replace('\n', ' ') - if (yield ui.choice(warning, cancel='no', + if (await ui.choice(warning, cancel='no', msg_position='left')) == 'no': return @@ -417,8 +414,7 @@ class SetCommand(Command): self.reset = not append Command.__init__(self, **kwargs) - @inlineCallbacks - def apply(self, ui): + async def apply(self, ui): envelope = ui.current_buffer.envelope if self.reset: if self.key in envelope: @@ -429,7 +425,7 @@ class SetCommand(Command): # as the key of the person BCC'd will be available to other recievers, # defeating the purpose of BCCing them if self.key.lower() in ['to', 'from', 'cc'] and envelope.encrypt: - yield utils.update_keys(ui, envelope) + await utils.update_keys(ui, envelope) ui.current_buffer.rebuild() @@ -445,15 +441,14 @@ class UnsetCommand(Command): self.key = key Command.__init__(self, **kwargs) - @inlineCallbacks - def apply(self, ui): + async def apply(self, ui): del ui.current_buffer.envelope[self.key] # FIXME: handle BCC as well # Currently we don't handle bcc because it creates a side channel leak, # as the key of the person BCC'd will be available to other recievers, # defeating the purpose of BCCing them if self.key.lower() in ['to', 'from', 'cc']: - yield utils.update_keys(ui, ui.current_buffer.envelope) + await utils.update_keys(ui, ui.current_buffer.envelope) ui.current_buffer.rebuild() @@ -578,8 +573,7 @@ class EncryptCommand(Command): self.trusted = trusted Command.__init__(self, **kwargs) - @inlineCallbacks - def apply(self, ui): + async def apply(self, ui): envelope = ui.current_buffer.envelope if self.action == 'rmencrypt': try: @@ -604,7 +598,7 @@ class EncryptCommand(Command): tmp_key = crypto.get_key(keyid) envelope.encrypt_keys[tmp_key.fpr] = tmp_key else: - yield utils.update_keys(ui, envelope, signed_only=self.trusted) + await utils.update_keys(ui, envelope, signed_only=self.trusted) envelope.encrypt = encrypt if not envelope.encrypt: # This is an extra conditional as it can even happen if encrypt is diff --git a/alot/commands/utils.py b/alot/commands/utils.py index decaeae2..ace63b03 100644 --- a/alot/commands/utils.py +++ b/alot/commands/utils.py @@ -4,16 +4,13 @@ import re import logging -from twisted.internet.defer import inlineCallbacks, returnValue - from ..errors import GPGProblem, GPGCode from ..settings.const import settings from ..settings.errors import NoMatchingAccount from .. import crypto -@inlineCallbacks -def update_keys(ui, envelope, block_error=False, signed_only=False): +async def update_keys(ui, envelope, block_error=False, signed_only=False): """Find and set the encryption keys in an envolope. :param ui: the main user interface object @@ -41,7 +38,7 @@ def update_keys(ui, envelope, block_error=False, signed_only=False): encrypt_keys.append(recipient) logging.debug("encryption keys: " + str(encrypt_keys)) - keys = yield _get_keys(ui, encrypt_keys, block_error=block_error, + keys = await _get_keys(ui, encrypt_keys, block_error=block_error, signed_only=signed_only) if keys: envelope.encrypt_keys = keys @@ -63,8 +60,7 @@ def update_keys(ui, envelope, block_error=False, signed_only=False): envelope.encrypt = False -@inlineCallbacks -def _get_keys(ui, encrypt_keyids, block_error=False, signed_only=False): +async def _get_keys(ui, encrypt_keyids, block_error=False, signed_only=False): """Get several keys from the GPG keyring. The keys are selected by keyid and are checked if they can be used for encryption. @@ -93,7 +89,7 @@ def _get_keys(ui, encrypt_keyids, block_error=False, signed_only=False): choices = {str(i): t for i, t in enumerate(tmp_choices, 1)} keys_to_return = {str(i): t for i, t in enumerate([k for k in crypto.list_keys(hint=keyid)], 1)} - choosen_key = yield ui.choice("ambiguous keyid! Which " + + choosen_key = await ui.choice("ambiguous keyid! Which " + "key do you want to use?", choices=choices, choices_to_return=keys_to_return) @@ -104,4 +100,4 @@ def _get_keys(ui, encrypt_keyids, block_error=False, signed_only=False): ui.notify(str(e), priority='error', block=block_error) continue keys[key.fpr] = key - returnValue(keys) + return keys diff --git a/tests/commands/envelope_test.py b/tests/commands/envelope_test.py index 5f69ae43..d3908be8 100644 --- a/tests/commands/envelope_test.py +++ b/tests/commands/envelope_test.py @@ -22,7 +22,7 @@ import tempfile import textwrap from twisted.trial import unittest -from twisted.internet.defer import inlineCallbacks +from twisted.internet.defer import inlineCallbacks, ensureDeferred import mock @@ -360,7 +360,7 @@ class TestSendCommand(unittest.TestCase): with mock.patch( 'alot.commands.envelope.settings.get_account_by_address', mock.Mock(return_value=account)) as get_account_by_address: - yield cmd.apply(mock.Mock()) + yield ensureDeferred(cmd.apply(mock.Mock())) get_account_by_address.assert_called_once_with('foo@example.com', return_default=True) # check that the apply did run through till the end. @@ -374,7 +374,7 @@ class TestSendCommand(unittest.TestCase): with mock.patch( 'alot.commands.envelope.settings.get_account_by_address', mock.Mock(return_value=account)) as get_account_by_address: - yield cmd.apply(mock.Mock()) + yield ensureDeferred(cmd.apply(mock.Mock())) get_account_by_address.assert_called_once_with('foo@example.com', return_default=True) # check that the apply did run through till the end. diff --git a/tests/commands/utils_tests.py b/tests/commands/utils_tests.py index db304552..bce85c14 100644 --- a/tests/commands/utils_tests.py +++ b/tests/commands/utils_tests.py @@ -21,7 +21,7 @@ import shutil import gpg import mock from twisted.trial import unittest -from twisted.internet.defer import inlineCallbacks +from twisted.internet.defer import inlineCallbacks, ensureDeferred from alot import crypto from alot import errors @@ -80,7 +80,7 @@ class TestGetKeys(unittest.TestCase): signed_only=False) ui = utilities.make_ui() ids = [FPR] - actual = yield utils._get_keys(ui, ids) + actual = yield ensureDeferred(utils._get_keys(ui, ids)) self.assertIn(FPR, actual) self.assertEqual(actual[FPR].fpr, expected.fpr) @@ -91,7 +91,7 @@ class TestGetKeys(unittest.TestCase): signed_only=False) ui = utilities.make_ui() ids = [FPR, "6F6B15509CF8E59E6E469F327F438280EF8D349F"] - actual = yield utils._get_keys(ui, ids) + actual = yield ensureDeferred(utils._get_keys(ui, ids)) self.assertIn(FPR, actual) self.assertEqual(actual[FPR].fpr, expected.fpr) @@ -100,7 +100,7 @@ class TestGetKeys(unittest.TestCase): """Test gettings keys when signed only is required.""" ui = utilities.make_ui() ids = [FPR] - actual = yield utils._get_keys(ui, ids, signed_only=True) + actual = yield ensureDeferred(utils._get_keys(ui, ids, signed_only=True)) self.assertEqual(actual, {}) @inlineCallbacks @@ -123,7 +123,7 @@ class TestGetKeys(unittest.TestCase): 'test', errors.GPGCode.AMBIGUOUS_NAME))): with mock.patch('alot.commands.utils.crypto.list_keys', mock.Mock(return_value=[key])): - yield utils._get_keys(ui, ids, signed_only=False) + yield ensureDeferred(utils._get_keys(ui, ids, signed_only=False)) ui.choice.assert_called_once() @@ -140,7 +140,7 @@ class TestSetEncrypt(unittest.TestCase): ui = utilities.make_ui() envelope = Envelope() envelope['To'] = 'ambig@example.com, test@example.com' - yield utils.update_keys(ui, envelope) + yield ensureDeferred(utils.update_keys(ui, envelope)) self.assertTrue(envelope.encrypt) self.assertCountEqual( [f.fpr for f in envelope.encrypt_keys.values()], @@ -151,7 +151,7 @@ class TestSetEncrypt(unittest.TestCase): ui = utilities.make_ui() envelope = Envelope() envelope['Cc'] = 'ambig@example.com, test@example.com' - yield utils.update_keys(ui, envelope) + yield ensureDeferred(utils.update_keys(ui, envelope)) self.assertTrue(envelope.encrypt) self.assertCountEqual( [f.fpr for f in envelope.encrypt_keys.values()], @@ -162,7 +162,7 @@ class TestSetEncrypt(unittest.TestCase): ui = utilities.make_ui() envelope = Envelope() envelope['Cc'] = 'foo@example.com, test@example.com' - yield utils.update_keys(ui, envelope) + yield ensureDeferred(utils.update_keys(ui, envelope)) self.assertTrue(envelope.encrypt) self.assertCountEqual( [f.fpr for f in envelope.encrypt_keys.values()], @@ -173,7 +173,7 @@ class TestSetEncrypt(unittest.TestCase): ui = utilities.make_ui() envelope = Envelope() envelope['To'] = 'foo@example.com' - yield utils.update_keys(ui, envelope) + yield ensureDeferred(utils.update_keys(ui, envelope)) self.assertFalse(envelope.encrypt) self.assertEqual(envelope.encrypt_keys, {}) @@ -187,7 +187,7 @@ class TestSetEncrypt(unittest.TestCase): account = _Account(encrypt_to_self=True, gpg_key=gpg_key) with mock.patch('alot.commands.thread.settings.get_account_by_address', mock.Mock(return_value=account)): - yield utils.update_keys(ui, envelope) + yield ensureDeferred(utils.update_keys(ui, envelope)) self.assertTrue(envelope.encrypt) self.assertIn(FPR, envelope.encrypt_keys) self.assertEqual(gpg_key, envelope.encrypt_keys[FPR]) @@ -202,6 +202,6 @@ class TestSetEncrypt(unittest.TestCase): account = _Account(encrypt_to_self=False, gpg_key=gpg_key) with mock.patch('alot.commands.thread.settings.get_account_by_address', mock.Mock(return_value=account)): - yield utils.update_keys(ui, envelope) + yield ensureDeferred(utils.update_keys(ui, envelope)) self.assertTrue(envelope.encrypt) self.assertNotIn(FPR, envelope.encrypt_keys) |