From 5a84aab7da3d28f681c3782c5add7f73252c34e4 Mon Sep 17 00:00:00 2001 From: ednt Date: Thu, 7 Jul 2022 08:47:28 +0200 Subject: [PATCH 1/8] Create playSmsSender.php Adding playSMS as SMS provider --- .../SmsProviders/playSMS/playSmsSender.php | 193 ++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 src/files/custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php diff --git a/src/files/custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php b/src/files/custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php new file mode 100644 index 0000000..926fb40 --- /dev/null +++ b/src/files/custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php @@ -0,0 +1,193 @@ +config = $config; + $this->entityManager = $entityManager; + $this->log = $log; + } + + public function send(Sms $sms): void + { + $toNumberList = $sms->getToNumberList(); + + if (!count($toNumberList)) { + throw new Error("No recipient phone number."); + } + + foreach ($toNumberList as $number) { + $this->sendToNumber($sms, $number); + } + } + + private function sendToNumber(Sms $sms, string $toNumber): void + { + $integration = $this->getIntegrationEntity(); + + $username = $integration->get('playSmsUsername'); + $webservicesToken = $integration->get('playSmsWebservicesToken'); + $baseUrl = rtrim( + $integration->get('playSmsBaseUrl') ?? + $this->config->get('playSmsApiBaseUrl') ?? + self::BASE_URL + ); + $timeout = $this->config->get('playSmsSendTimeout') ?? self::TIMEOUT; + + $fromNumber = $sms->getFromNumber(); + + if (!$username) { + throw new Error("No playSMS username."); + } + if (!$webservicesToken) { + throw new Error("No playSMS Webservices Token."); + } + + if (!$fromNumber) { + throw new Error("No sender phone number."); + } + + if (!$toNumber) { + throw new Error("No recipient phone number."); + } + + $numberPrefix = $integration->get('playSmsNumberPrefix'); + if ($numberPrefix) { + $toNumber = $numberPrefix . self::formatNumber($toNumber); + } + + $url = $baseUrl . '/index.php?app=ws&u=' . $username . '&h=' . $webservicesToken . '&op=pv&to=' . urlencode($toNumber) . '&from=' . urlencode(self::formatNumber($fromNumber)) . '&msg=' . urlencode($sms->getBody()); + + $ch = curl_init(); + if ($ch) { + + curl_setopt($ch, \CURLOPT_URL, $url); + curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, \CURLOPT_TIMEOUT, $timeout); + curl_setopt($ch, \CURLOPT_CONNECTTIMEOUT, $timeout); + curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'GET'); + + $response = curl_exec($ch); + + $code = curl_getinfo($ch, \CURLINFO_HTTP_CODE); + $error = curl_errno($ch); + + $headerSize = curl_getinfo($ch, \CURLINFO_HEADER_SIZE); + + $body = mb_substr($response, $headerSize); + + if ($code && !($code >= 200 && $code < 300)) { + $this->processError($code, $body); + + } + + if ($error) { + if (in_array($error, [\CURLE_OPERATION_TIMEDOUT, \CURLE_OPERATION_TIMEOUTED])) { + throw new Error("playSMS SMS sending timeout."); + } + } + + curl_close($ch); + } + } + + private function buildQuery(array $data): string + { + $itemList = []; + + foreach ($data as $key => $value) { + $itemList[] = urlencode($key) . '=' . urlencode($value); + } + + return implode('&', $itemList); + } + + private static function formatNumber(string $number): string + { + return preg_replace('/[^0-9]/', '', $number); + } + + private function processError(int $code, string $body): void + { + try { + $data = Json::decode($body); + + $message = $data->message ?? null; + } + catch (Throwable $e) { + $message = null; + } + + if ($message) { + $this->log->error("playSMS SMS sending error. Message: " . $message); + } + + throw new Error("playSMS SMS sending error. Code: {$code}."); + } + + private function getIntegrationEntity(): Integration + { + $entity = $this->entityManager + ->getEntity(Integration::ENTITY_TYPE, 'playSMS'); + + if (!$entity || !$entity->get('enabled')) { + throw new Error("playSMS integration is not enabled"); + } + + return $entity; + } +} From fa9461343292cae9608a685277bb5a12056228a6 Mon Sep 17 00:00:00 2001 From: ednt Date: Thu, 7 Jul 2022 08:49:11 +0200 Subject: [PATCH 2/8] Update Integration.json Adding playSMS as SMS provider --- .../SmsProviders/Resources/i18n/en_US/Integration.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/files/custom/Espo/Modules/SmsProviders/Resources/i18n/en_US/Integration.json b/src/files/custom/Espo/Modules/SmsProviders/Resources/i18n/en_US/Integration.json index 21264e3..b21ca8b 100644 --- a/src/files/custom/Espo/Modules/SmsProviders/Resources/i18n/en_US/Integration.json +++ b/src/files/custom/Espo/Modules/SmsProviders/Resources/i18n/en_US/Integration.json @@ -20,6 +20,10 @@ "serwerSmsPassword": "Password", "serwerSmsBaseUrl": "Base URL", "serwerSmsSender": "Sender Name", - "serwerSmsTest": "Test" + "serwerSmsTest": "Test", + "playSmsBaseUrl": "Base URL", + "playSmsUsername": "Username", + "playSmsWebservicesToken": "Webservices Token", + "playSmsNumberPrefix": "Prefix to add in front of the phonenumber" } } From 6a2f91ff3b31ed5372be10303ab5332058473e40 Mon Sep 17 00:00:00 2001 From: ednt Date: Thu, 7 Jul 2022 08:50:34 +0200 Subject: [PATCH 3/8] Update smsProviders.json Adding playSMS as SMS provider. --- .../SmsProviders/Resources/metadata/app/smsProviders.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/files/custom/Espo/Modules/SmsProviders/Resources/metadata/app/smsProviders.json b/src/files/custom/Espo/Modules/SmsProviders/Resources/metadata/app/smsProviders.json index 8e87868..40e513f 100644 --- a/src/files/custom/Espo/Modules/SmsProviders/Resources/metadata/app/smsProviders.json +++ b/src/files/custom/Espo/Modules/SmsProviders/Resources/metadata/app/smsProviders.json @@ -13,5 +13,8 @@ }, "SerwerSms": { "senderClassName": "Espo\\Modules\\SmsProviders\\SerwerSms\\SerwerSmsSender" + }, + "playSMS": { + "senderClassName": "Espo\\Modules\\SmsProviders\\playSMS\\playSmsSender" } } From e01b91d9a166d376045ff2e885a6c4d14a576a3e Mon Sep 17 00:00:00 2001 From: ednt Date: Thu, 7 Jul 2022 08:51:50 +0200 Subject: [PATCH 4/8] Create playSMS.json Adding playSMS as SMS provider --- .../metadata/integrations/playSMS.json | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/files/custom/Espo/Modules/SmsProviders/Resources/metadata/integrations/playSMS.json diff --git a/src/files/custom/Espo/Modules/SmsProviders/Resources/metadata/integrations/playSMS.json b/src/files/custom/Espo/Modules/SmsProviders/Resources/metadata/integrations/playSMS.json new file mode 100644 index 0000000..346c603 --- /dev/null +++ b/src/files/custom/Espo/Modules/SmsProviders/Resources/metadata/integrations/playSMS.json @@ -0,0 +1,25 @@ +{ + "view": "views/admin/integrations/edit", + "fields": { + "playSmsBaseUrl": { + "type": "varchar", + "maxLength": 100, + "required": true + }, + "playSmsUsername": { + "type": "varchar", + "maxLength": 100, + "required": true + }, + "playSmsWebservicesToken": { + "type": "password", + "maxLength": 100, + "required": true + }, + "playSmsNumberPrefix": { + "type": "varchar", + "maxLength": 20, + "required": false + } + } +} From 710386a4e69c5f394ce8acc02227afac9b0d6bf9 Mon Sep 17 00:00:00 2001 From: "bkk@ednt.de" Date: Thu, 7 Jul 2022 15:46:41 +0200 Subject: [PATCH 5/8] Done required changes --- .../Resources/metadata/app/smsProviders.json | 2 +- .../Modules/SmsProviders/playSMS/playSmsSender.php | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/files/custom/Espo/Modules/SmsProviders/Resources/metadata/app/smsProviders.json b/src/files/custom/Espo/Modules/SmsProviders/Resources/metadata/app/smsProviders.json index 40e513f..69a1bb6 100644 --- a/src/files/custom/Espo/Modules/SmsProviders/Resources/metadata/app/smsProviders.json +++ b/src/files/custom/Espo/Modules/SmsProviders/Resources/metadata/app/smsProviders.json @@ -15,6 +15,6 @@ "senderClassName": "Espo\\Modules\\SmsProviders\\SerwerSms\\SerwerSmsSender" }, "playSMS": { - "senderClassName": "Espo\\Modules\\SmsProviders\\playSMS\\playSmsSender" + "senderClassName": "Espo\\Modules\\SmsProviders\\playSMS\\PlaySmsSender" } } diff --git a/src/files/custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php b/src/files/custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php index 926fb40..9755037 100644 --- a/src/files/custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php +++ b/src/files/custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php @@ -43,10 +43,8 @@ use Throwable; -class playSmsSender implements Sender +class PlaySmsSender implements Sender { - private const BASE_URL = 'https://sms.ednt.de'; - private const TIMEOUT = 10; private $config; @@ -81,11 +79,7 @@ private function sendToNumber(Sms $sms, string $toNumber): void $username = $integration->get('playSmsUsername'); $webservicesToken = $integration->get('playSmsWebservicesToken'); - $baseUrl = rtrim( - $integration->get('playSmsBaseUrl') ?? - $this->config->get('playSmsApiBaseUrl') ?? - self::BASE_URL - ); + $baseUrl = rtrim($integration->get('playSmsBaseUrl')); $timeout = $this->config->get('playSmsSendTimeout') ?? self::TIMEOUT; $fromNumber = $sms->getFromNumber(); From dbf708120b71ccb12d7ab82063297823760de46b Mon Sep 17 00:00:00 2001 From: ednt Date: Thu, 7 Jul 2022 15:48:37 +0200 Subject: [PATCH 6/8] Delete playSmsSender.php --- .../SmsProviders/playSMS/playSmsSender.php | 187 ------------------ 1 file changed, 187 deletions(-) delete mode 100644 src/files/custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php diff --git a/src/files/custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php b/src/files/custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php deleted file mode 100644 index 9755037..0000000 --- a/src/files/custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php +++ /dev/null @@ -1,187 +0,0 @@ -config = $config; - $this->entityManager = $entityManager; - $this->log = $log; - } - - public function send(Sms $sms): void - { - $toNumberList = $sms->getToNumberList(); - - if (!count($toNumberList)) { - throw new Error("No recipient phone number."); - } - - foreach ($toNumberList as $number) { - $this->sendToNumber($sms, $number); - } - } - - private function sendToNumber(Sms $sms, string $toNumber): void - { - $integration = $this->getIntegrationEntity(); - - $username = $integration->get('playSmsUsername'); - $webservicesToken = $integration->get('playSmsWebservicesToken'); - $baseUrl = rtrim($integration->get('playSmsBaseUrl')); - $timeout = $this->config->get('playSmsSendTimeout') ?? self::TIMEOUT; - - $fromNumber = $sms->getFromNumber(); - - if (!$username) { - throw new Error("No playSMS username."); - } - if (!$webservicesToken) { - throw new Error("No playSMS Webservices Token."); - } - - if (!$fromNumber) { - throw new Error("No sender phone number."); - } - - if (!$toNumber) { - throw new Error("No recipient phone number."); - } - - $numberPrefix = $integration->get('playSmsNumberPrefix'); - if ($numberPrefix) { - $toNumber = $numberPrefix . self::formatNumber($toNumber); - } - - $url = $baseUrl . '/index.php?app=ws&u=' . $username . '&h=' . $webservicesToken . '&op=pv&to=' . urlencode($toNumber) . '&from=' . urlencode(self::formatNumber($fromNumber)) . '&msg=' . urlencode($sms->getBody()); - - $ch = curl_init(); - if ($ch) { - - curl_setopt($ch, \CURLOPT_URL, $url); - curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, \CURLOPT_TIMEOUT, $timeout); - curl_setopt($ch, \CURLOPT_CONNECTTIMEOUT, $timeout); - curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'GET'); - - $response = curl_exec($ch); - - $code = curl_getinfo($ch, \CURLINFO_HTTP_CODE); - $error = curl_errno($ch); - - $headerSize = curl_getinfo($ch, \CURLINFO_HEADER_SIZE); - - $body = mb_substr($response, $headerSize); - - if ($code && !($code >= 200 && $code < 300)) { - $this->processError($code, $body); - - } - - if ($error) { - if (in_array($error, [\CURLE_OPERATION_TIMEDOUT, \CURLE_OPERATION_TIMEOUTED])) { - throw new Error("playSMS SMS sending timeout."); - } - } - - curl_close($ch); - } - } - - private function buildQuery(array $data): string - { - $itemList = []; - - foreach ($data as $key => $value) { - $itemList[] = urlencode($key) . '=' . urlencode($value); - } - - return implode('&', $itemList); - } - - private static function formatNumber(string $number): string - { - return preg_replace('/[^0-9]/', '', $number); - } - - private function processError(int $code, string $body): void - { - try { - $data = Json::decode($body); - - $message = $data->message ?? null; - } - catch (Throwable $e) { - $message = null; - } - - if ($message) { - $this->log->error("playSMS SMS sending error. Message: " . $message); - } - - throw new Error("playSMS SMS sending error. Code: {$code}."); - } - - private function getIntegrationEntity(): Integration - { - $entity = $this->entityManager - ->getEntity(Integration::ENTITY_TYPE, 'playSMS'); - - if (!$entity || !$entity->get('enabled')) { - throw new Error("playSMS integration is not enabled"); - } - - return $entity; - } -} From d2064d9fad961e1ca7fb83000cc6efde3c1aa7d0 Mon Sep 17 00:00:00 2001 From: "bkk@ednt.de" Date: Thu, 7 Jul 2022 15:49:51 +0200 Subject: [PATCH 7/8] Done required changes --- .../custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/files/custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php b/src/files/custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php index 9755037..6ef5bd8 100644 --- a/src/files/custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php +++ b/src/files/custom/Espo/Modules/SmsProviders/playSMS/playSmsSender.php @@ -81,7 +81,6 @@ private function sendToNumber(Sms $sms, string $toNumber): void $webservicesToken = $integration->get('playSmsWebservicesToken'); $baseUrl = rtrim($integration->get('playSmsBaseUrl')); $timeout = $this->config->get('playSmsSendTimeout') ?? self::TIMEOUT; - $fromNumber = $sms->getFromNumber(); if (!$username) { From 44494c289b968c08167d8e0750f5f49a2750f83b Mon Sep 17 00:00:00 2001 From: "bkk@ednt.de" Date: Thu, 7 Jul 2022 15:54:40 +0200 Subject: [PATCH 8/8] new added --- .../SmsProviders/playSMS/PlaySmsSender.php | 186 ++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 src/files/custom/Espo/Modules/SmsProviders/playSMS/PlaySmsSender.php diff --git a/src/files/custom/Espo/Modules/SmsProviders/playSMS/PlaySmsSender.php b/src/files/custom/Espo/Modules/SmsProviders/playSMS/PlaySmsSender.php new file mode 100644 index 0000000..6ef5bd8 --- /dev/null +++ b/src/files/custom/Espo/Modules/SmsProviders/playSMS/PlaySmsSender.php @@ -0,0 +1,186 @@ +config = $config; + $this->entityManager = $entityManager; + $this->log = $log; + } + + public function send(Sms $sms): void + { + $toNumberList = $sms->getToNumberList(); + + if (!count($toNumberList)) { + throw new Error("No recipient phone number."); + } + + foreach ($toNumberList as $number) { + $this->sendToNumber($sms, $number); + } + } + + private function sendToNumber(Sms $sms, string $toNumber): void + { + $integration = $this->getIntegrationEntity(); + + $username = $integration->get('playSmsUsername'); + $webservicesToken = $integration->get('playSmsWebservicesToken'); + $baseUrl = rtrim($integration->get('playSmsBaseUrl')); + $timeout = $this->config->get('playSmsSendTimeout') ?? self::TIMEOUT; + $fromNumber = $sms->getFromNumber(); + + if (!$username) { + throw new Error("No playSMS username."); + } + if (!$webservicesToken) { + throw new Error("No playSMS Webservices Token."); + } + + if (!$fromNumber) { + throw new Error("No sender phone number."); + } + + if (!$toNumber) { + throw new Error("No recipient phone number."); + } + + $numberPrefix = $integration->get('playSmsNumberPrefix'); + if ($numberPrefix) { + $toNumber = $numberPrefix . self::formatNumber($toNumber); + } + + $url = $baseUrl . '/index.php?app=ws&u=' . $username . '&h=' . $webservicesToken . '&op=pv&to=' . urlencode($toNumber) . '&from=' . urlencode(self::formatNumber($fromNumber)) . '&msg=' . urlencode($sms->getBody()); + + $ch = curl_init(); + if ($ch) { + + curl_setopt($ch, \CURLOPT_URL, $url); + curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, \CURLOPT_TIMEOUT, $timeout); + curl_setopt($ch, \CURLOPT_CONNECTTIMEOUT, $timeout); + curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'GET'); + + $response = curl_exec($ch); + + $code = curl_getinfo($ch, \CURLINFO_HTTP_CODE); + $error = curl_errno($ch); + + $headerSize = curl_getinfo($ch, \CURLINFO_HEADER_SIZE); + + $body = mb_substr($response, $headerSize); + + if ($code && !($code >= 200 && $code < 300)) { + $this->processError($code, $body); + + } + + if ($error) { + if (in_array($error, [\CURLE_OPERATION_TIMEDOUT, \CURLE_OPERATION_TIMEOUTED])) { + throw new Error("playSMS SMS sending timeout."); + } + } + + curl_close($ch); + } + } + + private function buildQuery(array $data): string + { + $itemList = []; + + foreach ($data as $key => $value) { + $itemList[] = urlencode($key) . '=' . urlencode($value); + } + + return implode('&', $itemList); + } + + private static function formatNumber(string $number): string + { + return preg_replace('/[^0-9]/', '', $number); + } + + private function processError(int $code, string $body): void + { + try { + $data = Json::decode($body); + + $message = $data->message ?? null; + } + catch (Throwable $e) { + $message = null; + } + + if ($message) { + $this->log->error("playSMS SMS sending error. Message: " . $message); + } + + throw new Error("playSMS SMS sending error. Code: {$code}."); + } + + private function getIntegrationEntity(): Integration + { + $entity = $this->entityManager + ->getEntity(Integration::ENTITY_TYPE, 'playSMS'); + + if (!$entity || !$entity->get('enabled')) { + throw new Error("playSMS integration is not enabled"); + } + + return $entity; + } +}