Permalink
Browse files

de-duplicate emails received by phabricator multiple times

Summary: this can happen if you have Phabricator and email lists co-mingling such that Phabricator receives an email multiple times. we can prevent this from then spamming everyone or otherwise taking the action multiple times by storing a message id hash and dropping the message if we have more than one message that matches.

Test Plan: simulated sending the same email multiple times on the command line. noted only the first one made it through.

Reviewers: epriestley

Reviewed By: epriestley

CC: aran, Korvin

Maniphest Tasks: T1726

Differential Revision: https://secure.phabricator.com/D4328
  • Loading branch information...
1 parent f12af03 commit 3448781c40f0e45a4e7e19ab9f1e601df8485b13 @bobtrahan bobtrahan committed Jan 4, 2013
@@ -0,0 +1,3 @@
+ALTER TABLE `{$NAMESPACE}_metamta`.`metamta_receivedmail`
+ ADD `messageIDHash` CHAR(12) BINARY NOT NULL,
+ ADD KEY `key_messageIDHash` (`messageIDHash`);
@@ -34,6 +34,9 @@
'text' => $text_body,
'html' => $parser->getMessageBody('html'),
));
+$received->setMessageIDHash(
+ PhabricatorHash::digestForIndex($received->getMessageID())
+);
$attachments = array();
foreach ($parser->getAttachments() as $attachment) {
@@ -9,6 +9,7 @@
protected $relatedPHID;
protected $authorPHID;
protected $message;
+ protected $messageIDHash;
public function getConfiguration() {
return array(
@@ -145,6 +146,27 @@ public function processReceivedMail() {
return $this->setMessage($message)->save();
}
+ $message_id_hash = $this->getMessageIDHash();
+ if ($message_id_hash) {
+ $messages = $this->loadAllWhere(
+ 'messageIDHash = %s',
+ $message_id_hash
+ );
+ $messages_count = count($messages);
+ if ($messages_count > 1) {
+ $first_message = reset($messages);
+ if ($first_message->getID() != $this->getID()) {
+ $message = sprintf(
+ 'Ignoring email with message id hash "%s" that has been seen %d '.
+ 'times, including this message.',
+ $message_id_hash,
+ $messages_count
+ );
+ return $this->setMessage($message)->save();
+ }
+ }
+ }
+
list($to,
$receiver_name,
$user_id,
@@ -1076,6 +1076,11 @@ public function getPatches() {
'type' => 'sql',
'name' => $this->getPatchPath('20130101.confxaction.sql'),
),
+ '20130102.metamtareceivedmailmessageidhash.sql' => array(
+ 'type' => 'sql',
+ 'name' =>
+ $this->getPatchPath('20130102.metamtareceivedmailmessageidhash.sql'),
+ ),
);
}

0 comments on commit 3448781

Please sign in to comment.