summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2017-08-08 12:56:28 -0700
committerDylan Baker <dylan@pnwbakers.com>2017-08-28 16:53:04 -0700
commit362268d9a506c1d87f197bccef6fed0dcb83d629 (patch)
treecf0f48c8c93ff908cfbe37aece817af7b716ca81
parent593539bd091dfc53af62180b6a5559487213f953 (diff)
Use new Address class
This just wries the new Address class into alot for use, and fixes up a few places where such fixups are needed. Fixes #1107
-rw-r--r--alot/account.py7
-rw-r--r--alot/commands/thread.py6
-rw-r--r--alot/defaults/alot.rc.spec8
-rw-r--r--tests/commands/thread_test.py78
-rw-r--r--tests/settings/manager_test.py7
5 files changed, 58 insertions, 48 deletions
diff --git a/alot/account.py b/alot/account.py
index 01a536d0..e561f0c9 100644
--- a/alot/account.py
+++ b/alot/account.py
@@ -201,7 +201,7 @@ class Account(object):
signature_filename=None, signature_as_attachment=False,
sent_box=None, sent_tags=None, draft_box=None,
draft_tags=None, abook=None, sign_by_default=False,
- encrypt_by_default=u"none",
+ encrypt_by_default=u"none", case_sensitive_username=False,
**_):
sent_tags = sent_tags or []
if 'sent' not in sent_tags:
@@ -210,8 +210,9 @@ class Account(object):
if 'draft' not in draft_tags:
draft_tags.append('draft')
- self.address = address
- self.aliases = aliases or []
+ self.address = Address.from_string(address, case_sensitive=case_sensitive_username)
+ self.aliases = [Address.from_string(a, case_sensitive=case_sensitive_username)
+ for a in (aliases or [])]
self.alias_regexp = alias_regexp
self.realname = realname
self.gpg_key = gpg_key
diff --git a/alot/commands/thread.py b/alot/commands/thread.py
index 02017ae9..437a9bd0 100644
--- a/alot/commands/thread.py
+++ b/alot/commands/thread.py
@@ -71,11 +71,13 @@ def determine_sender(mail, action='reply'):
# pick the most important account that has an address in candidates
# and use that accounts realname and the address found here
for account in my_accounts:
- acc_addresses = [re.escape(a) for a in account.get_addresses()]
+ acc_addresses = [re.escape(unicode(a)) for a in account.get_addresses()]
if account.alias_regexp is not None:
acc_addresses.append(account.alias_regexp)
for alias in acc_addresses:
- regex = re.compile('^' + alias + '$', flags=re.IGNORECASE)
+ regex = re.compile(
+ u'^' + unicode(alias) + u'$',
+ flags=re.IGNORECASE if not account.address.case_sensitive else 0)
for seen_name, seen_address in candidate_addresses:
if regex.match(seen_address):
logging.debug("match!: '%s' '%s'", seen_address, alias)
diff --git a/alot/defaults/alot.rc.spec b/alot/defaults/alot.rc.spec
index 97de329d..eeae4348 100644
--- a/alot/defaults/alot.rc.spec
+++ b/alot/defaults/alot.rc.spec
@@ -355,6 +355,14 @@ thread_focus_linewise = boolean(default=True)
# use your default key.
gpg_key = gpg_key_hint(default=None)
+ # Whether the server treats the address as case-senstive or
+ # case-insensitve (True for the former, False for the latter)
+ #
+ # .. note:: The vast majority (if not all) SMTP servers in modern use
+ # treat usernames as case insenstive, you should only set
+ # this if you know that you need it.
+ case_sensitive_username = boolean(default=False)
+
# address book for this account
[[[abook]]]
# type identifier for address book
diff --git a/tests/commands/thread_test.py b/tests/commands/thread_test.py
index ede9e3b7..6897a953 100644
--- a/tests/commands/thread_test.py
+++ b/tests/commands/thread_test.py
@@ -151,77 +151,77 @@ class TestDetermineSender(unittest.TestCase):
self.assertTupleEqual(cm2.exception.args, expected)
def test_default_account_is_used_if_no_match_is_found(self):
- account1 = _AccountTestClass(address='foo@example.com')
- account2 = _AccountTestClass(address='bar@example.com')
- expected = ('foo@example.com', account1)
+ account1 = _AccountTestClass(address=u'foo@example.com')
+ account2 = _AccountTestClass(address=u'bar@example.com')
+ expected = (u'foo@example.com', account1)
self._test(accounts=[account1, account2], expected=expected)
def test_matching_address_and_account_are_returned(self):
- account1 = _AccountTestClass(address='foo@example.com')
- account2 = _AccountTestClass(address='to@example.com')
- account3 = _AccountTestClass(address='bar@example.com')
- expected = ('to@example.com', account2)
+ account1 = _AccountTestClass(address=u'foo@example.com')
+ account2 = _AccountTestClass(address=u'to@example.com')
+ account3 = _AccountTestClass(address=u'bar@example.com')
+ expected = (u'to@example.com', account2)
self._test(accounts=[account1, account2, account3], expected=expected)
def test_force_realname_includes_real_name_in_returned_address_if_defined(self):
- account1 = _AccountTestClass(address='foo@example.com')
- account2 = _AccountTestClass(address='to@example.com', realname='Bar')
- account3 = _AccountTestClass(address='baz@example.com')
- expected = ('Bar <to@example.com>', account2)
+ account1 = _AccountTestClass(address=u'foo@example.com')
+ account2 = _AccountTestClass(address=u'to@example.com', realname='Bar')
+ account3 = _AccountTestClass(address=u'baz@example.com')
+ expected = (u'Bar <to@example.com>', account2)
self._test(accounts=[account1, account2, account3], expected=expected,
force_realname=True)
def test_doesnt_fail_with_force_realname_if_real_name_not_defined(self):
- account1 = _AccountTestClass(address='foo@example.com')
- account2 = _AccountTestClass(address='to@example.com')
- account3 = _AccountTestClass(address='bar@example.com')
- expected = ('to@example.com', account2)
+ account1 = _AccountTestClass(address=u'foo@example.com')
+ account2 = _AccountTestClass(address=u'to@example.com')
+ account3 = _AccountTestClass(address=u'bar@example.com')
+ expected = (u'to@example.com', account2)
self._test(accounts=[account1, account2, account3], expected=expected,
force_realname=True)
def test_with_force_address_main_address_is_used_regardless_of_matching_address(self):
# In python 3.4 this and the next test could be written as subtests.
- account1 = _AccountTestClass(address='foo@example.com')
- account2 = _AccountTestClass(address='bar@example.com',
- aliases=['to@example.com'])
- account3 = _AccountTestClass(address='bar@example.com')
- expected = ('bar@example.com', account2)
+ account1 = _AccountTestClass(address=u'foo@example.com')
+ account2 = _AccountTestClass(address=u'bar@example.com',
+ aliases=[u'to@example.com'])
+ account3 = _AccountTestClass(address=u'bar@example.com')
+ expected = (u'bar@example.com', account2)
self._test(accounts=[account1, account2, account3], expected=expected,
force_address=True)
def test_without_force_address_matching_address_is_used(self):
# In python 3.4 this and the previous test could be written as
# subtests.
- account1 = _AccountTestClass(address='foo@example.com')
- account2 = _AccountTestClass(address='bar@example.com',
- aliases=['to@example.com'])
- account3 = _AccountTestClass(address='baz@example.com')
- expected = ('to@example.com', account2)
+ account1 = _AccountTestClass(address=u'foo@example.com')
+ account2 = _AccountTestClass(address=u'bar@example.com',
+ aliases=[u'to@example.com'])
+ account3 = _AccountTestClass(address=u'baz@example.com')
+ expected = (u'to@example.com', account2)
self._test(accounts=[account1, account2, account3], expected=expected,
force_address=False)
def test_uses_to_header_if_present(self):
- account1 = _AccountTestClass(address='foo@example.com')
- account2 = _AccountTestClass(address='to@example.com')
- account3 = _AccountTestClass(address='bar@example.com')
- expected = ('to@example.com', account2)
+ account1 = _AccountTestClass(address=u'foo@example.com')
+ account2 = _AccountTestClass(address=u'to@example.com')
+ account3 = _AccountTestClass(address=u'bar@example.com')
+ expected = (u'to@example.com', account2)
self._test(accounts=[account1, account2, account3], expected=expected)
def test_header_order_is_more_important_than_accounts_order(self):
- account1 = _AccountTestClass(address='cc@example.com')
- account2 = _AccountTestClass(address='to@example.com')
- account3 = _AccountTestClass(address='bcc@example.com')
- expected = ('to@example.com', account2)
+ account1 = _AccountTestClass(address=u'cc@example.com')
+ account2 = _AccountTestClass(address=u'to@example.com')
+ account3 = _AccountTestClass(address=u'bcc@example.com')
+ expected = (u'to@example.com', account2)
self._test(accounts=[account1, account2, account3], expected=expected)
def test_accounts_can_be_found_by_alias_regex_setting(self):
- account1 = _AccountTestClass(address='foo@example.com')
- account2 = _AccountTestClass(address='to@example.com',
+ account1 = _AccountTestClass(address=u'foo@example.com')
+ account2 = _AccountTestClass(address=u'to@example.com',
alias_regexp=r'to\+.*@example.com')
- account3 = _AccountTestClass(address='bar@example.com')
- mailstring = self.mailstring.replace('to@example.com',
- 'to+some_tag@example.com')
+ account3 = _AccountTestClass(address=u'bar@example.com')
+ mailstring = self.mailstring.replace(u'to@example.com',
+ u'to+some_tag@example.com')
mail = email.message_from_string(mailstring)
- expected = ('to+some_tag@example.com', account2)
+ expected = (u'to+some_tag@example.com', account2)
self._test(accounts=[account1, account2, account3], expected=expected,
mail=mail)
diff --git a/tests/settings/manager_test.py b/tests/settings/manager_test.py
index d56c4364..a09dbf15 100644
--- a/tests/settings/manager_test.py
+++ b/tests/settings/manager_test.py
@@ -123,17 +123,17 @@ class TestSettingsManagerGetAccountByAddress(utilities.TestCaseClassCleanup):
cls.manager = SettingsManager(alot_rc=f.name)
def test_exists_addr(self):
- acc = self.manager.get_account_by_address('that_guy@example.com')
+ acc = self.manager.get_account_by_address(u'that_guy@example.com')
self.assertEqual(acc.realname, 'That Guy')
def test_doesnt_exist_return_default(self):
- acc = self.manager.get_account_by_address('doesntexist@example.com',
+ acc = self.manager.get_account_by_address(u'doesntexist@example.com',
return_default=True)
self.assertEqual(acc.realname, 'That Guy')
def test_doesnt_exist_raise(self):
with self.assertRaises(NoMatchingAccount):
- self.manager.get_account_by_address('doesntexist@example.com')
+ self.manager.get_account_by_address(u'doesntexist@example.com')
def test_doesnt_exist_no_default(self):
with tempfile.NamedTemporaryFile() as f:
@@ -148,7 +148,6 @@ class TestSettingsManagerGetAccountByAddress(utilities.TestCaseClassCleanup):
'That Guy <a_dude@example.com>')
self.assertEqual(acc.realname, 'A Dude')
- @unittest.expectedFailure
def test_address_case(self):
"""Some servers do not differentiate addresses by case.