Page MenuHomePhabricator

D8930.id21194.diff
No OneTemporary

D8930.id21194.diff

diff --git a/externals/twilio-php b/externals/twilio-php
new file mode 160000
--- /dev/null
+++ b/externals/twilio-php
@@ -0,0 +1 @@
+Subproject commit 389e07ee41eabc422ea88b805006bccac7de9eb3
diff --git a/src/infrastructure/sms/adapter/PhabricatorSMSImplementationAdapter.php b/src/infrastructure/sms/adapter/PhabricatorSMSImplementationAdapter.php
new file mode 100644
--- /dev/null
+++ b/src/infrastructure/sms/adapter/PhabricatorSMSImplementationAdapter.php
@@ -0,0 +1,63 @@
+<?php
+
+abstract class PhabricatorSMSImplementationAdapter {
+
+ private $fromNumber;
+ private $toNumber;
+ private $body;
+
+ public function setFrom($number) {
+ $this->fromNumber = $number;
+ return $this;
+ }
+
+ public function getFrom() {
+ return $this->fromNumber;
+ }
+
+ public function setTo($number) {
+ $this->toNumber = $number;
+ return $this;
+ }
+
+ public function getTo() {
+ return $this->toNumber;
+ }
+
+ public function setBody($body) {
+ $this->body = $body;
+ return $this;
+ }
+
+ public function getBody() {
+ return $this->body;
+ }
+
+ /**
+ * Send the message. Generally, this means connecting to some service and
+ * handing data to it.
+ *
+ * If the adapter determines that the SMS will never be deliverable, it
+ * should throw an exception.
+ *
+ * For temporary failures, throw some other exception or return `false`.
+ *
+ * @return bool True on success.
+ */
+ abstract public function send();
+
+ /**
+ * Convenience function to handling sending an SMS.
+ */
+ public static function sendSMS(array $to_numbers, $body) {
+ $adapter = PhabricatorEnv::getEnvConfig('sms.default-adapter');
+ $from_number = PhabricatorEnv::getEnvConfig('sms.default-sender');
+ PhabricatorWorker::scheduleTask(
+ 'PhabricatorSMSDemultiplexer',
+ array(
+ 'fromNumber' => $from_number,
+ 'toNumbers' => $to_numbers,
+ 'body' => $body,
+ 'adapter' => $adapter));
+ }
+}
diff --git a/src/infrastructure/sms/adapter/PhabricatorSMSImplementationTwilioAdapter.php b/src/infrastructure/sms/adapter/PhabricatorSMSImplementationTwilioAdapter.php
new file mode 100644
--- /dev/null
+++ b/src/infrastructure/sms/adapter/PhabricatorSMSImplementationTwilioAdapter.php
@@ -0,0 +1,20 @@
+<?php
+
+final class PhabricatorSMSImplementationTwilioAdapter
+ extends PhabricatorSMSImplementationAdapter {
+
+ /**
+ * @phutil-external-symbol class Services_Twilio
+ */
+ public function send() {
+ $account_sid = PhabricatorEnv::getEnvConfig('twilio.account-sid');
+ $auth_token = PhabricatorEnv::getEnvConfig('twilio.auth-token');
+
+ $client = new Services_Twilio($account_sid, $auth_token);
+
+ $client->account->sms_messages->create(array(
+ 'From' => $this->getFrom(),
+ 'To' => $this->getTo(),
+ 'Body' => $this->getBody()));
+ }
+}
diff --git a/src/infrastructure/sms/storage/PhabricatorSMS.php b/src/infrastructure/sms/storage/PhabricatorSMS.php
new file mode 100644
--- /dev/null
+++ b/src/infrastructure/sms/storage/PhabricatorSMS.php
@@ -0,0 +1,17 @@
+<?php
+
+final class PhabricatorSMS
+ extends PhabricatorLiskDAO {
+
+ const STATUS_UNSENT = 'unsent';
+ const STATUS_SENT = 'sent';
+ const STATUS_FAILED = 'failed';
+ const STATUS_FAILED_PERMANENTLY = 'permafailed';
+
+ protected $toNumber;
+ protected $fromNumber;
+ protected $body;
+ protected $sendStatus;
+ protected $sendCount;
+
+}
diff --git a/src/infrastructure/sms/worker/PhabricatorSMSDemultiplexWorker.php b/src/infrastructure/sms/worker/PhabricatorSMSDemultiplexWorker.php
new file mode 100644
--- /dev/null
+++ b/src/infrastructure/sms/worker/PhabricatorSMSDemultiplexWorker.php
@@ -0,0 +1,28 @@
+<?php
+
+final class PhabricatorSMSDemultiplexWorker
+ extends PhabricatorSMSWorker {
+
+ public function doWork() {
+ $viewer = PhabricatorUser::getOmnipotentUser();
+
+ $task_data = $this->getTaskData();
+
+ $to_numbers = idx($task_data, 'toNumbers');
+ if (!$to_numbers) {
+ // If we don't have any to numbers, don't send any sms.
+ return;
+ }
+
+ foreach ($to_numbers as $number) {
+ $this->queueTask(
+ 'PhabricatorSMSSendWorker',
+ array(
+ 'fromNumber' => $task_data['from_number'],
+ 'toNumber' => $number,
+ 'body' => $task_data['body'],
+ 'adapter' => $task_data['adapter']));
+ }
+ }
+
+}
diff --git a/src/infrastructure/sms/worker/PhabricatorSMSSendWorker.php b/src/infrastructure/sms/worker/PhabricatorSMSSendWorker.php
new file mode 100644
--- /dev/null
+++ b/src/infrastructure/sms/worker/PhabricatorSMSSendWorker.php
@@ -0,0 +1,18 @@
+<?php
+
+final class PhabricatorSMSSendWorker
+ extends PhabricatorSMSWorker {
+
+ public function doWork() {
+ $viewer = PhabricatorUser::getOmnipotentUser();
+
+ $task_data = $this->getTaskData();
+
+ $adapter = newv($task_data['adapter'], array());
+ $adapter->setTo($task_data['toNumber']);
+ $adapter->setFrom($task_data['fromNumber']);
+ $adapter->setBody($task_data['body']);
+ $adapter->send();
+ }
+
+}
diff --git a/src/infrastructure/sms/worker/PhabricatorSMSWorker.php b/src/infrastructure/sms/worker/PhabricatorSMSWorker.php
new file mode 100644
--- /dev/null
+++ b/src/infrastructure/sms/worker/PhabricatorSMSWorker.php
@@ -0,0 +1,11 @@
+<?php
+
+abstract class PhabricatorSMSWorker
+ extends PhabricatorWorker {
+
+ public function renderForDisplay(PhabricatorUser $viewer) {
+ // This data has some sensitive stuff, so don't show it.
+ return null;
+ }
+
+}

File Metadata

Mime Type
text/plain
Expires
Thu, Mar 20, 2:39 PM (1 d, 20 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7713285
Default Alt Text
D8930.id21194.diff (5 KB)

Event Timeline