From da7f8d0189a61fd45a7489a51cf0c83e5145f1fb Mon Sep 17 00:00:00 2001 From: Nate Date: Tue, 3 Dec 2019 16:55:15 -0700 Subject: [PATCH] SIP Profiles: List view updates. --- .../resources/classes/sip_profiles.php | 288 ++++++++++++++++++ app/sip_profiles/sip_profile_delete.php | 8 +- app/sip_profiles/sip_profile_edit.php | 11 +- app/sip_profiles/sip_profiles.php | 204 ++++++++----- 4 files changed, 421 insertions(+), 90 deletions(-) create mode 100644 app/sip_profiles/resources/classes/sip_profiles.php diff --git a/app/sip_profiles/resources/classes/sip_profiles.php b/app/sip_profiles/resources/classes/sip_profiles.php new file mode 100644 index 0000000000..b24f876205 --- /dev/null +++ b/app/sip_profiles/resources/classes/sip_profiles.php @@ -0,0 +1,288 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2019 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//define the sip profiles class +if (!class_exists('sip_profiles')) { + class sip_profiles { + + /** + * declare private variables + */ + private $app_name; + private $app_uuid; + private $permission_prefix; + private $list_page; + private $table; + private $uuid_prefix; + private $toggle_field; + private $toggle_values; + + /** + * called when the object is created + */ + public function __construct() { + + //assign private variables + $this->app_name = 'sip_profiles'; + $this->app_uuid = 'a6a7c4c5-340a-43ce-bcbc-2ed9bab8659d'; + $this->permission_prefix = 'sip_profile_'; + $this->list_page = 'sip_profiles.php'; + $this->table = 'sip_profiles'; + $this->uuid_prefix = 'sip_profile_'; + $this->toggle_field = 'sip_profile_enabled'; + $this->toggle_values = ['true','false']; + + } + + /** + * called when there are no references to a particular object + * unset the variables used in the class + */ + public function __destruct() { + foreach ($this as $key => $value) { + unset($this->$key); + } + } + + /** + * delete records + */ + public function delete($records) { + if (permission_exists($this->permission_prefix.'delete')) { + + //add multi-lingual support + $language = new text; + $text = $language->get(); + + //validate the token + $token = new token; + if (!$token->validate($_SERVER['PHP_SELF'])) { + message::add($text['message-invalid_token'],'negative'); + header('Location: '.$this->list_page); + exit; + } + + //delete multiple records + if (is_array($records) && @sizeof($records) != 0) { + + //filter out unchecked sip profiles, build where clause for below + foreach ($records as $x => $record) { + if ($record['checked'] == 'true' && is_uuid($record['uuid'])) { + $uuids[] = "'".$record['uuid']."'"; + } + } + + //get necessary sip profile details + $sql = "select ".$this->uuid_prefix."uuid as uuid, sip_profile_name, sip_profile_hostname from v_".$this->table." "; + $sql .= "where ".$this->uuid_prefix."uuid in (".implode(', ', $uuids).") "; + $database = new database; + $rows = $database->select($sql, $parameters, 'all'); + if (is_array($rows) && @sizeof($rows) != 0) { + foreach ($rows as $row) { + $sip_profiles[$row['uuid']]['name'] = $row['sip_profile_name']; + $sip_profiles[$row['uuid']]['hostname'] = $row['sip_profile_hostname']; + } + } + unset($sql, $parameters, $rows, $row); + + //build the delete array + $x = 0; + foreach ($sip_profiles as $sip_profile_uuid => $sip_profile) { + $array[$this->table][$x][$this->uuid_prefix.'uuid'] = $sip_profile_uuid; + $array['sip_profile_domains'][$x][$this->uuid_prefix.'uuid'] = $sip_profile_uuid; + $array['sip_profile_settings'][$x][$this->uuid_prefix.'uuid'] = $sip_profile_uuid; + $x++; + } + + //delete the checked rows + if (is_array($array) && @sizeof($array) != 0) { + + //grant temporary permissions + $p = new permissions; + $p->add('sip_profile_domain_delete', 'temp'); + $p->add('sip_profile_setting_delete', 'temp'); + + //execute delete + $database = new database; + $database->app_name = $this->app_name; + $database->app_uuid = $this->app_uuid; + $database->delete($array); + unset($array); + + //revoke temporary permissions + $p->delete('sip_profile_domain_delete', 'temp'); + $p->delete('sip_profile_setting_delete', 'temp'); + + //delete the xml sip profile and directory + foreach ($sip_profiles as $sip_profile_uuid => $sip_profile) { + @unlink($_SESSION['switch']['conf']['dir']."/sip_profiles/".$sip_profile['name'].".xml"); + @unlink($_SESSION['switch']['conf']['dir']."/sip_profiles/".$sip_profile['name']); + } + + //save the sip profile xml + save_sip_profile_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + + //determine hostnames, get system hostname if necessary + $empty_hostname = false; + foreach ($sip_profiles as $sip_profile_uuid => $sip_profile) { + if ($sip_profile['hostname'] != '') { + $hostnames[] = $sip_profile['hostname']; + } + else { + $empty_hostname = true; + } + } + if ($empty_hostname) { + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + if ($fp) { + $hostnames[] = event_socket_request($fp, 'api switchname'); + } + } + + //clear the cache + if (is_array($hostnames) && @sizeof($hostnames) != 0) { + $hostnames = array_unique($hostnames); + $cache = new cache; + foreach ($hostnames as $hostname) { + $cache->delete("configuration:sofia.conf:".$hostname); + } + } + + //set message + message::add($text['message-delete']); + } + unset($records, $sip_profiles); + } + } + } + + /** + * toggle records + */ + public function toggle($records) { + if (permission_exists($this->permission_prefix.'edit')) { + + //add multi-lingual support + $language = new text; + $text = $language->get(); + + //validate the token + $token = new token; + if (!$token->validate($_SERVER['PHP_SELF'])) { + message::add($text['message-invalid_token'],'negative'); + header('Location: '.$this->list_page); + exit; + } + + //toggle the checked records + if (is_array($records) && @sizeof($records) != 0) { + + //get current toggle state + foreach ($records as $x => $record) { + if ($record['checked'] == 'true' && is_uuid($record['uuid'])) { + $uuids[] = "'".$record['uuid']."'"; + } + } + if (is_array($uuids) && @sizeof($uuids) != 0) { + $sql = "select ".$this->uuid_prefix."uuid as uuid, ".$this->toggle_field." as toggle, sip_profile_hostname from v_".$this->table." "; + $sql .= "where ".$this->uuid_prefix."uuid in (".implode(', ', $uuids).") "; + $database = new database; + $rows = $database->select($sql, $parameters, 'all'); + if (is_array($rows) && @sizeof($rows) != 0) { + foreach ($rows as $row) { + $sip_profiles[$row['uuid']]['state'] = $row['toggle']; + $sip_profiles[$row['uuid']]['hostname'] = $row['sip_profile_hostname']; + } + } + unset($sql, $parameters, $rows, $row); + } + + //build update array + $x = 0; + foreach ($sip_profiles as $uuid => $sip_profile) { + $array[$this->table][$x][$this->uuid_prefix.'uuid'] = $uuid; + $array[$this->table][$x][$this->toggle_field] = $sip_profile['state'] == $this->toggle_values[0] ? $this->toggle_values[1] : $this->toggle_values[0]; + $x++; + } + + //save the changes + if (is_array($array) && @sizeof($array) != 0) { + + //save the array + $database = new database; + $database->app_name = $this->app_name; + $database->app_uuid = $this->app_uuid; + $database->save($array); + unset($array); + + //determine hostnames, get system hostname if necessary + $empty_hostname = false; + foreach ($sip_profiles as $sip_profile_uuid => $sip_profile) { + if ($sip_profile['hostname'] != '') { + $hostnames[] = $sip_profile['hostname']; + } + else { + $empty_hostname = true; + } + } + if ($empty_hostname) { + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + if ($fp) { + $hostnames[] = event_socket_request($fp, 'api switchname'); + } + } + + //clear the cache + if (is_array($hostnames) && @sizeof($hostnames) != 0) { + $hostnames = array_unique($hostnames); + $cache = new cache; + foreach ($hostnames as $hostname) { + $cache->delete("configuration:sofia.conf:".$hostname); + } + } + + //save the sip profile xml + save_sip_profile_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + + //set message + message::add($text['message-toggle']); + } + unset($records, $states); + } + + } + } + + } +} + +?> \ No newline at end of file diff --git a/app/sip_profiles/sip_profile_delete.php b/app/sip_profiles/sip_profile_delete.php index 60da4e0148..7787723ae3 100644 --- a/app/sip_profiles/sip_profile_delete.php +++ b/app/sip_profiles/sip_profile_delete.php @@ -88,17 +88,17 @@ $_SESSION["reload_xml"] = true; //get the hostname - if ($sip_profile_name == nul) { + if ($sip_profile_hostname == '') { $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); if ($fp) { - $switch_cmd = "hostname"; - $sip_profile_name = event_socket_request($fp, 'api '.$switch_cmd); + $switch_cmd = "switchname"; + $sip_profile_hostname = event_socket_request($fp, 'api '.$switch_cmd); } } //clear the cache $cache = new cache; - $cache->delete("configuration:sofia.conf:".$sip_profile_name); + $cache->delete("configuration:sofia.conf:".$sip_profile_hostname); //set message message::add($text['message-delete']); diff --git a/app/sip_profiles/sip_profile_edit.php b/app/sip_profiles/sip_profile_edit.php index ecc5f8edea..39e4d8042b 100644 --- a/app/sip_profiles/sip_profile_edit.php +++ b/app/sip_profiles/sip_profile_edit.php @@ -161,11 +161,12 @@ $database->save($array); $message = $database->message; - //get the hostname - $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); - if ($fp) { - $switch_cmd = "switchname"; - $sip_profile_hostname = event_socket_request($fp, 'api '.$switch_cmd); + //get the hostname + if ($sip_profile_hostname == '') { + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + if ($fp) { + $sip_profile_hostname = event_socket_request($fp, 'api switchname'); + } } //revoke temporary permissions diff --git a/app/sip_profiles/sip_profiles.php b/app/sip_profiles/sip_profiles.php index 5a1e0c318b..89a35de1c0 100644 --- a/app/sip_profiles/sip_profiles.php +++ b/app/sip_profiles/sip_profiles.php @@ -27,9 +27,10 @@ //includes require_once "root.php"; require_once "resources/require.php"; + require_once "resources/check_auth.php"; + require_once "resources/paging.php"; //check permissions - require_once "resources/check_auth.php"; if (permission_exists('sip_profile_view')) { //access granted } @@ -42,132 +43,173 @@ $language = new text; $text = $language->get(); -//get variables used to control the order +//get the http post data + if (is_array($_POST['sip_profiles'])) { + $action = $_POST['action']; + $search = $_POST['search']; + $sip_profiles = $_POST['sip_profiles']; + } +//process the http post data by action + if ($action != '' && is_array($sip_profiles) && @sizeof($sip_profiles) != 0) { + switch ($action) { + case 'toggle': + if (permission_exists('sip_profile_edit')) { + $obj = new sip_profiles; + $obj->toggle($sip_profiles); + } + break; + case 'delete': + if (permission_exists('sip_profile_delete')) { + $obj = new sip_profiles; + $obj->delete($sip_profiles); + } + break; + } + + header('Location: sip_profiles.php'.($search != '' ? '?search='.urlencode($search) : null)); + exit; + } + +//get order and order by $order_by = $_GET["order_by"]; $order = $_GET["order"]; -//add the search term +//add the search string $search = strtolower($_GET["search"]); if (strlen($search) > 0) { $sql_search = "where ("; $sql_search .= "lower(sip_profile_name) like :search "; $sql_search .= "or lower(sip_profile_hostname) like :search "; + $sql_search .= "or lower(sip_profile_description) like :search "; $sql_search .= ") "; $parameters['search'] = '%'.$search.'%'; } -//additional includes - require_once "resources/header.php"; - require_once "resources/paging.php"; - //prepare to page the results - $sql = "select count(*) from v_sip_profiles "; + $sql = "select count(sip_profile_uuid) from v_sip_profiles "; + $sql .= $sql_search; $database = new database; - $num_rows = $database->select($sql, null, 'column'); + $num_rows = $database->select($sql, $parameters, 'column'); //prepare to page the results $rows_per_page = ($_SESSION['domain']['paging']['numeric'] != '') ? $_SESSION['domain']['paging']['numeric'] : 50; - $param = ""; - $page = $_GET['page']; - if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } - list($paging_controls, $rows_per_page, $var3) = paging($num_rows, $param, $rows_per_page); + $param = $search ? "&search=".$search : null; + $page = is_numeric($_GET['page']) ? $_GET['page'] : 0; + list($paging_controls, $rows_per_page) = paging($num_rows, $param, $rows_per_page); + list($paging_controls_mini, $rows_per_page) = paging($num_rows, $param, $rows_per_page, true); $offset = $rows_per_page * $page; //get the list - $sql = str_replace('count(*)', '*', $sql); - $sql .= $sql_search; + $sql = str_replace('count(sip_profile_uuid)', '*', $sql); $sql .= order_by($order_by, $order); $sql .= limit_offset($rows_per_page, $offset); $database = new database; $sip_profiles = $database->select($sql, $parameters, 'all'); unset($sql, $parameters); -//escape the search - $search = escape($search); +//create token + $object = new token; + $token = $object->create($_SERVER['PHP_SELF']); -//alternate the row style - $c = 0; - $row_style["0"] = "row_style0"; - $row_style["1"] = "row_style1"; +//additional includes + require_once "resources/header.php"; //show the content - echo "\n"; - echo " \n"; - echo " \n"; - echo " \n"; - echo " \n"; + echo "
\n"; + echo "
".$text['title-sip_profiles']." (".$num_rows.")
\n"; + echo "
\n"; + if (permission_exists('sip_profile_add')) { + echo button::create(['type'=>'button','label'=>$text['button-add'],'icon'=>$_SESSION['theme']['button_icon_add'],'link'=>'sip_profile_edit.php']); + } + if (permission_exists('sip_profile_edit') && $sip_profiles) { + echo button::create(['type'=>'button','label'=>$text['button-toggle'],'icon'=>$_SESSION['theme']['button_icon_toggle'],'onclick'=>"if (confirm('".$text['confirm-toggle']."')) { list_action_set('toggle'); list_form_submit('form_list'); } else { this.blur(); return false; }"]); + } + if (permission_exists('sip_profile_delete') && $sip_profiles) { + echo button::create(['type'=>'button','label'=>$text['button-delete'],'icon'=>$_SESSION['theme']['button_icon_delete'],'onclick'=>"if (confirm('".$text['confirm-delete']."')) { list_action_set('delete'); list_form_submit('form_list'); } else { this.blur(); return false; }"]); + } + echo "\n"; + echo ""; + echo button::create(['label'=>$text['button-search'],'icon'=>$_SESSION['theme']['button_icon_search'],'type'=>'submit','id'=>'btn_search','style'=>($search != '' ? 'display: none;' : null)]); + echo button::create(['label'=>$text['button-reset'],'icon'=>$_SESSION['theme']['button_icon_reset'],'type'=>'button','id'=>'btn_reset','link'=>'sip_profiles.php','style'=>($search == '' ? 'display: none;' : null)]); + if ($paging_controls_mini != '') { + echo "".$paging_controls_mini."\n"; + } echo " \n"; - echo "
\n"; - echo " \n"; - echo " \n"; - echo " \n"; - echo "
".$text['title-sip_profiles']."
\n"; - echo " \n"; - echo " \n"; - echo "
\n"; - echo " ".$text['description-sip_profiles']."

