Portions created by the Initial Developer are Copyright (C) 2008-2024 the Initial Developer. All Rights Reserved. Contributor(s): Mark J Crane */ //includes files require_once dirname(__DIR__, 2) . "/resources/require.php"; require_once "resources/require.php"; require_once "resources/check_auth.php"; require_once "resources/paging.php"; //check permissions if (permission_exists('extension_view')) { //access granted } else { echo "access denied"; exit; } //add multi-lingual support $language = new text; $text = $language->get(); //get order and order by, page, sort $order_by = preg_replace('#[^a-zA-Z0-9_\-]#', '', ($_REQUEST["order_by"] ?? 'extension')); $order = $_REQUEST["order"] ?? 'asc'; $page = isset($_REQUEST['page']) && is_numeric($_REQUEST['page']) ? $_REQUEST['page'] : 0; $sort = $order_by == 'extension' ? 'natural' : null; //get posted data if (!empty($_POST['extensions']) && is_array($_POST['extensions'])) { $action = $_POST['action']; $search = $_POST['search'] ?? ''; $extensions = $_POST['extensions']; } //process the http post data by action if (!empty($action) && !empty($extensions) && is_array($extensions) && @sizeof($extensions) != 0) { switch ($action) { case 'toggle': if (permission_exists('extension_enabled')) { $obj = new extension; $obj->toggle($extensions); } break; case 'delete_extension': case 'delete_extension_voicemail': if (permission_exists('extension_delete')) { $obj = new extension; if ($action == 'delete_extension_voicemail' && permission_exists('voicemail_delete')) { $obj->delete_voicemail = true; } $obj->delete($extensions); } break; } header('Location: extensions.php?'.(!empty($order_by) ? '&order_by='.$order_by.'&order='.$order : null).(is_numeric($page) ? '&page='.urlencode($page) : null).($search != '' ? '&search='.urlencode($search) : '')); exit; } //get total extension count for domain if (!empty($settings->get('limit', 'extensions'))) { $sql = "select count(*) from v_extensions "; $sql .= "where domain_uuid = :domain_uuid "; $parameters['domain_uuid'] = $_SESSION['domain_uuid']; $total_extensions = $database->select($sql, $parameters, 'column'); unset($sql, $parameters); } //add the search term $search = strtolower($_GET["search"] ?? ''); //build the query string $query_string = ''; if (!empty($search)) { $query_string .= '&search='.urlencode($search); } if (!empty($_GET['show']) && $_GET['show'] == "all" && permission_exists('extension_all')) { $query_string .= "&show=all"; } //get total extension count $sql = "select count(*) from v_extensions "; $sql .= "where true "; if (!(!empty($_GET['show']) && $_GET['show'] == "all" && permission_exists('extension_all'))) { $sql .= "and domain_uuid = :domain_uuid "; $parameters['domain_uuid'] = $_SESSION['domain_uuid']; } if (!empty($search)) { $sql .= "and ( "; $sql .= " lower(extension) like :search "; $sql .= " or lower(number_alias) like :search "; $sql .= " or lower(effective_caller_id_name) like :search "; $sql .= " or lower(effective_caller_id_number) like :search "; $sql .= " or lower(outbound_caller_id_name) like :search "; $sql .= " or lower(outbound_caller_id_number) like :search "; $sql .= " or lower(emergency_caller_id_name) like :search "; $sql .= " or lower(emergency_caller_id_number) like :search "; $sql .= " or lower(directory_first_name) like :search "; $sql .= " or lower(directory_last_name) like :search "; if (permission_exists("extension_call_group")) { $sql .= " or lower(call_group) like :search "; } $sql .= " or lower(user_context) like :search "; $sql .= " or lower(enabled) like :search "; $sql .= " or lower(description) like :search "; $sql .= ") "; $parameters['search'] = '%'.$search.'%'; } $num_rows = $database->select($sql, $parameters ?? null, 'column'); //prepare to page the results $rows_per_page = $settings->get('domain', 'paging', 50); $param = ''; if (!empty($order) && !empty($order_by)) { $param .= "&order=".$order; $param .= "&order_by=".$order_by; } list($paging_controls, $rows_per_page) = paging($num_rows, $param.$query_string, $rows_per_page); //bottom list($paging_controls_mini, $rows_per_page) = paging($num_rows, $param.$query_string, $rows_per_page, true); //top $offset = $rows_per_page * $page; //get the extensions $sql = "select "; $sql .= "e.extension_uuid, "; $sql .= "e.domain_uuid, "; $sql .= "e.extension, "; $sql .= "e.number_alias, "; $sql .= "e.password, "; $sql .= "e.accountcode, "; $sql .= "e.effective_caller_id_name, "; $sql .= "e.effective_caller_id_number, "; $sql .= "e.outbound_caller_id_name, "; $sql .= "e.outbound_caller_id_number, "; $sql .= "e.emergency_caller_id_name, "; $sql .= "e.emergency_caller_id_number, "; $sql .= "e.directory_first_name, "; $sql .= "e.directory_last_name, "; $sql .= "e.directory_visible, "; $sql .= "e.directory_exten_visible, "; $sql .= "e.limit_max, "; $sql .= "e.limit_destination, "; $sql .= "e.missed_call_app, "; $sql .= "e.missed_call_data, "; $sql .= "e.user_context, "; $sql .= "e.toll_allow, "; $sql .= "e.call_timeout, "; $sql .= "e.call_group, "; $sql .= "e.call_screen_enabled, "; $sql .= "e.user_record, "; $sql .= "e.hold_music, "; $sql .= "e.auth_acl, "; $sql .= "e.cidr, "; $sql .= "e.sip_force_contact, "; $sql .= "e.nibble_account, "; $sql .= "e.sip_force_expires, "; $sql .= "e.mwi_account, "; $sql .= "e.sip_bypass_media, "; $sql .= "e.unique_id, "; $sql .= "e.dial_string, "; $sql .= "e.dial_user, "; $sql .= "e.dial_domain, "; $sql .= "e.do_not_disturb, "; $sql .= "e.forward_all_destination, "; $sql .= "e.forward_all_enabled, "; $sql .= "e.forward_busy_destination, "; $sql .= "e.forward_busy_enabled, "; $sql .= "e.forward_no_answer_destination, "; $sql .= "e.forward_no_answer_enabled, "; $sql .= "e.forward_user_not_registered_destination, "; $sql .= "e.forward_user_not_registered_enabled, "; $sql .= "e.follow_me_uuid, "; $sql .= "e.follow_me_enabled, "; $sql .= "e.follow_me_destinations, "; $sql .= "cast(e.enabled as text), "; $sql .= "e.description, "; $sql .= "e.absolute_codec_string, "; $sql .= "e.force_ping, "; $sql .= "e.max_registrations, "; $sql .= "e.extension_type, "; $sql .= "e.extension_language, "; $sql .= "e.extension_dialect, "; $sql .= "e.extension_voice, "; $sql .= "( "; $sql .= " select device_uuid "; $sql .= " from v_device_lines "; $sql .= " where domain_uuid = e.domain_uuid "; $sql .= " and user_id = e.extension "; $sql .= " limit 1 "; $sql .= ") AS device_uuid, "; if (permission_exists("extension_device_address")) { $sql .= "( "; $sql .= " select device_address "; $sql .= " from v_devices "; $sql .= " where device_uuid in ( "; $sql .= " select device_uuid "; $sql .= " from v_device_lines "; $sql .= " where domain_uuid = e.domain_uuid "; $sql .= " and user_id = e.extension "; $sql .= " limit 1) "; $sql .= ") AS device_address, "; } if (permission_exists("extension_device_template")) { $sql .= "( "; $sql .= " select device_template "; $sql .= " from v_devices "; $sql .= " where device_uuid in ( "; $sql .= " select device_uuid "; $sql .= " from v_device_lines "; $sql .= " where domain_uuid = e.domain_uuid "; $sql .= " and user_id = e.extension "; $sql .= " limit 1) "; $sql .= ") AS device_template, "; } $sql .= "true as true "; $sql .= "from v_extensions as e "; $sql .= "where true "; if (!(!empty($_GET['show']) && $_GET['show'] == "all" && permission_exists('extension_all'))) { $sql .= "and domain_uuid = :domain_uuid "; $parameters['domain_uuid'] = $_SESSION['domain_uuid']; } if (!empty($search)) { $sql .= "and ( "; $sql .= " lower(extension) like :search "; $sql .= " or lower(number_alias) like :search "; $sql .= " or lower(effective_caller_id_name) like :search "; $sql .= " or lower(effective_caller_id_number) like :search "; $sql .= " or lower(outbound_caller_id_name) like :search "; $sql .= " or lower(outbound_caller_id_number) like :search "; $sql .= " or lower(emergency_caller_id_name) like :search "; $sql .= " or lower(emergency_caller_id_number) like :search "; $sql .= " or lower(directory_first_name) like :search "; $sql .= " or lower(directory_last_name) like :search "; if (permission_exists("extension_call_group")) { $sql .= " or lower(call_group) like :search "; } $sql .= " or lower(user_context) like :search "; $sql .= " or lower(description) like :search "; $sql .= ") "; $parameters['search'] = '%'.$search.'%'; } $sql .= order_by($order_by, $order, null, null, $sort); $sql .= limit_offset($rows_per_page, $offset); $extensions = $database->select($sql, $parameters ?? null, 'all'); unset($sql, $parameters); //get the registrations if (permission_exists('extension_registered')) { $obj = new registrations; if (!empty($_GET['show']) && $_GET['show'] == 'all') { $obj->show = 'all'; } $registrations = $obj->get('all'); } //create token $object = new token; $token = $object->create($_SERVER['PHP_SELF']); //include the header $document['title'] = $text['title-extensions']; require_once "resources/header.php"; //show the content echo "
\n"; echo "
".$text['header-extensions']."
".number_format($num_rows)."
\n"; echo "
\n"; if (permission_exists('extension_import') && (empty($settings->get('limit', 'extensions', 0)) || $total_extensions < $settings->get('limit', 'extensions'))) { echo button::create(['type'=>'button','label'=>$text['button-import'],'icon'=>$settings->get('theme', 'button_icon_import'),'link'=>'extension_imports.php']); } if (permission_exists('extension_export')) { echo button::create(['type'=>'button','label'=>$text['button-export'],'icon'=>$settings->get('theme', 'button_icon_export'),'link'=>'extension_download.php']); } $margin_left = permission_exists('extension_import') || permission_exists('extension_export') ? "margin-left: 15px;" : null; if (permission_exists('extension_add') && (empty($settings->get('limit', 'extensions', 0)) || $total_extensions < $settings->get('limit', 'extensions'))) { echo button::create(['type'=>'button','label'=>$text['button-add'],'icon'=>$settings->get('theme', 'button_icon_add'),'id'=>'btn_add','style'=>($margin_left ?? ''),'link'=>'extension_edit.php']); unset($margin_left); } if (permission_exists('extension_enabled') && $extensions) { echo button::create(['type'=>'button','label'=>$text['button-toggle'],'icon'=>$settings->get('theme', 'button_icon_toggle'),'id'=>'btn_toggle','name'=>'btn_toggle','style'=>'display: none; '.($margin_left ?? ''),'onclick'=>"modal_open('modal-toggle','btn_toggle');"]); unset($margin_left); } if (permission_exists('extension_delete') && $extensions) { if (permission_exists('voicemail_delete')) { echo button::create(['type'=>'button','label'=>$text['button-delete'],'icon'=>$settings->get('theme', 'button_icon_delete'),'id'=>'btn_delete','name'=>'btn_delete','style'=>'display: none; '.($margin_left ?? ''),'onclick'=>"modal_open('modal-delete-options');"]); } else { echo button::create(['type'=>'button','label'=>$text['button-delete'],'icon'=>$settings->get('theme', 'button_icon_delete'),'id'=>'btn_delete','name'=>'btn_delete','style'=>'display: none; '.($margin_left ?? ''),'onclick'=>"modal_open('modal-delete');"]); } unset($margin_left); } echo "\n"; echo "
\n"; echo "
\n"; echo "
\n"; if (permission_exists('extension_enabled') && $extensions) { echo modal::create(['id'=>'modal-toggle','type'=>'toggle','actions'=>button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_toggle','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_action_set('toggle'); list_form_submit('form_list');"])]); } if (permission_exists('extension_delete') && $extensions) { if (permission_exists('voicemail_delete')) { echo modal::create([ 'id'=>'modal-delete-options', 'title'=>$text['modal_title-confirmation'], 'message'=>$text['message-delete_selection'], 'actions'=> button::create(['type'=>'button','label'=>$text['button-cancel'],'icon'=>$settings->get('theme', 'button_icon_cancel'),'collapse'=>'hide-xs','onclick'=>'modal_close();']). button::create(['type'=>'button','label'=>$text['label-extension_and_voicemail'],'icon'=>'voicemail','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_action_set('delete_extension_voicemail'); list_form_submit('form_list');"]). button::create(['type'=>'button','label'=>$text['label-extension_only'],'icon'=>'phone-alt','collapse'=>'never','style'=>'float: right;','onclick'=>"modal_close(); list_action_set('delete_extension'); list_form_submit('form_list');"]) ]); } else { echo modal::create(['id'=>'modal-delete','type'=>'delete','actions'=>button::create(['type'=>'button','label'=>$text['button-continue'],'id'=>'btn_delete','icon'=>'check','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_action_set('delete_extension'); list_form_submit('form_list');"])]); } } echo $text['description-extensions']."\n"; echo "

\n"; echo "
\n"; echo "\n"; if (!empty($order_by)) { echo "\n"; echo "\n"; } if (isset($page) && is_numeric($page)) { echo "\n"; } echo "\n"; echo "
\n"; echo "\n"; echo "\n"; if (permission_exists('extension_enabled') || permission_exists('extension_delete')) { echo " \n"; } if (!empty($_GET['show']) && $_GET['show'] == "all" && permission_exists('extension_all')) { echo "\n"; //echo th_order_by('domain_name', $text['label-domain'], $order_by, $order); } if (permission_exists('extension_registered')) { echo "\n"; } echo th_order_by('extension', $text['label-extension'], $order_by, $order, $query_string); echo th_order_by('effective_caller_id_name', $text['label-effective_cid_name'], $order_by, $order, $query_string, "class='hide-xs'"); if (permission_exists("outbound_caller_id_name")) { echo th_order_by('outbound_caller_id_name', $text['label-outbound_cid_name'], $order_by, $order, $query_string, "class='hide-sm-dn'"); } if (permission_exists("outbound_caller_id_number")) { echo th_order_by('outbound_caller_id_number', $text['label-outbound_cid_number'], $order_by, $order, $query_string, "class='hide-md-dn'"); } if (permission_exists("extension_call_group")) { echo th_order_by('call_group', $text['label-call_group'], $order_by, $order, $query_string); } if (permission_exists("extension_device_address")) { echo th_order_by('device_address', $text['label-device_address'], $order_by, $order, $query_string, "class='hide-md-dn'"); } if (permission_exists("extension_device_template")) { echo th_order_by('device_template', $text['label-device_template'], $order_by, $order, $query_string, "class='hide-md-dn'"); } if (permission_exists("extension_user_context")) { echo th_order_by('user_context', $text['label-user_context'], $order_by, $order); } echo th_order_by('enabled', $text['label-enabled'], $order_by, $order, $query_string, "class='center'"); echo th_order_by('description', $text['label-description'], $order_by, $order, $query_string, "class='hide-sm-dn'"); if (permission_exists('extension_edit') && $settings->get('theme', 'list_row_edit_button', false)) { echo " \n"; } echo "\n"; if (is_array($extensions) && @sizeof($extensions) != 0) { $x = 0; foreach($extensions as $row) { $list_row_url = ''; if (permission_exists('extension_edit')) { $list_row_url = "extension_edit.php?id=".urlencode($row['extension_uuid']).(!empty($order_by) ? '&order_by='.$order_by.'&order='.$order : null).(is_numeric($page) ? '&page='.urlencode($page) : null); if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) { $list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true'; } } echo "\n"; if (permission_exists('extension_enabled') || permission_exists('extension_delete')) { echo " \n"; } if (!empty($_GET['show']) && $_GET['show'] == "all" && permission_exists('extension_all')) { echo " \n"; } if (permission_exists('extension_registered')) { $icon_registered_color = $settings->get('extension', 'icon_registered_color') ?? '#12d600'; $icon_unregistered_color = $settings->get('extension', 'icon_unregistered_color') ?? '#e21b1b'; $extension_number = $row['extension'].'@'.$_SESSION['domains'][$row['domain_uuid']]['domain_name']; $extension_number_alias = $row['number_alias']; if (!empty($extension_number_alias)) { $extension_number_alias .= '@'.$_SESSION['domains'][$row['domain_uuid']]['domain_name']; } $found_count = 0; if (is_array($registrations)) { foreach ($registrations as $array) { if ($extension_number == $array['user'] || ($extension_number_alias != '' && $extension_number_alias == $array['user'])) { $found_count++; } } } if ($found_count > 0) { echo " \n"; } echo " \n"; echo " \n"; if (permission_exists("outbound_caller_id_name")) { echo " \n"; } if (permission_exists("outbound_caller_id_number")) { echo " \n"; } if (permission_exists("extension_call_group")) { echo " \n"; } if (permission_exists("extension_device_address")) { echo " \n"; } if (permission_exists("extension_device_template")) { echo " \n"; } if (permission_exists("extension_user_context")) { echo " \n"; } if (permission_exists('extension_enabled')) { echo " \n"; echo " \n"; if (permission_exists('extension_edit') && $settings->get('theme', 'list_row_edit_button', false)) { echo " \n"; } echo "\n"; $x++; } } echo "
\n"; echo " \n"; echo " ".$text['label-domain']."  
\n"; echo " \n"; echo " \n"; echo " ".escape($_SESSION['domains'][$row['domain_uuid']]['domain_name'])." 1 ? $found_count.' '.$text['label-registrations'] : $text['label-registered'])."\">"; if ($found_count > 1) { echo "
\n"; } echo "
\n"; } else { echo "
"; echo "
\n"; } unset($extension_number, $extension_number_alias, $found_count, $array); echo "
"; if (permission_exists('extension_edit')) { echo "".escape($row['extension']).""; } else { echo escape($row['extension']); } echo " ".escape($row['effective_caller_id_name'])." ".escape($row['outbound_caller_id_name'])." ".escape($row['outbound_caller_id_number'])." ".escape($row['call_group'])." ".escape($row['device_address'])."".escape($row['device_template'])."".escape($row['user_context']).""; echo $text['label-'.$row['enabled']]; } echo " ".escape($row['description']).""; echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$settings->get('theme', 'button_icon_edit'),'link'=>$list_row_url]); echo "
\n"; echo "
\n"; echo "
\n"; echo "
".$paging_controls."
\n"; echo "\n"; echo "
\n"; unset($extensions); //show the footer require_once "resources/footer.php"; ?>