diff --git a/scripts/sms/manage_sms.php b/scripts/sms/manage_sms.php new file mode 100755 --- /dev/null +++ b/scripts/sms/manage_sms.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage sms')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorNotificationManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2071,7 +2071,6 @@ 'PeopleMainMenuBarExtension' => 'applications/people/engineextension/PeopleMainMenuBarExtension.php', 'PeopleUserLogGarbageCollector' => 'applications/people/garbagecollector/PeopleUserLogGarbageCollector.php', 'Phabricator404Controller' => 'applications/base/controller/Phabricator404Controller.php', - 'PhabricatorAWSConfigOptions' => 'applications/config/option/PhabricatorAWSConfigOptions.php', 'PhabricatorAccessControlTestCase' => 'applications/base/controller/__tests__/PhabricatorAccessControlTestCase.php', 'PhabricatorAccessLog' => 'infrastructure/log/PhabricatorAccessLog.php', 'PhabricatorAccessLogConfigOptions' => 'applications/config/option/PhabricatorAccessLogConfigOptions.php', @@ -2083,6 +2082,7 @@ 'PhabricatorAjaxRequestExceptionHandler' => 'aphront/handler/PhabricatorAjaxRequestExceptionHandler.php', 'PhabricatorAlmanacApplication' => 'applications/almanac/application/PhabricatorAlmanacApplication.php', 'PhabricatorAmazonAuthProvider' => 'applications/auth/provider/PhabricatorAmazonAuthProvider.php', + 'PhabricatorAmazonSNSFuture' => 'applications/metamta/future/PhabricatorAmazonSNSFuture.php', 'PhabricatorAnchorView' => 'view/layout/PhabricatorAnchorView.php', 'PhabricatorAphlictManagementDebugWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementDebugWorkflow.php', 'PhabricatorAphlictManagementNotifyWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementNotifyWorkflow.php', @@ -3425,6 +3425,7 @@ 'PhabricatorMacroViewController' => 'applications/macro/controller/PhabricatorMacroViewController.php', 'PhabricatorMailAdapter' => 'applications/metamta/adapter/PhabricatorMailAdapter.php', 'PhabricatorMailAmazonSESAdapter' => 'applications/metamta/adapter/PhabricatorMailAmazonSESAdapter.php', + 'PhabricatorMailAmazonSNSAdapter' => 'applications/metamta/adapter/PhabricatorMailAmazonSNSAdapter.php', 'PhabricatorMailAttachment' => 'applications/metamta/message/PhabricatorMailAttachment.php', 'PhabricatorMailConfigTestCase' => 'applications/metamta/storage/__tests__/PhabricatorMailConfigTestCase.php', 'PhabricatorMailEmailEngine' => 'applications/metamta/engine/PhabricatorMailEmailEngine.php', @@ -7761,7 +7762,6 @@ 'PeopleMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension', 'PeopleUserLogGarbageCollector' => 'PhabricatorGarbageCollector', 'Phabricator404Controller' => 'PhabricatorController', - 'PhabricatorAWSConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorAccessControlTestCase' => 'PhabricatorTestCase', 'PhabricatorAccessLog' => 'Phobject', 'PhabricatorAccessLogConfigOptions' => 'PhabricatorApplicationConfigOptions', @@ -7773,6 +7773,7 @@ 'PhabricatorAjaxRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler', 'PhabricatorAlmanacApplication' => 'PhabricatorApplication', 'PhabricatorAmazonAuthProvider' => 'PhabricatorOAuth2AuthProvider', + 'PhabricatorAmazonSNSFuture' => 'PhutilAWSFuture', 'PhabricatorAnchorView' => 'AphrontView', 'PhabricatorAphlictManagementDebugWorkflow' => 'PhabricatorAphlictManagementWorkflow', 'PhabricatorAphlictManagementNotifyWorkflow' => 'PhabricatorAphlictManagementWorkflow', @@ -9318,6 +9319,7 @@ 'PhabricatorMacroViewController' => 'PhabricatorMacroController', 'PhabricatorMailAdapter' => 'Phobject', 'PhabricatorMailAmazonSESAdapter' => 'PhabricatorMailAdapter', + 'PhabricatorMailAmazonSNSAdapter' => 'PhabricatorMailAdapter', 'PhabricatorMailAttachment' => 'Phobject', 'PhabricatorMailConfigTestCase' => 'PhabricatorTestCase', 'PhabricatorMailEmailEngine' => 'PhabricatorMailMessageEngine', diff --git a/src/applications/config/option/PhabricatorAWSConfigOptions.php b/src/applications/config/option/PhabricatorAWSConfigOptions.php deleted file mode 100644 --- a/src/applications/config/option/PhabricatorAWSConfigOptions.php +++ /dev/null @@ -1,60 +0,0 @@ -newOption('amazon-s3.access-key', 'string', null) - ->setLocked(true) - ->setDescription(pht('Access key for Amazon S3.')), - $this->newOption('amazon-s3.secret-key', 'string', null) - ->setHidden(true) - ->setDescription(pht('Secret key for Amazon S3.')), - $this->newOption('amazon-s3.region', 'string', null) - ->setLocked(true) - ->setDescription( - pht( - 'Amazon S3 region where your S3 bucket is located. When you '. - 'specify a region, you should also specify a corresponding '. - 'endpoint with `amazon-s3.endpoint`. You can find a list of '. - 'available regions and endpoints in the AWS documentation.')) - ->addExample('us-west-1', pht('USWest Region')), - $this->newOption('amazon-s3.endpoint', 'string', null) - ->setLocked(true) - ->setDescription( - pht( - 'Explicit S3 endpoint to use. This should be the endpoint '. - 'which corresponds to the region you have selected in '. - '`amazon-s3.region`. Phabricator can not determine the correct '. - 'endpoint automatically because some endpoint locations are '. - 'irregular.')) - ->addExample( - 's3-us-west-1.amazonaws.com', - pht('Use specific endpoint')), - $this->newOption('amazon-ec2.access-key', 'string', null) - ->setLocked(true) - ->setDescription(pht('Access key for Amazon EC2.')), - $this->newOption('amazon-ec2.secret-key', 'string', null) - ->setHidden(true) - ->setDescription(pht('Secret key for Amazon EC2.')), - ); - } - -} diff --git a/src/applications/metamta/adapter/PhabricatorMailAmazonSNSAdapter.php b/src/applications/metamta/adapter/PhabricatorMailAmazonSNSAdapter.php new file mode 100644 --- /dev/null +++ b/src/applications/metamta/adapter/PhabricatorMailAmazonSNSAdapter.php @@ -0,0 +1,66 @@ + '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(); + } + +} diff --git a/src/applications/metamta/future/PhabricatorAmazonSNSFuture.php b/src/applications/metamta/future/PhabricatorAmazonSNSFuture.php new file mode 100644 --- /dev/null +++ b/src/applications/metamta/future/PhabricatorAmazonSNSFuture.php @@ -0,0 +1,41 @@ +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; + + } + +} diff --git a/src/docs/user/configuration/configuring_outbound_email.diviner b/src/docs/user/configuration/configuring_outbound_email.diviner --- a/src/docs/user/configuration/configuring_outbound_email.diviner +++ b/src/docs/user/configuration/configuring_outbound_email.diviner @@ -97,6 +97,7 @@ - `ses`: Use Amazon SES. - `sendgrid`: Use SendGrid. - `postmark`: Use Postmark. + - `sns`: Use Amazon SNS (only for sending SMS messages). It also supports these local mailers: @@ -208,6 +209,15 @@ config, then follow the Amazon SES verification process to verify it. You 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 +. 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 SNS configuration above. Mailer: SendGrid ================ diff --git a/src/infrastructure/cluster/config/PhabricatorClusterMailersConfigType.php b/src/infrastructure/cluster/config/PhabricatorClusterMailersConfigType.php --- a/src/infrastructure/cluster/config/PhabricatorClusterMailersConfigType.php +++ b/src/infrastructure/cluster/config/PhabricatorClusterMailersConfigType.php @@ -45,6 +45,7 @@ 'options' => 'optional wild', 'inbound' => 'optional bool', 'outbound' => 'optional bool', + 'media' => 'optional list', )); } catch (Exception $ex) { throw $this->newException(