*
* @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 .
*
*/
declare(strict_types=1);
namespace OCA\SMSRelentless\Controller;
use OCP\IRequest;
use OCP\AppFramework\Controller;
use OCA\SMSRelentless\Service\SmsrelentlessService;
use OCP\AppFramework\App;
use OC\Http\Client\Client;
use OCP\Files\SimpleFS\ISimpleFile;
use OCP\Files\SimpleFS\ISimpleFolder;
use OCP\IL10N;
use OCP\Files\Folder;
use OCP\IConfig;
use OC\Files\Filesystem;
use OC\Files\View;
use \ReflectionClass;
use \FilesystemIterator;
use \DateTime;
use \DateInterval;
use OCP\AppFramework\Http\DataResponse;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use Plivo\RestClient;
use OCP\IURLGenerator;
use OCP\Share\IManager;
use OCP\Constants;
use OCP\IGroupManager;
use OCP\IDBConnection;
use OCP\IUserManager;
class SmsrelentlessController extends Controller {
private $service;
private $config;
private $userId;
private $folder;
private $filesystem;
private $view;
private $urlGenerator;
private $shareManager;
private $groupManager;
private $connection;
private $userManager;
public function __construct($appName, IRequest $request, SmsrelentlessService $service, IConfig $config, $userId, Folder $folder, Filesystem $filesystem, View $view, IURLGenerator $urlGenerator, IManager $shareManager, IGroupManager $groupManager, IDBConnection $connection, IUserManager $userManager) {
parent::__construct($appName, $request);
$this->service = $service;
$this->config = $config;
$this->userId = $userId;
$this->folder = $folder;
$this->filesystem = $filesystem;
$this->view = $view;
$this->urlGenerator = $urlGenerator;
$this->shareManager = $shareManager;
$this->groupManager = $groupManager;
$this->connection = $connection;
$this->userManager = $userManager;
}
/**
* @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 getbalancetel($userId) {
$telsmsapicred = $this->service->getapicredentials($this->userId);
$telapikey = $telsmsapicred[0];
$ch = curl_init();
$headerstel = array("Content-Type: application/json", "Accept: application/json", "Authorization: Bearer ".$telapikey);
curl_setopt($ch, CURLOPT_URL, "https://api.telnyx.com/v2/balance");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerstel);
$responsetel = curl_exec($ch);
$recdatatel = json_decode($responsetel, TRUE);
$telbalresponse = $recdatatel['data']['balance'];
$currentbalancetel = round(floatval($telbalresponse), 3);
curl_close($ch);
return $currentbalancetel;
}
/**
* @NoAdminRequired
*/
public function getbalancenex($userId) {
$smsapicred = $this->service->getapicredentials($this->userId);
$smsapikey = $smsapicred[5];
$smsapisecret = $smsapicred[6];
if ($smsapikey == '' || $smsapisecret == '') {
$currentbalancenex = "N/A";
} else {
$getmesdata = "https://".$smsapikey.":".$smsapisecret."@api.plivo.com/v1/Account/".$smsapikey."/";
$mesdata = file_get_contents($getmesdata);
$datainit = json_decode($mesdata);
$balancenex = $datainit->cash_credits;
$currentbalancenex = round(floatval($balancenex), 3);
}
return $currentbalancenex;
}
/**
* @NoAdminRequired
*/
public function getbalancetwil($userId) {
$smsapicred = $this->service->getapicredentials($this->userId);
$smsapisid = $smsapicred[15];
$smsapitoken = $smsapicred[16];
if ($smsapisid == '' || $smsapitoken == '') {
$currentbalancetwil = "N/A";
} else {
$twilbalance = json_decode(file_get_contents("https://".$smsapisid.":".$smsapitoken."@api.twilio.com/2010-04-01/Accounts/".$smsapisid."/Balance.json"));
$balancetwil = $twilbalance->balance;
$currentbalancetwil = round(floatval($balancetwil), 3);
}
return $currentbalancetwil;
}
/**
* @NoAdminRequired
*/
public function getbalanceflow($userId) {
$currentbalanceflow = 'n/a';
return $currentbalanceflow;
}
/**
* @NoAdminRequired
*/
public function getsmsnumbers($userId) {
$smsapicred = $this->service->getapicredentials($this->userId);
$telnyxkey = $smsapicred[0];
$nexapikey = $smsapicred[5];
$nexapisecret = $smsapicred[6];
$twilapikey = $smsapicred[15];
$twilapisecret = $smsapicred[16];
$flowapikey = $smsapicred[20];
$flowapisecret = $smsapicred[21];
$telsendernameinit = $smsapicred[9];
$nexsendernameinit = $smsapicred[10];
$twilsendernameinit = $smsapicred[19];
if ($telsendernameinit) {
$telsendername = "Tx: " . $telsendernameinit;
$telsenderarr = [0 => $telsendername];
} else { $telsenderarr = []; }
if ($nexsendernameinit) {
$nexsendername = "Pl: " . $nexsendernameinit;
$nexsenderarr = [0 => $nexsendername];
} else { $nexsenderarr = []; }
if ($twilsendernameinit) {
$twilsendername = "Tw: " . $twilsendernameinit;
$twilsenderarr = [0 => $twilsendername];
} else { $twilsenderarr = []; }
// Get Telnyx phone numbers
if ($telnyxkey != '') {
\Telnyx\Telnyx::setApiKey($telnyxkey);
$telnumbers = \Telnyx\MessagingPhoneNumber::All();
$telnumbersarr = $this->object_to_array($telnumbers);
$telnmbrs = [];
foreach ($telnumbersarr['_originalValues'] as $nmbkey => $nmbvalue) {
if (is_int($nmbkey)) {
foreach ($nmbvalue as $nkey => $nvalue) {
if ($nkey == 'phone_number' && $nvalue) {
$telnmbrs[] = "Tx: " . $nvalue;
}
}
}
}
} else { $telnmbrs = []; }
// Get Plivo phone numbers
if ($nexapikey != '' && $nexapisecret != '') {
$getacdata = "https://".$nexapikey.":".$nexapisecret."@api.plivo.com/v1/Account/".$nexapikey."/Number/";
$acdata = file_get_contents($getacdata);
$datainit = json_decode($acdata, true);
$findata = $this->object_to_array($datainit);
$nexcurrentnmbrs = [];
foreach ($findata['objects'] as $smskey => $smsvalue) {
if (is_array($smsvalue)) {
foreach ($smsvalue as $smskey2 => $smsvalue2) {
if ($smskey2 == 'number' && $smsvalue2) {
$nexcurrentnmbrs[] = "Pl: +" . $smsvalue2;
}
}
}
}
} else { $nexcurrentnmbrs = []; }
// Get Twilio phone numbers
if ($twilapikey != '' && $twilapisecret != '') {
$twilnumbers = json_decode(file_get_contents("https://".$twilapikey.":".$twilapisecret."@api.twilio.com/2010-04-01/Accounts/".$twilapikey."/IncomingPhoneNumbers.json"), true);
$twilactivenmbrs = $twilnumbers['incoming_phone_numbers'];
$twilcurrentnmbrs = [];
foreach ($twilactivenmbrs as $twnbkey => $twnbvalue) {
if (is_array($twnbvalue)) {
foreach ($twnbvalue as $twfkey => $twfvalue) {
if ($twfkey == 'phone_number' && $twfvalue) {
$twilcurrentnmbrs[] = "Tw: " . $twfvalue;
}
}
}
}
} else { $twilcurrentnmbrs = []; }
// Get Flowroute phone numbers
if ($flowapikey != '' && $flowapisecret != '') {
$flnbrsresult = json_decode(file_get_contents("https://".$flowapikey.":".$flowapisecret."@api.flowroute.com/v2/numbers"));
$flnbrsarr = $flnbrsresult->data;
$flowcurrentnmbrs = [];
foreach ($flnbrsarr as $flkey => $flitem) {
if ($flitem->id) {
$flowcurrentnmbrs[] = "Fl: +" . $flitem->id;
}
}
} else { $flowcurrentnmbrs = []; }
$currentnmbrs = array_merge($telnmbrs, $nexcurrentnmbrs, $twilcurrentnmbrs, $flowcurrentnmbrs, $telsenderarr, $nexsenderarr, $twilsenderarr);
if ($this->groupManager->isAdmin($this->userId)) {
return $currentnmbrs;
} else {
// Get the restrictions from the 'sms_relent_restrict' table
$getrestr = $this->connection->prepare('
SELECT `phone_number`, `groups`, `users` FROM `*PREFIX*sms_relent_restrict`');
$getrestrres = $getrestr->execute();
$restrdata = [];
while ($restrfetched = $getrestrres->fetch()) {
$restrdata[] = $restrfetched;
}
$getrestrres->closeCursor();
if ($restrdata) {
// Get the groups to which the current user belongs
$usrId = $this->userId;
$getusrgrp = $this->connection->prepare('
SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `uid` = ?');
$getusrgrpres = $getusrgrp->execute([$usrId]);
$usergrps = [];
while ($fetchedgrps = $getusrgrpres->fetch()) {
$usergrps[] = $fetchedgrps['gid'];
}
$getusrgrpres->closeCursor();
$ctusergroups = implode("|", $usergrps);
// Get the Display Name of the current user
$getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
$getacdatadnres = $getacdatadn->execute([$usrId, 'displayname']);
$acdatausrdnadm = $getacdatadnres->fetch();
$cruserdname = $acdatausrdnadm['value'];
$getacdatadnres->closeCursor();
// Get the phone numbers that are not allowed for the current user
$restrPhoneNb = [];
foreach ($restrdata as $rskey => $rsvalue) {
$chck = 0;
if ($rsvalue['groups']) {
$restrgrparr = explode("|", $rsvalue['groups']);
foreach ($restrgrparr as $grkey => $grvalue) {
if (str_contains($ctusergroups, $grvalue)) { $chck++; }
}
}
if ($rsvalue['users']) {
$usrnmstr = $rsvalue['users'];
if (str_contains($usrnmstr, $cruserdname)) { $chck++; }
}
if ($chck == 0) { $restrPhoneNb[] = $rsvalue['phone_number']; }
}
$restrPhoneNmbrs = array_unique($restrPhoneNb);
// Assemble the array of phone numbers that the current user is allowed to use
for ($k = 0; $k < count($currentnmbrs); $k++) {
if (in_array($currentnmbrs[$k], $restrPhoneNmbrs)) {
unset($currentnmbrs[$k]);
}
}
$currentnmbrsrstr = array_values($currentnmbrs);
return $currentnmbrsrstr;
} else { return $currentnmbrs; }
}
}
/**
* @NoAdminRequired
*/
public function cleantempdir($userId) {
// Create the temporary folder if it doesn't exist
if ($this->folder->nodeExists('SMS_Relentless/temp_files') == false) {
$this->folder->newFolder('SMS_Relentless/temp_files');
}
$datadir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data') . '/';
$targetdir = $datadir . $this->userId . "/files/SMS_Relentless/temp_files";
$fileSystemIterator = new FilesystemIterator($targetdir);
$dirfiles = [];
foreach ($fileSystemIterator as $fileInfo){
$dirfiles[] = $fileInfo->getFilename();
}
foreach ($dirfiles as $key => $indfile) {
$thisuserroot = $this->view->getRoot();
$tempfile = $thisuserroot . "/SMS_Relentless/temp_files/" . $indfile;
$removetmpfile = $this->filesystem->unlink($tempfile);
}
}
/**
* @NoAdminRequired
*/
public function uploadNumbersFile($userId, $uploadfileforsms) {
// Create the temporary folder if it doesn't exist
if ($this->folder->nodeExists('SMS_Relentless/temp_files') == false) {
$this->folder->newFolder('SMS_Relentless/temp_files');
}
// First delete any file that has been previously uploaded
$datadir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data') . '/';
$targetdir = $datadir . $this->userId . "/files/SMS_Relentless/temp_files";
$fileSystemIterator = new FilesystemIterator($targetdir);
$dirfiles = [];
foreach ($fileSystemIterator as $fileInfo){
$dirfiles[] = $fileInfo->getFilename();
}
foreach ($dirfiles as $key => $indfile) {
$thisuserroot = $this->view->getRoot();
$tempfile = $thisuserroot . "/SMS_Relentless/temp_files/" . $indfile;
$removetmpfile = $this->filesystem->unlink($tempfile);
}
// Upload the new file
$fileContent = file_get_contents($_FILES['uploadfileforsms']['tmp_name']);
$fileName = $_FILES['uploadfileforsms']['name'];
$userroot = $this->view->getRoot();
$targetfile = $userroot . "/SMS_Relentless/temp_files/" . $fileName;
$target = $this->folder->newFile($targetfile);
$target->putContent($fileContent);
// Extract the phone numbers from the file
$numberarraysec = str_replace(array(";", "|", "\r\n", "\r", "\n", "\t"), ",", $fileContent);
$numberarraytert = preg_replace("/[^0-9,]/", "", $numberarraysec);
$numberarrayfourth = explode(",", $numberarraytert);
$numberarrayfifth = array_filter(array_map('trim', $numberarrayfourth));
$numberarray = array_unique($numberarrayfifth);
return $numberarray;
}
/**
* @NoAdminRequired
*/
public function uploadfile($uploadfileformms) {
$fileContent = file_get_contents($_FILES['uploadfileformms']['tmp_name']);
$fileName = $_FILES['uploadfileformms']['name'];
$fileSizeinit = $_FILES['uploadfileformms']['size'];
$fileSize = $fileSizeinit / 1024;
if ($this->folder->nodeExists('SMS_Relentless/temp_files') == false) {
$this->folder->newFolder('SMS_Relentless/temp_files');
}
$userroot = $this->view->getRoot();
$targetfile = $userroot . "/SMS_Relentless/temp_files/" . $fileName;
$target = $this->folder->newFile($targetfile);
$target->putContent($fileContent);
// Get the cumulative files size of the uploaded files
$datadir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data') . '/';
$targetdir = $datadir . $this->userId . "/files/SMS_Relentless/temp_files";
$fileSystemIterator = new FilesystemIterator($targetdir);
$dirfiles = [];
foreach ($fileSystemIterator as $fileInfo){
$dirfiles[] = $fileInfo->getFilename();
}
$totalflsizeinit = 0;
foreach ($dirfiles as $key => $indfile) {
$fileSizeinit = $this->filesystem->filesize($userroot . "/SMS_Relentless/temp_files/" . $indfile);
$mbSize = round($fileSizeinit / 1024, 4);
$totalflsizeinit += $mbSize;
}
$totalflsize = round($totalflsizeinit, 4);
return $totalflsize;
}
/**
* @NoAdminRequired
*/
public function pickfile($path) {
if ($this->folder->nodeExists('SMS_Relentless/temp_files') == false) {
$this->folder->newFolder('SMS_Relentless/temp_files');
}
$datadir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data') . '/';
$fltgt = $datadir . $this->userId . "/files" . $path;
$fileContent = file_get_contents($fltgt);
$pkfilesize = round(filesize($fltgt) / 1024, 4);
$patharr = explode("/", $path);
$revarr = array_reverse($patharr);
$relflpath = "/SMS_Relentless/temp_files/" . $revarr[0];
$target = $this->folder->newFile($relflpath);
$target->putContent($fileContent);
// Get the cumulative files size of the uploaded files
$targetdir = $datadir . $this->userId . "/files/SMS_Relentless/temp_files";
$fileSystemIterator = new FilesystemIterator($targetdir);
$dirfiles = [];
foreach ($fileSystemIterator as $fileInfo) {
$dirfiles[] = $fileInfo->getFilename();
}
$totalflsizeinit = 0;
foreach ($dirfiles as $key => $indfile) {
$fileSizeinit = $this->filesystem->filesize("/SMS_Relentless/temp_files/" . $indfile);
$mbSize = round($fileSizeinit / 1024, 4);
$totalflsizeinit += $mbSize;
}
$totalflsize = round($totalflsizeinit, 4);
$pickresult = [$totalflsize, $pkfilesize];
return $pickresult;
}
/**
* @NoAdminRequired
*/
public function removeupfile($removedfilename) {
$tmpfl = "/" . $this->userId . "/files/SMS_Relentless/temp_files/" . $removedfilename;
$removefile = $this->view->unlink($tmpfl);
// Get the cumulative files size of the uploaded files
$datadir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data') . '/';
$targetdir = $datadir . $this->userId . "/files/SMS_Relentless/temp_files";
$fileSystemIterator = new FilesystemIterator($targetdir);
$dirfiles = [];
foreach ($fileSystemIterator as $fileInfo){
$dirfiles[] = $fileInfo->getFilename();
}
$totalflsizeinit = 0;
foreach ($dirfiles as $key => $indfile) {
$fileSizeinit = $this->filesystem->filesize("/SMS_Relentless/temp_files/" . $indfile);
$mbSize = round($fileSizeinit / 1024, 4);
$totalflsizeinit += $mbSize;
}
$totalflsize = round($totalflsizeinit, 4);
return $totalflsize;
}
/**
* @NoAdminRequired
*/
public function sendsmstel($userId, $receiversPhoneNbs, $fromsender, $waitinterval, $sentsmstext, $ismms, $mmsfiles) {
$telsmsapicred = $this->service->getapicredentials($this->userId);
$telnyxkey = $telsmsapicred[0];
$teldelrecurl = $telsmsapicred[3];
$messagingprofid = $telsmsapicred[4];
\Telnyx\Telnyx::setApiKey($telnyxkey);
$microinterval = $waitinterval * 1000;
foreach ($receiversPhoneNbs as $keytel => $tonumber) {
usleep($microinterval);
$messagedate = date("Y-m-d H:i:s");
if ($ismms == 0) {
if (preg_match('/[A-Za-z]+/', $fromsender)) {
$message = \Telnyx\Message::Create(["from" => $fromsender, "to" => $tonumber, "text" => $sentsmstext, "webhook_url" => $teldelrecurl, "messaging_profile_id" => $messagingprofid]);
} else {
$message = \Telnyx\Message::Create(["from" => $fromsender, "to" => $tonumber, "text" => $sentsmstext, "webhook_url" => $teldelrecurl]);
}
$messagetexttel = $sentsmstext;
} else {
$mediaURLarr = [];
$includedMediaFiles = '';
for ($p = 0; $p < count($mmsfiles); $p++ ) {
$userroot = $this->view->getRoot();
$filetoshare = $userroot . "/SMS_Relentless/temp_files/".$mmsfiles[$p]."";
$flsharetarget = $this->folder->newFile($filetoshare);
$share = $this->shareManager->newShare();
$share->setNode($flsharetarget);
$share->setPermissions(Constants::PERMISSION_READ);
$share->setShareType(\OC\Share\Constants::SHARE_TYPE_LINK);
$share->setSharedBy($this->userId);
$expirydate = DateTime::createFromFormat('Y-m-d H:i:s', $messagedate);
$expirydate->add(new \DateInterval('P1D'));
$share->setExpirationDate($expirydate);
$shared = $this->shareManager->createShare($share);
$shareToken = $shared->getToken();
$hostnm = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'];
$mediaURLarr[] = $hostnm . "/s/" . $shareToken . "/download/" . $mmsfiles[$p] . "";
$base64imagetx = base64_encode(file_get_contents($hostnm . "/s/" . $shareToken . "/download/" . $mmsfiles[$p]));
$includedMediaFiles .= "
" . $hostnm . "/s/" . $shareToken . "/download/" . $mmsfiles[$p] . "
";
}
if (preg_match('/[A-Za-z]+/', $fromsender)) {
$message = \Telnyx\Message::Create(["from" => $fromsender, "to" => $tonumber, "text" => $sentsmstext, "webhook_url" => $teldelrecurl, "messaging_profile_id" => $messagingprofid, "subject" => "MMS", "media_urls" => $mediaURLarr]);
} else {
$message = \Telnyx\Message::Create(["from" => $fromsender, "to" => $tonumber, "text" => $sentsmstext, "webhook_url" => $teldelrecurl, "subject" => "MMS", "media_urls" => $mediaURLarr]);
}
$messagetexttel = $sentsmstext . "
--- File(s) included in MMS ---
" . $includedMediaFiles;
}
$messageid = $message['id'];
$messagefrom = "Telnyx: " . $fromsender;
$messageto = $tonumber;
$messagenetwork = null;
$messageprice = null;
$messagestatus = $message['to'][0]['status'];
$messagedelivery = null;
$sentmessagearr = [$messageid, $messagedate, $messagefrom, $messageto, $messagenetwork, $messageprice, $messagestatus, $messagedelivery, $messagetexttel];
$this->service->insertsentsms($this->userId, $sentmessagearr);
}
$crtuser = $this->userManager->get($this->userId);
$displayname = $crtuser->getDisplayName();
return $displayname;
}
/**
* @NoAdminRequired
*/
public function sendsmsnex($userId, $receiversPhoneNbs, $fromsender, $waitinterval, $sentsmstext, $ismms, $mmsfiles) {
$smsapicred = $this->service->getapicredentials($this->userId);
$smsapikey = $smsapicred[5];
$smsapisecret = $smsapicred[6];
$smsapideliveryrecurl = $smsapicred[8];
$microinterval = $waitinterval * 1000;
foreach ($receiversPhoneNbs as $keynex => $tonumber) {
usleep($microinterval);
$messagedatepl = date("Y-m-d H:i:s");
if ($ismms == 0) {
$client = new RestClient($smsapikey, $smsapisecret);
$response = $client->messages->create($fromsender,[$tonumber],$sentsmstext,["url" => $smsapideliveryrecurl]);
$messagetextpl = $sentsmstext;
$messageidinit = $response->getmessageUuid(0);
$messageid = $messageidinit[0];
if (property_exists($response, 'error')) {
$messagestatus = "Error: " . $response->error;
} else { $messagestatus = 'The message has been accepted for delivery.'; }
} else {
$mediaURLarr = [];
$includedMediaFiles = '';
for ($p = 0; $p < count($mmsfiles); $p++ ) {
$userroot = $this->view->getRoot();
$filetoshare = $userroot . "/SMS_Relentless/temp_files/".$mmsfiles[$p]."";
$flsharetarget = $this->folder->newFile($filetoshare);
$share = $this->shareManager->newShare();
$share->setNode($flsharetarget);
$share->setPermissions(Constants::PERMISSION_READ);
$share->setShareType(\OC\Share\Constants::SHARE_TYPE_LINK);
$share->setSharedBy($this->userId);
$expirydate = DateTime::createFromFormat('Y-m-d H:i:s', $messagedatepl);
$expirydate->add(new \DateInterval('P1D'));
$share->setExpirationDate($expirydate);
$shared = $this->shareManager->createShare($share);
$shareToken = $shared->getToken();
$hostnm = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'];
$mediaURLarr[] = $hostnm . "/s/" . $shareToken . "/download/" . $mmsfiles[$p] . "";
$base64imagepl = base64_encode(file_get_contents($hostnm . "/s/" . $shareToken . "/download/" . $mmsfiles[$p]));
$includedMediaFiles .= "" . $hostnm . "/s/" . $shareToken . "/download/" . $mmsfiles[$p] . "
";
}
$datatosendpl = ["src" => $fromsender, "dst" => $tonumber, "text" => $sentsmstext, "url" => $smsapideliveryrecurl, "type" => "mms", "media_urls" => $mediaURLarr];
$postedparamspl = json_encode($datatosendpl);
$chpl = curl_init();
curl_setopt($chpl, CURLOPT_URL, 'https://'.$smsapikey.':'.$smsapisecret.'@api.plivo.com/v1/Account/'.$smsapikey.'/Message/');
curl_setopt($chpl, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
curl_setopt($chpl, CURLOPT_TIMEOUT, 300);
curl_setopt($chpl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($chpl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($chpl, CURLOPT_POST, 1);
curl_setopt($chpl, CURLOPT_POSTFIELDS, $postedparamspl);
$resultpl = curl_exec ($chpl);
$statusCodepl = curl_getinfo($chpl, CURLINFO_HTTP_CODE);
curl_close ($chpl);
$decresultpl = json_decode($resultpl);
if (property_exists($decresultpl, 'message_uuid')) {
$messageidinit = $decresultpl->message_uuid;
$messageid = $messageidinit[0];
}
if (in_array($statusCodepl, [200, 201, 202, 203, 204, 205, 206])) {
if (property_exists($decresultpl, 'error')) {
$messagestatus = "Error: " . $decresultpl->error;
} else { $messagestatus = 'The message has been accepted for delivery.'; }
} else { $messagestatus = 'An error occurred while trying to send the message.'; }
$messagetextpl = $sentsmstext . "
--- File(s) included in MMS ---
" . $includedMediaFiles;
}
if (preg_match('/[A-Za-z]+/', $fromsender)) {
$messagefrom = "Plivo: " . $fromsender;
} else { $messagefrom = "Plivo: +" . $fromsender; }
$messageto = $tonumber;
$messagenetwork = '';
$messageprice = '';
$messagedelivery = '';
$sentmessagearr = [$messageid, $messagedatepl, $messagefrom, $messageto, $messagenetwork, $messageprice, $messagestatus, $messagedelivery, $messagetextpl];
$this->service->insertsentsms($this->userId, $sentmessagearr);
}
$crtuser = $this->userManager->get($this->userId);
$displayname = $crtuser->getDisplayName();
return $displayname;
}
/**
* @NoAdminRequired
*/
public function sendsmstwil($userId, $receiversPhoneNbs, $fromsender, $waitinterval, $sentsmstext, $ismms, $mmsfiles) {
$smsapicred = $this->service->getapicredentials($this->userId);
$sid = $smsapicred[15];
$token = $smsapicred[16];
$smsapirecurltw = $smsapicred[18];
$microinterval = $waitinterval * 1000;
foreach ($receiversPhoneNbs as $keytwil => $tonumbertw) {
usleep($microinterval);
$messagedatetw = date("Y-m-d H:i:s");
if ($ismms == 0) {
$datatoposttw = [["To" => $tonumbertw, "From" => $fromsender, "Body" => $sentsmstext, "StatusCallback" => $smsapirecurltw]];
$sentsmstextfintw = $sentsmstext;
} else {
$mediaURLs = [];
for ($p = 0; $p < count($mmsfiles); $p++ ) {
$userroot = $this->view->getRoot();
$filetoshare = $userroot . "/SMS_Relentless/temp_files/".$mmsfiles[$p]."";
$flsharetarget = $this->folder->newFile($filetoshare);
$share = $this->shareManager->newShare();
$share->setNode($flsharetarget);
$share->setPermissions(Constants::PERMISSION_READ);
$share->setShareType(\OC\Share\Constants::SHARE_TYPE_LINK);
$share->setSharedBy($this->userId);
$expirydate = DateTime::createFromFormat('Y-m-d H:i:s', $messagedatetw);
$expirydate->add(new \DateInterval('P1D'));
$share->setExpirationDate($expirydate);
$shared = $this->shareManager->createShare($share);
$shareToken = $shared->getToken();
$hostnm = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'];
$mediaURLs[] = $hostnm . "/s/".$shareToken."/download/".$mmsfiles[$p]."";
}
$datatoposttw = [["To" => $tonumbertw, "From" => $fromsender, "Body" => $sentsmstext, "StatusCallback" => $smsapirecurltw]];
$includedMediaFiles = '';
for ($m = 0; $m < count($mediaURLs); $m++) {
array_push($datatoposttw, ["MediaUrl" => $mediaURLs[$m]]);
$base64imagetw = base64_encode(file_get_contents($mediaURLs[$m]));
$includedMediaFiles .= "" . $mediaURLs[$m] . "
";
}
$sentsmstextfintw = $sentsmstext . "
--- File(s) included in MMS ---
" . $includedMediaFiles;
}
$postedsendingfl = implode('&', array_map('http_build_query', $datatoposttw));
$chtw = curl_init();
curl_setopt($chtw, CURLOPT_URL, 'https://api.twilio.com/2010-04-01/Accounts/'.$sid.'/Messages.json');
curl_setopt($chtw, CURLOPT_TIMEOUT, 300);
curl_setopt($chtw, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($chtw, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($chtw, CURLOPT_USERPWD, "$sid:$token");
curl_setopt($chtw, CURLOPT_POST, 1);
curl_setopt($chtw, CURLOPT_POSTFIELDS, $postedsendingfl);
$resulttw = curl_exec ($chtw);
$statusCodetw = curl_getinfo($chtw, CURLINFO_HTTP_CODE);
curl_close ($chtw);
$decresulttw = json_decode($resulttw);
if ($resulttw) {
$messageidtw = $decresulttw->sid;
} else { $messageidtw = ''; }
if (in_array($statusCodetw, [200, 201, 202, 203, 204, 205, 206])) {
$messagestatustw = 'The message has been accepted for delivery.';
} else {
$messagestatustw = 'An error occurred while trying to send the message.';
}
if (preg_match('/[A-Za-z]+/', $fromsender)) {
$messagefromtw = "Twilio: " . $fromsender;
} else { $messagefromtw = "Twilio: " . $fromsender; }
$messagenetworktw = '';
$messagepricetw = '';
$messagedeliverytw = '';
$sentmessagearr = [$messageidtw, $messagedatetw, $messagefromtw, $tonumbertw, $messagenetworktw, $messagepricetw, $messagestatustw, $messagedeliverytw, $sentsmstextfintw];
$this->service->insertsentsms($this->userId, $sentmessagearr);
}
$crtuser = $this->userManager->get($this->userId);
$displayname = $crtuser->getDisplayName();
return $displayname;
}
/**
* @NoAdminRequired
*/
public function sendsmsflow($userId, $receiversPhoneNbs, $fromsender, $waitinterval, $sentsmstext, $ismms, $mmsfiles) {
$smsapicredfl = $this->service->getapicredentials($this->userId);
$flowapikey = $smsapicredfl[20];
$flowapisecret = $smsapicredfl[21];
$flowdelrecurl = $smsapicredfl[23];
$sentsmstextproc = str_replace('"','\\"', $sentsmstext);
$microinterval = $waitinterval * 1000;
foreach ($receiversPhoneNbs as $keyflow => $tonumberfl) {
usleep($microinterval);
$messagedatefl = date("Y-m-d H:i:s");
if ($ismms == 0) {
$messagetextfinfl = $sentsmstext;
$postedparamsfl = json_encode(["to" => $tonumberfl, "from" => $fromsender, "body" => $sentsmstextproc, "dlr_callback" => $flowdelrecurl]);
} else {
$mediaurlsarr = [];
for ($p = 0; $p < count($mmsfiles); $p++ ) {
$userroot = $this->view->getRoot();
$filetoshare = $userroot . "/SMS_Relentless/temp_files/".$mmsfiles[$p]."";
$flsharetarget = $this->folder->newFile($filetoshare);
$share = $this->shareManager->newShare();
$share->setNode($flsharetarget);
$share->setPermissions(Constants::PERMISSION_READ);
$share->setShareType(\OC\Share\Constants::SHARE_TYPE_LINK);
$share->setSharedBy($this->userId);
$expirydate = DateTime::createFromFormat('Y-m-d H:i:s', $messagedatefl);
$expirydate->add(new \DateInterval('P1D'));
$share->setExpirationDate($expirydate);
$shared = $this->shareManager->createShare($share);
$shareToken = $shared->getToken();
$hostnm = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'];
$mediaurlsarr[] = $hostnm . "/s/".$shareToken."/download/".$mmsfiles[$p]."";
}
$includedMediaFiles = '';
for ($m = 0; $m < count($mediaurlsarr); $m++) {
$base64imagefl = base64_encode(file_get_contents($mediaurlsarr[$m]));
$includedMediaFiles .= "" . $mediaurlsarr[$m] . "
";
}
$messagetextfinfl = $sentsmstext . "
--- File(s) included in MMS ---
" . $includedMediaFiles;
$postedparamsfl = json_encode(["to" => $tonumberfl, "from" => $fromsender, "body" => $sentsmstextproc, "dlr_callback" => $flowdelrecurl, "media_urls" => $mediaurlsarr]);
}
$chfl = curl_init();
curl_setopt($chfl, CURLOPT_URL, 'https://'.$flowapikey.':'.$flowapisecret.'@api.flowroute.com/v2.1/messages');
curl_setopt($chfl, CURLOPT_HTTPHEADER, array("Content-Type: application/vnd.api+json"));
curl_setopt($chfl, CURLOPT_TIMEOUT, 300);
curl_setopt($chfl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($chfl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($chfl, CURLOPT_POST, 1);
curl_setopt($chfl, CURLOPT_POSTFIELDS, $postedparamsfl);
$resultfl = curl_exec ($chfl);
$statusCode = curl_getinfo($chfl, CURLINFO_HTTP_CODE);
curl_close ($chfl);
$decresultfl = json_decode($resultfl);
if ($resultfl) {
$messageidfl = $decresultfl->data->id;
} else { $messageidfl = ''; }
if (in_array($statusCode, [200, 201, 202, 203, 204, 205, 206])) {
$messagestatusfl = 'The message has been accepted for delivery.';
} else {
$messagestatusfl = 'An error occurred while trying to send the message.';
}
if (preg_match('/[A-Za-z]+/', $fromsender)) {
$messagefromfl = "Flowroute: " . $fromsender;
} else { $messagefromfl = "Flowroute: " . $fromsender; }
$messagetofl = $tonumberfl;
$messagenetworkfl = '';
$messagepricefl = '';
$messagedeliveryfl = '';
$sentmessagearr = [$messageidfl, $messagedatefl, $messagefromfl, $messagetofl, $messagenetworkfl, $messagepricefl, $messagestatusfl, $messagedeliveryfl, $messagetextfinfl];
$this->service->insertsentsms($this->userId, $sentmessagearr);
}
$crtuser = $this->userManager->get($this->userId);
$displayname = $crtuser->getDisplayName();
return $displayname;
}
/**
* @NoAdminRequired
*/
public function saveoldrecrows($userId, $oldrecRows) {
// Create the folder for removed messages if it doesn't exist
if ($this->folder->nodeExists('SMS_Relentless/removed_received_messages') == false) {
$this->folder->newFolder('SMS_Relentless/removed_received_messages');
}
$savecheck = 0;
if (count($oldrecRows) > 1) {
$msfileContent = implode("", $oldrecRows);
$delrowsdate = date("Y-m-d_H-i-s");
$msfileName = "Received_Messages_Deleted_On_" . $delrowsdate . ".csv";
$userroot = $this->view->getRoot();
$targetfile = $userroot . "/SMS_Relentless/removed_received_messages/" . $msfileName;
$target = $this->folder->newFile($targetfile);
$target->putContent($msfileContent);
if ($this->filesystem->file_get_contents($targetfile) != '') {
$savecheck = 1;
}
}
return $savecheck;
}
/**
* @NoAdminRequired
*/
public function saveoldsentrows($userId, $oldsentRows) {
// Create the folder for removed messages if it doesn't exist
if ($this->folder->nodeExists('SMS_Relentless/removed_sent_messages') == false) {
$this->folder->newFolder('SMS_Relentless/removed_sent_messages');
}
$savesentcheck = 0;
if (count($oldsentRows) > 1) {
$sntfileContent = implode("", $oldsentRows);
$delsentrowsdate = date("Y-m-d_H-i-s");
$sntfileName = "Sent_Messages_Deleted_On_" . $delsentrowsdate . ".csv";
$userroot = $this->view->getRoot();
$snttargetfile = $userroot . "/SMS_Relentless/removed_sent_messages/" . $sntfileName;
$snttarget = $this->folder->newFile($snttargetfile);
$snttarget->putContent($sntfileContent);
if ($this->filesystem->file_get_contents($snttargetfile) != '') {
$savesentcheck = 1;
}
}
return $savesentcheck;
}
/**
* @NoAdminRequired
*/
public function getreceivedtable($userId) {
return $this->service->getreceivedtable($this->userId);
}
/**
* @NoAdminRequired
*/
public function getreceivedtablefordel($userId) {
return $this->service->getreceivedtablefordel($this->userId);
}
/**
* @NoAdminRequired
*/
public function removerecrows($userId, $recmessagedbIDs) {
return $this->service->removerecrows($this->userId, $recmessagedbIDs);
}
/**
* @NoAdminRequired
*/
public function getsenttable($userId) {
return $this->service->getsenttable($this->userId);
}
/**
* @NoAdminRequired
*/
public function getsenttablefordel($userId) {
return $this->service->getsenttablefordel($this->userId);
}
/**
* @NoAdminRequired
*/
public function removesentrows($userId, $sentmessagedbIDs) {
return $this->service->removesentrows($this->userId, $sentmessagedbIDs);
}
/**
* @NoAdminRequired
*/
public function getgroupedtable($userId) {
return $this->service->getgroupedtable($this->userId);
}
/**
* @NoAdminRequired
*/
public function savedisplayname($userId, $authorDisplayname, $from) {
return $this->service->savedisplayname($this->userId, $authorDisplayname, $from);
}
/**
* @NoAdminRequired
*/
public function getmessagesperpage($userId) {
return $this->service->getmessagesperpage($this->userId);
}
/**
* @NoAdminRequired
*/
public function getdelrecsettings($userId) {
return $this->service->getdelrecsettings($this->userId);
}
public function updatenumberrestrictions($userId, $savedByDsplname, $phoneNumber, $groups, $users) {
return $this->service->updatenumberrestrictions($this->userId, $savedByDsplname, $phoneNumber, $groups, $users);
}
public function updatekeysallowedusers($userId, $groups, $users, $provider) {
return $this->service->updatekeysallowedusers($this->userId, $groups, $users, $provider);
}
public function removenumberrestrictions($userId, $phoneNumber) {
return $this->service->removenumberrestrictions($this->userId, $phoneNumber);
}
/**
* @NoAdminRequired
*/
public function updateautoreplies($userId, $savedByDsplname, $phoneNumber, $daysOfWeek, $dailyStart, $dailyEnd, $vacationStart, $vacationEnd, $messageText) {
return $this->service->updateautoreplies($this->userId, $savedByDsplname, $phoneNumber, $daysOfWeek, $dailyStart, $dailyEnd, $vacationStart, $vacationEnd, $messageText);
}
/**
* @NoAdminRequired
*/
public function removeautoreplies($userId, $phoneNumber) {
return $this->service->removeautoreplies($this->userId, $phoneNumber);
}
/**
* @NoAdminRequired
*/
public function getsettings($userId) {
return $this->service->getsettings($this->userId);
}
public function getadminsettings($userId) {
return $this->service->getadminsettings($this->userId);
}
/**
* @NoAdminRequired
*/
public function getautoreplyconf($userId) {
// Get the available phone numbers for the current user (the restricted phone numbers are excluded)
$availphonenmbrs = $this->getsmsnumbers($this->userId);
// Get the display name of the current user
$usrid = $this->userId;
$getusrdnm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
$getusrdnmres = $getusrdnm->execute([$usrid, 'displayname']);
$getusrdnmdata = $getusrdnmres->fetch();
$userDisplayNm = $getusrdnmdata['value'];
$getusrdnmres->closeCursor();
// Get the auto-replies for the available phone numbers
$getautorpl = $this->connection->prepare('SELECT `saved_by_dsplname`, `phone_number`, `days_of_week`, `daily_start`, `daily_end`, `vacation_start`, `vacation_end`,
`message_text` FROM `*PREFIX*sms_relent_autorply`');
$getautorplres = $getautorpl->execute();
$autorplconf = [];
while ($acdatausrdnadm = $getautorplres->fetch()) {
$autorplconf[] = $acdatausrdnadm;
}
$getautorplres->closeCursor();
if ($autorplconf) {
$autoreplyconf = [];
foreach ($autorplconf as $arkey => $arvalue) {
if (in_array($arvalue['phone_number'], $availphonenmbrs)) {
$autoreplyconf[] = $arvalue;
}
}
} else { $autoreplyconf = ''; }
$autoreplyfdb = ['userdisplayname' => $userDisplayNm, 'phonenumbers' => $availphonenmbrs, 'autoreplies' => $autoreplyconf];
return $autoreplyfdb;
}
/**
* @NoAdminRequired
*/
public function getgroupedpernumber($userId, $phoneNumber) {
return $this->service->getgroupedpernumber($this->userId, $phoneNumber);
}
/**
* @NoAdminRequired
*/
public function getgroupedforreply($userId, $phoneNmbrFrom, $phoneNmbrTo) {
return $this->service->getgroupedforreply($this->userId, $phoneNmbrFrom, $phoneNmbrTo);
}
/**
* @NoAdminRequired
*/
public function updatesettings($userId, $telapiUrlRec, $telapiUrl, $nexapiUrlRec, $nexapiUrl, $twilapiUrlRec, $twilapiUrl, $flowapiUrlRec, $flowapiUrl, $messagesperpage, $getNotify, $notificationEmail, $getsmsinemail, $showDisplayNames) {
return $this->service->updatesettings($this->userId, $telapiUrlRec, $telapiUrl, $nexapiUrlRec, $nexapiUrl, $twilapiUrlRec, $twilapiUrl, $flowapiUrlRec, $flowapiUrl, $messagesperpage, $getNotify, $notificationEmail, $getsmsinemail, $showDisplayNames);
}
public function updateadminsettings($userId, $telapiKey, $telPubKey, $telapiUrlRec, $telapiUrl, $messagingProfileId, $nexapiKey, $nexapiSecret, $nexapiUrlRec, $nexapiUrl, $telSenderName, $nexSenderName, $twilapiKey, $twilapiSecret, $twilapiUrlRec, $twilapiUrl, $twilSenderName, $flowapiKey, $flowapiSecret, $flowapiUrlRec, $flowapiUrl, $showAllMessages) {
return $this->service->updateadminsettings($this->userId, $telapiKey, $telPubKey, $telapiUrlRec, $telapiUrl, $messagingProfileId, $nexapiKey, $nexapiSecret, $nexapiUrlRec, $nexapiUrl, $telSenderName, $nexSenderName, $twilapiKey, $twilapiSecret, $twilapiUrlRec, $twilapiUrl, $twilSenderName, $flowapiKey, $flowapiSecret, $flowapiUrlRec, $flowapiUrl, $showAllMessages);
}
public function updatepersadmnsettings($userId, $messagesperpage, $getNotify, $notificationEmail, $getsmsinemail, $showDisplayNames) {
return $this->service->updatepersadmnsettings($this->userId, $messagesperpage, $getNotify, $notificationEmail, $getsmsinemail, $showDisplayNames);
}
}