diff options
author | Vitor Mattos <vitor@php.rio> | 2022-05-06 17:47:19 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-06 17:47:19 +0300 |
commit | 0587332b00257abdf2a3784212e13d39e01427a4 (patch) | |
tree | b0adf6004c23fb5d8b922fc37b370d26d69dee4b | |
parent | e09474ac62c83de7602279fb42deac7b91a6f420 (diff) | |
parent | 449885a9276c1f6d5076f95b3ce897bb01bde006 (diff) |
Merge pull request #464 from kffl/master
Add SerwerSMS.pl provider
-rw-r--r-- | doc/Admin Documentation.md | 11 | ||||
-rw-r--r-- | lib/Command/Configure.php | 21 | ||||
-rw-r--r-- | lib/Service/Gateway/SMS/Provider/ProviderFactory.php | 2 | ||||
-rw-r--r-- | lib/Service/Gateway/SMS/Provider/SerwerSMS.php | 87 | ||||
-rw-r--r-- | lib/Service/Gateway/SMS/Provider/SerwerSMSConfig.php | 87 |
5 files changed, 207 insertions, 1 deletions
diff --git a/doc/Admin Documentation.md b/doc/Admin Documentation.md index 5d0f0bb..62cb0c3 100644 --- a/doc/Admin Documentation.md +++ b/doc/Admin Documentation.md @@ -202,4 +202,15 @@ Interactive admin configuration: occ twofactorauth:gateway:configure sms ``` +### SerwerSMS.pl +URL: https://serwersms.pl +Stability: Experimental + +Use the SMS gateway provided by SerwerSMS.pl (HTTPS JSON API) for sending SMS. The sender name provided during configuration must be added and approved in the SerwerSMS.pl customer portal. + +Interactive admin configuration (make sure to provide the full API login including the `webapi_` prefix): +```bash +occ twofactorauth:gateway:configure sms +``` + [User Documentation]: https://nextcloud-twofactor-gateway.readthedocs.io/en/latest/User%20Documentation/ diff --git a/lib/Command/Configure.php b/lib/Command/Configure.php index 09ab0fd..c963018 100644 --- a/lib/Command/Configure.php +++ b/lib/Command/Configure.php @@ -41,6 +41,7 @@ use OCA\TwoFactorGateway\Service\Gateway\SMS\Provider\HuaweiE3531Config; use OCA\TwoFactorGateway\Service\Gateway\SMS\Provider\SpryngSMSConfig; use OCA\TwoFactorGateway\Service\Gateway\SMS\Provider\ClickatellCentralConfig; use OCA\TwoFactorGateway\Service\Gateway\SMS\Provider\VoipbusterConfig; +use OCA\TwoFactorGateway\Service\Gateway\SMS\Provider\SerwerSMSConfig; use OCA\TwoFactorGateway\Service\Gateway\Telegram\Gateway as TelegramGateway; use OCA\TwoFactorGateway\Service\Gateway\Telegram\GatewayConfig as TelegramConfig; use Symfony\Component\Console\Command\Command; @@ -111,7 +112,7 @@ class Configure extends Command { private function configureSms(InputInterface $input, OutputInterface $output) { $helper = $this->getHelper('question'); - $providerQuestion = new Question('Please choose a SMS provider (sipgate, websms, playsms, clockworksms, puzzelsms, ecallsms, voipms, voipbuster, huawei_e3531, spryng, sms77io, ovh, clickatellcentral, clicksend): ', 'websms'); + $providerQuestion = new Question('Please choose a SMS provider (sipgate, websms, playsms, clockworksms, puzzelsms, ecallsms, voipms, voipbuster, huawei_e3531, spryng, sms77io, ovh, clickatellcentral, clicksend, serwersms): ', 'websms'); $provider = $helper->ask($input, $output, $providerQuestion); /** @var SMSConfig $config */ @@ -354,6 +355,24 @@ class Configure extends Command { break; + case 'serwersms': + $config->setProvider($provider); + /** @var SerwerSMSConfig $providerConfig */ + $providerConfig = $config->getProvider()->getConfig(); + + $loginQuestion = new Question('Please enter your SerwerSMS.pl API login: '); + $login = $helper->ask($input, $output, $loginQuestion); + $passwordQuestion = new Question('Please enter your SerwerSMS.pl API password: '); + $password = $helper->ask($input, $output, $passwordQuestion); + $senderQuestion = new Question('Please enter your SerwerSMS.pl sender name: '); + $sender = $helper->ask($input, $output, $senderQuestion); + + $providerConfig->setLogin($login); + $providerConfig->setPassword($password); + $providerConfig->setSender($sender); + + break; + default: $output->writeln("Invalid provider $provider"); break; diff --git a/lib/Service/Gateway/SMS/Provider/ProviderFactory.php b/lib/Service/Gateway/SMS/Provider/ProviderFactory.php index dca549e..7aaf939 100644 --- a/lib/Service/Gateway/SMS/Provider/ProviderFactory.php +++ b/lib/Service/Gateway/SMS/Provider/ProviderFactory.php @@ -65,6 +65,8 @@ class ProviderFactory { return $this->container->query(ClickatellCentral::class); case ClickSend::PROVIDER_ID: return $this->container->query(ClickSend::class); + case SerwerSMS::PROVIDER_ID: + return $this->container->query(SerwerSMS::class); default: throw new InvalidSmsProviderException("Provider <$id> does not exist"); } diff --git a/lib/Service/Gateway/SMS/Provider/SerwerSMS.php b/lib/Service/Gateway/SMS/Provider/SerwerSMS.php new file mode 100644 index 0000000..27c4569 --- /dev/null +++ b/lib/Service/Gateway/SMS/Provider/SerwerSMS.php @@ -0,0 +1,87 @@ +<?php + +declare(strict_types=1); + +/** + * @author Paweł Kuffel <pawel@kuffel.io> + * + * Nextcloud - Two-factor Gateway for SerwerSMS.pl + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\TwoFactorGateway\Service\Gateway\SMS\Provider; + +use Exception; +use OCA\TwoFactorGateway\Exception\SmsTransmissionException; +use OCP\Http\Client\IClient; +use OCP\Http\Client\IClientService; + +class SerwerSMS implements IProvider { + public const PROVIDER_ID = 'serwersms'; + + /** @var IClient */ + private $client; + + /** @var SerwerSMSConfig */ + private $config; + + public function __construct(IClientService $clientService, + SerwerSMSConfig $config) { + $this->client = $clientService->newClient(); + $this->config = $config; + } + + /** + * @param string $identifier + * @param string $message + * + * @throws SmsTransmissionException + */ + public function send(string $identifier, string $message) { + $config = $this->getConfig(); + $login = $config->getLogin(); + $password = $config->getPassword(); + $sender = $config->getSender(); + try { + $response = $this->client->post('https://api2.serwersms.pl/messages/send_sms', [ + 'headers' => [ + 'Content-Type' => 'application/json', + ], + 'json' => [ + 'username' => $login, + 'password' => $password, + 'phone' => $identifier, + 'text' => $message, + 'sender' => $sender, + ], + ]); + + $responseData = json_decode($response->getBody(), true); + + if ($responseData['success'] !== true) { + throw new SmsTransmissionException(); + } + } catch (Exception $ex) { + throw new SmsTransmissionException(); + } + } + + /** + * @return SerwerSMSConfig + */ + public function getConfig(): IProviderConfig { + return $this->config; + } +} diff --git a/lib/Service/Gateway/SMS/Provider/SerwerSMSConfig.php b/lib/Service/Gateway/SMS/Provider/SerwerSMSConfig.php new file mode 100644 index 0000000..7db562f --- /dev/null +++ b/lib/Service/Gateway/SMS/Provider/SerwerSMSConfig.php @@ -0,0 +1,87 @@ +<?php + +declare(strict_types=1); + +/** + * @author Paweł Kuffel <pawel@kuffel.io> + * + * Nextcloud - Two-factor Gateway for SerwerSMS.pl + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\TwoFactorGateway\Service\Gateway\SMS\Provider; + +use function array_intersect; +use OCA\TwoFactorGateway\AppInfo\Application; +use OCA\TwoFactorGateway\Exception\ConfigurationException; +use OCP\IConfig; + +class SerwerSMSConfig implements IProviderConfig { + private const expected = [ + 'serwersms_login', + 'serwersms_password', + 'serwersms_sender', + ]; + + /** @var IConfig */ + private $config; + + public function __construct(IConfig $config) { + $this->config = $config; + } + + private function getOrFail(string $key): string { + $val = $this->config->getAppValue(Application::APP_NAME, $key, null); + if (is_null($val)) { + throw new ConfigurationException(); + } + return $val; + } + + public function getLogin(): string { + return $this->getOrFail('serwersms_login'); + } + + public function getPassword(): string { + return $this->getOrFail('serwersms_password'); + } + + public function getSender(): string { + return $this->getOrFail('serwersms_sender'); + } + + public function setLogin(string $login) { + $this->config->setAppValue(Application::APP_NAME, 'serwersms_login', $login); + } + + public function setPassword(string $password) { + $this->config->setAppValue(Application::APP_NAME, 'serwersms_password', $password); + } + + public function setSender(string $sender) { + $this->config->setAppValue(Application::APP_NAME, 'serwersms_sender', $sender); + } + + public function isComplete(): bool { + $set = $this->config->getAppKeys(Application::APP_NAME); + return count(array_intersect($set, self::expected)) === count(self::expected); + } + + public function remove() { + foreach (self::expected as $key) { + $this->config->deleteAppValue(Application::APP_NAME, $key); + } + } +} |