Differential D15575 Diff 37548 src/applications/metamta/controller/PhabricatorMetaMTAMailgunReceiveController.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/metamta/controller/PhabricatorMetaMTAMailgunReceiveController.php
| Show All 22 Lines | public function handleRequest(AphrontRequest $request) { | ||||
| // No CSRF for Mailgun. | // No CSRF for Mailgun. | ||||
| $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites(); | $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites(); | ||||
| if (!$this->verifyMessage()) { | if (!$this->verifyMessage()) { | ||||
| throw new Exception( | throw new Exception( | ||||
| pht('Mail signature is not valid. Check your Mailgun API key.')); | pht('Mail signature is not valid. Check your Mailgun API key.')); | ||||
| } | } | ||||
| $user = $request->getUser(); | $raw_headers = $request->getStr('message-headers'); | ||||
| $raw_headers = $request->getStr('headers'); | |||||
| $raw_headers = explode("\n", rtrim($raw_headers)); | |||||
| $raw_dict = array(); | $raw_dict = array(); | ||||
| foreach (array_filter($raw_headers) as $header) { | if (strlen($raw_headers)) { | ||||
| list($name, $value) = explode(':', $header, 2); | $raw_headers = phutil_json_decode($raw_headers); | ||||
| $raw_dict[$name] = ltrim($value); | foreach ($raw_headers as $raw_header) { | ||||
| list($name, $value) = $raw_header; | |||||
| $raw_dict[$name] = $value; | |||||
| } | |||||
| } | } | ||||
| $headers = array( | $headers = array( | ||||
| 'to' => $request->getStr('recipient'), | 'to' => $request->getStr('recipient'), | ||||
| 'from' => $request->getStr('from'), | 'from' => $request->getStr('from'), | ||||
| 'subject' => $request->getStr('subject'), | 'subject' => $request->getStr('subject'), | ||||
| ) + $raw_dict; | ) + $raw_dict; | ||||
| Show All 13 Lines | foreach ($_FILES as $file_raw) { | ||||
| 'viewPolicy' => PhabricatorPolicies::POLICY_NOONE, | 'viewPolicy' => PhabricatorPolicies::POLICY_NOONE, | ||||
| )); | )); | ||||
| $file_phids[] = $file->getPHID(); | $file_phids[] = $file->getPHID(); | ||||
| } catch (Exception $ex) { | } catch (Exception $ex) { | ||||
| phlog($ex); | phlog($ex); | ||||
| } | } | ||||
| } | } | ||||
| $received->setAttachments($file_phids); | $received->setAttachments($file_phids); | ||||
| $received->save(); | |||||
| try { | |||||
| $received->save(); | |||||
| $received->processReceivedMail(); | $received->processReceivedMail(); | ||||
| } catch (Exception $ex) { | |||||
| // We can get exceptions here in two cases. | |||||
| // First, saving the message may throw if we have already received a | |||||
| // message with the same Message ID. In this case, we're declining to | |||||
| // process a duplicate message, so failing silently is correct. | |||||
| // Second, processing the message may throw (for example, if it contains | |||||
| // an invalid !command). This will generate an email as a side effect, | |||||
| // so we don't need to explicitly handle the exception here. | |||||
| // In these cases, we want to return HTTP 200. If we do not, MailGun will | |||||
| // re-transmit the message later. | |||||
| phlog($ex); | |||||
| } | |||||
| $response = new AphrontWebpageResponse(); | $response = new AphrontWebpageResponse(); | ||||
| $response->setContent(pht("Got it! Thanks, Mailgun!\n")); | $response->setContent(pht("Got it! Thanks, Mailgun!\n")); | ||||
| return $response; | return $response; | ||||
| } | } | ||||
| } | } | ||||