← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~cjwatson/launchpad:dmarc-for-merges-and-code into launchpad:master

 

Colin Watson has proposed merging ~cjwatson/launchpad:dmarc-for-merges-and-code into launchpad:master.

Commit message:
Use DMARC-compliant From addresses in code review emails

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)
Related bugs:
  Bug #1879740 in Launchpad itself: "Make Launchpad Code Review / Merge Review / Code Notices DMARC Compliant"
  https://bugs.launchpad.net/launchpad/+bug/1879740

For more details, see:
https://code.launchpad.net/~cjwatson/launchpad/+git/launchpad/+merge/406528

Most of this work is by Thomas Ward; I just tidied a few things up and fixed the tests.
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~cjwatson/launchpad:dmarc-for-merges-and-code into launchpad:master.
diff --git a/lib/lp/code/doc/branch-merge-proposal-notifications.txt b/lib/lp/code/doc/branch-merge-proposal-notifications.txt
index 70d15f0..e7134c2 100644
--- a/lib/lp/code/doc/branch-merge-proposal-notifications.txt
+++ b/lib/lp/code/doc/branch-merge-proposal-notifications.txt
@@ -129,7 +129,7 @@ An email is sent to subscribers of either branch and the default reviewer.
 
     >>> notification = notifications[0]
     >>> print(notification['From'])
-    Eric <eric@xxxxxxxxxxx>
+    Eric <mp+...@xxxxxxxxxxxxxxxxxxx>
     >>> print(notification['Subject'])
     [Merge] lp://dev/~person-name... into lp://dev/~person-name...
     >>> print(notification['X-Launchpad-Project'])
diff --git a/lib/lp/code/doc/codereviewcomment.txt b/lib/lp/code/doc/codereviewcomment.txt
index 8023afd..263f73e 100644
--- a/lib/lp/code/doc/codereviewcomment.txt
+++ b/lib/lp/code/doc/codereviewcomment.txt
@@ -86,7 +86,7 @@ Now run the pending job to send the email.
     >>> notifications = [email for email in notifications if
     ...                  email['X-Launchpad-Message-Rationale'] == 'Owner']
     >>> print_emails(include_reply_to=True, notifications=notifications)
-    From: Sender Person <sender@xxxxxxxxxxx>
+    From: Sender Person <mp+...@xxxxxxxxxxxxxxxxxxx>
     To: ...
     Reply-To: mp+...@xxxxxxxxxxxxxxxxxxx
     Subject: Please merge
diff --git a/lib/lp/code/mail/branchmergeproposal.py b/lib/lp/code/mail/branchmergeproposal.py
index 9566ae8..d876ad5 100644
--- a/lib/lp/code/mail/branchmergeproposal.py
+++ b/lib/lp/code/mail/branchmergeproposal.py
@@ -8,9 +8,9 @@ __metaclass__ = type
 
 from lp.code.enums import CodeReviewNotificationLevel
 from lp.code.mail.branch import BranchMailer
-from lp.services.config import config
 from lp.services.mail.basemailer import BaseMailer
 from lp.services.mail.sendmail import (
+    format_address,
     format_address_for_person,
     get_msgid,
     )
@@ -52,9 +52,8 @@ class BMPMailer(BranchMailer):
         recipients = merge_proposal.getNotificationRecipients(
             CodeReviewNotificationLevel.STATUS)
 
