[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/metamta/controller/ -> PhabricatorMetaMTAMailgunReceiveController.php (source)

   1  <?php
   2  
   3  final class PhabricatorMetaMTAMailgunReceiveController
   4    extends PhabricatorMetaMTAController {
   5  
   6    public function shouldRequireLogin() {
   7      return false;
   8    }
   9  
  10    private function verifyMessage() {
  11      $api_key = PhabricatorEnv::getEnvConfig('mailgun.api-key');
  12      $request = $this->getRequest();
  13      $timestamp = $request->getStr('timestamp');
  14      $token = $request->getStr('token');
  15      $sig = $request->getStr('signature');
  16      return hash_hmac('sha256', $timestamp.$token, $api_key) == $sig;
  17  
  18    }
  19    public function processRequest() {
  20  
  21      // No CSRF for Mailgun.
  22      $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();
  23  
  24      if (!$this->verifyMessage()) {
  25        throw new Exception(
  26          'Mail signature is not valid. Check your Mailgun API key.');
  27      }
  28  
  29      $request = $this->getRequest();
  30      $user = $request->getUser();
  31  
  32      $raw_headers = $request->getStr('headers');
  33      $raw_headers = explode("\n", rtrim($raw_headers));
  34      $raw_dict = array();
  35      foreach (array_filter($raw_headers) as $header) {
  36        list($name, $value) = explode(':', $header, 2);
  37        $raw_dict[$name] = ltrim($value);
  38      }
  39  
  40      $headers = array(
  41        'to'      => $request->getStr('recipient'),
  42        'from'    => $request->getStr('from'),
  43        'subject' => $request->getStr('subject'),
  44      ) + $raw_dict;
  45  
  46      $received = new PhabricatorMetaMTAReceivedMail();
  47      $received->setHeaders($headers);
  48      $received->setBodies(array(
  49        'text' => $request->getStr('stripped-text'),
  50        'html' => $request->getStr('stripped-html'),
  51      ));
  52  
  53      $file_phids = array();
  54      foreach ($_FILES as $file_raw) {
  55        try {
  56          $file = PhabricatorFile::newFromPHPUpload(
  57            $file_raw,
  58            array(
  59              'authorPHID' => $user->getPHID(),
  60            ));
  61          $file_phids[] = $file->getPHID();
  62        } catch (Exception $ex) {
  63          phlog($ex);
  64        }
  65      }
  66      $received->setAttachments($file_phids);
  67      $received->save();
  68  
  69      $received->processReceivedMail();
  70  
  71      $response = new AphrontWebpageResponse();
  72      $response->setContent(pht("Got it! Thanks, Mailgun!\n"));
  73      return $response;
  74    }
  75  
  76  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1