lib/Service/PaxfaxService.php
57a6327f
 <?php
 /**
  * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
  *
  * @author Double Bastion LLC
  *
  * @license GNU AGPL version 3 or any later version
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
  * License as published by the Free Software Foundation; either
  * version 3 of the License, or any later version.
  *
  * 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 along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  */
 
 declare(strict_types=1);
 
 namespace OCA\PaxFax\Service;
 
 use OCP\DB\QueryBuilder\IQueryBuilder;
 use OCP\IDBConnection;
 use OCP\Security\ICrypto;
 use OCP\AppFramework\ApiController;
 use OCP\IRequest;
 use OCP\AppFramework\Controller;
 use OCP\Files\IAppData;
 use OCP\AppFramework\App;
 use OCP\Files\NotPermittedException;
 use OCP\Files\Folder;
 use OC\Files\Filesystem;
 use \ReflectionClass;
 
 use Phaxio;
 use Phaxio\OperationResult;
 use Phaxio\Error\AuthenticationException;
 use Phaxio\Error\NotFoundException;
 use Phaxio\Error\InvalidRequestException;
 use Phaxio\Error\RateLimitException;
 use Phaxio\Error\APIConnectionException;
 use Phaxio\Error\GeneralException;
 
 
 class PaxfaxService {
 
       private $connection;
 
       private $crypto;
 
       public function __construct(IDBConnection $connection, ICrypto $crypto) {
 
               $this->connection = $connection;
 
               $this->crypto = $crypto;
       }
 
 
       /**
        * @NoAdminRequired
        */
       public function object_to_array($obj) {
          if(is_object($obj)) $obj = (array)$this->dismount($obj);
          if(is_array($obj)) {
             $new = array();
             foreach($obj as $key => $val) {
                 $new[$key] = $this->object_to_array($val);
             }
          }
          else $new = $obj;
          return $new;
       }
 
 
       /**
        * @NoAdminRequired
        */
       public function dismount($object) {
          $reflectionClass = new ReflectionClass(get_class($object));
          $array = array();
          foreach ($reflectionClass->getProperties() as $property) {
             $property->setAccessible(true);
             $array[$property->getName()] = $property->getValue($object);
             $property->setAccessible(false);
          }
          return $array;
       }
 
 
       /**
        * @NoAdminRequired
        *
        */
       public function getsettings($userId) {
 
           $sql = $this->connection->prepare('
 	           SELECT `id`, `user_id`, `api_key`, `api_secret`, `webhook_token`, `receive_url`, `get_notification`, `notification_email` 
                    FROM `*PREFIX*pax_fax`
                    WHERE `user_id` = ?');
 	  $result = $sql->execute([$userId]);
           $settingsfromdb = $result->fetch();
           $result->closeCursor();
 
           if ($settingsfromdb) {
 
               if ($settingsfromdb['api_key'] != '') {
 
                   // Send a placeholder to the browser, instead of the real data
                   $settingsfromdb['api_key'] = "%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
               }
               if ($settingsfromdb['api_secret'] != '') {
                   $settingsfromdb['api_secret'] = "%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
               }
               if ($settingsfromdb['webhook_token'] != '') {
                   $settingsfromdb['webhook_token'] = "%20%20%20%20%20%20%20%20%20%20%20";
               }
               if ($settingsfromdb['receive_url'] != '') {
                   $settingsfromdb['receive_url']= "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
               }
 
               return $settingsfromdb;
           }
       }
 
 
       /**
        * @NoAdminRequired
        *
        */
       public function updatesettings($userId, $apiKey, $apiSecret, $webhookToken, $receiveUrl, $getNotification, $notificationEmail) {
 
           $sqlsel = $this->connection->prepare('
 	             SELECT `id`, `user_id`, `api_key`, `api_secret`, `webhook_token`, `receive_url`, `get_notification`, `notification_email` 
                      FROM `*PREFIX*pax_fax`
                      WHERE `user_id` = ?');
 	  $resultsel = $sqlsel->execute([$userId]);
           $row = $resultsel->fetch();
           $resultsel->closeCursor();
 
           if ($resultsel && !$row) {
 
               if ($apiKey != '') {
                   $apikeystrenc = $this->crypto->encrypt($apiKey);                
               } else { $apikeystrenc = ''; }
 
               if ($apiSecret != '') {
                   $apisecretstrenc = $this->crypto->encrypt($apiSecret);                
               } else { $apisecretstrenc = ''; }
 
               if ($webhookToken != '') {
                   $webhookTokenenc = $this->crypto->encrypt($webhookToken);               
               } else { $webhookTokenenc = ''; }
 
               if ($receiveUrl != '') {
                   $receiveUrlenc = $this->crypto->encrypt($receiveUrl);                
               } else { $receiveUrlenc = ''; }
 
               $sqlns = $this->connection->prepare('
 				INSERT INTO `*PREFIX*pax_fax`
 					(`user_id`, `api_key`, `api_secret`, `webhook_token`, `receive_url`, `get_notification`, `notification_email`)
 				VALUES (?, ?, ?, ?, ?, ?, ?)');
 	      $sqlns->execute([$userId, $apikeystrenc, $apisecretstrenc, $webhookTokenenc, $receiveUrlenc, $getNotification, $notificationEmail]);
 
           } elseif ($resultsel && $row) {  
 
               if ($apiKey != '' && $apiKey != "%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
                   $apikeystrenc = $this->crypto->encrypt($apiKey);                
               } elseif ($apiKey == "%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
                   $apikeystrenc = $row['api_key'];
               } elseif ($apiKey == '') {
                   $apikeystrenc = '';
               }
 
               if ($apiSecret != '' && $apiSecret != "%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
                   $apisecretstrenc = $this->crypto->encrypt($apiSecret);                
               } elseif ($apiSecret == "%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
                   $apisecretstrenc = $row['api_secret'];
               } elseif ($apiSecret == '') {
                   $apisecretstrenc = '';
               }
 
               if ($webhookToken != '' && $webhookToken != "%20%20%20%20%20%20%20%20%20%20%20") {
                   $webhookTokenenc = $this->crypto->encrypt($webhookToken);                
               } elseif ($webhookToken == "%20%20%20%20%20%20%20%20%20%20%20") {
                   $webhookTokenenc = $row['webhook_token'];
               } elseif ($webhookToken == '') {
                   $webhookTokenenc = '';
               }
 
               if ($receiveUrl != '' && $receiveUrl != "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
                   $receiveUrlenc = $this->crypto->encrypt($receiveUrl);                
               } elseif ($receiveUrl == "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
                   $receiveUrlenc = $row['receive_url'];
               } elseif ($receiveUrl == '') {
                   $receiveUrlenc = '';
               }
 
 	      $sqlup = $this->connection->prepare('
 			UPDATE `*PREFIX*pax_fax`
 			SET `api_key` = ?, `api_secret` = ?, `webhook_token` = ?, `receive_url` = ?, `get_notification` = ?, `notification_email` = ?
                         WHERE `user_id` = ?');
 	      $updateRes = $sqlup->execute([$apikeystrenc, $apisecretstrenc, $webhookTokenenc, $receiveUrlenc, $getNotification, $notificationEmail, $userId]);
 	      $updateRes->closeCursor();
           }
       }
 
       /**
        * @NoAdminRequired
        */
       public function getapicredentials($userId) {
 
               $sqlselcr = $this->connection->prepare('
 	                    SELECT `id`, `user_id`, `api_key`, `api_secret`, `webhook_token`, `receive_url`, `get_notification`, `notification_email` 
                             FROM `*PREFIX*pax_fax`
                             WHERE `user_id` = ?');
 	      $resultselcr = $sqlselcr->execute([$userId]);
               $settingsfrdb = $resultselcr->fetch();
               $resultselcr->closeCursor();
 
               if (($settingsfrdb['api_key'] != '') && ($settingsfrdb['api_key'] != 'undefined') && ($settingsfrdb['api_key'] != null)) {
                    $apikeystr = $this->crypto->decrypt($settingsfrdb['api_key']);
               } else { $apikeystr = ''; }
 
               if (($settingsfrdb['api_secret'] != '') && ($settingsfrdb['api_secret'] != 'undefined') && ($settingsfrdb['api_secret'] != null)) {              
                    $apisecretstr = $this->crypto->decrypt($settingsfrdb['api_secret']);
               } else { $apisecretstr = ''; }
 
               if (($settingsfrdb['webhook_token'] != '') && ($settingsfrdb['webhook_token'] != 'undefined') && ($settingsfrdb['webhook_token'] != null)) {            
                    $webhookToken = $this->crypto->decrypt($settingsfrdb['webhook_token']);
               } else { $webhookToken = ''; }
 
               if (($settingsfrdb['receive_url'] != '') && ($settingsfrdb['receive_url'] != 'undefined') && ($settingsfrdb['receive_url'] != null)) {
                    $receiveUrl = $this->crypto->decrypt($settingsfrdb['receive_url']);
               } else { $receiveUrl = ''; }
 
               $getnotification = $settingsfrdb['get_notification'];
               $notifyemail = $settingsfrdb['notification_email'];
 
               return [$apikeystr, $apisecretstr, $webhookToken, $receiveUrl, $getnotification, $notifyemail];
       }
 
 }