index.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693
  1. <?php
  2. //set the include path
  3. $conf = glob("{/usr/local/etc,/etc}/fusionpbx/config.conf", GLOB_BRACE);
  4. set_include_path(parse_ini_file($conf[0])['document.root']);
  5. //includes files
  6. require_once "resources/require.php";
  7. require_once "resources/functions.php";
  8. require_once "resources/functions/message_media_builder.php";
  9. require_once "resources/pdo.php";
  10. //connect to the database
  11. $database = database::new();
  12. //debug
  13. if ($_SESSION['message']['debug']['boolean'] == 'true') {
  14. $debug = true;
  15. }
  16. else {
  17. $debug = false;
  18. }
  19. //log file
  20. $log_file = '/tmp/message.log';
  21. //write the remote address to the log
  22. if ($debug) {
  23. file_put_contents($log_file, "Remote Address: ".$_SERVER['REMOTE_ADDR']."\n", FILE_APPEND);
  24. }
  25. //get the provider addresses
  26. $sql = "select provider_uuid, provider_address_cidr ";
  27. $sql .= "from v_provider_addresses ";
  28. $sql .= "where provider_address_cidr is not null ";
  29. $sql .= "and provider_address_enabled = true ";
  30. $parameters = null;
  31. $provider_addresses = $database->select($sql, $parameters, 'all');
  32. //default authorized to false
  33. $authorized = false;
  34. //use the ip address to get the provider uuid and determine if request is authorized
  35. foreach($provider_addresses as $row) {
  36. if (check_cidr($row['provider_address_cidr'], $_SERVER['REMOTE_ADDR'])) {
  37. $provider_uuid = $row['provider_uuid'];
  38. $authorized = true;
  39. break;
  40. }
  41. }
  42. //authorization failed
  43. if ($authorized) {
  44. if ($debug) {
  45. file_put_contents($log_file, "authorized\n", FILE_APPEND);
  46. file_put_contents($log_file, "provider_uuid ".$provider_uuid."\n", FILE_APPEND);
  47. }
  48. }
  49. else {
  50. //log the failed auth attempt to the system, to be available for fail2ban.
  51. if ($debug) {
  52. file_put_contents($log_file, "unauthorized\n", FILE_APPEND);
  53. }
  54. openlog('FusionPBX', LOG_NDELAY, LOG_AUTH);
  55. syslog(LOG_WARNING, '['.$_SERVER['REMOTE_ADDR']."] authentication failed for ".($_GET['key'] ?? ''));
  56. closelog();
  57. //send http 403
  58. header("HTTP/1.0 403 Forbidden");
  59. echo "Forbidden\n";
  60. exit();
  61. }
  62. //check if string is url encoded
  63. function is_urlencoded($string) {
  64. $urlencoded = preg_match('~%[0-9A-F]{2}~i', $string);
  65. if ($urlencoded) {
  66. return true;
  67. }
  68. else {
  69. return false;
  70. }
  71. }
  72. //use the provider uuid to get the provider_settings
  73. $sql = "select provider_setting_category, provider_setting_subcategory, \n";
  74. $sql .= "provider_setting_name, provider_setting_value, provider_setting_order \n";
  75. $sql .= "from v_provider_settings \n";
  76. $sql .= "where provider_uuid = :provider_uuid \n";
  77. $sql .= "and provider_setting_enabled = 'true' \n";
  78. $sql .= "and provider_setting_category = 'inbound' \n";
  79. $parameters['provider_uuid'] = $provider_uuid;
  80. $provider_settings = $database->select($sql, $parameters, 'all');
  81. foreach ($provider_settings as $row) {
  82. if ($row['provider_setting_subcategory'] == 'content') {
  83. $setting[$row['provider_setting_name']] = $row['provider_setting_value'];
  84. }
  85. elseif ($row['provider_setting_subcategory'] == 'format') {
  86. $format[$row['provider_setting_name']] = $row['provider_setting_value'];
  87. }
  88. }
  89. unset($parameters);
  90. //view_array($settings, false);
  91. //set the default content type to json
  92. $content_type = 'json';
  93. //get the content location for the destination number
  94. if (isset($setting['content_type'])) {
  95. $content_type = strtolower($setting['content_type']);
  96. }
  97. if ($debug) {
  98. file_put_contents($log_file, "Server CONTENT_TYPE ".$_SERVER['CONTENT_TYPE']."\n", FILE_APPEND);
  99. file_put_contents($log_file, "content_type: $content_type\n", FILE_APPEND);
  100. }
  101. //get the content
  102. if ($content_type == 'json') {
  103. $message_json = file_get_contents("php://input");
  104. }
  105. elseif ($content_type == 'get') {
  106. $message_json = json_encode($_GET);
  107. }
  108. elseif ($content_type == 'post') {
  109. $message_json = json_encode($_POST);
  110. }
  111. // Used for Providers that send HTTP requests with mixed http method and http variables
  112. // For example, a Provider that sends a POST with a query string would populate $_GET, not $_POST
  113. elseif ($content_type == 'mixed') {
  114. if(!empty($_GET)) {
  115. $message_json = json_encode($_GET);
  116. $content_type = 'get';
  117. }
  118. elseif (!empty($_POST)) {
  119. $message_json = json_encode($_POST);
  120. $content_type = 'post';
  121. }
  122. else {
  123. $message_json = file_get_contents("php://input");
  124. $content_type = 'json';
  125. }
  126. }
  127. //write content to the logs
  128. if ($debug) {
  129. if ($content_type == 'json') {
  130. file_put_contents($log_file, $message_json, FILE_APPEND);
  131. }
  132. }
  133. //save the http post to the log
  134. if ($debug) {
  135. if (count($_POST)) {
  136. file_put_contents($log_file, json_encode($_POST)."\n", FILE_APPEND);
  137. }
  138. if (count($_GET)) {
  139. file_put_contents($log_file, json_encode($_GET)."\n", FILE_APPEND);
  140. }
  141. }
  142. //decode the json into array
  143. if ($content_type == 'json') {
  144. $message = json_decode($message_json, true);
  145. }
  146. //ignore inbound delivery receipt - used by bulkvs
  147. if (isset($message['DeliveryReceipt']) && $message['DeliveryReceipt'] == 'true') {
  148. exit;
  149. }
  150. //send print_r to the log
  151. //if ($debug) {
  152. // file_put_contents($log_file, print_r($message, true)."\n", FILE_APPEND);
  153. //}
  154. //get the content location for the destination number
  155. $message_to = $setting['content']['message_to'] ?? null;
  156. //debug info
  157. if ($debug) {
  158. file_put_contents($log_file, "--------------\n", FILE_APPEND);
  159. file_put_contents($log_file, print_r($setting, true)."\n", FILE_APPEND);
  160. file_put_contents($log_file, "message_to $message_to\n", FILE_APPEND);
  161. file_put_contents($log_file, "--------------\n", FILE_APPEND);
  162. }
  163. /*
  164. $setting['message_from'] => data.attributes.from
  165. $setting['message_to'] => data.attributes.to
  166. $setting['message_content'] => data.attributes.body
  167. $from_array = explode('.', $setting['message_from']);
  168. $to_array = explode('.', $setting['message_to']);
  169. $content_array = explode('.', $setting['message_content']);
  170. */
  171. //version 3
  172. /*
  173. function get_value($array, $key) {
  174. $keys = explode('.', $key);
  175. $segment = array_shift($keys);
  176. if (isset($array[$segment]) && is_array($array[$segment])) {
  177. $next_key = substr($key, strpos($key, '.') + 1);
  178. $data = get_value($array[$segment], $next_key);
  179. }
  180. else {
  181. $data = $array[$segment] ?? '';
  182. }
  183. return $data;
  184. }
  185. */
  186. //version 2
  187. function get_value($data, $path) {
  188. $keys = explode('.', $path);
  189. foreach ($keys as $key) {
  190. $data = $data[$key];
  191. }
  192. return $data;
  193. }
  194. //version 1
  195. /*
  196. function get_value($data, $path) {
  197. $keys = explode('.', $path);
  198. if (count($keys) == 1) {
  199. return $data[$keys[0]];
  200. }
  201. if (count($keys) == 2) {
  202. return $data[$keys[0]][$keys[1]];
  203. }
  204. if (count($keys) == 3) {
  205. return $data[$keys[0]][$keys[1]][$keys[2]];
  206. }
  207. if (count($keys) == 4) {
  208. return $data[$key_array[0]][$keys[1]][$keys[2]][$keys[3]];
  209. }
  210. if (count($keys) == 5) {
  211. return $data[$keys[0]][$keys[1]][$keys[2]][$keys[3]][$keys[4]];
  212. }
  213. }
  214. */
  215. /*
  216. if (count($from_array) == 3) {
  217. $message_from = $message[$from_array[0]][$from_array[1]][$from_array[2]];
  218. }
  219. if (count($to_array) == 3) {
  220. $message_to = $message[$to_array[0]][$to_array[1]][$to_array[2]];
  221. }
  222. if (count($message_content) == 3) {
  223. $message_content = $message[$message_content[0]][$message_content[1]][$message_content[2]];
  224. }
  225. */
  226. //get the values from the message array using the provider settings
  227. if ($content_type == 'json') {
  228. $message_from = get_value($message, $setting['message_from']);
  229. $message_to = get_value($message, $setting['message_to']);
  230. $message_content = get_value($message, $setting['message_content']);
  231. $message_media_array = !empty($setting['message_media_array']) ? get_value($message, $setting['message_media_array']) : null;
  232. //get the message_type options: sms, mms
  233. if (isset($setting['message_type'])) {
  234. $message_type = strtolower($setting['message_type']);
  235. }
  236. else {
  237. $message_type = !empty($message_media_array) && is_array($message_media_array) ? 'mms' : 'sms';
  238. }
  239. }
  240. elseif ($content_type == 'post') {
  241. if (!empty($setting['message_media_array']) && isset($_POST[$setting['message_media_array']])){
  242. $message_media_array = $_POST[$setting['message_media_array']] ;
  243. }
  244. else {
  245. $message_media_array = message_media_builder($_POST, [$setting['message_media_url'], $setting['message_media_type']]);
  246. }
  247. //get the message_type options: sms, mms
  248. if (isset($setting['message_type'])) {
  249. $message_type = strtolower($setting['message_type']);
  250. }
  251. else {
  252. $message_type = !empty($message_media_array) && is_array($message_media_array) ? 'mms' : 'sms';
  253. }
  254. $message_from = ($message_type == 'mms') ? $_POST[$setting['message_media_from']] : $_POST[$setting['message_from']];
  255. $message_to = ($message_type == 'mms') ? $_POST[$setting['message_media_to']] : $_POST[$setting['message_to']];
  256. $message_content = ($message_type == 'mms') ? $_POST[$setting['message_media_content']] : $_POST[$setting['message_content']];
  257. $message_content = preg_replace('/<smil[^>]*>([\s\S]*?)<\/smil[^>]*>/', '', $message_content);
  258. }
  259. elseif ($content_type == 'get') {
  260. if (!empty($setting['message_media_array']) && isset($_GET[$setting['message_media_array']])){
  261. $message_media_array = $_GET[$setting['message_media_array']] ;
  262. }
  263. else {
  264. $message_media_array = message_media_builder($_GET, [$setting['message_media_url'], $setting['message_media_type']]);
  265. }
  266. //get the message_type options: sms, mms
  267. if (isset($setting['message_type'])) {
  268. $message_type = strtolower($setting['message_type']);
  269. }
  270. else {
  271. $message_type = !empty($message_media_array) && is_array($message_media_array) ? 'mms' : 'sms';
  272. }
  273. $message_from = ($message_type == 'mms') ? $_GET[$setting['message_media_from']] : $_GET[$setting['message_from']];
  274. $message_to = ($message_type == 'mms') ? $_GET[$setting['message_media_to']] : $_GET[$setting['message_to']];
  275. $message_content = ($message_type == 'mms') ? $_GET[$setting['message_media_content']] : $_GET[$setting['message_content']];
  276. $message_content = preg_replace('/<smil[^>]*>([\s\S]*?)<\/smil[^>]*>/', '', $message_content);
  277. }
  278. //message to is an array get first number in the array
  279. if (is_array($message_to)) {
  280. $message_to = $message_to['0'];
  281. }
  282. //decode the content if it is encoded
  283. if (isset($message_content)) {
  284. if (is_urlencoded($message_content)) {
  285. $message_content = urldecode($message_content);
  286. }
  287. }
  288. //format the phone numbers
  289. if($message_type == 'mms') {
  290. //check if message_media formats are defined and non-empty, and if so, use those instead of default formats
  291. if (isset($format['message_media_message_from']) && !empty($format['message_media_message_from'])) {
  292. $message_from = format_string($format['message_media_message_from'], $message_from);
  293. }
  294. elseif (isset($format['message_from'])) {
  295. $message_from = format_string($format['message_from'], $message_from);
  296. }
  297. if (isset($format['message_media_message_to']) && !empty($format['message_media_message_to'])) {
  298. $message_to = format_string($format['message_media_message_to'], $message_to);
  299. }
  300. elseif (isset($format['message_to'])) {
  301. $message_to = format_string($format['message_to'], $message_to);
  302. }
  303. }
  304. else {
  305. //default formats. If setting is defined but format string is left blank, the format_string function
  306. //will return the data as is (No changes made)
  307. if (isset($format['message_from'])) {
  308. $message_from = format_string($format['message_from'], $message_from);
  309. }
  310. if (isset($format['message_to'])) {
  311. $message_to = format_string($format['message_to'], $message_to);
  312. }
  313. }
  314. //debug info
  315. if ($debug) {
  316. file_put_contents($log_file, "setting.message_from: ".$setting['message_from']."\n", FILE_APPEND);
  317. file_put_contents($log_file, "setting.message_to: ".$setting['message_to']."\n", FILE_APPEND);
  318. file_put_contents($log_file, "setting.message_content: ".$setting['message_content']."\n", FILE_APPEND);
  319. file_put_contents($log_file, "content_type: $content_type\n", FILE_APPEND);
  320. file_put_contents($log_file, "provider_uuid: $provider_uuid\n", FILE_APPEND);
  321. file_put_contents($log_file, "from: ".$message_from."\n", FILE_APPEND);
  322. file_put_contents($log_file, "to: ".$message_to."\n", FILE_APPEND);
  323. file_put_contents($log_file, "content: ".$message_content."\n", FILE_APPEND);
  324. file_put_contents($log_file, "message_media_array: ".print_r($message_media_array, true)."\n", FILE_APPEND);
  325. }
  326. /*
  327. ()
  328. [data] => Array
  329. (
  330. [attributes] => Array
  331. (
  332. [status] => delivered
  333. [body] => Ddd
  334. [direction] => inbound
  335. [amount_nanodollars] => 4000000
  336. [message_encoding] => 0
  337. [timestamp] => 2021-05-16T06:12:59.88Z
  338. [to] => 12089068227
  339. [amount_display] => $0.0040
  340. [from] => 12088058985
  341. [is_mms] =>
  342. [message_callback_url] => https://voip.fusionpbx.com/app/messages/index.php
  343. [message_type] => longcode
  344. )
  345. [type] => message
  346. [id] => mdr2-c3afc962b60d11ebb748aecb682882cc
  347. )
  348. )
  349. */
  350. //set the hostname if it wasn't provided
  351. $hostname = gethostname();
  352. //get the source phone number
  353. $destination_number = preg_replace('{[\D]}', '', $message_to);
  354. //use the phone number to get the destination details
  355. $sql = "SELECT * FROM v_destinations ";
  356. $sql .= "WHERE ( ";
  357. $sql .= " destination_prefix || destination_area_code || destination_number = :destination_number ";
  358. $sql .= " OR destination_trunk_prefix || destination_area_code || destination_number = :destination_number ";
  359. $sql .= " OR destination_prefix || destination_number = :destination_number ";
  360. $sql .= " OR '+' || destination_prefix || destination_number = :destination_number ";
  361. $sql .= " OR '+' || destination_prefix || destination_area_code || destination_number = :destination_number ";
  362. $sql .= " OR destination_area_code || destination_number = :destination_number ";
  363. $sql .= " OR destination_number = :destination_number ";
  364. $sql .= ") ";
  365. $sql .= "and provider_uuid is not null ";
  366. $sql .= "and destination_enabled = 'true'; ";
  367. $parameters['destination_number'] = $destination_number;
  368. if ($debug) {
  369. file_put_contents($log_file, "sql: ".$sql."\n", FILE_APPEND);
  370. file_put_contents($log_file, print_r($parameters, true)."\n", FILE_APPEND);
  371. }
  372. $row = $database->select($sql, $parameters, 'row');
  373. $domain_uuid = $row['domain_uuid'];
  374. $user_uuid = $row['user_uuid'];
  375. $group_uuid = $row['group_uuid'];
  376. if ($debug) {
  377. file_put_contents($log_file, print_r($row, true)."\n", FILE_APPEND);
  378. }
  379. unset($sql, $parameters, $row);
  380. //get the contact uuid
  381. $sql = "select c.contact_uuid ";
  382. $sql .= "from v_contacts as c, v_contact_phones as p ";
  383. $sql .= "where p.contact_uuid = c.contact_uuid ";
  384. $sql .= "and p.phone_number = :phone_number ";
  385. $sql .= "and c.domain_uuid = :domain_uuid ";
  386. $parameters['phone_number'] = $destination_number;
  387. $parameters['domain_uuid'] = $domain_uuid;
  388. $contact_uuid = $database->select($sql, $parameters, 'column');
  389. unset($sql, $parameters);
  390. //add to the messages array
  391. $message_uuid = uuid();
  392. $array['messages'][0]['message_uuid'] = $message_uuid;
  393. $array['messages'][0]['domain_uuid'] = $domain_uuid;
  394. $array['messages'][0]['provider_uuid'] = $provider_uuid;
  395. if (is_uuid($user_uuid)) {
  396. $array['messages'][0]['user_uuid'] = $user_uuid;
  397. }
  398. if (is_uuid($group_uuid)) {
  399. $array['messages'][0]['group_uuid'] = $group_uuid;
  400. }
  401. if (is_uuid($contact_uuid)) {
  402. $array['messages'][0]['contact_uuid'] = $contact_uuid;
  403. }
  404. $array['messages'][0]['message_type'] = $message_type;
  405. $array['messages'][0]['message_direction'] = 'inbound';
  406. $array['messages'][0]['message_date'] = 'now()';
  407. $array['messages'][0]['message_from'] = $message_from;
  408. $array['messages'][0]['message_to'] = $message_to;
  409. $array['messages'][0]['message_text'] = $message_content;
  410. $array['messages'][0]['message_json'] = $message_json;
  411. //add to message queue array
  412. $message_queue_uuid = uuid();
  413. $array['message_queue'][0]['message_queue_uuid'] = $message_queue_uuid;
  414. $array['message_queue'][0]['domain_uuid'] = $domain_uuid;
  415. if (is_uuid($user_uuid)) {
  416. $array['message_queue'][0]['user_uuid'] = $user_uuid;
  417. }
  418. if (is_uuid($group_uuid)) {
  419. $array['message_queue'][0]['group_uuid'] = $group_uuid;
  420. }
  421. $array['message_queue'][0]['provider_uuid'] = $provider_uuid;
  422. $array['message_queue'][0]['hostname'] = $hostname;
  423. if (is_uuid($contact_uuid)) {
  424. $array['message_queue'][0]['contact_uuid'] = $contact_uuid;
  425. }
  426. $array['message_queue'][0]['message_type'] = $message_type;
  427. $array['message_queue'][0]['message_direction'] = 'inbound';
  428. $array['message_queue'][0]['message_status'] = 'waiting';
  429. $array['message_queue'][0]['message_date'] = 'now()';
  430. $array['message_queue'][0]['message_from'] = $message_from;
  431. $array['message_queue'][0]['message_to'] = $message_to;
  432. $array['message_queue'][0]['message_text'] = $message_content;
  433. $array['message_queue'][0]['message_json'] = $message_json;
  434. //add the required permission
  435. $p = new permissions;
  436. $p->add("message_add", "temp");
  437. $p->add("message_queue_add", "temp");
  438. $p->add("message_media_add", "temp");
  439. //build message media array (if necessary)
  440. if (is_array($message_media_array)) {
  441. foreach($message_media_array as $index => $media_row) {
  442. //get the value out of the array using dot notation
  443. if (isset($setting['message_media_url'])) {
  444. $message_media_url = get_value($media_row, $setting['message_media_url']);
  445. }
  446. if (isset($setting['message_media_type'])) {
  447. $message_media_type = get_value($media_row, $setting['message_media_type']);
  448. }
  449. //get the file extension
  450. if (isset($message_media_type)) {
  451. if ($message_media_type == 'image/jpg') { $message_media_type = 'jpg'; }
  452. if ($message_media_type == 'image/jpeg') { $message_media_type = 'jpg'; }
  453. if ($message_media_type == 'image/png') { $message_media_type = 'png'; }
  454. if ($message_media_type == 'image/gif') { $message_media_type = 'gif'; }
  455. }
  456. //get the media url
  457. if (!isset($message_media_url)) {
  458. $message_media_url = $media_row;
  459. }
  460. //get the media type from the URL
  461. if (!isset($message_media_type)) {
  462. $message_media_type = pathinfo($message_media_url, PATHINFO_EXTENSION);
  463. }
  464. //get the file name from the URL
  465. if (!isset($message_media_name)) {
  466. $message_media_name = pathinfo($message_media_url, PATHINFO_FILENAME).'.'.$message_media_type;
  467. }
  468. if ($debug) {
  469. file_put_contents($log_file, "media_row: ".print_r($media_row, true)."\n", FILE_APPEND);
  470. file_put_contents($log_file, "message_media_url: ".$message_media_url."\n", FILE_APPEND);
  471. file_put_contents($log_file, "message_media_name: ".$message_media_name."\n", FILE_APPEND);
  472. file_put_contents($log_file, "message_media_type: ".$message_media_type."\n", FILE_APPEND);
  473. }
  474. //build the array for the media
  475. if ($message_media_type !== 'xml' && strlen($message_media_url) > 0) {
  476. $array['message_media'][$index]['message_media_uuid'] = uuid();
  477. $array['message_media'][$index]['message_uuid'] = $message_uuid;
  478. $array['message_media'][$index]['domain_uuid'] = $domain_uuid;
  479. $array['message_media'][$index]['user_uuid'] = $user_uuid;
  480. $array['message_media'][$index]['message_media_type'] = $message_media_type;
  481. $array['message_media'][$index]['message_media_name'] = $message_media_name;
  482. $array['message_media'][$index]['message_media_date'] = 'now()';
  483. $array['message_media'][$index]['message_media_url'] = $message_media_url;
  484. $array['message_media'][$index]['message_media_content'] = base64_encode(url_get_contents($message_media_url));
  485. }
  486. }
  487. }
  488. else {
  489. //get the value out of the array using dot notation
  490. if (isset($setting['message_media_url'])) {
  491. $message_media_url = get_value($message, $setting['message_media_url']);
  492. }
  493. if (isset($setting['message_media_type'])) {
  494. $message_media_type = get_value($message, $setting['message_media_type']);
  495. }
  496. //get the media type from the URL
  497. if (!isset($message_media_type) && !empty($message_media_url)) {
  498. $message_media_type = pathinfo($message_media_url, PATHINFO_EXTENSION);
  499. }
  500. //get the file extension
  501. if (!empty($message_media_type)) {
  502. if ($message_media_type == 'image/jpeg') { $message_media_type = 'jpg'; }
  503. if ($message_media_type == 'image/png') { $message_media_type = 'png'; }
  504. if ($message_media_type == 'image/gif') { $message_media_type = 'gif'; }
  505. }
  506. //build the array for the media
  507. if (!empty($message_media_url) && strlen($message_media_url) > 0 && $message_media_type !== 'xml') {
  508. $index = 0;
  509. $array['message_media'][$index]['message_media_uuid'] = uuid();
  510. $array['message_media'][$index]['message_uuid'] = $message_uuid;
  511. $array['message_media'][$index]['domain_uuid'] = $domain_uuid;
  512. $array['message_media'][$index]['user_uuid'] = $user_uuid;
  513. $array['message_media'][$index]['message_media_type'] = $message_media_type;
  514. $array['message_media'][$index]['message_media_url'] = $message_media_url;
  515. $array['message_media'][$index]['message_media_content'] = base64_encode(url_get_contents($message_media_url));
  516. }
  517. }
  518. //if ($debug) {
  519. // file_put_contents($log_file, print_r($array, true), FILE_APPEND);
  520. //}
  521. //save message to the database;
  522. $database->app_name = 'messages';
  523. $database->app_uuid = '4a20815d-042c-47c8-85df-085333e79b87';
  524. $database->save($array, false);
  525. $result = $database->message;
  526. //if ($debug) {
  527. // file_put_contents($log_file, print_r($result, true), FILE_APPEND);
  528. //}
  529. //remove the temporary permission
  530. $p->delete("message_add", "temp");
  531. $p->delete("message_queue_add", "temp");
  532. $p->delete("message_media_add", "temp");
  533. //convert the array to json
  534. //$array_json = json_encode($array);
  535. //get the list of extensions using the user_uuid
  536. $sql = "select * from v_domains as d, v_extensions as e ";
  537. $sql .= "where extension_uuid in ( ";
  538. $sql .= " select extension_uuid ";
  539. $sql .= " from v_extension_users ";
  540. $sql .= " where user_uuid = :user_uuid ";
  541. $sql .= ") ";
  542. $sql .= "and e.domain_uuid = d.domain_uuid ";
  543. $sql .= "and e.enabled = 'true' ";
  544. $parameters['user_uuid'] = $user_uuid;
  545. $extensions = $database->select($sql, $parameters, 'all');
  546. unset($sql, $parameters);
  547. //send the sip message
  548. if (is_array($extensions) && @sizeof($extensions) != 0) {
  549. //create the event socket connection
  550. $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
  551. //loop through assigned extensions
  552. foreach ($extensions as $row) {
  553. //get variables from the array
  554. $domain_name = $row['domain_name'];
  555. $extension = $row['extension'];
  556. $number_alias = $row['number_alias'];
  557. //get the sip profile
  558. $command = "sofia_contact ".$extension."@".$domain_name;
  559. $response = event_socket_request($fp, "api ".$command);
  560. if ($response != 'error/user_not_registered') {
  561. $sip_profile = explode("/", $response)[1];
  562. }
  563. //send the sip messages
  564. //$command = "luarun app/messages/resources/send.lua ".$message["from"]."@".$domain_name." ".$extension."@".$domain_name." '".$message["text"]."'";
  565. //$message_from_orig = $message_from;
  566. //original number with the domain name
  567. $message_from = $message_from .'@'.$domain_name;
  568. //$message_to_orig = $message_to;
  569. //send to the assigned extension(s)
  570. $message_to = $extension . '@'.$domain_name;
  571. //$message_to = '[email protected]';
  572. //add debug info to the message
  573. //$message_content = $message_content . ' - ' .$message_to_orig;
  574. //send the SIP message (working)
  575. $event = "sendevent CUSTOM\n";
  576. $event .= "Event-Subclass: SMS::SEND_MESSAGE\n";
  577. $event .= "proto: sip\n";
  578. $event .= "dest_proto: sip\n";
  579. $event .= "from: ".$message_from."\n";
  580. $event .= "from_full: sip:".$message_from."\n";
  581. $event .= "to: ".$message_to."\n";
  582. $event .= "subject: sip:".$message_to."\n";
  583. //$event .= "type: text/html\n";
  584. $event .= "type: text/plain\n";
  585. $event .= "hint: the hint\n";
  586. $event .= "replying: true\n";
  587. $event .= "sip_profile: ".$sip_profile."\n";
  588. $event .= "_body: ". $message_content;
  589. event_socket_request($fp, $event);
  590. }
  591. }
  592. //set the file
  593. //$file = '/tmp/sms.txt';
  594. //save the file
  595. //file_put_contents($file, $json);
  596. //save the data to the file system
  597. //file_put_contents($file, $json."\n");
  598. //file_put_contents($file, $array_json."\nfrom: ".$message["from"]." to: ".$message["to"]." text: ".$message["text"]."\n$sql_test\njson: ".$json."\n".$saved_result."\n");
  599. //send response to provider, if defined
  600. foreach ($provider_settings as $row) {
  601. if ($row['provider_setting_subcategory'] == 'response' && $row['provider_setting_name'] == 'message_content' && !empty($row['provider_setting_value'])) {
  602. $message_content = $row['provider_setting_value'];
  603. if ($debug) {
  604. file_put_contents($log_file, "Response...\n".$row['provider_setting_value']."\n\n", FILE_APPEND);
  605. }
  606. echo $row['provider_setting_value'];
  607. break;
  608. }
  609. }
  610. ?>