晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/akaindir/www/crm/modules/SMSNotifier/ext/providers/ |
Upload File : |
<?php
/*+**********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.0
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
************************************************************************************/
include_once dirname(__FILE__) . '/../ISMSProvider.php';
include_once 'vtlib/Vtiger/Net/Client.php';
class TextAnywhere implements ISMSProvider {
private $_username;
private $_password;
private $_parameters = array();
const SERVICE_URI = 'http://www.textapp.net/webservice/httpservice.aspx';
private static $REQUIRED_PARAMETERS = array('Originator', 'CharacterSet');
function __construct() {
}
public function setAuthParameters($username, $password) {
$this->_username = $username;
$this->_password = $password;
}
public function setParameter($key, $value) {
$this->_parameters[$key] = $value;
}
public function getParameter($key, $defvalue = false) {
if (isset($this->_parameters[$key])) {
return $this->_parameters[$key];
}
return $defvalue;
}
public function getRequiredParams() {
return self::$REQUIRED_PARAMETERS;
}
public function getServiceURL($type = false) {
if ($type) {
switch (strtoupper($type)) {
case self::SERVICE_AUTH: return self::SERVICE_URI . '';
case self::SERVICE_SEND: return self::SERVICE_URI . '?method=SendSMS&';
case self::SERVICE_QUERY: return self::SERVICE_URI . '?method=GetSMSStatus&';
}
}
return false;
}
public function send($message, $tonumbers) {
if (!is_array($tonumbers)) {
$tonumbers = array($tonumbers);
}
$tonumbers = $this->cleanNumbers($tonumbers);
$clientMessageReference = $this->generateClientMessageReference();
$response = $this->sendMessage($clientMessageReference, $message, $tonumbers);
return $this->processSendMessageResult($response, $clientMessageReference, $tonumbers);
}
public function query($messageid) {
$messageidSplit = split('--', $messageid);
$clientMessageReference = trim($messageidSplit[0]);
$number = trim($messageidSplit[1]);
$response = $this->queryMessage($clientMessageReference);
return $this->processQueryMessageResult($response, $number);
}
private function cleanNumbers($numbers) {
$pattern = '/[^\+\d]/';
$replacement = '';
return preg_replace($pattern, $replacement, $numbers);
}
private function generateClientMessageReference() {
return uniqid();
}
private function validEmail($email) {
$isValid = true;
$atIndex = strrpos($email, "@");
if (is_bool($atIndex) && !$atIndex) {
$isValid = false;
} else {
$domain = substr($email, $atIndex + 1);
$local = substr($email, 0, $atIndex);
$localLen = strlen($local);
$domainLen = strlen($domain);
if ($localLen < 1 || $localLen > 64) {
// local part length exceeded
$isValid = false;
} else if ($domainLen < 1 || $domainLen > 255) {
// domain part length exceeded
$isValid = false;
} else if ($local[0] == '.' || $local[$localLen - 1] == '.') {
// local part starts or ends with '.'
$isValid = false;
} else if (preg_match('/\\.\\./', $local)) {
// local part has two consecutive dots
$isValid = false;
} else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) {
// character not valid in domain part
$isValid = false;
} else if (preg_match('/\\.\\./', $domain)) {
// domain part has two consecutive dots
$isValid = false;
} else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\", "", $local))) {
// character not valid in local part unless
// local part is quoted
if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\", "", $local))) {
$isValid = false;
}
}
}
return $isValid;
}
private function getReplyMethodID($originator) {
if (substr($originator, 0, 1) === '+' && is_numeric(substr($originator, 1))) {
return 4;
} else if ($this->validEmail($originator)) {
return 2;
} else {
return 1;
}
}
private function sendMessage($clientMessageReference, $message, $tonumbers) {
$originator = $this->getParameter('Originator', '');
$replyMethodID = $this->getReplyMethodID($originator);
$replyData = '';
if ($replyMethodID == 2) {
$replyData = $originator;
$originator = '';
}
$characterSetID = $this->getParameter('CharacterSet', '2');
$current_user = new Users();
$current_user->retrieveCurrentUserInfoFromFile($_SESSION['authenticated_user_id']);
$serviceURL = $this->getServiceURL(self::SERVICE_SEND);
$serviceURL = $serviceURL . 'returnCSVString=' . 'true' . '&';
$serviceURL = $serviceURL . 'externalLogin=' . urlencode($this->_username) . '&';
$serviceURL = $serviceURL . 'password=' . urlencode($this->_password) . '&';
$serviceURL = $serviceURL . 'clientBillingReference=' . urlencode('vTiger' . '-' . $current_user->user_name) . '&';
$serviceURL = $serviceURL . 'clientMessageReference=' . urlencode($clientMessageReference) . '&';
$serviceURL = $serviceURL . 'originator=' . urlencode($originator) . '&';
$serviceURL = $serviceURL . 'body=' . urlencode(html_entity_decode($message)) . '&';
$serviceURL = $serviceURL . 'destinations=' . urlencode(implode(',', $tonumbers)) . '&';
$serviceURL = $serviceURL . 'validity=' . urlencode('72') . '&';
$serviceURL = $serviceURL . 'characterSetID=' . urlencode($characterSetID) . '&';
$serviceURL = $serviceURL . 'replyMethodID=' . urlencode($replyMethodID) . '&';
$serviceURL = $serviceURL . 'replyData=' . urlencode($replyData) . '&';
$serviceURL = $serviceURL . 'statusNotificationUrl=';
$httpClient = new Vtiger_Net_Client($serviceURL);
return $httpClient->doPost(array());
}
private function processSendMessageResult($response, $clientMessageReference, $tonumbers) {
$results = array();
$responseLines = split("\n", $response);
if (trim($responseLines[0]) === '#1#') {
//Successful transaction
$numberResults = split(",", $responseLines[1]);
foreach ($numberResults as $numberResult) {
$numberResultSplit = split(":", $numberResult);
$number = trim($numberResultSplit[0]);
$code = trim($numberResultSplit[1]);
$result = array();
if ($code != '1') {
$result['error'] = true;
$result['statusmessage'] = $code;
$result['to'] = $number;
} else {
$result['error'] = false;
$result['id'] = $clientMessageReference . '--' . $number;
$result['status'] = self::MSG_STATUS_PROCESSING;
$result['statusmessage'] = $code;
$result['to'] = $number;
}
$results[] = $result;
}
} else {
//Transaction failed
foreach ($tonumbers as $number) {
$result = array('error' => true, 'statusmessage' => $responseLines[0], 'to' => $number);
$results[] = $result;
}
}
return $results;
}
private function queryMessage($clientMessageReference) {
$serviceURL = $this->getServiceURL(self::SERVICE_QUERY);
$serviceURL = $serviceURL . 'returnCSVString=' . 'true' . '&';
$serviceURL = $serviceURL . 'externalLogin=' . urlencode($this->_username) . '&';
$serviceURL = $serviceURL . 'password=' . urlencode($this->_password) . '&';
$serviceURL = $serviceURL . 'clientMessageReference=' . urlencode($clientMessageReference);
$httpClient = new Vtiger_Net_Client($serviceURL);
return $httpClient->doPost(array());
}
private function processQueryMessageResult($response, $number) {
$result = array();
$responseLines = split("\n", $response);
if (trim($responseLines[0]) === '#1#') {
//Successful transaction
$numberResults = split(",", $responseLines[1]);
foreach ($numberResults as $numberResult) {
$numberResultSplit = split(":", $numberResult);
$thisNumber = trim($numberResultSplit[0]);
$code = (int) trim($numberResultSplit[1]);
if ($thisNumber != $number)
continue;
if ($code >= 400 && $code <= 499) {
$result['error'] = false;
$result['status'] = self::MSG_STATUS_DELIVERED;
$result['needlookup'] = 0;
$result['statusmessage'] = $code;
} else if ($code >= 500 && $code <= 599) {
$result['error'] = false;
$result['status'] = self::MSG_STATUS_FAILED;
$result['needlookup'] = 0;
$result['statusmessage'] = $code;
} else if ($code >= 600 && $code <= 699) {
$result['error'] = false;
$result['status'] = self::MSG_STATUS_DISPATCHED;
$result['needlookup'] = 1;
$result['statusmessage'] = $code;
}
break;
}
} else {
//Transaction failed
$result['error'] = true;
$result['needlookup'] = 1;
$result['statusmessage'] = $responseLines[0];
}
return $result;
}
}
?>