Page MenuHomePhabricator

D7989.id18072.diff
No OneTemporary

D7989.id18072.diff

Index: src/__phutil_library_map__.php
===================================================================
--- src/__phutil_library_map__.php
+++ src/__phutil_library_map__.php
@@ -1589,6 +1589,7 @@
'PhabricatorMailReceiver' => 'applications/metamta/receiver/PhabricatorMailReceiver.php',
'PhabricatorMailReceiverTestCase' => 'applications/metamta/receiver/__tests__/PhabricatorMailReceiverTestCase.php',
'PhabricatorMailReplyHandler' => 'applications/metamta/replyhandler/PhabricatorMailReplyHandler.php',
+ 'PhabricatorMailgunConfigOptions' => 'applications/config/option/PhabricatorMailgunConfigOptions.php',
'PhabricatorMailingListPHIDTypeList' => 'applications/mailinglists/phid/PhabricatorMailingListPHIDTypeList.php',
'PhabricatorMailingListQuery' => 'applications/mailinglists/query/PhabricatorMailingListQuery.php',
'PhabricatorMailingListSearchEngine' => 'applications/mailinglists/query/PhabricatorMailingListSearchEngine.php',
@@ -1620,6 +1621,7 @@
'PhabricatorMetaMTAMailBody' => 'applications/metamta/view/PhabricatorMetaMTAMailBody.php',
'PhabricatorMetaMTAMailBodyTestCase' => 'applications/metamta/view/__tests__/PhabricatorMetaMTAMailBodyTestCase.php',
'PhabricatorMetaMTAMailTestCase' => 'applications/metamta/storage/__tests__/PhabricatorMetaMTAMailTestCase.php',
+ 'PhabricatorMetaMTAMailgunReceiveController' => 'applications/metamta/controller/PhabricatorMetaMTAMailgunReceiveController.php',
'PhabricatorMetaMTAMailingList' => 'applications/mailinglists/storage/PhabricatorMetaMTAMailingList.php',
'PhabricatorMetaMTAPermanentFailureException' => 'applications/metamta/exception/PhabricatorMetaMTAPermanentFailureException.php',
'PhabricatorMetaMTAReceivedMail' => 'applications/metamta/storage/PhabricatorMetaMTAReceivedMail.php',
@@ -4207,6 +4209,7 @@
'PhabricatorMailManagementShowOutboundWorkflow' => 'PhabricatorMailManagementWorkflow',
'PhabricatorMailManagementWorkflow' => 'PhabricatorManagementWorkflow',
'PhabricatorMailReceiverTestCase' => 'PhabricatorTestCase',
+ 'PhabricatorMailgunConfigOptions' => 'PhabricatorApplicationConfigOptions',
'PhabricatorMailingListPHIDTypeList' => 'PhabricatorPHIDType',
'PhabricatorMailingListQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhabricatorMailingListSearchEngine' => 'PhabricatorApplicationSearchEngine',
@@ -4235,6 +4238,7 @@
'PhabricatorMetaMTAMail' => 'PhabricatorMetaMTADAO',
'PhabricatorMetaMTAMailBodyTestCase' => 'PhabricatorTestCase',
'PhabricatorMetaMTAMailTestCase' => 'PhabricatorTestCase',
+ 'PhabricatorMetaMTAMailgunReceiveController' => 'PhabricatorMetaMTAController',
'PhabricatorMetaMTAMailingList' =>
array(
0 => 'PhabricatorMetaMTADAO',
Index: src/applications/config/option/PhabricatorMailgunConfigOptions.php
===================================================================
--- /dev/null
+++ src/applications/config/option/PhabricatorMailgunConfigOptions.php
@@ -0,0 +1,22 @@
+<?php
+
+final class PhabricatorMailgunConfigOptions
+ extends PhabricatorApplicationConfigOptions {
+
+ public function getName() {
+ return pht("Integration with Mailgun");
+ }
+
+ public function getDescription() {
+ return pht("Configure Mailgun integration.");
+ }
+
+ public function getOptions() {
+ return array(
+ $this->newOption('mailgun.api-key', 'string', null)
+ ->setMasked(true)
+ ->setDescription(pht('Mailgun API key.')),
+ );
+ }
+
+}
Index: src/applications/metamta/application/PhabricatorApplicationMetaMTA.php
===================================================================
--- src/applications/metamta/application/PhabricatorApplicationMetaMTA.php
+++ src/applications/metamta/application/PhabricatorApplicationMetaMTA.php
@@ -34,6 +34,7 @@
return array(
$this->getBaseURI() => array(
'sendgrid/' => 'PhabricatorMetaMTASendGridReceiveController',
+ 'mailgun/' => 'PhabricatorMetaMTAMailgunReceiveController',
),
);
}
Index: src/applications/metamta/controller/PhabricatorMetaMTAMailgunReceiveController.php
===================================================================
--- /dev/null
+++ src/applications/metamta/controller/PhabricatorMetaMTAMailgunReceiveController.php
@@ -0,0 +1,81 @@
+<?php
+
+final class PhabricatorMetaMTAMailgunReceiveController
+ extends PhabricatorMetaMTAController {
+
+ public function shouldRequireLogin() {
+ return false;
+ }
+
+ private function verifyMessage() {
+ $api_key = PhabricatorEnv::getEnvConfig('mailgun.api-key');
+ $request = $this->getRequest();
+ $timestamp = $request->getStr('timestamp');
+ $token = $request->getStr('token');
+ $sig = $request->getStr('signature');
+ return hash_hmac('sha256', $timestamp.$token, $api_key) == $sig;
+
+ }
+ public function processRequest() {
+
+ // No CSRF for Mailgun.
+ $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();
+
+ if (!$this->verifyMessage()) {
+ $message = sprintf(
+ "PhabricatorMetaMTAMailgunReceiveController: ".
+ "message failed signature validation");
+ trigger_error($message, E_USER_WARNING);
+ $response = new AphrontWebpageResponse();
+ $response->setContent(pht("No. Just.... no.\n"));
+ return $response;
+ }
+
+ $request = $this->getRequest();
+ $user = $request->getUser();
+
+ $raw_headers = $request->getStr('headers');
+ $raw_headers = explode("\n", rtrim($raw_headers));
+ $raw_dict = array();
+ foreach (array_filter($raw_headers) as $header) {
+ list($name, $value) = explode(':', $header, 2);
+ $raw_dict[$name] = ltrim($value);
+ }
+
+ $headers = array(
+ 'to' => $request->getStr('recipient'),
+ 'from' => $request->getStr('from'),
+ 'subject' => $request->getStr('subject'),
+ ) + $raw_dict;
+
+ $received = new PhabricatorMetaMTAReceivedMail();
+ $received->setHeaders($headers);
+ $received->setBodies(array(
+ 'text' => $request->getStr('stripped-text'),
+ 'html' => $request->getStr('stripped-html'),
+ ));
+
+ $file_phids = array();
+ foreach ($_FILES as $file_raw) {
+ try {
+ $file = PhabricatorFile::newFromPHPUpload(
+ $file_raw,
+ array(
+ 'authorPHID' => $user->getPHID(),
+ ));
+ $file_phids[] = $file->getPHID();
+ } catch (Exception $ex) {
+ phlog($ex);
+ }
+ }
+ $received->setAttachments($file_phids);
+ $received->save();
+
+ $received->processReceivedMail();
+
+ $response = new AphrontWebpageResponse();
+ $response->setContent(pht("Got it! Thanks, Mailgun!\n"));
+ return $response;
+ }
+
+}

File Metadata

Mime Type
text/plain
Expires
Sun, Mar 16, 4:12 AM (6 d, 22 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7705679
Default Alt Text
D7989.id18072.diff (6 KB)

Event Timeline