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 @@ -3423,6 +3423,7 @@ 'PhabricatorMailReceiverTestCase' => 'applications/metamta/receiver/__tests__/PhabricatorMailReceiverTestCase.php', 'PhabricatorMailReplyHandler' => 'applications/metamta/replyhandler/PhabricatorMailReplyHandler.php', 'PhabricatorMailRoutingRule' => 'applications/metamta/constants/PhabricatorMailRoutingRule.php', + 'PhabricatorMailSMSMessage' => 'applications/metamta/message/PhabricatorMailSMSMessage.php', 'PhabricatorMailSMTPAdapter' => 'applications/metamta/adapter/PhabricatorMailSMTPAdapter.php', 'PhabricatorMailSendGridAdapter' => 'applications/metamta/adapter/PhabricatorMailSendGridAdapter.php', 'PhabricatorMailSendmailAdapter' => 'applications/metamta/adapter/PhabricatorMailSendmailAdapter.php', @@ -3430,6 +3431,7 @@ 'PhabricatorMailStamp' => 'applications/metamta/stamp/PhabricatorMailStamp.php', 'PhabricatorMailTarget' => 'applications/metamta/replyhandler/PhabricatorMailTarget.php', 'PhabricatorMailTestAdapter' => 'applications/metamta/adapter/PhabricatorMailTestAdapter.php', + 'PhabricatorMailTwilioAdapter' => 'applications/metamta/adapter/PhabricatorMailTwilioAdapter.php', 'PhabricatorMailUtil' => 'applications/metamta/util/PhabricatorMailUtil.php', 'PhabricatorMainMenuBarExtension' => 'view/page/menu/PhabricatorMainMenuBarExtension.php', 'PhabricatorMainMenuSearchView' => 'view/page/menu/PhabricatorMainMenuSearchView.php', @@ -3851,6 +3853,7 @@ 'PhabricatorPholioApplication' => 'applications/pholio/application/PhabricatorPholioApplication.php', 'PhabricatorPholioConfigOptions' => 'applications/pholio/config/PhabricatorPholioConfigOptions.php', 'PhabricatorPholioMockTestDataGenerator' => 'applications/pholio/lipsum/PhabricatorPholioMockTestDataGenerator.php', + 'PhabricatorPhoneNumber' => 'applications/metamta/message/PhabricatorPhoneNumber.php', 'PhabricatorPhortuneApplication' => 'applications/phortune/application/PhabricatorPhortuneApplication.php', 'PhabricatorPhortuneContentSource' => 'applications/phortune/contentsource/PhabricatorPhortuneContentSource.php', 'PhabricatorPhortuneManagementInvoiceWorkflow' => 'applications/phortune/management/PhabricatorPhortuneManagementInvoiceWorkflow.php', @@ -9257,6 +9260,7 @@ 'PhabricatorMailReceiverTestCase' => 'PhabricatorTestCase', 'PhabricatorMailReplyHandler' => 'Phobject', 'PhabricatorMailRoutingRule' => 'Phobject', + 'PhabricatorMailSMSMessage' => 'PhabricatorMailExternalMessage', 'PhabricatorMailSMTPAdapter' => 'PhabricatorMailAdapter', 'PhabricatorMailSendGridAdapter' => 'PhabricatorMailAdapter', 'PhabricatorMailSendmailAdapter' => 'PhabricatorMailAdapter', @@ -9264,6 +9268,7 @@ 'PhabricatorMailStamp' => 'Phobject', 'PhabricatorMailTarget' => 'Phobject', 'PhabricatorMailTestAdapter' => 'PhabricatorMailAdapter', + 'PhabricatorMailTwilioAdapter' => 'PhabricatorMailAdapter', 'PhabricatorMailUtil' => 'Phobject', 'PhabricatorMainMenuBarExtension' => 'Phobject', 'PhabricatorMainMenuSearchView' => 'AphrontView', @@ -9768,6 +9773,7 @@ 'PhabricatorPholioApplication' => 'PhabricatorApplication', 'PhabricatorPholioConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorPholioMockTestDataGenerator' => 'PhabricatorTestDataGenerator', + 'PhabricatorPhoneNumber' => 'Phobject', 'PhabricatorPhortuneApplication' => 'PhabricatorApplication', 'PhabricatorPhortuneContentSource' => 'PhabricatorContentSource', 'PhabricatorPhortuneManagementInvoiceWorkflow' => 'PhabricatorPhortuneManagementWorkflow', diff --git a/src/applications/metamta/adapter/PhabricatorMailTwilioAdapter.php b/src/applications/metamta/adapter/PhabricatorMailTwilioAdapter.php new file mode 100644 --- /dev/null +++ b/src/applications/metamta/adapter/PhabricatorMailTwilioAdapter.php @@ -0,0 +1,61 @@ + 'string', + 'auth-token' => 'string', + 'from-number' => 'string', + )); + + // Construct an object from the "from-number" to validate it. + $number = new PhabricatorPhoneNumber($options['from-number']); + } + + public function newDefaultOptions() { + return array( + 'account-sid' => null, + 'auth-token' => null, + 'from-number' => null, + ); + } + + public function sendMessage(PhabricatorMailExternalMessage $message) { + $account_sid = $this->getOption('account-sid'); + + $auth_token = $this->getOption('auth-token'); + $auth_token = new PhutilOpaqueEnvelope($auth_token); + + $from_number = $this->getOption('from-number'); + $from_number = new PhabricatorPhoneNumber($from_number); + + $to_number = $message->getToNumber(); + $text_body = $message->getTextBody(); + + $parameters = array( + 'From' => $from_number->toE164(), + 'To' => $to_number->toE164(), + 'Body' => $text_body, + ); + + $result = id(new PhabricatorTwilioFuture()) + ->setAccountSID($account_sid) + ->setAuthToken($auth_token) + ->setMethod('Messages.json', $parameters) + ->setTimeout(60) + ->resolve(); + } + +} diff --git a/src/applications/metamta/future/PhabricatorTwilioFuture.php b/src/applications/metamta/future/PhabricatorTwilioFuture.php --- a/src/applications/metamta/future/PhabricatorTwilioFuture.php +++ b/src/applications/metamta/future/PhabricatorTwilioFuture.php @@ -7,6 +7,7 @@ private $authToken; private $method; private $parameters; + private $timeout; public function __construct() { parent::__construct(null); @@ -28,6 +29,15 @@ return $this; } + public function setTimeout($timeout) { + $this->timeout = $timeout; + return $this; + } + + public function getTimeout() { + return $this->timeout; + } + protected function getProxiedFuture() { if (!$this->future) { if ($this->accountSID === null) { @@ -58,6 +68,11 @@ ->setMethod('POST') ->addHeader('Accept', 'application/json'); + $timeout = $this->getTimeout(); + if ($timeout) { + $future->setTimeout($timeout); + } + $this->future = $future; } diff --git a/src/applications/metamta/message/PhabricatorMailSMSMessage.php b/src/applications/metamta/message/PhabricatorMailSMSMessage.php new file mode 100644 --- /dev/null +++ b/src/applications/metamta/message/PhabricatorMailSMSMessage.php @@ -0,0 +1,29 @@ +toNumber = $to_number; + return $this; + } + + public function getToNumber() { + return $this->toNumber; + } + + public function setTextBody($text_body) { + $this->textBody = $text_body; + return $this; + } + + public function getTextBody() { + return $this->textBody; + } + +} diff --git a/src/applications/metamta/message/PhabricatorPhoneNumber.php b/src/applications/metamta/message/PhabricatorPhoneNumber.php new file mode 100644 --- /dev/null +++ b/src/applications/metamta/message/PhabricatorPhoneNumber.php @@ -0,0 +1,25 @@ +number = $number; + } + + public function toE164() { + return '+'.$this->number; + } + +}