From ae90151c632b376abc2a5bdf76d136b3a3629ea6 Mon Sep 17 00:00:00 2001 From: drebs Date: Wed, 15 Apr 2015 14:16:13 -0300 Subject: [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 @ 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. --- src/leap/mx/mail_receiver.py | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) (limited to 'src') 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 @, 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 -- cgit v1.2.3