Fork of FusionPBX but with LDAP kinda working
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

458 lines
18 KiB

2 years ago
  1. <?php
  2. /*
  3. FusionPBX
  4. Version: MPL 1.1
  5. The contents of this file are subject to the Mozilla Public License Version
  6. 1.1 (the "License"); you may not use this file except in compliance with
  7. the License. You may obtain a copy of the License at
  8. http://www.mozilla.org/MPL/
  9. Software distributed under the License is distributed on an "AS IS" basis,
  10. WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11. for the specific language governing rights and limitations under the
  12. License.
  13. The Original Code is FusionPBX
  14. The Initial Developer of the Original Code is
  15. Mark J Crane <markjcrane@fusionpbx.com>
  16. Portions created by the Initial Developer are Copyright (C) 2018 - 2022
  17. the Initial Developer. All Rights Reserved.
  18. */
  19. //includes
  20. require_once "root.php";
  21. require_once "resources/require.php";
  22. require_once "resources/check_auth.php";
  23. //check permissions
  24. if (permission_exists('access_control_add') || permission_exists('access_control_edit')) {
  25. //access granted
  26. }
  27. else {
  28. echo "access denied";
  29. exit;
  30. }
  31. //add multi-lingual support
  32. $language = new text;
  33. $text = $language->get();
  34. //action add or update
  35. if (is_uuid($_REQUEST["id"])) {
  36. $action = "update";
  37. $access_control_uuid = $_REQUEST["id"];
  38. $id = $_REQUEST["id"];
  39. }
  40. else {
  41. $action = "add";
  42. }
  43. //get http post variables and set them to php variables
  44. if (is_array($_POST) && @sizeof($_POST) != 0) {
  45. $access_control_name = $_POST["access_control_name"];
  46. $access_control_default = $_POST["access_control_default"];
  47. $access_control_nodes = $_POST["access_control_nodes"];
  48. $access_control_description = $_POST["access_control_description"];
  49. }
  50. //process the user data and save it to the database
  51. if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
  52. //enforce valid data
  53. if ($access_control_name == 'providers' || $access_control_name == 'domains') {
  54. $access_control_default = 'deny';
  55. }
  56. if ($access_control_default != 'allow' && $access_control_default != 'deny') {
  57. $access_control_default = 'deny';
  58. }
  59. //validate the token
  60. $token = new token;
  61. if (!$token->validate($_SERVER['PHP_SELF'])) {
  62. message::add($text['message-invalid_token'],'negative');
  63. header('Location: access_controls.php');
  64. exit;
  65. }
  66. //process the http post data by submitted action
  67. if ($_POST['action'] != '' && strlen($_POST['action']) > 0) {
  68. //prepare the array(s)
  69. $x = 0;
  70. foreach ($_POST['access_control_nodes'] as $row) {
  71. if (is_uuid($row['access_control_uuid']) && $row['checked'] === 'true') {
  72. $array['access_controls'][$x]['checked'] = $row['checked'];
  73. $array['access_controls'][$x]['access_control_nodes'][]['access_control_node_uuid'] = $row['access_control_node_uuid'];
  74. $x++;
  75. }
  76. }
  77. //send the array to the database class
  78. switch ($_POST['action']) {
  79. case 'copy':
  80. if (permission_exists('access_control_add')) {
  81. $obj = new database;
  82. $obj->copy($array);
  83. }
  84. break;
  85. case 'delete':
  86. if (permission_exists('access_control_delete')) {
  87. $obj = new database;
  88. $obj->delete($array);
  89. }
  90. break;
  91. case 'toggle':
  92. if (permission_exists('access_control_update')) {
  93. $obj = new database;
  94. $obj->toggle($array);
  95. }
  96. break;
  97. }
  98. //clear the cache, reloadacl and redirect the user
  99. if (in_array($_POST['action'], array('copy', 'delete', 'toggle'))) {
  100. //clear the cache
  101. $cache = new cache;
  102. $cache->delete("configuration:acl.conf");
  103. //create the event socket connection
  104. $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
  105. if ($fp) {
  106. event_socket_request($fp, "api reloadacl");
  107. }
  108. //redirect the user
  109. header('Location: access_control_edit.php?id='.$id);
  110. exit;
  111. }
  112. }
  113. //check for all required data
  114. $msg = '';
  115. if (strlen($access_control_name) == 0) { $msg .= $text['message-required']." ".$text['label-access_control_name']."<br>\n"; }
  116. if (strlen($access_control_default) == 0) { $msg .= $text['message-required']." ".$text['label-access_control_default']."<br>\n"; }
  117. //if (strlen($access_control_nodes) == 0) { $msg .= $text['message-required']." ".$text['label-access_control_nodes']."<br>\n"; }
  118. //if (strlen($access_control_description) == 0) { $msg .= $text['message-required']." ".$text['label-access_control_description']."<br>\n"; }
  119. if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) {
  120. require_once "resources/header.php";
  121. require_once "resources/persist_form_var.php";
  122. echo "<div align='center'>\n";
  123. echo "<table><tr><td>\n";
  124. echo $msg."<br />";
  125. echo "</td></tr></table>\n";
  126. persistformvar($_POST);
  127. echo "</div>\n";
  128. require_once "resources/footer.php";
  129. return;
  130. }
  131. //add the access_control_uuid
  132. if (!is_uuid($_POST["access_control_uuid"])) {
  133. $access_control_uuid = uuid();
  134. }
  135. //prepare the array
  136. $array['access_controls'][0]['access_control_uuid'] = $access_control_uuid;
  137. $array['access_controls'][0]['access_control_name'] = $access_control_name;
  138. $array['access_controls'][0]['access_control_default'] = $access_control_default;
  139. $array['access_controls'][0]['access_control_description'] = $access_control_description;
  140. $y = 0;
  141. if (is_array($access_control_nodes)) {
  142. foreach ($access_control_nodes as $row) {
  143. //validate the data
  144. if (!is_uuid($row["access_control_node_uuid"])) { continue; }
  145. if ($row["node_type"] != 'allow' && $row["node_type"] != 'deny') { continue; }
  146. if (isset($row["node_cidr"]) && $row["node_cidr"] != '') {
  147. $cidr_array = explode("/", str_replace("\\", "/", $row["node_cidr"]));
  148. if (filter_var($cidr_array[0], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
  149. if (isset($cidr_array[1]) && is_numeric($cidr_array[1])) {
  150. //valid IPv4 address and cidr notation
  151. $node_cidr = $row["node_cidr"];
  152. }
  153. else {
  154. //valid IPv4 address add the missing cidr notation
  155. $node_cidr = $row["node_cidr"].'/32';
  156. }
  157. }
  158. elseif(filter_var($cidr_array[0], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
  159. //valid IPv6 address
  160. $node_cidr = $row["node_cidr"];
  161. }
  162. //if the cidr is provided ignore the domain.
  163. $row["node_domain"] = '';
  164. }
  165. //build the sub array
  166. $array['access_controls'][0]['access_control_nodes'][$y]['access_control_node_uuid'] = $row["access_control_node_uuid"];
  167. $array['access_controls'][0]['access_control_nodes'][$y]['node_type'] = $row["node_type"];
  168. $array['access_controls'][0]['access_control_nodes'][$y]['node_cidr'] = $node_cidr;
  169. $array['access_controls'][0]['access_control_nodes'][$y]['node_domain'] = $row["node_domain"];
  170. $array['access_controls'][0]['access_control_nodes'][$y]['node_description'] = $row["node_description"];
  171. $y++;
  172. //unset values
  173. unset($cidr_array, $node_cidr);
  174. }
  175. }
  176. //save the data
  177. if (is_array($array)) {
  178. $database = new database;
  179. $database->app_name = 'access controls';
  180. $database->app_uuid = '1416a250-f6e1-4edc-91a6-5c9b883638fd';
  181. $database->save($array);
  182. }
  183. //clear the cache
  184. $cache = new cache;
  185. $cache->delete("configuration:acl.conf");
  186. //create the event socket connection
  187. $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
  188. if ($fp) {
  189. event_socket_request($fp, "api reloadacl");
  190. }
  191. //redirect the user
  192. if (isset($action)) {
  193. if ($action == "add") {
  194. $_SESSION["message"] = $text['message-add'];
  195. }
  196. if ($action == "update") {
  197. $_SESSION["message"] = $text['message-update'];
  198. }
  199. //header('Location: access_controls.php');
  200. header('Location: access_control_edit.php?id='.urlencode($access_control_uuid));
  201. return;
  202. }
  203. }
  204. //pre-populate the form
  205. if (is_array($_GET) && $_POST["persistformvar"] != "true") {
  206. $sql = "select * from v_access_controls ";
  207. $sql .= "where access_control_uuid = :access_control_uuid ";
  208. $parameters['access_control_uuid'] = $access_control_uuid;
  209. $database = new database;
  210. $row = $database->select($sql, $parameters, 'row');
  211. if (is_array($row) && @sizeof($row) != 0) {
  212. $access_control_name = $row["access_control_name"];
  213. $access_control_default = $row["access_control_default"];
  214. $access_control_description = $row["access_control_description"];
  215. }
  216. unset($sql, $parameters, $row);
  217. }
  218. //get the child data
  219. if (is_uuid($access_control_uuid)) {
  220. $sql = "select * from v_access_control_nodes ";
  221. $sql .= "where access_control_uuid = :access_control_uuid ";
  222. $sql .= "order by node_cidr asc";
  223. $parameters['access_control_uuid'] = $access_control_uuid;
  224. $database = new database;
  225. $access_control_nodes = $database->select($sql, $parameters, 'all');
  226. unset ($sql, $parameters);
  227. }
  228. //add the $access_control_node_uuid
  229. if (!is_uuid($access_control_node_uuid)) {
  230. $access_control_node_uuid = uuid();
  231. }
  232. //add an empty row
  233. if (is_array($access_control_nodes) && @sizeof($access_control_nodes) != 0) {
  234. $x = count($access_control_nodes);
  235. }
  236. else {
  237. $access_control_nodes = array();
  238. $x = 0;
  239. }
  240. $access_control_nodes[$x]['access_control_uuid'] = $access_control_uuid;
  241. $access_control_nodes[$x]['access_control_node_uuid'] = uuid();
  242. $access_control_nodes[$x]['node_type'] = '';
  243. $access_control_nodes[$x]['node_cidr'] = '';
  244. $access_control_nodes[$x]['node_domain'] = '';
  245. $access_control_nodes[$x]['node_description'] = '';
  246. //create token
  247. $object = new token;
  248. $token = $object->create($_SERVER['PHP_SELF']);
  249. //show the header
  250. $document['title'] = $text['title-access_control'];
  251. require_once "resources/header.php";
  252. //show the content
  253. echo "<form name='frm' id='frm' method='post'>\n";
  254. echo "<input class='formfld' type='hidden' name='access_control_uuid' value='".escape($access_control_uuid)."'>\n";
  255. echo "<div class='action_bar' id='action_bar'>\n";
  256. echo " <div class='heading'><b>".$text['title-access_control']."</b></div>\n";
  257. echo " <div class='actions'>\n";
  258. echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','collapse'=>'hide-xs','style'=>'margin-right: 15px;','link'=>'access_controls.php']);
  259. if ($action == 'update') {
  260. if (permission_exists('access_control_node_add')) {
  261. echo button::create(['type'=>'button','label'=>$text['button-copy'],'icon'=>$_SESSION['theme']['button_icon_copy'],'id'=>'btn_copy','name'=>'btn_copy','style'=>'display: none;','onclick'=>"modal_open('modal-copy','btn_copy');"]);
  262. }
  263. if (permission_exists('access_control_node_delete')) {
  264. echo button::create(['type'=>'button','label'=>$text['button-delete'],'icon'=>$_SESSION['theme']['button_icon_delete'],'id'=>'btn_delete','name'=>'btn_delete','style'=>'display: none; margin-right: 15px;','onclick'=>"modal_open('modal-delete','btn_delete');"]);
  265. }
  266. }
  267. echo button::create(['type'=>'submit','label'=>$text['button-save'],'icon'=>$_SESSION['theme']['button_icon_save'],'id'=>'btn_save','collapse'=>'hide-xs']);
  268. echo " </div>\n";
  269. echo " <div style='clear: both;'></div>\n";
  270. echo "</div>\n";
  271. echo $text['title_description-access_controls']."\n";
  272. echo "<br /><br />\n";
  273. if ($action == 'update') {
  274. if (permission_exists('access_control_add')) {
  275. echo modal::create(['id'=>'modal-copy','type'=>'copy','actions'=>button::create(['type'=>'submit','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_copy','style'=>'float: right; margin-left: 15px;','collapse'=>'never','name'=>'action','value'=>'copy','onclick'=>"modal_close();"])]);
  276. }
  277. if (permission_exists('access_control_delete')) {
  278. echo modal::create(['id'=>'modal-delete','type'=>'delete','actions'=>button::create(['type'=>'submit','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_delete','style'=>'float: right; margin-left: 15px;','collapse'=>'never','name'=>'action','value'=>'delete','onclick'=>"modal_close();"])]);
  279. }
  280. }
  281. if ($action == 'update') {
  282. if (permission_exists('access_control_add')) {
  283. echo modal::create(['id'=>'modal-copy','type'=>'copy','actions'=>button::create(['type'=>'submit','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_copy','style'=>'float: right; margin-left: 15px;','collapse'=>'never','name'=>'action','value'=>'copy','onclick'=>"modal_close();"])]);
  284. }
  285. if (permission_exists('access_control_delete')) {
  286. echo modal::create(['id'=>'modal-delete','type'=>'delete','actions'=>button::create(['type'=>'submit','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_delete','style'=>'float: right; margin-left: 15px;','collapse'=>'never','name'=>'action','value'=>'delete','onclick'=>"modal_close();"])]);
  287. }
  288. }
  289. echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
  290. echo "<tr>\n";
  291. echo "<td class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
  292. echo " ".$text['label-access_control_name']."\n";
  293. echo "</td>\n";
  294. echo "<td class='vtable' style='position: relative;' align='left'>\n";
  295. echo " <input class='formfld' type='text' name='access_control_name' maxlength='255' value='".escape($access_control_name)."'>\n";
  296. echo "<br />\n";
  297. echo $text['description-access_control_name']."\n";
  298. echo "</td>\n";
  299. echo "</tr>\n";
  300. echo "<tr>\n";
  301. echo "<td class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
  302. echo " ".$text['label-access_control_default']."\n";
  303. echo "</td>\n";
  304. echo "<td class='vtable' style='position: relative;' align='left'>\n";
  305. echo " <select class='formfld' name='access_control_default'>\n";
  306. echo " <option value=''></option>\n";
  307. if ($access_control_default == "allow") {
  308. echo " <option value='allow' selected='selected'>".$text['label-allow']."</option>\n";
  309. }
  310. else {
  311. echo " <option value='allow'>".$text['label-allow']."</option>\n";
  312. }
  313. if ($access_control_default == "deny") {
  314. echo " <option value='deny' selected='selected'>".$text['label-deny']."</option>\n";
  315. }
  316. else {
  317. echo " <option value='deny'>".$text['label-deny']."</option>\n";
  318. }
  319. echo " </select>\n";
  320. echo "<br />\n";
  321. echo $text['description-access_control_default']."\n";
  322. echo "</td>\n";
  323. echo "</tr>\n";
  324. echo "<tr>\n";
  325. echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
  326. echo " ".$text['label-access_control_nodes']."\n";
  327. echo "</td>\n";
  328. echo "<td class='vtable' style='position: relative;' align='left'>\n";
  329. echo " <table>\n";
  330. echo " <tr>\n";
  331. echo " <th class='vtablereq'>".$text['label-node_type']."</th>\n";
  332. echo " <td class='vtable'>".$text['label-node_cidr']."</td>\n";
  333. echo " <td class='vtable'>".$text['label-node_domain']."</td>\n";
  334. echo " <td class='vtable'>".$text['label-node_description']."</td>\n";
  335. if (is_array($access_control_nodes) && @sizeof($access_control_nodes) > 1 && permission_exists('access_control_node_delete')) {
  336. echo " <td class='vtable edit_delete_checkbox_all' onmouseover=\"swap_display('delete_label_details', 'delete_toggle_details');\" onmouseout=\"swap_display('delete_label_details', 'delete_toggle_details');\">\n";
  337. echo " <span id='delete_label_details'>".$text['label-action']."</span>\n";
  338. echo " <span id='delete_toggle_details'><input type='checkbox' id='checkbox_all_details' name='checkbox_all' onclick=\"edit_all_toggle('details'); checkbox_on_change(this);\"></span>\n";
  339. echo " </td>\n";
  340. }
  341. echo " </tr>\n";
  342. $x = 0;
  343. foreach($access_control_nodes as $row) {
  344. echo " <tr>\n";
  345. echo " <input type='hidden' name='access_control_nodes[$x][access_control_uuid]' value=\"".escape($row["access_control_uuid"])."\">\n";
  346. echo " <input type='hidden' name='access_control_nodes[$x][access_control_node_uuid]' value=\"".escape($row["access_control_node_uuid"])."\">\n";
  347. echo " <td class='formfld'>\n";
  348. echo " <select class='formfld' name='access_control_nodes[$x][node_type]'>\n";
  349. echo " <option value=''></option>\n";
  350. if ($row['node_type'] == "allow") {
  351. echo " <option value='allow' selected='selected'>".$text['label-allow']."</option>\n";
  352. }
  353. else {
  354. echo " <option value='allow'>".$text['label-allow']."</option>\n";
  355. }
  356. if ($row['node_type'] == "deny") {
  357. echo " <option value='deny' selected='selected'>".$text['label-deny']."</option>\n";
  358. }
  359. else {
  360. echo " <option value='deny'>".$text['label-deny']."</option>\n";
  361. }
  362. echo " </select>\n";
  363. echo " </td>\n";
  364. echo " <td class='formfld'>\n";
  365. echo " <input class='formfld' type='text' name='access_control_nodes[$x][node_cidr]' maxlength='255' value=\"".escape($row["node_cidr"])."\">\n";
  366. echo " </td>\n";
  367. echo " <td class='formfld'>\n";
  368. echo " <input class='formfld' type='text' name='access_control_nodes[$x][node_domain]' maxlength='255' value=\"".escape($row["node_domain"])."\">\n";
  369. echo " </td>\n";
  370. echo " <td class='formfld'>\n";
  371. echo " <input class='formfld' type='text' name='access_control_nodes[$x][node_description]' maxlength='255' value=\"".escape($row["node_description"])."\">\n";
  372. echo " </td>\n";
  373. if (is_array($access_control_nodes) && @sizeof($access_control_nodes) > 1 && permission_exists('access_control_node_delete')) {
  374. if (is_uuid($row['access_control_node_uuid'])) {
  375. echo " <td class='vtable' style='text-align: center; padding-bottom: 3px;'>\n";
  376. echo " <input type='checkbox' name='access_control_nodes[".$x."][checked]' value='true' class='chk_delete checkbox_details' onclick=\"checkbox_on_change(this);\">\n";
  377. echo " </td>\n";
  378. }
  379. else {
  380. echo " <td></td>\n";
  381. }
  382. }
  383. echo " </tr>\n";
  384. $x++;
  385. }
  386. echo " </table>\n";
  387. echo "<br />\n";
  388. echo $text['description-node_description']."\n";
  389. echo "</td>\n";
  390. echo "</tr>\n";
  391. echo "<tr>\n";
  392. echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
  393. echo " ".$text['label-access_control_description']."\n";
  394. echo "</td>\n";
  395. echo "<td class='vtable' style='position: relative;' align='left'>\n";
  396. echo " <input class='formfld' type='text' name='access_control_description' maxlength='255' value='".escape($access_control_description)."'>\n";
  397. echo "<br />\n";
  398. echo $text['description-access_control_description']."\n";
  399. echo "</td>\n";
  400. echo "</tr>\n";
  401. echo "</table>";
  402. echo "<br /><br />";
  403. echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
  404. echo "</form>";
  405. //include the footer
  406. require_once "resources/footer.php";
  407. ?>