mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-10 08:52:39 +01:00
Add infrastructure for sending SMS via AWS SNS
Summary: Ref T920. Ref T13235. This adds a `Future`, similar to `TwilioFuture`, for interacting with Amazon's SNS service. Also updates the documentation. Also makes the code consistent with the documentation by accepting a `media` argument. Test Plan: Clicked the "send test message" button from the Settings UI. Reviewers: epriestley Reviewed By: epriestley Subscribers: Korvin Maniphest Tasks: T13235, T920 Differential Revision: https://secure.phabricator.com/D19982
This commit is contained in:
parent
ab2cbbd9f9
commit
e72684a4ba
5 changed files with 119 additions and 0 deletions
|
@ -2083,6 +2083,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorAjaxRequestExceptionHandler' => 'aphront/handler/PhabricatorAjaxRequestExceptionHandler.php',
|
'PhabricatorAjaxRequestExceptionHandler' => 'aphront/handler/PhabricatorAjaxRequestExceptionHandler.php',
|
||||||
'PhabricatorAlmanacApplication' => 'applications/almanac/application/PhabricatorAlmanacApplication.php',
|
'PhabricatorAlmanacApplication' => 'applications/almanac/application/PhabricatorAlmanacApplication.php',
|
||||||
'PhabricatorAmazonAuthProvider' => 'applications/auth/provider/PhabricatorAmazonAuthProvider.php',
|
'PhabricatorAmazonAuthProvider' => 'applications/auth/provider/PhabricatorAmazonAuthProvider.php',
|
||||||
|
'PhabricatorAmazonSNSFuture' => 'applications/metamta/future/PhabricatorAmazonSNSFuture.php',
|
||||||
'PhabricatorAnchorView' => 'view/layout/PhabricatorAnchorView.php',
|
'PhabricatorAnchorView' => 'view/layout/PhabricatorAnchorView.php',
|
||||||
'PhabricatorAphlictManagementDebugWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementDebugWorkflow.php',
|
'PhabricatorAphlictManagementDebugWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementDebugWorkflow.php',
|
||||||
'PhabricatorAphlictManagementNotifyWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementNotifyWorkflow.php',
|
'PhabricatorAphlictManagementNotifyWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementNotifyWorkflow.php',
|
||||||
|
@ -3425,6 +3426,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorMacroViewController' => 'applications/macro/controller/PhabricatorMacroViewController.php',
|
'PhabricatorMacroViewController' => 'applications/macro/controller/PhabricatorMacroViewController.php',
|
||||||
'PhabricatorMailAdapter' => 'applications/metamta/adapter/PhabricatorMailAdapter.php',
|
'PhabricatorMailAdapter' => 'applications/metamta/adapter/PhabricatorMailAdapter.php',
|
||||||
'PhabricatorMailAmazonSESAdapter' => 'applications/metamta/adapter/PhabricatorMailAmazonSESAdapter.php',
|
'PhabricatorMailAmazonSESAdapter' => 'applications/metamta/adapter/PhabricatorMailAmazonSESAdapter.php',
|
||||||
|
'PhabricatorMailAmazonSNSAdapter' => 'applications/metamta/adapter/PhabricatorMailAmazonSNSAdapter.php',
|
||||||
'PhabricatorMailAttachment' => 'applications/metamta/message/PhabricatorMailAttachment.php',
|
'PhabricatorMailAttachment' => 'applications/metamta/message/PhabricatorMailAttachment.php',
|
||||||
'PhabricatorMailConfigTestCase' => 'applications/metamta/storage/__tests__/PhabricatorMailConfigTestCase.php',
|
'PhabricatorMailConfigTestCase' => 'applications/metamta/storage/__tests__/PhabricatorMailConfigTestCase.php',
|
||||||
'PhabricatorMailEmailEngine' => 'applications/metamta/engine/PhabricatorMailEmailEngine.php',
|
'PhabricatorMailEmailEngine' => 'applications/metamta/engine/PhabricatorMailEmailEngine.php',
|
||||||
|
@ -7773,6 +7775,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorAjaxRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler',
|
'PhabricatorAjaxRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler',
|
||||||
'PhabricatorAlmanacApplication' => 'PhabricatorApplication',
|
'PhabricatorAlmanacApplication' => 'PhabricatorApplication',
|
||||||
'PhabricatorAmazonAuthProvider' => 'PhabricatorOAuth2AuthProvider',
|
'PhabricatorAmazonAuthProvider' => 'PhabricatorOAuth2AuthProvider',
|
||||||
|
'PhabricatorAmazonSNSFuture' => 'PhutilAWSFuture',
|
||||||
'PhabricatorAnchorView' => 'AphrontView',
|
'PhabricatorAnchorView' => 'AphrontView',
|
||||||
'PhabricatorAphlictManagementDebugWorkflow' => 'PhabricatorAphlictManagementWorkflow',
|
'PhabricatorAphlictManagementDebugWorkflow' => 'PhabricatorAphlictManagementWorkflow',
|
||||||
'PhabricatorAphlictManagementNotifyWorkflow' => 'PhabricatorAphlictManagementWorkflow',
|
'PhabricatorAphlictManagementNotifyWorkflow' => 'PhabricatorAphlictManagementWorkflow',
|
||||||
|
@ -9318,6 +9321,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorMacroViewController' => 'PhabricatorMacroController',
|
'PhabricatorMacroViewController' => 'PhabricatorMacroController',
|
||||||
'PhabricatorMailAdapter' => 'Phobject',
|
'PhabricatorMailAdapter' => 'Phobject',
|
||||||
'PhabricatorMailAmazonSESAdapter' => 'PhabricatorMailAdapter',
|
'PhabricatorMailAmazonSESAdapter' => 'PhabricatorMailAdapter',
|
||||||
|
'PhabricatorMailAmazonSNSAdapter' => 'PhabricatorMailAdapter',
|
||||||
'PhabricatorMailAttachment' => 'Phobject',
|
'PhabricatorMailAttachment' => 'Phobject',
|
||||||
'PhabricatorMailConfigTestCase' => 'PhabricatorTestCase',
|
'PhabricatorMailConfigTestCase' => 'PhabricatorTestCase',
|
||||||
'PhabricatorMailEmailEngine' => 'PhabricatorMailMessageEngine',
|
'PhabricatorMailEmailEngine' => 'PhabricatorMailMessageEngine',
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorMailAmazonSNSAdapter
|
||||||
|
extends PhabricatorMailAdapter {
|
||||||
|
|
||||||
|
const ADAPTERTYPE = 'sns';
|
||||||
|
|
||||||
|
public function getSupportedMessageTypes() {
|
||||||
|
return array(
|
||||||
|
PhabricatorMailSMSMessage::MESSAGETYPE,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function validateOptions(array $options) {
|
||||||
|
PhutilTypeSpec::checkMap(
|
||||||
|
$options,
|
||||||
|
array(
|
||||||
|
'access-key' => 'string',
|
||||||
|
'secret-key' => 'string',
|
||||||
|
'endpoint' => 'string',
|
||||||
|
'region' => 'string',
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function newDefaultOptions() {
|
||||||
|
return array(
|
||||||
|
'access-key' => null,
|
||||||
|
'secret-key' => null,
|
||||||
|
'endpoint' => null,
|
||||||
|
'region' => null,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function sendMessage(PhabricatorMailExternalMessage $message) {
|
||||||
|
$access_key = $this->getOption('access-key');
|
||||||
|
|
||||||
|
$secret_key = $this->getOption('secret-key');
|
||||||
|
$secret_key = new PhutilOpaqueEnvelope($secret_key);
|
||||||
|
|
||||||
|
$endpoint = $this->getOption('endpoint');
|
||||||
|
$region = $this->getOption('region');
|
||||||
|
|
||||||
|
$to_number = $message->getToNumber();
|
||||||
|
$text_body = $message->getTextBody();
|
||||||
|
|
||||||
|
$params = array(
|
||||||
|
'Version' => '2010-03-31',
|
||||||
|
'Action' => 'Publish',
|
||||||
|
'PhoneNumber' => $to_number->toE164(),
|
||||||
|
'Message' => $text_body,
|
||||||
|
);
|
||||||
|
|
||||||
|
return id(new PhabricatorAmazonSNSFuture())
|
||||||
|
->setParameters($params)
|
||||||
|
->setEndpoint($endpoint)
|
||||||
|
->setAccessKey($access_key)
|
||||||
|
->setSecretKey($secret_key)
|
||||||
|
->setRegion($region)
|
||||||
|
->setTimeout(60)
|
||||||
|
->resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorAmazonSNSFuture extends PhutilAWSFuture {
|
||||||
|
private $parameters = array();
|
||||||
|
private $timeout;
|
||||||
|
|
||||||
|
public function setParameters($parameters) {
|
||||||
|
$this->parameters = $parameters;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getParameters() {
|
||||||
|
return $this->parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getServiceName() {
|
||||||
|
return 'sns';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setTimeout($timeout) {
|
||||||
|
$this->timeout = $timeout;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTimeout() {
|
||||||
|
return $this->timeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getProxiedFuture() {
|
||||||
|
$future = parent::getProxiedFuture();
|
||||||
|
|
||||||
|
$timeout = $this->getTimeout();
|
||||||
|
if ($timeout) {
|
||||||
|
$future->setTimeout($timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $future;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -97,6 +97,7 @@ The `type` field can be used to select these third-party mailers:
|
||||||
- `ses`: Use Amazon SES.
|
- `ses`: Use Amazon SES.
|
||||||
- `sendgrid`: Use SendGrid.
|
- `sendgrid`: Use SendGrid.
|
||||||
- `postmark`: Use Postmark.
|
- `postmark`: Use Postmark.
|
||||||
|
- `sns`: Use Amazon SNS (only for sending SMS messages).
|
||||||
|
|
||||||
It also supports these local mailers:
|
It also supports these local mailers:
|
||||||
|
|
||||||
|
@ -208,6 +209,15 @@ which "From" address to use by setting `metamta.default-address` in your
|
||||||
config, then follow the Amazon SES verification process to verify it. You
|
config, then follow the Amazon SES verification process to verify it. You
|
||||||
won't be able to send email until you do this!
|
won't be able to send email until you do this!
|
||||||
|
|
||||||
|
Mailer: Amazon SNS
|
||||||
|
==================
|
||||||
|
|
||||||
|
Amazon SNS is Amazon's cloud notification service. You can learn more at
|
||||||
|
<http://aws.amazon.com/sns/>. Note that this mailer is only able to send
|
||||||
|
SMS messages, not emails.
|
||||||
|
|
||||||
|
To use this mailer, set `type` to `sns`, then configure the options similarly
|
||||||
|
to the SES configuration above.
|
||||||
|
|
||||||
Mailer: SendGrid
|
Mailer: SendGrid
|
||||||
================
|
================
|
||||||
|
|
|
@ -45,6 +45,7 @@ final class PhabricatorClusterMailersConfigType
|
||||||
'options' => 'optional wild',
|
'options' => 'optional wild',
|
||||||
'inbound' => 'optional bool',
|
'inbound' => 'optional bool',
|
||||||
'outbound' => 'optional bool',
|
'outbound' => 'optional bool',
|
||||||
|
'media' => 'optional list<string>',
|
||||||
));
|
));
|
||||||
} catch (Exception $ex) {
|
} catch (Exception $ex) {
|
||||||
throw $this->newException(
|
throw $this->newException(
|
||||||
|
|
Loading…
Reference in a new issue