diff options
author | drebs <drebs@leap.se> | 2015-04-15 14:16:13 -0300 |
---|---|---|
committer | drebs <drebs@leap.se> | 2015-04-16 11:53:48 -0300 |
commit | ae90151c632b376abc2a5bdf76d136b3a3629ea6 (patch) | |
tree | 05a6275c3f4f0597c0790da89925fdb0b9125dd6 | |
parent | 057de70291aee0eaedb8f8318dd1132e960e7e97 (diff) |
[bug] fix extraction of uuid from message headers
Before this commit, the mail receiver system used to compare the domain of the
delivery addresses found in the "Delivered-To" header to find out the final
delivery address. If we assume that the mail server delivery to the spool mail
directory was correct, then we have two facts: (1) the topmost "Delivered-To"
header is the one that indicates the correct final delivery address; and (2)
we should expect the address to be <uuid>@<domain> because of the earlier
alias resolve query made by the mail server.
Another problem is that the domain comparison would compare whatever is in the
"Delivered-To" header with whatever the python's socket module would return,
which depends on the values on /etc/hosts and the order of the values in that
file. This was causing problems whenever the platform made changes in
/etc/hosts.
So this commit eliminates the domain check and gets the uuid from the first
"Delivered-To" header found in the message.
Related: #6858.
-rw-r--r-- | src/leap/mx/mail_receiver.py | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/src/leap/mx/mail_receiver.py b/src/leap/mx/mail_receiver.py index f0b9c03..6b384f2 100644 --- a/src/leap/mx/mail_receiver.py +++ b/src/leap/mx/mail_receiver.py @@ -39,7 +39,6 @@ import signal import json import email.utils -import socket from email import message_from_string from email.MIMEMultipart import MIMEMultipart @@ -181,8 +180,6 @@ class MailReceiver(Service): self._directories = directories self._bounce_from = bounce_from self._bounce_subject = bounce_subject - - self._domain = socket.gethostbyaddr(socket.gethostname())[0] self._processing_skipped = False def startService(self): @@ -357,7 +354,7 @@ class MailReceiver(Service): def _get_owner(self, mail): """ - Given an email, returns the uuid of the owner. + Given an email, return the uuid of the owner. :param mail: mail to analyze :type mail: email.message.Message @@ -365,18 +362,17 @@ class MailReceiver(Service): :returns: uuid :rtype: str or None """ - uuid = None - + # we expect the topmost "Delivered-To" header to indicate the correct + # final delivery address. It should consist of <uuid>@<domain>, as the + # earlier alias resolver query should have translated the username to + # the user id. See https://leap.se/code/issues/6858 for more info. delivereds = mail.get_all("Delivered-To") if delivereds is None: + # XXX this should not happen! see the comment above return None - for to in delivereds: - name, addr = email.utils.parseaddr(to) - parts = addr.split("@") - if len(parts) > 1 and parts[1] == self._domain: - uuid = parts[0] - break - + final_address = delivereds.pop(0) + _, addr = email.utils.parseaddr(final_address) + uuid, _ = addr.split("@") return uuid @defer.inlineCallbacks |