*
* @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\AppFramework\ApiController;
use OCP\IRequest;
use OCA\SMSRelentless\Service\SmsrelentlessService;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCSController;
use OCP\IUserSession;
use OCP\IConfig;
use \DateTime;
use OCP\AppFramework\Controller;
use OCP\Files\IAppData;
use OCP\AppFramework\App;
use OCP\Files\NotPermittedException;
use \ReflectionClass;
use OCP\Notification\INotification;
use OCP\Notification\IManager;
use OCP\IDBConnection;
use OCP\IUserManager;
use Plivo\RestClient;
use Plivo\Util\signatureValidation;
class AuthorApiController extends ApiController {
private $service;
private $userId;
private $config;
private $connection;
private $userManager;
private $manager;
public function __construct($appName, IRequest $request, SmsrelentlessService $service, $userId, IConfig $config, IDBConnection $connection, IUserManager $userManager, IManager $manager) {
parent::__construct(
$appName,
$request,
'PUT, POST, GET, DELETE, PATCH',
'Authorization, Content-Type, Accept',
1728000);
$this->service = $service;
$this->userId = $userId;
$this->config = $config;
$this->connection = $connection;
$this->userManager = $userManager;
$this->manager = $manager;
}
/**
* @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 createMessageId() {
// Create a random string to use as message id for messages that don't have it
$keypassin = substr(sha1((string) mt_rand()), 0, 32);
$keysaltin = openssl_random_pseudo_bytes(24);
$keyLengthin = 32;
$iterationin = 50;
$generated_keyin = openssl_pbkdf2($keypassin, $keysaltin, $keyLengthin, $iterationin, 'sha256');
$ctdMessageId = "generated-id-" . bin2hex($generated_keyin);
return $ctdMessageId;
}
/**
* @NoAdminRequired
*/
public function verifyHeader($receiveddata, $signature_header, $timestamp, $public_key = '', $tolerance = null ) {
// Typecast timestamp to int for comparisons
$timestamp = (int)$timestamp;
// Check if timestamp is within tolerance
if (($tolerance > 0) && (\abs(\time() - $timestamp) > $tolerance)) {
return false;
} else {
// Convert base64 string to bytes for sodium crypto functions
$public_key_bytes = base64_decode($public_key);
$signature_header_bytes = base64_decode($signature_header);
// Construct a message to test against the signature header using the timestamp and payload
$constructed_string = $timestamp . '|' . $receiveddata;
if (!\sodium_crypto_sign_verify_detached($signature_header_bytes, $constructed_string, $public_key_bytes)) {
return false;
} else {
return true;
}
}
}
/**
* @NoAdminRequired
* @NoCSRFRequired
* @PublicPage
*/
public function recdeliveryreptel() {
$request = file_get_contents("php://input");
$recdata = json_decode($request, TRUE);
$delsmswebhookurl = $recdata["data"]["payload"]["webhook_url"];
$ncuserfortelnyxdel = $this->service->getuserbyteldelrwhurl($delsmswebhookurl);
if ($ncuserfortelnyxdel) {
$messageid = $recdata["data"]["payload"]["id"];
$network = $recdata["data"]["payload"]["to"][0]["carrier"];
$messageprice = $recdata["data"]["payload"]["cost"]["amount"];
$deliverystatus = $recdata["data"]["payload"]["to"][0]["status"];
$goterrorinit = $recdata["data"]["payload"]["errors"];
if (!empty($goterrorinit)) {
$retrievedtitle = $recdata["data"]["payload"]["errors"][0]["title"];
$retrievedcode = $recdata["data"]["payload"]["errors"][0]["code"];
$messagestatus = "(Error " . $retrievedcode . ") " . $retrievedtitle;
} else {
$messagestatus = "Success ! The message has been successfully accepted for delivery.";
}
return $this->service->updatedeliverystatustel($ncuserfortelnyxdel, $messageid, $network, $messageprice, $messagestatus, $deliverystatus);
} else { return "access denied"; }
}
/**
* @NoAdminRequired
* @NoCSRFRequired
* @PublicPage
*/
public function recdeliveryrepnex() {
$plivodrurl = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$ncuserforplivodel = $this->service->getuserbyplivodelrwhurl($plivodrurl);
if ($ncuserforplivodel) {
$networkcode = "";
$mStatus = "";
if (isset($_REQUEST["MessageUUID"])) { $messageid = $_REQUEST["MessageUUID"]; } else { $messageid = ''; }
if (isset($_REQUEST["MCC"]) && isset($_REQUEST["MNC"])) { $networkcode = $_REQUEST["MCC"] . " " . $_REQUEST["MNC"]; } else { $networkcode = ''; }
if (isset($_REQUEST["TotalAmount"])) { $messageprice = $_REQUEST["TotalAmount"]; } else { $messageprice = ''; }
if (isset($_REQUEST["ErrorCode"]) && $_REQUEST["ErrorCode"] == "") {
$mStatus = "Success ! The message has been successfully accepted for delivery.";
} elseif (isset($_REQUEST["ErrorCode"]) && $_REQUEST["ErrorCode"] != "") {
$mStatus = "Error " . $_REQUEST["ErrorCode"];
} else { $mStatus = ''; }
if (isset($_REQUEST["Status"])) { $deliverystatus = $_REQUEST["Status"]; }
return $this->service->updatedeliverystatusnex($ncuserforplivodel, $messageid, $networkcode, $messageprice, $mStatus, $deliverystatus);
} else { return "access denied"; }
}
/**
* @NoAdminRequired
* @NoCSRFRequired
* @PublicPage
*/
public function recdeliveryreptwil() {
$twildrurl = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$ncuserfortwildel = $this->service->getuserbytwildelrwhurl($twildrurl);
if ($ncuserfortwildel) {
$messageid = $_REQUEST["SmsSid"];
if ($messageid != null) {
$credentialstw = $this->service->getapicredentials($ncuserfortwildel, 'twilio');
$sidtw = $credentialstw[15];
$tokentw = $credentialstw[16];
$msdetails = json_decode(file_get_contents("https://".$sidtw.":".$tokentw."@api.twilio.com/2010-04-01/Accounts/".$sidtw."/Messages/".$messageid.".json"));
$errorMessage = $msdetails->error_message;
$errorCode = $msdetails->error_code;
$deliverystatus = $msdetails->status;
if ($errorCode == null) {
$mStatus = 'Success ! The message has been successfully accepted for delivery.';
} else { $mStatus = 'Error ' . $errorCode . '. '. ($errorMessage != '') ? 'Message: '. $errorMessage : ''; }
$messagepricepre = $msdetails->price;
if ($messagepricepre) {
$messageprice = str_replace("-", "", $messagepricepre);
} else { $messageprice = ""; }
$networkcode = '';
return $this->service->updatedeliverystatustwil($ncuserfortwildel, $messageid, $networkcode, $messageprice, $mStatus, $deliverystatus);
} else { exit(); }
} else { exit(); }
}
/**
* @NoAdminRequired
* @NoCSRFRequired
* @PublicPage
*/
public function recdeliveryrepflow() {
$flowdrurl = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$ncuserforflowdel = $this->service->getuserbyflowdelrwhurl($flowdrurl);
if ($ncuserforflowdel) {
$receivereq = file_get_contents('php://input');
$recmdec = json_decode($receivereq, true);
$recmsid = $recmdec['data']['id'];
$smsapicredfl = $this->service->getapicredentials($ncuserforflowdel, 'flowroute');
$flowapikey = $smsapicredfl[20];
$flowapisecret = $smsapicredfl[21];
$getmsdetails = json_decode(file_get_contents("https://".$flowapikey.":".$flowapisecret."@api.flowroute.com/v2.1/messages/".$recmsid.""), true);
$messagepriceflinit = $getmsdetails['data']['attributes']['amount_display'];
$messagepricefl = str_replace("$", "", $messagepriceflinit);
$mdeliveryflinit = $getmsdetails['data']['attributes']['delivery_receipts'][0]['status'];
if ($mdeliveryflinit != 'message buffered') {
if ($mdeliveryflinit == 'Ok') {
$messagedeliveryfl = "Issues";
} else { $messagedeliveryfl = $mdeliveryflinit; }
} else { $messagedeliveryfl = 'delivered'; }
$messagestatuscode = $getmsdetails['data']['attributes']['delivery_receipts'][0]['status_code'];
$messagestatusdescr = $getmsdetails['data']['attributes']['delivery_receipts'][0]['status_code_description'];
if ($messagestatuscode != '') {
$messagestatusfl = (($messagestatusdescr != '') ? $messagestatusdescr . ". " : "") . "Status code: " . $messagestatuscode;
} else { $messagestatusfl = "There were issues with message delivery."; }
$networkcodefl = '';
return $this->service->updatedeliverystatusflow($ncuserforflowdel, $recmsid, $networkcodefl, $messagepricefl, $messagestatusfl, $messagedeliveryfl);
} else { return "access denied"; }
}
/**
* @NoAdminRequired
* @NoCSRFRequired
* @PublicPage
*/
public function receivesmstel() {
$signature = $_SERVER['HTTP_TELNYX_SIGNATURE_ED25519'];
$timestamp = $_SERVER['HTTP_TELNYX_TIMESTAMP'];
$receivereq = file_get_contents('php://input');
$recmesdata = json_decode($receivereq, TRUE);
$recsmswebhookurl = $recmesdata["data"]["payload"]["webhook_url"];
$ncuserfortelnyx = $this->service->getuserbytelrecwhurl($recsmswebhookurl);
$txcredentials = $this->service->getapicredentials($ncuserfortelnyx, 'telnyx');
$telpubkey = $txcredentials[1];
$telnyxkey = $txcredentials[0];
$teldelrecurl = $txcredentials[3];
$messagingprofid = $txcredentials[4];
// Verify message signature
$signatureverify = $this->verifyHeader($receivereq, $signature, $timestamp, $telpubkey, $tolerance = 30);
if ($signatureverify) {
if ($ncuserfortelnyx) {
if ($recmesdata) {
if (isset($recmesdata["data"]["payload"]["id"])) {
$messageid = $recmesdata["data"]["payload"]["id"];
} else { $messageid = $this->createMessageId(); }
} else { $messageid = $this->createMessageId(); }
$messagedate = date("Y-m-d H:i:s");
$messagefrom = $recmesdata["data"]["payload"]["from"]["phone_number"];
$messageto = "Telnyx: " . $recmesdata["data"]["payload"]["to"][0]["phone_number"];
$messagetopr = $recmesdata["data"]["payload"]["to"][0]["phone_number"];
$messagetoprtx = "Tx: " . $messagetopr;
// Check if the message is a MMS
if ($recmesdata["data"]["payload"]['type'] == 'MMS') {
$includedFilestx = '';
foreach ($recmesdata["data"]["payload"]['media'] as $telkey => $telvalue) {
if (is_array($telvalue)) {
foreach ($telvalue as $telkeysec => $telvaluesec) {
if ($telkeysec == "url") {
$includedFilestx .= "
" . $telvaluesec . "
";
}
}
}
}
$messagetexttel = $recmesdata["data"]["payload"]["text"] . "
--- The files included in the MMS follow. Download them only if you trust the sender and the domains of the URLs ---
" . $includedFilestx;
$ismmstel = 1;
} else {
$messagetexttel = $recmesdata["data"]["payload"]["text"];
$ismmstel = 0;
}
$recmessagearr = [$messageid, $messagedate, $messagefrom, $messageto, $messagetexttel];
$this->service->insertrecsms($ncuserfortelnyx, $recmessagearr);
// Check if there is any auto-reply configured for the receiving number
$telgetarpl = $this->connection->prepare('SELECT `phone_number`, `days_of_week`, `daily_start`, `daily_end`, `vacation_start`, `vacation_end`, `message_text` FROM
`*PREFIX*sms_relent_autorply` WHERE `phone_number` = ?');
$telgetarplres = $telgetarpl->execute([$messagetoprtx]);
$telarpldata = $telgetarplres->fetch();
$telgetarplres->closeCursor();
if ($telarpldata) {
$autoreplytext = $telarpldata['message_text'];
// Get the Display Name of the current user
$crtuser = $this->userManager->get($ncuserfortelnyx);
$displaynm = $crtuser->getDisplayName();
// Check if the auto-reply is in 'daily mode'
if ($telarpldata['days_of_week']) {
// Check if the auto-reply should be sent
$daysofweekarrinit = explode(",", $telarpldata['days_of_week']);
$daysofweekarr = [];
$fulldays = [];
foreach ($daysofweekarrinit as $crtday) {
if (strpos($crtday, "full") !== false) {
$fulldays[] = $crtday;
} else {
$daysofweekarr[] = $crtday;
}
}
$dailystart = $telarpldata['daily_start'];
$dailyend = $telarpldata['daily_end'];
$crntdate = date("Y-m-d");
$crntDayNumber = date('N', strtotime($crntdate));
if (in_array($crntDayNumber, $daysofweekarr)) {
$crntimehrmin = date("H:i");
$crntdatefmt = new DateTime($crntimehrmin);
$startdatefmt = new DateTime($dailystart);
$enddatefmt = new DateTime($dailyend);
if ($crntdatefmt >= $startdatefmt && $enddatefmt > $crntdatefmt) {
// OK
} else {
// Send the auto-reply
\Telnyx\Telnyx::setApiKey($telnyxkey);
$messagedate = date("Y-m-d H:i:s");
$message = \Telnyx\Message::Create(["from" => $messagetopr, "to" => $messagefrom, "text" => $autoreplytext, "webhook_url" => $teldelrecurl]);
// Insert the sent SMS in the 'sms_relent_sent' table
if ($message) {
if (isset($message['id'])) {
$messageid = $message['id'];
} else { $messageid = $this->createMessageId(); }
} else { $messageid = $this->createMessageId(); }
$messagefromtx = "Telnyx: " . $messagetopr;
$messagetotx = $messagefrom;
$messagenetwork = null;
$messageprice = null;
$messagestatus = $message['to'][0]['status'];
$messagedelivery = null;
$sentmessagearr = [$messageid, $messagedate, $messagefromtx, $messagetotx, $messagenetwork, $messageprice, $messagestatus, $messagedelivery, $autoreplytext];
$this->service->insertsentsms($ncuserfortelnyx, $displaynm, $sentmessagearr);
}
}
if (in_array($crntDayNumber . "(full)", $fulldays)) {
// Send the auto-reply
\Telnyx\Telnyx::setApiKey($telnyxkey);
$messagedate = date("Y-m-d H:i:s");
$message = \Telnyx\Message::Create(["from" => $messagetopr, "to" => $messagefrom, "text" => $autoreplytext, "webhook_url" => $teldelrecurl]);
// Insert the sent SMS in the 'sms_relent_sent' table
if ($message) {
if (isset($message['id'])) {
$messageid = $message['id'];
} else { $messageid = $this->createMessageId(); }
} else { $messageid = $this->createMessageId(); }
$messagefromtx = "Telnyx: " . $messagetopr;
$messagetotx = $messagefrom;
$messagenetwork = null;
$messageprice = null;
$messagestatus = $message['to'][0]['status'];
$messagedelivery = null;
$sentmessagearr = [$messageid, $messagedate, $messagefromtx, $messagetotx, $messagenetwork, $messageprice, $messagestatus, $messagedelivery, $autoreplytext];
$this->service->insertsentsms($ncuserfortelnyx, $displaynm, $sentmessagearr);
}
} elseif ($telarpldata['vacation_start'] && $telarpldata['vacation_end']) {
$vacationstart = $telarpldata['vacation_start'];
$vacationend = $telarpldata['vacation_end'];
$crntimeymd = date("Y-m-d H:i:s");
$crntdatevcfmt = new DateTime($crntimeymd);
$startdatevcfmt = new DateTime($vacationstart);
$enddatefvcmt = new DateTime($vacationend);
if ($startdatevcfmt <= $crntdatevcfmt && $crntdatevcfmt <= $enddatefvcmt) {
// Send the auto-reply
\Telnyx\Telnyx::setApiKey($telnyxkey);
$messagedate = date("Y-m-d H:i:s");
$message = \Telnyx\Message::Create(["from" => $messagetopr, "to" => $messagefrom, "text" => $autoreplytext, "webhook_url" => $teldelrecurl]);
// Insert the sent SMS in the 'sms_relent_sent' table
if ($message) {
if (isset($message['id'])) {
$messageid = $message['id'];
} else { $messageid = $this->createMessageId(); }
} else { $messageid = $this->createMessageId(); }
$messagefromtx = "Telnyx: " . $messagetopr;
$messagetotx = $messagefrom;
$messagenetwork = null;
$messageprice = null;
$messagestatus = $message['to'][0]['status'];
$messagedelivery = null;
$sentmessagearr = [$messageid, $messagedate, $messagefromtx, $messagetotx, $messagenetwork, $messageprice, $messagestatus, $messagedelivery, $autoreplytext];
$this->service->insertsentsms($ncuserfortelnyx, $displaynm, $sentmessagearr);
}
}
}
// Send notifications
$nameofhost = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'];
$telsmsapicred = $this->service->getapicredentials($ncuserfortelnyx, 'telnyx');
$telnotify = $telsmsapicred[12];
$emailaddress = $telsmsapicred[13];
$includemessageinemail = $telsmsapicred[14];
if ($ismmstel == 0) { $smsormmstel = "SMS"; } else { $smsormmstel = "MMS"; }
// Send the Nextcloud notification(s)
if ($telnotify != 0 ) {
$allalloweduserstx = $this->service->getallowedusers($ncuserfortelnyx);
foreach ($allalloweduserstx as $alusrkeytx => $specusrnametx) {
$notificationtx = $this->manager->createNotification();
$notificationtx->setApp('sms_relentless')
->setUser($specusrnametx)
->setDateTime(new \DateTime())
->setObject('sms_relentless', '11')
->setSubject('New SMS Message');
$this->manager->notify($notificationtx);
}
}
// Send the email notification
if ($emailaddress != '') {
$gmtind = "UTC " . date('P');
$smsdateinit = date("Y-m-d H:i:s");
$smsdate = $smsdateinit . " " . $gmtind;
$subject = "New ". $smsormmstel ." message received";
$messagetextnltel = str_replace("\n", "
", $messagetexttel);
if ($includemessageinemail == 0) {
$message = "Hello,
You have received a new message on ".$smsdate." .
You can check the new message by going to 'SMS Relentless' > 'Received SMS Messages'.
Yours,
SMS Relentless
An SMS application for Nextcloud
Host: '" . $nameofhost . "'
";
} else {
$message = "Hello,
You have received a new message on ".$smsdate." :
Message ID: ".$messageid."
Message Date: ".$messagedate."
From: ".$messagefrom."
To: ".$messageto."
Message Text:
".$messagetextnltel."
____________
Yours,
SMS Relentless
An SMS application for Nextcloud
Host: '".$nameofhost."'
";
}
$messagefin = chunk_split(base64_encode($message));
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=UTF-8" . "\r\n";
$headers .= "Content-Transfer-Encoding: base64" . "\r\n";
// Set the email sender
$headers .= "From: " . $emailaddress . "\r\n";
$headers .= "Reply-To: " . $emailaddress . "\r\n";
mail($emailaddress, $subject, $messagefin, $headers);
}
return http_response_code(200);
} else { return "access denied"; }
} else { return "access denied"; }
}
/**
* @NoAdminRequired
* @NoCSRFRequired
* @PublicPage
*/
public function receivesmsnex() {
$plivosignature = $_SERVER['HTTP_X_PLIVO_SIGNATURE_V2'];
$plivononce = $_SERVER["HTTP_X_PLIVO_SIGNATURE_V2_NONCE"];
$plivorecurl = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$ncuserforplivo = $this->service->getuserbyplivorecwhurl($plivorecurl);
$smsapicred = $this->service->getapicredentials($ncuserforplivo, 'plivo');
$plivoapikey = $smsapicred[5];
$plivoauthtoken = $smsapicred[6];
$plivowhdelrcpt = $smsapicred[8];
$baseplivourlinit = explode("?", $plivorecurl);
$baseplivoURI = $baseplivourlinit[0];
// Verify message signature
$SigValidation = new signatureValidation();
$signverify = $SigValidation->validateSignature($baseplivoURI, $plivononce, $plivosignature, $plivoauthtoken);
if ($signverify) {
if ($ncuserforplivo) {
if ($_REQUEST) {
if (isset($_REQUEST["MessageUUID"])) {
$messageid = $_REQUEST["MessageUUID"];
} else { $messageid = $this->createMessageId(); }
} else { $messageid = $this->createMessageId(); }
$messagedate = date("Y-m-d H:i:s");
$messagefrom = "+" . $_REQUEST['From'];
$messageto = "Plivo: +" . $_REQUEST['To'];
$messagetoprpl = "Pl: +" . $_REQUEST['To'];
$messagetoplsp = "+" . $_REQUEST['To'];
// Check if the message is a MMS
if ($_REQUEST['Type'] == 'mms') {
$includedFilespl = '';
foreach ($_REQUEST as $plkey => $plvalue) {
if (strpos($plkey, "Media") !== false && $plkey != "MediaCount") {
$includedFilespl .= "" . $plvalue . "
";
}
}
$messagetextpl = $_REQUEST['Body'] . "
--- The files included in the MMS follow. Download them only if you trust the sender and the domains of the URLs ---
" . $includedFilespl;
$ismmspl = 1;
} else {
$messagetextpl = $_REQUEST['Text'];
$ismmspl = 0;
}
$recmessagearr = [$messageid, $messagedate, $messagefrom, $messageto, $messagetextpl];
$this->service->insertrecsms($ncuserforplivo, $recmessagearr);
// Check if there is any auto-reply configured for the receiving number
$plgetarpl = $this->connection->prepare('SELECT `phone_number`, `days_of_week`, `daily_start`, `daily_end`, `vacation_start`, `vacation_end`, `message_text` FROM
`*PREFIX*sms_relent_autorply` WHERE `phone_number` = ?');
$plgetarplres = $plgetarpl->execute([$messagetoprpl]);
$plarpldata = $plgetarplres->fetch();
$plgetarplres->closeCursor();
if ($plarpldata) {
$autoreplytext = $plarpldata['message_text'];
// Get the Display Name of the current user
$crtuser = $this->userManager->get($ncuserforplivo);
$displaynm = $crtuser->getDisplayName();
// Check if the auto-reply is in 'daily mode'
if ($plarpldata['days_of_week']) {
// Check if the auto-reply should be sent
$daysofweekarrinit = explode(",", $plarpldata['days_of_week']);
$daysofweekarr = [];
$fulldays = [];
foreach ($daysofweekarrinit as $crtday) {
if (strpos($crtday, "full") !== false) {
$fulldays[] = $crtday;
} else {
$daysofweekarr[] = $crtday;
}
}
$dailystart = $plarpldata['daily_start'];
$dailyend = $plarpldata['daily_end'];
$crntdate = date("Y-m-d");
$crntDayNumber = date('N', strtotime($crntdate));
if (in_array($crntDayNumber, $daysofweekarr)) {
$crntimehrmin = date("H:i");
$crntdatefmt = new DateTime($crntimehrmin);
$startdatefmt = new DateTime($dailystart);
$enddatefmt = new DateTime($dailyend);
if ($crntdatefmt >= $startdatefmt && $enddatefmt > $crntdatefmt) {
// OK
} else {
// Send the auto-reply
$client = new RestClient($plivoapikey, $plivoauthtoken);
$messagedatepl = date("Y-m-d H:i:s");
$response = $client->messages->create($messagetoplsp,[$messagefrom],$autoreplytext,["url" => $plivowhdelrcpt]);
$messageidinit = $response->getmessageUuid(0);
if ($messageidinit) {
if (isset($messageidinit[0])) {
$messageid = $messageidinit[0];
} else { $messageid = $this->createMessageId(); }
} else { $messageid = $this->createMessageId(); }
if (property_exists($response, 'error')) {
$messagestatus = "Error: " . $response->error;
} else { $messagestatus = 'The message has been accepted for delivery.'; }
$messagefrompl = $messageto;
$messagetopl = $messagefrom;
$messagenetwork = '';
$messageprice = '';
$messagedelivery = '';
$sentmessagearr = [$messageid, $messagedatepl, $messagefrompl, $messagetopl, $messagenetwork, $messageprice, $messagestatus, $messagedelivery, $autoreplytext];
$this->service->insertsentsms($ncuserforplivo, $displaynm, $sentmessagearr);
}
}
if (in_array($crntDayNumber, $fulldays)) {
// Send the auto-reply
$client = new RestClient($plivoapikey, $plivoauthtoken);
$messagedatepl = date("Y-m-d H:i:s");
$response = $client->messages->create($messagetoplsp,[$messagefrom],$autoreplytext,["url" => $plivowhdelrcpt]);
$messageidinit = $response->getmessageUuid(0);
if ($messageidinit) {
if (isset($messageidinit[0])) {
$messageid = $messageidinit[0];
} else { $messageid = $this->createMessageId(); }
} else { $messageid = $this->createMessageId(); }
if (property_exists($response, 'error')) {
$messagestatus = "Error: " . $response->error;
} else { $messagestatus = 'The message has been accepted for delivery.'; }
$messagefrompl = $messageto;
$messagetopl = $messagefrom;
$messagenetwork = '';
$messageprice = '';
$messagedelivery = '';
$sentmessagearr = [$messageid, $messagedatepl, $messagefrompl, $messagetopl, $messagenetwork, $messageprice, $messagestatus, $messagedelivery, $autoreplytext];
$this->service->insertsentsms($ncuserforplivo, $displaynm, $sentmessagearr);
}
} elseif ($plarpldata['vacation_start'] && $plarpldata['vacation_end']) {
$vacationstart = $plarpldata['vacation_start'];
$vacationend = $plarpldata['vacation_end'];
$crntimeymd = date("Y-m-d H:i:s");
$crntdatevcfmt = new DateTime($crntimeymd);
$startdatevcfmt = new DateTime($vacationstart);
$enddatefvcmt = new DateTime($vacationend);
if ($startdatevcfmt <= $crntdatevcfmt && $crntdatevcfmt <= $enddatefvcmt) {
$client = new RestClient($plivoapikey, $plivoauthtoken);
$messagedatepl = date("Y-m-d H:i:s");
$response = $client->messages->create($messagetoplsp,[$messagefrom],$autoreplytext,["url" => $plivowhdelrcpt]);
$messageidinit = $response->getmessageUuid(0);
if ($messageidinit) {
if (isset($messageidinit[0])) {
$messageid = $messageidinit[0];
} else { $messageid = $this->createMessageId(); }
} else { $messageid = $this->createMessageId(); }
if (property_exists($response, 'error')) {
$messagestatus = "Error: " . $response->error;
} else { $messagestatus = 'The message has been accepted for delivery.'; }
$messagefrompl = $messageto;
$messagetopl = $messagefrom;
$messagenetwork = '';
$messageprice = '';
$messagedelivery = '';
$sentmessagearr = [$messageid, $messagedatepl, $messagefrompl, $messagetopl, $messagenetwork, $messageprice, $messagestatus, $messagedelivery, $autoreplytext];
$this->service->insertsentsms($ncuserforplivo, $displaynm, $sentmessagearr);
}
}
}
// Send notifications
$nameofhost = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'];
$nextnotify = $smsapicred[12];
$emailaddress = $smsapicred[13];
$includemessageinemail = $smsapicred[14];
if ($ismmspl == 0) { $smsormmspl = "SMS"; } else { $smsormmspl = "MMS"; }
// Send the Nextcloud notification(s)
if ($nextnotify != 0 ) {
$allalloweduserspl = $this->service->getallowedusers($ncuserforplivo);
foreach ($allalloweduserspl as $alusrkeypl => $specusrnamepl) {
$notificationpl = $this->manager->createNotification();
$notificationpl->setApp('sms_relentless')
->setUser($specusrnamepl)
->setDateTime(new \DateTime())
->setObject('sms_relentless', '11')
->setSubject('New SMS Message');
$this->manager->notify($notificationpl);
}
}
// Send the email notification
if ($emailaddress != '') {
$gmtind = "UTC " . date('P');
$smsdateinit = date("Y-m-d H:i:s");
$smsdate = $smsdateinit . " " . $gmtind;
$subject = "New ". $smsormmspl ." message received";
$messagetextnlpl = str_replace("\n", "
", $messagetextpl);
if ($includemessageinemail == 0) {
$message = "Hello,
You have received a new message on ".$smsdate." .
You can check the new message by going to 'SMS Relentless' > 'Received SMS Messages'.
Yours,
SMS Relentless
An SMS application for Nextcloud
Host: '".$nameofhost."'
";
} else {
$message = "Hello,
You have received a new message on ".$smsdate." :
Message ID: ".$messageid."
Message Date: ".$messagedate."
From: ".$messagefrom."
To: ".$messageto."
Message Text:
".$messagetextnlpl."
____________
Yours,
SMS Relentless
An SMS application for Nextcloud
Host: '".$nameofhost."'
";
}
$messagefin = chunk_split(base64_encode($message));
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=UTF-8" . "\r\n";
$headers .= "Content-Transfer-Encoding: base64" . "\r\n";
// Set the email sender
$headers .= "From: " . $emailaddress . "\r\n";
$headers .= "Reply-To: " . $emailaddress . "\r\n";
mail($emailaddress, $subject, $messagefin, $headers);
}
return http_response_code(200);
} else { return "access denied"; }
} else { return "access denied"; }
}
/**
* @NoAdminRequired
* @NoCSRFRequired
* @PublicPage
*/
public function receivesmstwil() {
$twilsig = $_SERVER['HTTP_X_TWILIO_SIGNATURE'];
$basepath = $this->config->getSystemValue('overwrite.cli.url');
$twilrecprm = $_GET["twilrecparam"];
$twilrecurl = $basepath . "/apps/sms_relentless/api/recsmstwil?twilrecparam=" . $twilrecprm;
$ncuserfortwil = $this->service->getuserbytwilrecwhurl($twilrecurl);
$smsapicred = $this->service->getapicredentials($ncuserfortwil, 'twilio');
$apikeyTw = $smsapicred[15];
$authTokenTw = $smsapicred[16];
$apidelrecurltw = $smsapicred[18];
$postVars = $_POST;
ksort($postVars);
$compurlpart = '';
foreach ($postVars as $twilkey => $twilvalue) {
$compurlpart .= $twilkey . $twilvalue;
}
$compURL1 = $basepath . "/apps/sms_relentless/api/recsmstwil?twilrecparam=" . $twilrecprm . $compurlpart;
$compURL2 = $basepath . "/apps/sms_relentless/api/recsmstwil?twilrecparam=" . $twilrecprm . "&twilrecparam=" . $twilrecprm . $compurlpart;
$computedsig1 = base64_encode(hash_hmac('sha1', $compURL1, $authTokenTw, true));
$computedsig2 = base64_encode(hash_hmac('sha1', $compURL2, $authTokenTw, true));
// Verify message signature
if (strcmp($computedsig1, $twilsig) == 0 || strcmp($computedsig2, $twilsig) == 0) {
if ($ncuserfortwil) {
if ($_POST) {
if (isset($_POST['MessageSid'])) {
$messageid = $_POST['MessageSid'];
} else { $messageid = $this->createMessageId(); }
} else { $messageid = $this->createMessageId(); }
$messagedate = date("Y-m-d H:i:s");
$messagefrom = $_POST['From'];
$messageto = "Twilio: " . $_POST['To'];
$messagetoprtw = $_POST['To'];
$messagetotwls = "Tw: " . $_POST['To'];
// Check if the new message is a MMS
if ($_POST['NumMedia'] != 0) {
$includedFilestw = '';
foreach ($_POST as $twkey => $twvalue) {
if (strpos($twkey, "MediaUrl") !== false) {
$includedFilestw .= "" . $twvalue . "
";
}
}
$messagetexttw = $_POST['Body'] . "
--- The files included in the MMS follow. Download them only if you trust the sender and the domains of the URLs ---
" . $includedFilestw;
$ismmstw = 1;
} else {
$messagetexttw = $_POST['Body'];
$ismmstw = 0;
}
$recmessagearr = [$messageid, $messagedate, $messagefrom, $messageto, $messagetexttw];
$this->service->insertrecsms($ncuserfortwil, $recmessagearr);
// Check if there is any auto-reply configured for the receiving number
$twilgetarpl = $this->connection->prepare('SELECT `phone_number`, `days_of_week`, `daily_start`, `daily_end`, `vacation_start`, `vacation_end`, `message_text` FROM
`*PREFIX*sms_relent_autorply` WHERE `phone_number` = ?');
$twilgetarplres = $twilgetarpl->execute([$messagetotwls]);
$twilarpldata = $twilgetarplres->fetch();
$twilgetarplres->closeCursor();
if ($twilarpldata) {
$autoreplytext = $twilarpldata['message_text'];
// Get the Display Name of the current user
$crtuser = $this->userManager->get($ncuserfortwil);
$displaynm = $crtuser->getDisplayName();
// Check if the auto-reply is in 'daily mode'
if ($twilarpldata['days_of_week']) {
// Check if the auto-reply should be sent
$daysofweekarrinit = explode(",", $twilarpldata['days_of_week']);
$daysofweekarr = [];
$fulldays = [];
foreach ($daysofweekarrinit as $crtday) {
if (strpos($crtday, "full") !== false) {
$fulldays[] = str_replace("(full)", "", $crtday);
} else {
$daysofweekarr[] = $crtday;
}
}
$dailystart = $twilarpldata['daily_start'];
$dailyend = $twilarpldata['daily_end'];
$crntdate = date("Y-m-d");
$crntDayNumber = date('N', strtotime($crntdate));
if (in_array($crntDayNumber, $daysofweekarr)) {
$crntimehrmin = date("H:i");
$crntdatefmt = new DateTime($crntimehrmin);
$startdatefmt = new DateTime($dailystart);
$enddatefmt = new DateTime($dailyend);
if ($crntdatefmt >= $startdatefmt && $enddatefmt > $crntdatefmt) {
// OK
} else {
$datatoposttw = [["To" => $messagefrom, "From" => $messagetoprtw, "Body" => $autoreplytext, "StatusCallback" => $apidelrecurltw]];
$postedsendingfl = implode('&', array_map('http_build_query', $datatoposttw));
$messagedatetw = date("Y-m-d H:i:s");
$chtw = curl_init();
curl_setopt($chtw, CURLOPT_URL, 'https://api.twilio.com/2010-04-01/Accounts/' . $apikeyTw . '/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, "$apikeyTw:$authTokenTw");
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) {
if (property_exists($decresulttw, 'sid')) {
$messageidtw = $decresulttw->sid;
} else { $messageidtw = $this->createMessageId(); }
} else { $messageidtw = $this->createMessageId(); }
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.';
}
$messagenetworktw = '';
$messagepricetw = '';
$messagedeliverytw = '';
$sentmessagearr = [$messageidtw, $messagedatetw, $messageto, $messagefrom, $messagenetworktw, $messagepricetw, $messagestatustw, $messagedeliverytw, $autoreplytext];
$this->service->insertsentsms($ncuserfortwil, $displaynm, $sentmessagearr);
}
}
if (in_array($crntDayNumber, $fulldays)) {
$datatoposttw = [["To" => $messagefrom, "From" => $messagetoprtw, "Body" => $autoreplytext, "StatusCallback" => $apidelrecurltw]];
$postedsendingfl = implode('&', array_map('http_build_query', $datatoposttw));
$messagedatetw = date("Y-m-d H:i:s");
$chtw = curl_init();
curl_setopt($chtw, CURLOPT_URL, 'https://api.twilio.com/2010-04-01/Accounts/' . $apikeyTw . '/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, "$apikeyTw:$authTokenTw");
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) {
if (property_exists($decresulttw, 'sid')) {
$messageidtw = $decresulttw->sid;
} else { $messageidtw = $this->createMessageId(); }
} else { $messageidtw = $this->createMessageId(); }
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.';
}
$messagenetworktw = '';
$messagepricetw = '';
$messagedeliverytw = '';
$sentmessagearr = [$messageidtw, $messagedatetw, $messageto, $messagefrom, $messagenetworktw, $messagepricetw, $messagestatustw, $messagedeliverytw, $autoreplytext];
$this->service->insertsentsms($ncuserfortwil, $displaynm, $sentmessagearr);
}
} elseif ($twilarpldata['vacation_start'] && $twilarpldata['vacation_end']) {
$vacationstart = $twilarpldata['vacation_start'];
$vacationend = $twilarpldata['vacation_end'];
$crntimeymd = date("Y-m-d H:i:s");
$crntdatevcfmt = new DateTime($crntimeymd);
$startdatevcfmt = new DateTime($vacationstart);
$enddatefvcmt = new DateTime($vacationend);
if ($startdatevcfmt <= $crntdatevcfmt && $crntdatevcfmt <= $enddatefvcmt) {
$datatoposttw = [["To" => $messagefrom, "From" => $messagetoprtw, "Body" => $autoreplytext, "StatusCallback" => $apidelrecurltw]];
$postedsendingfl = implode('&', array_map('http_build_query', $datatoposttw));
$messagedatetw = date("Y-m-d H:i:s");
$chtw = curl_init();
curl_setopt($chtw, CURLOPT_URL, 'https://api.twilio.com/2010-04-01/Accounts/' . $apikeyTw . '/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, "$apikeyTw:$authTokenTw");
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) {
if (property_exists($decresulttw, 'sid')) {
$messageidtw = $decresulttw->sid;
} else { $messageidtw = $this->createMessageId(); }
} else { $messageidtw = $this->createMessageId(); }
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.';
}
$messagenetworktw = '';
$messagepricetw = '';
$messagedeliverytw = '';
$sentmessagearr = [$messageidtw, $messagedatetw, $messageto, $messagefrom, $messagenetworktw, $messagepricetw, $messagestatustw, $messagedeliverytw, $autoreplytext];
$this->service->insertsentsms($ncuserfortwil, $displaynm, $sentmessagearr);
}
}
}
// Send notifications
$nameofhost = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'];
$twilnotify = $smsapicred[12];
$emailaddress = $smsapicred[13];
$includemessageinemail = $smsapicred[14];
if ($ismmstw == 0) { $smsormmstw = "SMS"; } else { $smsormmstw = "MMS"; }
// Send the Nextcloud notification(s)
if ($twilnotify != 0 ) {
$allalloweduserstw = $this->service->getallowedusers($ncuserfortwil);
foreach ($allalloweduserstw as $alusrkeytw => $specusrnametw) {
$notificationtw = $this->manager->createNotification();
$notificationtw->setApp('sms_relentless')
->setUser($specusrnametw)
->setDateTime(new \DateTime())
->setObject('sms_relentless', '11')
->setSubject('New SMS Message');
$this->manager->notify($notificationtw);
}
}
// Send the email notification
if ($emailaddress != '') {
$gmtind = "UTC " . date('P');
$smsdateinit = date("Y-m-d H:i:s");
$smsdate = $smsdateinit . " " . $gmtind;
$subject = "New ". $smsormmstw ." message received";
$messagetextnltw = str_replace("\n", "
", $messagetexttw);
if ($includemessageinemail == 0) {
$message = "Hello,
You have received a new message on ".$smsdate." .
You can check the new message by going to 'SMS Relentless' > 'Received SMS Messages'.
Yours,
SMS Relentless
An SMS application for Nextcloud
Host: '".$nameofhost."'
";
} else {
$message = "Hello,
You have received a new message on ".$smsdate." :
Message ID: ".$messageid."
Message Date: ".$messagedate."
From: ".$messagefrom."
To: ".$messageto."
Message Text:
".$messagetextnltw."
____________
Yours,
SMS Relentless
An SMS application for Nextcloud
Host: '".$nameofhost."'
";
}
$messagefin = chunk_split(base64_encode($message));
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=UTF-8" . "\r\n";
$headers .= "Content-Transfer-Encoding: base64" . "\r\n";
// Set the email sender
$headers .= "From: " . $emailaddress . "\r\n";
$headers .= "Reply-To: " . $emailaddress . "\r\n";
mail($emailaddress, $subject, $messagefin, $headers);
}
exit();
} else { exit(); }
} else { exit(); }
}
/**
* @NoAdminRequired
* @NoCSRFRequired
* @PublicPage
*/
public function receivesmsflow() {
$flowdrurl = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$receivesms = file_get_contents('php://input');
$recsmsarr = json_decode($receivesms, true);
$ncuserforflowrec = $this->service->getuserbyflowrecwhurl($flowdrurl);
if ($ncuserforflowrec) {
if ($recsmsarr) {
if (isset($recsmsarr['data']['id'])) {
$messageidfl = $recsmsarr['data']['id'];
} else { $messageidfl = $this->createMessageId(); }
} else { $messageidfl = $this->createMessageId(); }
$messagedatefl = date("Y-m-d H:i:s");
$messagefromflpre = $recsmsarr['data']['attributes']['from'];
if (substr($messagefromflpre, 0, 1) == '+') { $messagefromfl = $messagefromflpre; } else { $messagefromfl = '+' . $messagefromflpre; }
$messagetofl = "Flowroute: +" . $recsmsarr['data']['attributes']['to'];
$messagetoprsl = "+" . $recsmsarr['data']['attributes']['to'];
$messagetoprfl = "Fl: +" . $recsmsarr['data']['attributes']['to'];
// Check if the message is a MMS
if ($recsmsarr['data']['attributes']['is_mms'] == true) {
$includedFilesfl = '';
for ($k = 0; $k < count($recsmsarr['included']); $k++) {
$includedFilesfl .= "" . $recsmsarr['included'][$k]['attributes']['url'] . "
";
}
$messagetextfl = $recsmsarr['data']['attributes']['body'] . "
--- The files included in the MMS follow. Download them only if you trust the sender and the domains of the URLs ---
" . $includedFilesfl;
$ismmsfl = 1;
} else {
$messagetextfl = $recsmsarr['data']['attributes']['body'];
$ismmsfl = 0;
}
$recmessagearr = [$messageidfl, $messagedatefl, $messagefromfl, $messagetofl, $messagetextfl];
$this->service->insertrecsms($ncuserforflowrec, $recmessagearr);
$flsmsapicred = $this->service->getapicredentials($ncuserforflowrec, 'flowroute');
$flownotify = $flsmsapicred[12];
$emailaddress = $flsmsapicred[13];
$includemessageinemail = $flsmsapicred[14];
$flowapikey = $flsmsapicred[20];
$flowapisecret = $flsmsapicred[21];
$flowdelrecurl = $flsmsapicred[23];
// Check if there is any auto-reply configured for the receiving number
$flgetarpl = $this->connection->prepare('SELECT `phone_number`, `days_of_week`, `daily_start`, `daily_end`, `vacation_start`, `vacation_end`, `message_text` FROM
`*PREFIX*sms_relent_autorply` WHERE `phone_number` = ?');
$flgetarplres = $flgetarpl->execute([$messagetoprfl]);
$flarpldata = $flgetarplres->fetch();
$flgetarplres->closeCursor();
if ($flarpldata) {
$autoreplytext = $flarpldata['message_text'];
// Get the Display Name of the current user
$crtuser = $this->userManager->get($ncuserforflowrec);
$displaynm = $crtuser->getDisplayName();
// Check if the auto-reply is in 'daily mode'
if ($flarpldata['days_of_week']) {
// Check if the auto-reply should be sent
$daysofweekarrinit = explode(",", $flarpldata['days_of_week']);
$daysofweekarr = [];
$fulldays = [];
foreach ($daysofweekarrinit as $crtday) {
if (strpos($crtday, "full") !== false) {
$fulldays[] = str_replace("(full)", "", $crtday);
} else {
$daysofweekarr[] = $crtday;
}
}
$dailystart = $flarpldata['daily_start'];
$dailyend = $flarpldata['daily_end'];
$crntdate = date("Y-m-d");
$crntDayNumber = date('N', strtotime($crntdate));
if (in_array($crntDayNumber, $daysofweekarr)) {
$crntimehrmin = date("H:i");
$crntdatefmt = new DateTime($crntimehrmin);
$startdatefmt = new DateTime($dailystart);
$enddatefmt = new DateTime($dailyend);
if ($crntdatefmt >= $startdatefmt && $enddatefmt > $crntdatefmt) {
// OK
} else {
// Send the auto-reply
$postedparamsfl = json_encode(["to" => $messagefromfl, "from" => $messagetoprsl, "body" => $autoreplytext, "dlr_callback" => $flowdelrecurl]);
$messagedatefl = date("Y-m-d H:i:s");
$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) {
if (isset($decresultfl->data->id)) {
$messageidfl = $decresultfl->data->id;
} else { $messageidfl = $this->createMessageId(); }
} else { $messageidfl = $this->createMessageId(); }
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.';
}
$messagefromflow = "Flowroute: " . $messagetoprsl;
$messagetoflow = $messagefromfl;
$messagenetworkfl = '';
$messagepricefl = '';
$messagedeliveryfl = '';
$sentmessagearr = [$messageidfl, $messagedatefl, $messagefromflow, $messagetoflow, $messagenetworkfl, $messagepricefl, $messagestatusfl, $messagedeliveryfl, $autoreplytext];
$this->service->insertsentsms($ncuserforflowrec, $displaynm, $sentmessagearr);
}
}
if (in_array($crntDayNumber, $fulldays)) {
// Send the auto-reply
$postedparamsfl = json_encode(["to" => $messagefromfl, "from" => $messagetoprsl, "body" => $autoreplytext, "dlr_callback" => $flowdelrecurl]);
$messagedatefl = date("Y-m-d H:i:s");
$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) {
if (isset($decresultfl->data->id)) {
$messageidfl = $decresultfl->data->id;
} else { $messageidfl = $this->createMessageId(); }
} else { $messageidfl = $this->createMessageId(); }
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.';
}
$messagefromflow = "Flowroute: " . $messagetoprsl;
$messagetoflow = $messagefromfl;
$messagenetworkfl = '';
$messagepricefl = '';
$messagedeliveryfl = '';
$sentmessagearr = [$messageidfl, $messagedatefl, $messagefromflow, $messagetoflow, $messagenetworkfl, $messagepricefl, $messagestatusfl, $messagedeliveryfl, $autoreplytext];
$this->service->insertsentsms($ncuserforflowrec, $displaynm, $sentmessagearr);
}
} elseif ($flarpldata['vacation_start'] && $flarpldata['vacation_end']) {
$vacationstart = $flarpldata['vacation_start'];
$vacationend = $flarpldata['vacation_end'];
$crntimeymd = date("Y-m-d H:i:s");
$crntdatevcfmt = new DateTime($crntimeymd);
$startdatevcfmt = new DateTime($vacationstart);
$enddatefvcmt = new DateTime($vacationend);
if ($startdatevcfmt <= $crntdatevcfmt && $crntdatevcfmt <= $enddatefvcmt) {
$postedparamsfl = json_encode(["to" => $messagefromfl, "from" => $messagetoprsl, "body" => $autoreplytext, "dlr_callback" => $flowdelrecurl]);
$messagedatefl = date("Y-m-d H:i:s");
$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) {
if (isset($decresultfl->data->id)) {
$messageidfl = $decresultfl->data->id;
} else { $messageidfl = $this->createMessageId(); }
} else { $messageidfl = $this->createMessageId(); }
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.';
}
$messagefromflow = "Flowroute: " . $messagetoprsl;
$messagetoflow = $messagefromfl;
$messagenetworkfl = '';
$messagepricefl = '';
$messagedeliveryfl = '';
$sentmessagearr = [$messageidfl, $messagedatefl, $messagefromflow, $messagetoflow, $messagenetworkfl, $messagepricefl, $messagestatusfl, $messagedeliveryfl, $autoreplytext];
$this->service->insertsentsms($ncuserforflowrec, $displaynm, $sentmessagearr);
}
}
}
// Send notifications
$nameofhost = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'];
if ($ismmsfl == 0) { $smsormmsfl = "SMS"; } else { $smsormmsfl = "MMS"; }
// Send the Nextcloud notification(s)
if ($flownotify != 0 ) {
$allallowedusersfl = $this->service->getallowedusers($ncuserforflowrec);
foreach ($allallowedusersfl as $alusrkeyfl => $specusrnamefl) {
$notificationfl = $this->manager->createNotification();
$notificationfl->setApp('sms_relentless')
->setUser($specusrnamefl)
->setDateTime(new \DateTime())
->setObject('sms_relentless', '11')
->setSubject('New SMS Message');
$this->manager->notify($notificationfl);
}
}
// Send the email notification
if ($emailaddress != '') {
$gmtind = "UTC " . date('P');
$smsdateinit = date("Y-m-d H:i:s");
$smsdate = $smsdateinit . " " . $gmtind;
$subject = "New ". $smsormmsfl ." message received";
$messagetextnlfl = str_replace("\n", "
", $messagetextfl);
if ($includemessageinemail == 0) {
$message = "Hello,
You have received a new message on ".$smsdate." .
You can check the new message by going to 'SMS Relentless' > 'Received SMS Messages'.
Yours,
SMS Relentless
An SMS application for Nextcloud
Host: '".$nameofhost."'
";
} else {
$message = "Hello,
You have received a new message on ".$smsdate." :
Message ID: ".$messageidfl."
Message Date: ".$messagedatefl."
From: ".$messagefromfl."
To: ".$messagetofl."
Message Text:
".$messagetextnlfl."
____________
Yours,
SMS Relentless
An SMS application for Nextcloud
Host: '".$nameofhost."'
";
}
$messagefin = chunk_split(base64_encode($message));
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=UTF-8" . "\r\n";
$headers .= "Content-Transfer-Encoding: base64" . "\r\n";
// Set the email sender
$headers .= "From: " . $emailaddress . "\r\n";
$headers .= "Reply-To: " . $emailaddress . "\r\n";
mail($emailaddress, $subject, $messagefin, $headers);
}
return http_response_code(200);
} else { return "access denied"; }
}
}