Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15388645
D7989.id18072.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
6 KB
Referenced Files
None
Subscribers
None
D7989.id18072.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D7989: Mailgun receive support
Attached
Detach File
Event Timeline
Log In to Comment