-        assert from_user.preferredemail is not None, (
-            'The sender must have an email address.')
-        from_address = format_address_for_person(from_user)
+        from_address = format_address(
+            from_user.display_name, merge_proposal.address)
 
         return cls(
             '%(proposal_title)s',
@@ -74,11 +73,10 @@ class BMPMailer(BranchMailer):
         recipients = merge_proposal.getNotificationRecipients(
             CodeReviewNotificationLevel.STATUS)
         if from_user is not None:
-            assert from_user.preferredemail is not None, (
-                'The sender must have an email address.')
-            from_address = format_address_for_person(from_user)
+            from_address = format_address(
+                from_user.display_name, merge_proposal.address)
         else:
-            from_address = config.canonical.noreply_from_address
+            from_address = merge_proposal.address
         return cls(
             '%(proposal_title)s',
             'branch-merge-proposal-updated.txt', recipients,
@@ -88,7 +86,8 @@ class BMPMailer(BranchMailer):
     @classmethod
     def forReviewRequest(cls, reason, merge_proposal, from_user):
         """Return a mailer for a request to review a BranchMergeProposal."""
-        from_address = format_address_for_person(from_user)
+        from_address = format_address(
+            from_user.display_name, merge_proposal.address)
         recipients = {reason.subscriber: reason}
         return cls(
             '%(proposal_title)s',
diff --git a/lib/lp/code/mail/codereviewcomment.py b/lib/lp/code/mail/codereviewcomment.py
index 0a885d2..f9e882f 100644
--- a/lib/lp/code/mail/codereviewcomment.py
+++ b/lib/lp/code/mail/codereviewcomment.py
@@ -44,7 +44,8 @@ class CodeReviewCommentMailer(BMPMailer):
         self.message = code_review_comment.message
         from_person = self.message.owner
         from_address = format_address(
-            from_person.displayname, from_person.preferredemail.email)
+            from_person.display_name,
+            code_review_comment.branch_merge_proposal.address)
         merge_proposal = code_review_comment.branch_merge_proposal
         BMPMailer.__init__(
             self, self.message.subject, None, recipients, merge_proposal,
diff --git a/lib/lp/code/mail/tests/test_branchmergeproposal.py b/lib/lp/code/mail/tests/test_branchmergeproposal.py
index f121fa7..06bc638 100644
--- a/lib/lp/code/mail/tests/test_branchmergeproposal.py
+++ b/lib/lp/code/mail/tests/test_branchmergeproposal.py
@@ -143,7 +143,9 @@ class TestMergeProposalMailing(TestCaseWithFactory):
              'Reply-To': bmp.address,
              'Message-Id': '<foobar-example-com>'},
             ctrl.headers)
-        self.assertEqual('Baz Qux <baz.qux@xxxxxxxxxxx>', ctrl.from_addr)
+        self.assertEqual(
+            'Baz Qux <mp+%d@%s>' % (bmp.id, config.launchpad.code_domain),
+            ctrl.from_addr)
         reviewer_id = format_address_for_person(reviewer)
         self.assertEqual(set([reviewer_id, bmp.address]), set(ctrl.to_addrs))
         mailer.sendAll()
@@ -337,7 +339,9 @@ class TestMergeProposalMailing(TestCaseWithFactory):
         mailer.message_id = '<foobar-example-com>'
         ctrl = mailer.generateEmail('baz.quxx@xxxxxxxxxxx', subscriber)
         self.assertEqual('<foobar-example-com>', ctrl.headers['Message-Id'])
-        self.assertEqual('Baz Qux <baz.qux@xxxxxxxxxxx>', ctrl.from_addr)
+        self.assertEqual(
+            'Baz Qux <mp+%d@%s>' % (bmp.id, config.launchpad.code_domain),
+            ctrl.from_addr)
         bmp.root_message_id = None
         pop_notifications()
         mailer.sendAll()
@@ -576,7 +580,9 @@ class TestMergeProposalMailing(TestCaseWithFactory):
         mailer = BMPMailer.forReviewRequest(
             request, request.merge_proposal, requester)
         self.assertEqual(
-            'Requester <requester@xxxxxxxxxxx>', mailer.from_address)
+            'Requester <mp+%d@%s>' % (
+                request.merge_proposal.id, config.launchpad.code_domain),
+            mailer.from_address)
         self.assertEqual(
             request.merge_proposal.preview_diff,
             mailer.preview_diff)
diff --git a/lib/lp/code/mail/tests/test_codereviewcomment.py b/lib/lp/code/mail/tests/test_codereviewcomment.py
index 7d4ec13..8c65a49 100644
--- a/lib/lp/code/mail/tests/test_codereviewcomment.py
+++ b/lib/lp/code/mail/tests/test_codereviewcomment.py
@@ -99,8 +99,9 @@ class TestCodeReviewComment(TestCaseWithFactory):
         self.assertEqual(
             comment.branch_merge_proposal, mailer.merge_proposal)
         sender = comment.message.owner
-        sender_address = format_address(sender.displayname,
-                                        sender.preferredemail.email)
+        sender_address = format_address(
+            sender.displayname,
+            "mp+%d@%s" % (bmp.id, config.launchpad.code_domain))
         self.assertEqual(sender_address, mailer.from_address)
         self.assertEqual(comment, mailer.code_review_comment)
 
diff --git a/lib/lp/code/model/tests/test_gitrepository.py b/lib/lp/code/model/tests/test_gitrepository.py
index e8e7205..69d0595 100644
--- a/lib/lp/code/model/tests/test_gitrepository.py
+++ b/lib/lp/code/model/tests/test_gitrepository.py
@@ -2924,8 +2924,7 @@ class TestGitRepositoryDetectMerges(TestCaseWithFactory):
         self.assertIn(
             "Work in progress => Merged",
             notifications[0].get_payload(decode=True).decode("UTF-8"))
-        self.assertEqual(
-            config.canonical.noreply_from_address, notifications[0]["From"])
+        self.assertEqual(proposal.address, notifications[0]["From"])
         recipients = set(msg["x-envelope-to"] for msg in notifications)
         expected = set(
             [proposal.source_git_repository.registrant.preferredemail.email,