\n"; - echo "
\n"; + echo " \n"; + echo "
\n"; + echo "\n"; - echo "\n"; - echo "\n"; + echo $text['description-sip_profiles']."\n"; + echo "

\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + echo "\n"; + if (permission_exists('sip_profile_add') || permission_exists('sip_profile_edit') || permission_exists('sip_profile_delete')) { + echo " \n"; + } echo th_order_by('sip_profile_name', $text['label-sip_profile_name'], $order_by, $order); echo th_order_by('sip_profile_hostname', $text['label-sip_profile_hostname'], $order_by, $order); - echo th_order_by('sip_profile_enabled', $text['label-sip_profile_enabled'], $order_by, $order); - echo th_order_by('sip_profile_description', $text['label-sip_profile_description'], $order_by, $order); - echo "\n"; } - else { - echo " \n"; - } - echo "\n"; - echo "\n"; + echo "\n"; - if (is_array($sip_profiles)) { + if (is_array($sip_profiles) && @sizeof($sip_profiles) != 0) { + $x = 0; foreach ($sip_profiles as $row) { if (permission_exists('sip_profile_edit')) { - $tr_link = "href='sip_profile_edit.php?id=".escape($row['sip_profile_uuid'])."'"; + $list_row_url = "sip_profile_edit.php?id=".urlencode($row['sip_profile_uuid']); } - echo "\n"; - echo " \n"; - echo " \n"; - echo " \n"; - echo " \n"; - echo " \n"; + if (permission_exists('sip_profile_add') || permission_exists('sip_profile_edit') || permission_exists('sip_profile_delete')) { + echo " \n"; + } + echo " \n"; + echo " \n"; + if (permission_exists('sip_profile_edit')) { + echo " \n"; + echo " \n"; + if (permission_exists('sip_profile_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') { + echo " \n"; + } echo "\n"; - $c = $c ? 0 : 1; + $x++; } + unset($sip_profiles); } - unset($sip_profiles, $row); - echo "\n"; - echo "\n"; - echo "\n"; - echo "
\n"; + echo " \n"; + echo " "; - if (permission_exists('sip_profile_add')) { - echo "$v_link_label_add"; + echo th_order_by('sip_profile_enabled', $text['label-sip_profile_enabled'], $order_by, $order, null, "class='center'"); + echo th_order_by('sip_profile_description', $text['label-sip_profile_description'], $order_by, $order, null, "class='hide-sm-dn pct-70'"); + if (permission_exists('sip_profile_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') { + echo "  
".escape($row['sip_profile_name'])." ".escape($row['sip_profile_hostname'])." ".escape($row['sip_profile_enabled'])." ".escape($row['sip_profile_description'])." "; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; if (permission_exists('sip_profile_edit')) { - echo "$v_link_label_edit"; + echo " ".escape($row['sip_profile_name'])."\n"; } - if (permission_exists('sip_profile_delete')) { - echo "$v_link_label_delete"; + else { + echo " ".escape($row['sip_profile_name']); } echo " ".escape($row['sip_profile_hostname'])." \n"; + echo $text['label-'.$row['sip_profile_enabled']]; + } + echo " ".escape($row['sip_profile_description'])." \n"; + echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]); + echo "
\n"; - echo " \n"; - echo " \n"; - echo " \n"; - echo " \n"; - echo " \n"; - echo " \n"; - echo "
 $paging_controls"; - if (permission_exists('sip_profile_add')) { - echo "$v_link_label_add"; - } - else { - echo " "; - } - echo "
\n"; - echo "
"; - echo "

"; + echo "\n"; + echo "
\n"; + echo "
".$paging_controls."
\n"; + echo "\n"; + echo "\n"; //include the footer require_once "resources/footer.php";