group_permissions.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  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 <[email protected]>
  16. Portions created by the Initial Developer are Copyright (C) 2018-2024
  17. the Initial Developer. All Rights Reserved.
  18. Contributor(s):
  19. Mark J Crane <[email protected]>
  20. */
  21. //includes files
  22. require_once dirname(__DIR__, 2) . "/resources/require.php";
  23. require_once "resources/check_auth.php";
  24. //check permissions
  25. if (permission_exists('group_permission_view')) {
  26. //access granted
  27. }
  28. else {
  29. echo "access denied";
  30. exit;
  31. }
  32. //get the group_uuid
  33. if (!empty($_REQUEST["group_uuid"])) {
  34. $group_uuid = $_GET['group_uuid'];
  35. }
  36. //connect to the database
  37. $database = new database;
  38. //get the group_name
  39. if (isset($group_uuid) && is_uuid($group_uuid)) {
  40. $sql = "select group_name from v_groups ";
  41. $sql .= "where group_uuid = :group_uuid ";
  42. $parameters['group_uuid'] = $group_uuid;
  43. $group_name = $database->select($sql, $parameters, 'column');
  44. unset($sql, $parameters);
  45. }
  46. //add multi-lingual support
  47. $language = new text;
  48. $text = $language->get();
  49. //get the http post data
  50. $view = $_REQUEST['view'] ?? '';
  51. // $action = $_POST['action'] ?? '';
  52. $search = $_REQUEST['search'] ?? '';
  53. $group_permissions = $_POST['group_permissions'] ?? '';
  54. //process permission reload
  55. if (!empty($_GET['action']) && $_GET['action'] == 'reload' && !empty($group_uuid)) {
  56. if (is_array($_SESSION["groups"]) && @sizeof($_SESSION["groups"]) != 0) {
  57. //clear current permissions
  58. unset($_SESSION['permissions'], $_SESSION['user']['permissions']);
  59. //get the permissions assigned to the groups that the current user is a member of, set the permissions in session variables
  60. $x = 0;
  61. $sql = "select distinct(permission_name) from v_group_permissions ";
  62. $sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) ";
  63. $sql .= "and permission_assigned = 'true' ";
  64. foreach ($_SESSION["groups"] as $field) {
  65. if (!empty($field['group_name'])) {
  66. $sql_where_or[] = "group_name = :group_name_".$x;
  67. $parameters['group_name_'.$x] = $field['group_name'];
  68. $x++;
  69. }
  70. }
  71. if (is_array($sql_where_or) && @sizeof($sql_where_or) != 0) {
  72. $sql .= "and (".implode(' or ', $sql_where_or).") ";
  73. }
  74. $parameters['domain_uuid'] = $_SESSION["domain_uuid"];
  75. $result = $database->select($sql, $parameters, 'all');
  76. if (is_array($result) && @sizeof($result) != 0) {
  77. foreach ($result as $row) {
  78. $_SESSION['permissions'][$row["permission_name"]] = true;
  79. $_SESSION["user"]["permissions"][$row["permission_name"]] = true;
  80. }
  81. }
  82. unset($sql, $parameters, $result, $row);
  83. //set message and redirect
  84. message::add($text['message-permissions_reloaded'],'positive');
  85. header('Location: group_permissions.php?group_uuid='.urlencode($_GET['group_uuid']).($view ? '&view='.urlencode($view) : null).($search ? '&search='.urlencode($search) : null));
  86. exit;
  87. }
  88. }
  89. //get the list
  90. $sql = "select ";
  91. $sql .= " distinct p.permission_name, \n";
  92. $sql .= " p.application_name, \n";
  93. $sql .= " g.permission_protected, \n";
  94. $sql .= " g.group_permission_uuid, \n";
  95. $sql .= " g.permission_assigned \n";
  96. $sql .= "from v_permissions as p \n";
  97. $sql .= "left join \n";
  98. $sql .= " v_group_permissions as g \n";
  99. $sql .= " on p.permission_name = g.permission_name \n";
  100. $sql .= " and group_name = :group_name \n";
  101. $sql .= " and g.group_uuid = :group_uuid \n";
  102. $sql .= "where true \n";
  103. if (!empty($search)) {
  104. $sql .= "and (";
  105. $sql .= " lower(p.permission_name) like :search \n";
  106. $sql .= ") ";
  107. $parameters['search'] = '%'.$search.'%';
  108. }
  109. $sql .= " order by p.application_name, p.permission_name asc ";
  110. $parameters['group_name'] = $group_name;
  111. $parameters['group_uuid'] = $group_uuid;
  112. $group_permissions = $database->select($sql, $parameters, 'all');
  113. //process the user data and save it to the database
  114. if (!empty($_POST) > 0 && empty($_POST["persistformvar"])) {
  115. $x = 0;
  116. if (is_array($_POST['group_permissions'])) {
  117. foreach($_POST['group_permissions'] as $row) {
  118. //reset values
  119. $action = "";
  120. $save_permission = false;
  121. $delete_permission = false;
  122. $save_protected = false;
  123. $delete_protected = false;
  124. $persist = false;
  125. //set row defaults
  126. $row['checked'] = $row['checked'] ?? '';
  127. $row['permission_assigned'] = $row['permission_assigned'] ?? '';
  128. $row['permission_protected'] = $row['permission_protected'] ?? '';
  129. //get the action save or delete
  130. foreach($group_permissions as $field) {
  131. if ($field['permission_name'] === $row['permission_name']) {
  132. $row['checked'] = $row['checked'] ?? '';
  133. $row['permission_assigned'] = $row['permission_assigned'] ?? '';
  134. if ($field['permission_assigned'] == 'true') {
  135. if ($row['checked'] == "true") {
  136. $persist = true;
  137. }
  138. else {
  139. $delete_permission = true;
  140. }
  141. }
  142. else {
  143. if ($row['checked'] == "true") {
  144. $save_permission = true;
  145. }
  146. else {
  147. //do nothing
  148. }
  149. }
  150. if ($field['permission_protected'] == 'true') {
  151. if ($row['permission_protected'] == "true") {
  152. $persist = true;
  153. }
  154. else {
  155. $delete_protected = true;
  156. }
  157. }
  158. else {
  159. if ($row['permission_protected'] == "true") {
  160. $save_protected = true;
  161. }
  162. else {
  163. //do nothing
  164. }
  165. }
  166. if ($save_permission || $save_protected) {
  167. $action = "save";
  168. }
  169. elseif ($delete_permission || $delete_protected){
  170. if ($persist) {
  171. $action = "save";
  172. }
  173. else {
  174. $action = "delete";
  175. }
  176. }
  177. else {
  178. $action = "";
  179. }
  180. $group_permission_uuid = $field['group_permission_uuid'];
  181. break;
  182. }
  183. }
  184. //build the array;
  185. if ($action == "save") {
  186. if (empty($group_permission_uuid)) {
  187. $group_permission_uuid = uuid();
  188. }
  189. if (isset($row['permission_name']) && !empty($row['permission_name'])) {
  190. $array['save']['group_permissions'][$x]['group_permission_uuid'] = $group_permission_uuid;
  191. $array['save']['group_permissions'][$x]['permission_name'] = $row['permission_name'];
  192. $array['save']['group_permissions'][$x]['permission_protected'] = $row['permission_protected'] == 'true' ? "true" : 'false';
  193. $array['save']['group_permissions'][$x]['permission_assigned'] = $row['checked'] != "true" ? "false" : "true";
  194. $array['save']['group_permissions'][$x]['group_uuid'] = $group_uuid;
  195. $array['save']['group_permissions'][$x]['group_name'] = $group_name;
  196. $x++;
  197. }
  198. }
  199. if ($action == "delete") {
  200. if (isset($row['permission_name']) && !empty($row['permission_name'])) {
  201. $array['delete']['group_permissions'][$x]['permission_name'] = $row['permission_name'];
  202. $array['delete']['group_permissions'][$x]['group_uuid'] = $group_uuid;
  203. $array['delete']['group_permissions'][$x]['group_name'] = $group_name;
  204. }
  205. $x++;
  206. }
  207. }
  208. }
  209. //validate the token
  210. $token = new token;
  211. if (!$token->validate($_SERVER['PHP_SELF'])) {
  212. message::add($text['message-invalid_token'],'negative');
  213. header('Location: group_permissions.php?group_uuid='.urlencode($group_uuid).($view ? '&view='.urlencode($view) : null).($search ? '&search='.urlencode($search) : null));
  214. exit;
  215. }
  216. //save the save array
  217. if (!empty($array['save']) && is_array($array['save']) && @sizeof($array['save']) != 0) {
  218. $database->app_name = 'groups';
  219. $database->app_uuid = '2caf27b0-540a-43d5-bb9b-c9871a1e4f84';
  220. $database->save($array['save']);
  221. $message = $database->message;
  222. }
  223. //delete the delete array
  224. if (!empty($array['delete']) && is_array($array['delete']) && @sizeof($array['delete']) != 0) {
  225. if (permission_exists('group_permission_delete')) {
  226. $database->app_name = 'groups';
  227. $database->app_uuid = '2caf27b0-540a-43d5-bb9b-c9871a1e4f84';
  228. $database->delete($array['delete']);
  229. }
  230. }
  231. //set the message
  232. message::add($text['message-update']);
  233. //redirect
  234. header('Location: group_permissions.php?group_uuid='.urlencode($group_uuid).($view ? '&view='.urlencode($view) : null).($search ? '&search='.urlencode($search) : null));
  235. exit;
  236. }
  237. //create token
  238. $object = new token;
  239. $token = $object->create($_SERVER['PHP_SELF']);
  240. //include the header
  241. $document['title'] = $text['title-group_permissions'];
  242. require_once "resources/header.php";
  243. //show the content
  244. echo "<div class='action_bar' id='action_bar'>\n";
  245. echo " <div class='heading'><b>".$text['title-group_permissions']."</b><div class='count'>".escape($group_name)."</div></div>\n";
  246. echo " <div class='actions'>\n";
  247. echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','style'=>'margin-right: 15px;','collapse'=>'hide-md-dn','link'=>'groups.php']);
  248. echo button::create(['type'=>'button','label'=>$text['button-reload'],'icon'=>$_SESSION['theme']['button_icon_reload'],'collapse'=>'hide-md-dn','link'=>'?group_uuid='.urlencode($group_uuid).'&action=reload'.($view ? '&view='.urlencode($view) : null).($search ? '&search='.urlencode($search) : null)]);
  249. if (permission_exists('group_member_view')) {
  250. echo button::create(['type'=>'button','label'=>$text['button-members'],'icon'=>'users','collapse'=>'hide-md-dn','link'=>'group_members.php?group_uuid='.urlencode($group_uuid)]);
  251. }
  252. echo "<form id='form_search' class='inline' method='get'>\n";
  253. echo "<input type='hidden' name='group_uuid' value='".escape($group_uuid)."'>\n";
  254. echo "<select class='txt' style='margin-left: 15px; margin-right: 0;' id='view' name='view' onchange=\"document.getElementById('form_search').submit();\">\n";
  255. echo " <option value=''>".$text['label-all']."</option>\n";
  256. echo " <option value='assigned' ".($view == 'assigned' ? "selected='selected'" : null).">".$text['label-assigned']."</option>\n";
  257. echo " <option value='unassigned' ".($view == 'unassigned' ? "selected='selected'" : null).">".$text['label-unassigned']."</option>\n";
  258. echo " <option value='protected' ".($view == 'protected' ? "selected='selected'" : null).">".$text['label-group_protected']."</option>\n";
  259. echo "</select>\n";
  260. echo "<input type='text' class='txt list-search' style='margin-left: 0;' name='search' id='search' value=\"".escape($search)."\" placeholder=\"".$text['label-search']."\" onkeydown='list_search_reset();'>";
  261. echo button::create(['label'=>$text['button-search'],'icon'=>$_SESSION['theme']['button_icon_search'],'type'=>'submit','id'=>'btn_search','collapse'=>'hide-md-dn','style'=>($search != '' ? 'display: none;' : null)]);
  262. echo button::create(['label'=>$text['button-reset'],'icon'=>$_SESSION['theme']['button_icon_reset'],'type'=>'button','id'=>'btn_reset','collapse'=>'hide-md-dn','link'=>'group_permissions.php?group_uuid='.urlencode($group_uuid),'style'=>($search == '' ? 'display: none;' : null)]);
  263. if (permission_exists('group_permission_edit')) {
  264. echo button::create(['type'=>'button','label'=>$text['button-save'],'icon'=>$_SESSION['theme']['button_icon_save'],'id'=>'btn_save','collapse'=>'hide-md-dn','style'=>'margin-left: 15px;','onclick'=>"document.getElementById('form_list').submit();"]);
  265. }
  266. echo " </form>\n";
  267. echo " </div>\n";
  268. echo " <div style='clear: both;'></div>\n";
  269. echo "</div>\n";
  270. echo $text['description-group_permissions']."\n";
  271. echo "<br /><br />\n";
  272. echo "<form id='form_list' method='post'>\n";
  273. echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
  274. echo "<input type='hidden' name='group_uuid' value='".escape($group_uuid)."'>\n";
  275. echo "<input type='hidden' name='view' value=\"".escape($view)."\">\n";
  276. echo "<input type='hidden' name='search' value=\"".escape($search)."\">\n";
  277. echo "<div class='card'>\n";
  278. echo "<table class='list'>\n";
  279. if (is_array($group_permissions) && @sizeof($group_permissions) != 0) {
  280. $x = 0;
  281. foreach ($group_permissions as $row) {
  282. $previous_application_name = $previous_application_name ?? '';
  283. $checked = ($row['permission_assigned'] === 'true') ? " checked=\"checked\"" : $checked = '';
  284. $protected = ($row['permission_protected'] === 'true') ? " checked=\"checked\"" : '';
  285. $application_name = strtolower(str_replace([' ','-'], '_', $row['application_name']));
  286. $application_name_label = ucwords(str_replace(['_','-'], " ", $row['application_name']));
  287. //application heading
  288. if ($previous_application_name !== $row['application_name']) {
  289. if ($previous_application_name != '') {
  290. echo " <tr class='heading_".$application_name."'>";
  291. echo " <td align='left' colspan='999' style='cursor: default !important;'>&nbsp;</td>\n";
  292. echo " </tr>";
  293. }
  294. echo " <tr class='heading_".$application_name."'>";
  295. echo " <td align='left' colspan='999' style='cursor: default !important;' nowrap='nowrap'><b>".escape($application_name_label)."</b></td>\n";
  296. echo " </tr>";
  297. echo " <tr class='list-header heading_".$application_name."'>\n";
  298. if (permission_exists('group_permission_add') || permission_exists('group_permission_edit') || permission_exists('group_permission_delete')) {
  299. echo " <th class='checkbox'>\n";
  300. echo " <input type='checkbox' id='checkbox_all_".$application_name."' name='checkbox_all' onclick=\"list_all_toggle('".$application_name."');\">\n";
  301. echo " </th>\n";
  302. }
  303. echo " <th>".$text['label-group_name']."</th>\n";
  304. if (permission_exists('group_permission_add') || permission_exists('group_permission_edit') || permission_exists('group_permission_delete')) {
  305. echo " <th class='checkbox' onmouseover=\"document.getElementById('checkbox_all_label_".$application_name."').style.display='none'; document.getElementById('checkbox_all_".$application_name."_protected').style.display='';\" onmouseout=\"document.getElementById('checkbox_all_label_".$application_name."').style.display=''; document.getElementById('checkbox_all_".$application_name."_protected').style.display='none';\">\n";
  306. echo " <span id='checkbox_all_label_".$application_name."'>".$text['label-group_protected']."</span>\n";
  307. echo " <input type='checkbox' id='checkbox_all_".$application_name."_protected' name='checkbox_protected_all' style='display: none;' onclick=\"list_all_toggle('".$application_name."_protected');\">\n";
  308. echo " </th>\n";
  309. }
  310. echo " </tr>\n";
  311. $displayed_permissions[$application_name] = 0;
  312. }
  313. //application permission
  314. if (!$view || ($view == 'assigned' && $checked) || ($view == 'unassigned' && !$checked) || ($view == 'protected' && $protected)) {
  315. echo "<tr class='list-row'>\n";
  316. if (permission_exists('group_permission_add') || permission_exists('group_permission_edit') || permission_exists('group_permission_delete')) {
  317. echo " <td class='checkbox'>\n";
  318. echo " <input type='checkbox' name='group_permissions[$x][checked]' id='checkbox_".$x."' class='checkbox_".$application_name."' value='true' ".$checked." onclick=\"if (!this.checked) { document.getElementById('checkbox_all_".$application_name."').checked = false; }\">\n";
  319. //echo " <input type='hidden' name='group_permissions[$x][permission_uuid]' value='".escape($row['permission_uuid'])."' />\n";
  320. echo " <input type='hidden' name='group_permissions[$x][permission_name]' value='".escape($row['permission_name'])."' />\n";
  321. echo " </td>\n";
  322. }
  323. echo " <td class='no-wrap' onclick=\"if (document.getElementById('checkbox_".$x."').checked) { document.getElementById('checkbox_".$x."').checked = false; document.getElementById('checkbox_all_".$application_name."').checked = false; } else { document.getElementById('checkbox_".$x."').checked = true; }\">";
  324. echo " ".escape($row['permission_name']);
  325. echo " </td>\n";
  326. if (permission_exists('group_permission_add') || permission_exists('group_permission_edit') || permission_exists('group_permission_delete')) {
  327. echo " <td class='checkbox'>\n";
  328. echo " <input type='checkbox' name='group_permissions[$x][permission_protected]' id='checkbox_protected_".$x."' class='checkbox_".$application_name."_protected' value='true' ".$protected." onclick=\"if (!this.checked) { document.getElementById('checkbox_all_".$application_name."_protected').checked = false; }\">\n";
  329. echo " </td>\n";
  330. }
  331. echo "</tr>\n";
  332. $displayed_permissions[$application_name]++;
  333. }
  334. //set the previous application name
  335. $previous_application_name = $row['application_name'];
  336. $x++;
  337. }
  338. unset($group_permissions);
  339. //hide application heading if no permissions displayed
  340. if (is_array($displayed_permissions) && @sizeof($displayed_permissions) != 0) {
  341. echo "<script>\n";
  342. foreach ($displayed_permissions as $application_name => $permission_count) {
  343. if (!$permission_count) {
  344. echo "$('.heading_".$application_name."').hide();\n";
  345. }
  346. }
  347. echo "</script>\n";
  348. }
  349. }
  350. echo "</table>\n";
  351. echo "</div>\n";
  352. echo "</form>\n";
  353. //include the footer
  354. require_once "resources/footer.php";
  355. ?>