From b847f959876d1aa6c2c0279483820a93092e1c6a Mon Sep 17 00:00:00 2001 From: demonspork Date: Thu, 11 Mar 2021 14:01:55 -0600 Subject: [PATCH 1/8] Add "Settings" link to Domains list Skip the step of clicking on the domain then clicking settings. I very rarely want to edit a domain's basic settings, 99% of the time I am wanting to either manage the domain or edit domain_settings. --- core/domains/domains.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/domains/domains.php b/core/domains/domains.php index 742cc3bbc5..22deeb6767 100644 --- a/core/domains/domains.php +++ b/core/domains/domains.php @@ -267,6 +267,10 @@ echo " \n"; echo " \n"; echo " ".$text['label-manage'].""; + if (permission_exists('domain_setting_view')) { + $list_setting_url = PROJECT_PATH."/core/domain_settings/domain_settings.php?id=".urlencode($row['domain_uuid']); + echo " | ".$text['button-settings']; + } echo " \n"; if (permission_exists('domain_edit')) { echo " \n"; From 8672784b0227b4aa7de18efaf61383912edb917b Mon Sep 17 00:00:00 2001 From: chansizzle <14916599+chansizzle@users.noreply.github.com> Date: Mon, 15 Mar 2021 15:12:12 -0600 Subject: [PATCH 2/8] grandstream call waiting ring --- app/grandstream/app_config.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/grandstream/app_config.php b/app/grandstream/app_config.php index f3673393b5..278802ec7f 100644 --- a/app/grandstream/app_config.php +++ b/app/grandstream/app_config.php @@ -38,6 +38,14 @@ $apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true"; $apps[$x]['default_settings'][$y]['default_setting_description'] = "Call Waiting 0-default, 1-enabled, 2-disable."; $y++; + $apps[$x]['default_settings'][$y]['default_setting_uuid'] = "3efa97d6-a35a-4371-b3db-efca7ef9b9b5"; + $apps[$x]['default_settings'][$y]['default_setting_category'] = "provision"; + $apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "grandstream_call_waiting_ring"; + $apps[$x]['default_settings'][$y]['default_setting_name'] = "text"; + $apps[$x]['default_settings'][$y]['default_setting_value'] = "0"; + $apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false"; + $apps[$x]['default_settings'][$y]['default_setting_description'] = "Call waiting ringing instead of playing call waiting tone when call waiting is on. 0-disabled (default), 1-enabled"; + $y++; $apps[$x]['default_settings'][$y]['default_setting_uuid'] = "3a8841f3-e1c0-4eb1-abd3-068a3e3701a5"; $apps[$x]['default_settings'][$y]['default_setting_category'] = "provision"; $apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "grandstream_gxp_time_zone"; From 7d57cef6acde11f946e6ae35b6a2c341a654730a Mon Sep 17 00:00:00 2001 From: Andrew Querol Date: Thu, 5 Nov 2020 14:28:19 -0600 Subject: [PATCH 3/8] Fix device provisioning and event notification for multiple registrations across different SIP profiles. --- .../classes/feature_event_notify.php | 64 ++++++++++--------- app/devices/cmd.php | 30 ++++++--- app/devices/device_edit.php | 16 +---- 3 files changed, 55 insertions(+), 55 deletions(-) diff --git a/app/calls/resources/classes/feature_event_notify.php b/app/calls/resources/classes/feature_event_notify.php index 28e0791011..b7efff6196 100644 --- a/app/calls/resources/classes/feature_event_notify.php +++ b/app/calls/resources/classes/feature_event_notify.php @@ -43,38 +43,40 @@ include "root.php"; //feature_event method public function send_notify() { - - $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); - if ($fp) { - //get the sip profile name - $command = "sofia_contact */".$this->extension."@".$this->domain_name; - $contact_string = event_socket_request($fp, "api ".$command); - if (substr($contact_string, 0, 5) == "sofia") { - $contact_array = explode("/", $contact_string); - $sip_profile_name = $contact_array[1]; - } - else { - $sip_profile_name = 'internal'; - } - //send the event - $event = "sendevent SWITCH_EVENT_PHONE_FEATURE\n"; - $event .= "profile: ".$sip_profile_name."\n"; - $event .= "user: ".$this->extension."\n"; - $event .= "host: ".$this->domain_name."\n"; - $event .= "device: \n"; - $event .= "Feature-Event: init\n"; - $event .= "forward_immediate_enabled: ".$this->forward_all_enabled."\n"; - $event .= "forward_immediate: ".$this->forward_all_destination."\n"; - $event .= "forward_busy_enabled: ".$this->forward_busy_enabled."\n"; - $event .= "forward_busy: ".$this->forward_busy_destination."\n"; - $event .= "forward_no_answer_enabled: ".$this->forward_no_answer_enabled."\n"; - $event .= "forward_no_answer: ".$this->forward_no_answer_destination."\n"; - $event .= "doNotDisturbOn: ".$this->do_not_disturb."\n"; - $event .= "ringCount: ".$this->ring_count."\n"; - event_socket_request($fp, $event); - - fclose($fp); + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + if ($fp) { + // Get the SIP profiles for the extension + $command = "sofia_contact */{$this->extension}@{$this->domain_name}"; + $contact_string = event_socket_request($fp, "api ".$command); + // The first value in the array will be full matching text, the second one will be the array of profile matches + preg_match_all('/sofia\/([^,]+)\/(?:[^,]+)/', $contact_string, $matches); + if (sizeof($matches) != 2 || sizeof($matches[1]) < 1) { + $profiles = array("internal"); + } else { + // We have at least one profile, get all of the unique profiles + $profiles = array_unique($matches[1]); } + + foreach ($profiles as $profile) { + //send the event + $event = "sendevent SWITCH_EVENT_PHONE_FEATURE\n"; + $event .= "profile: " . $profile . "\n"; + $event .= "user: " . $this->extension . "\n"; + $event .= "host: " . $this->domain_name . "\n"; + $event .= "device: \n"; + $event .= "Feature-Event: init\n"; + $event .= "forward_immediate_enabled: " . $this->forward_all_enabled . "\n"; + $event .= "forward_immediate: " . $this->forward_all_destination . "\n"; + $event .= "forward_busy_enabled: " . $this->forward_busy_enabled . "\n"; + $event .= "forward_busy: " . $this->forward_busy_destination . "\n"; + $event .= "forward_no_answer_enabled: " . $this->forward_no_answer_enabled . "\n"; + $event .= "forward_no_answer: " . $this->forward_no_answer_destination . "\n"; + $event .= "doNotDisturbOn: " . $this->do_not_disturb . "\n"; + $event .= "ringCount: " . $this->ring_count . "\n"; + event_socket_request($fp, $event); + } + fclose($fp); + } } //function } //class diff --git a/app/devices/cmd.php b/app/devices/cmd.php index 132001f441..7faeea7ffd 100644 --- a/app/devices/cmd.php +++ b/app/devices/cmd.php @@ -41,7 +41,6 @@ else { //set the variables $cmd = check_str($_GET['cmd']); $rdr = check_str($_GET['rdr']); - $profile = check_str($_GET['profile']); $domain = check_str($_GET['domain']); $show = check_str($_GET['show']); $user = check_str($_GET['user']); @@ -51,26 +50,39 @@ else { //create the event socket connection $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); if ($fp) { + // Get the SIP profiles for the user + $command = "sofia_contact */{$user}"; + $contact_string = event_socket_request($fp, "api ".$command); + // The first value in the array will be full matching text, the second one will be the array of profile matches + preg_match_all('/sofia\/([^,]+)\/(?:[^,]+)/', $contact_string, $matches); + if (sizeof($matches) != 2 || sizeof($matches[1]) < 1) { + $profiles = array("internal"); + } else { + // We have at least one profile, get all of the unique profiles + $profiles = array_unique($matches[1]); + } - //prepare the command + foreach ($profiles as $profile) { + //prepare the command if ($cmd == "unregister") { - $command = "sofia profile ".$profile." flush_inbound_reg ".$user." reboot"; + $command = "sofia profile {$profile} flush_inbound_reg {$user} reboot"; } else { - $command = "lua app.lua event_notify ".$profile." ".$cmd." ".$user." ".$vendor; + $command = "lua app.lua event_notify {$profile} {$cmd} {$user} {$vendor}"; //if ($cmd == "check_sync") { // $command = "sofia profile ".$profile." check_sync ".$user; //} } - //send the command - $response = event_socket_request($fp, "api ".$command); - $response = event_socket_request($fp, "api log notice ".$command); + //send the command + $response = event_socket_request($fp, "api {$command}"); + event_socket_request($fp, "api log notice {$command}"); - //show the response + //show the response message::add($text['label-event']." ".ucwords($cmd)."     ".$text['label-response'].htmlentities($response)); + } //close the connection - fclose($fp); + fclose($fp); } //redirect the user diff --git a/app/devices/device_edit.php b/app/devices/device_edit.php index b93f271737..f45281c94e 100644 --- a/app/devices/device_edit.php +++ b/app/devices/device_edit.php @@ -625,20 +625,6 @@ } } -//get the sip profile name - $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); - if ($fp) { - $command = "sofia_contact */".$user_id."@".$server_address; - $contact_string = event_socket_request($fp, "api ".$command); - if (substr($contact_string, 0, 5) == "sofia") { - $contact_array = explode("/", $contact_string); - $sip_profile_name = $contact_array[1]; - } - else { - $sip_profile_name = 'internal'; - } - } - //create token $object = new token; $token = $object->create($_SERVER['PHP_SELF']); @@ -816,7 +802,7 @@ echo button::create(['type'=>'button','label'=>$text['button-qr_code'],'icon'=>'qrcode','style'=>$button_margin,'onclick'=>"$('#qr_code_container').fadeIn(400);"]); unset($button_margin); } - echo button::create(['type'=>'button','label'=>$text['button-provision'],'icon'=>'fax','style'=>$button_margin,'link'=>PROJECT_PATH."/app/devices/cmd.php?cmd=check_sync&profile=".urlencode($sip_profile_name)."&user=".urlencode($user_id)."@".urlencode($server_address)."&domain=".urlencode($server_address)."&agent=".urlencode($device_vendor)]); + echo button::create(['type'=>'button','label'=>$text['button-provision'],'icon'=>'fax','style'=>$button_margin,'link'=>PROJECT_PATH."/app/devices/cmd.php?cmd=check_sync"."&user=".urlencode($user_id)."@".urlencode($server_address)."&domain=".urlencode($server_address)."&agent=".urlencode($device_vendor)]); unset($button_margin); if (permission_exists("device_files")) { //get the template directory From 7217da15f0b360a6c1de3a9bb9ab011633083cf8 Mon Sep 17 00:00:00 2001 From: Andrew Querol Date: Thu, 19 Nov 2020 11:30:14 -0600 Subject: [PATCH 4/8] Update the feature event LUA code to match the fix in PHP This renames `get_profile` to `get_profiles` which either returns nil for no profiles or a array of unique profiles. Then each function that used to take the single sip_profile was updated to take this array and send events to each profile the user is part of. --- .../scripts/app/feature_event/index.lua | 54 +++++++------- .../functions/feature_event_notify.lua | 74 ++++++++++++------- .../resources/scripts/call_forward.lua | 12 +-- .../resources/scripts/do_not_disturb.lua | 12 +-- 4 files changed, 87 insertions(+), 65 deletions(-) diff --git a/app/scripts/resources/scripts/app/feature_event/index.lua b/app/scripts/resources/scripts/app/feature_event/index.lua index a8aa898f60..95ec5edf72 100644 --- a/app/scripts/resources/scripts/app/feature_event/index.lua +++ b/app/scripts/resources/scripts/app/feature_event/index.lua @@ -72,7 +72,7 @@ end --get the events - --if (user == nil) then + --if (user == nil) then --serialize the data for the console --freeswitch.consoleLog("notice","[events] " .. event:serialize("xml") .. "\n"); --freeswitch.consoleLog("notice","[evnts] " .. event:serialize("json") .. "\n"); @@ -115,13 +115,13 @@ --get sip profile if (user ~= nil and host ~= nil) then - sip_profile = notify.get_profile(user, host); + sip_profiles = notify.get_profiles(user, host); end --DND - + if (sip_profiles ~= nil) then --DND enabled - if (feature_action == "SetDoNotDisturb" and feature_enabled == "true" and sip_profile ~= nil) then + if (feature_action == "SetDoNotDisturb" and feature_enabled == "true") then --set a variable dial_string = "error/user_busy"; do_not_disturb = "true"; @@ -155,11 +155,11 @@ end --send notify to the phone - notify.dnd(user, host, sip_profile, do_not_disturb); + notify.dnd(user, host, sip_profiles, do_not_disturb); end --DND disabled - if (feature_action == "SetDoNotDisturb" and feature_enabled == "false" and sip_profile ~= nil ) then + if (feature_action == "SetDoNotDisturb" and feature_enabled == "false") then --set a variable do_not_disturb = "false"; @@ -177,14 +177,14 @@ dbh:query(sql, params); --send notify to the phone - notify.dnd(user, host, sip_profile, do_not_disturb); + notify.dnd(user, host, sip_profiles, do_not_disturb); end --Call Forward --Call Formward All enabled - if (feature_action == "SetCallForward" and feature_enabled == "true" and action_name == "forward_immediate" and sip_profile ~= nil) then + if (feature_action == "SetCallForward" and feature_enabled == "true" and action_name == "forward_immediate") then --set a variable forward_all_destination = action_value; forward_all_enabled = "true"; @@ -247,11 +247,11 @@ end --send notify to the phone - notify.forward_immediate(user, host, sip_profile, forward_immediate_enabled, forward_immediate_destination); + notify.forward_immediate(user, host, sip_profiles, forward_immediate_enabled, forward_immediate_destination); end --Call Formward All disable - if (feature_action == "SetCallForward" and feature_enabled == "false" and action_name == "forward_immediate" and sip_profile ~= nil) then + if (feature_action == "SetCallForward" and feature_enabled == "false" and action_name == "forward_immediate") then --set a variable forward_all_destination = action_value; forward_all_enabled = "false"; @@ -277,14 +277,14 @@ dbh:query(sql, params); --send notify to the phone - if (forward_immediate_destination == nil) then + if (forward_immediate_destination == nil) then forward_immediate_destination = " "; end - notify.forward_immediate(user, host, sip_profile, forward_immediate_enabled, forward_immediate_destination); + notify.forward_immediate(user, host, sip_profiles, forward_immediate_enabled, forward_immediate_destination); end --Call Formward BUSY enable - if (feature_action == "SetCallForward" and feature_enabled == "true" and action_name == "forward_busy" and sip_profile ~= nil) then + if (feature_action == "SetCallForward" and feature_enabled == "true" and action_name == "forward_busy") then --set a variable forward_busy_destination = action_value; forward_busy_enabled = "true"; @@ -303,11 +303,11 @@ dbh:query(sql, params); --send notify to the phone - notify.forward_busy(user, host, sip_profile, forward_busy_enabled, forward_busy_destination); + notify.forward_busy(user, host, sip_profiles, forward_busy_enabled, forward_busy_destination); end --Call Formward BUSY disable - if (feature_action == "SetCallForward" and feature_enabled == "false" and action_name == "forward_busy" and sip_profile ~= nil) then + if (feature_action == "SetCallForward" and feature_enabled == "false" and action_name == "forward_busy") then --set a variable forward_busy_destination = action_value; forward_busy_enabled = "false"; @@ -330,11 +330,11 @@ dbh:query(sql, params); --send notify to the phone - notify.forward_busy(user, host, sip_profile, forward_busy_enabled, forward_busy_destination); + notify.forward_busy(user, host, sip_profiles, forward_busy_enabled, forward_busy_destination); end --Call Formward NO ANSWER enable - if (feature_action == "SetCallForward" and feature_enabled == "true" and action_name == "forward_no_answer" and sip_profile ~= nil) then + if (feature_action == "SetCallForward" and feature_enabled == "true" and action_name == "forward_no_answer") then --set a variable forward_no_answer_destination = action_value; forward_no_answer_enabled = "true"; @@ -355,11 +355,11 @@ dbh:query(sql, params); --send notify to the phone - notify.forward_no_answer(user, host, sip_profile, forward_no_answer_enabled, forward_no_answer_destination, ring_count); + notify.forward_no_answer(user, host, sip_profiles, forward_no_answer_enabled, forward_no_answer_destination, ring_count); end --Call Formward NO ANSWER disable - if (feature_action == "SetCallForward" and feature_enabled == "false" and action_name == "forward_no_answer" and sip_profile ~= nil) then + if (feature_action == "SetCallForward" and feature_enabled == "false" and action_name == "forward_no_answer") then --set a variable forward_no_answer_destination = action_value; forward_no_answer_enabled = "false"; @@ -382,28 +382,28 @@ dbh:query(sql, params); --send notify to the phone - notify.forward_no_answer(user, host, sip_profile, forward_no_answer_enabled, forward_no_answer_destination, ring_count); + notify.forward_no_answer(user, host, sip_profiles, forward_no_answer_enabled, forward_no_answer_destination, ring_count); end --No feature event (phone boots): Send all values if (feature_enabled == nil) then --Do Not Disturb - --notify.dnd(user, host, sip_profile, do_not_disturb); + --notify.dnd(user, host, sip_profiles, do_not_disturb); --Forward all forward_immediate_enabled = forward_all_enabled; forward_immediate_destination = forward_all_destination; - --notify.forward_immediate(user, host, sip_profile, forward_immediate_enabled, forward_immediate_destination); + --notify.forward_immediate(user, host, sip_profiles, forward_immediate_enabled, forward_immediate_destination); --Forward busy - --notify.forward_busy(user, host, sip_profile, forward_busy_enabled, forward_busy_destination); + --notify.forward_busy(user, host, sip_profiles, forward_busy_enabled, forward_busy_destination); --Forward No Answer ring_count = math.ceil (call_timeout / 6); - --notify.forward_no_answer(user, host, sip_profile, forward_no_answer_enabled, forward_no_answer_destination, ring_count); + --notify.forward_no_answer(user, host, sip_profiles, forward_no_answer_enabled, forward_no_answer_destination, ring_count); notify.init(user, host, - sip_profile, + sip_profiles, forward_immediate_enabled, forward_immediate_destination, forward_busy_enabled, @@ -414,8 +414,8 @@ do_not_disturb); end --- feature_event_notify.init(user, host, sip_profile, forward_immediate_enabled, forward_immediate_destination, forward_busy_enabled, forward_busy_destination, forward_no_answer_enabled, forward_no_answer_destination, ring_count, do_not_disturb) - +-- feature_event_notify.init(user, host, sip_profiles, forward_immediate_enabled, forward_immediate_destination, forward_busy_enabled, forward_busy_destination, forward_no_answer_enabled, forward_no_answer_destination, ring_count, do_not_disturb) + end --clear the cache if (feature_enabled ~= nil) then cache.del("directory:"..user.."@"..host) diff --git a/app/scripts/resources/scripts/app/feature_event/resources/functions/feature_event_notify.lua b/app/scripts/resources/scripts/app/feature_event/resources/functions/feature_event_notify.lua index e2c145b984..24f96e0f26 100644 --- a/app/scripts/resources/scripts/app/feature_event/resources/functions/feature_event_notify.lua +++ b/app/scripts/resources/scripts/app/feature_event/resources/functions/feature_event_notify.lua @@ -56,35 +56,50 @@ function feature_event_notify.get_db_values(user, domain_name) return do_not_disturb, forward_all_enabled, forward_all_destination, forward_busy_enabled, forward_busy_destination, forward_no_answer_enabled, forward_no_answer_destination, call_timeout end -function feature_event_notify.get_profile(user, host) +---@return table, nil +function feature_event_notify.get_profiles(user, domain) --includes - require "resources.functions.explode" require "resources.functions.trim" - - local account = user.."@"..host + + local account = user.."@"..domain --create the api object api = freeswitch.API(); local sofia_contact = trim(api:executeString("sofia_contact */"..account)); - local array = explode("/", sofia_contact); - local sip_profile = array[2]; - return sip_profile + --get all profiles for the user account + local profile_iterator = string.gmatch(sofia_contact, "sofia/([^,]+)/[^,]+"); + + --remove any duplicates and check if we have any profiles + local unique_profiles = {} + local has_profile = false + for profile in profile_iterator do + has_profile = true + unique_profiles[profile] = 1 + end + + -- return nil if we have no profiles + if not has_profile then return nil end + + return unique_profiles end -function feature_event_notify.dnd(user, host, sip_profile, do_not_disturb) - --set the event and send it - local event = freeswitch.Event("SWITCH_EVENT_PHONE_FEATURE") - event:addHeader("profile", sip_profile) - event:addHeader("user", user) - event:addHeader("host", host) - event:addHeader("device", "") - event:addHeader("Feature-Event", "DoNotDisturbEvent") - event:addHeader("doNotDisturbOn", do_not_disturb) - --freeswitch.consoleLog("notice","[events] " .. event:serialize("xml") .. "\n"); - event:fire() +function feature_event_notify.dnd(user, host, sip_profiles, do_not_disturb) + --set the event and send it to each profile + for sip_profile, _ in pairs(sip_profiles) do + local event = freeswitch.Event("SWITCH_EVENT_PHONE_FEATURE") + event:addHeader("profile", sip_profile) + event:addHeader("user", user) + event:addHeader("host", host) + event:addHeader("device", "") + event:addHeader("Feature-Event", "DoNotDisturbEvent") + event:addHeader("doNotDisturbOn", do_not_disturb) + --freeswitch.consoleLog("notice","[events] " .. event:serialize("xml") .. "\n"); + event:fire() + end end -function feature_event_notify.forward_immediate(user, host, sip_profile, forward_immediate_enabled, forward_immediate_destination) - --set the event and send it +function feature_event_notify.forward_immediate(user, host, sip_profiles, forward_immediate_enabled, forward_immediate_destination) + --set the event and send it to each profile + for sip_profile, _ in pairs(sip_profiles) do local event = freeswitch.Event("SWITCH_EVENT_PHONE_FEATURE") event:addHeader("profile", sip_profile) event:addHeader("user", user) @@ -95,10 +110,12 @@ function feature_event_notify.forward_immediate(user, host, sip_profile, forward event:addHeader("forward_immediate", forward_immediate_destination); freeswitch.consoleLog("notice","[events] " .. event:serialize("xml") .. "\n"); event:fire() + end end -function feature_event_notify.forward_busy(user, host, sip_profile, forward_busy_enabled, forward_busy_destination) - --set the event and send it +function feature_event_notify.forward_busy(user, host, sip_profiles, forward_busy_enabled, forward_busy_destination) + --set the event and send it to each profile + for sip_profile, _ in pairs(sip_profiles) do local event = freeswitch.Event("SWITCH_EVENT_PHONE_FEATURE") event:addHeader("profile", sip_profile) event:addHeader("user", user) @@ -108,10 +125,12 @@ function feature_event_notify.forward_busy(user, host, sip_profile, forward_busy event:addHeader("forward_busy", forward_busy_destination) event:addHeader("forward_busy_enabled", forward_busy_enabled) event:fire() + end end -function feature_event_notify.forward_no_answer(user, host, sip_profile, forward_no_answer_enabled, forward_no_answer_destination, ring_count) - --set the event and send it +function feature_event_notify.forward_no_answer(user, host, sip_profiles, forward_no_answer_enabled, forward_no_answer_destination, ring_count) + --set the event and send it to each profile + for sip_profile, _ in pairs(sip_profiles) do local event = freeswitch.Event("SWITCH_EVENT_PHONE_FEATURE") event:addHeader("profile", sip_profile) event:addHeader("user", user) @@ -122,10 +141,12 @@ function feature_event_notify.forward_no_answer(user, host, sip_profile, forward event:addHeader("forward_no_answer_enabled", forward_no_answer_enabled) event:addHeader("ringCount", ring_count) event:fire() + end end -function feature_event_notify.init(user, host, sip_profile, forward_immediate_enabled, forward_immediate_destination, forward_busy_enabled, forward_busy_destination, forward_no_answer_enabled, forward_no_answer_destination, ring_count, do_not_disturb) - --set the event and send it +function feature_event_notify.init(user, host, sip_profiles, forward_immediate_enabled, forward_immediate_destination, forward_busy_enabled, forward_busy_destination, forward_no_answer_enabled, forward_no_answer_destination, ring_count, do_not_disturb) + --set the event and send it to each profile + for sip_profile, _ in pairs(sip_profiles) do local event = freeswitch.Event("SWITCH_EVENT_PHONE_FEATURE") event:addHeader("profile", sip_profile) event:addHeader("user", user) @@ -143,6 +164,7 @@ function feature_event_notify.init(user, host, sip_profile, forward_immediate_en event:addHeader("Feature-Event", "DoNotDisturbEvent") event:addHeader("doNotDisturbOn", do_not_disturb) event:fire() + end end return feature_event_notify diff --git a/app/scripts/resources/scripts/call_forward.lua b/app/scripts/resources/scripts/call_forward.lua index 33e69d8bd6..ceed101ea1 100644 --- a/app/scripts/resources/scripts/call_forward.lua +++ b/app/scripts/resources/scripts/call_forward.lua @@ -262,14 +262,14 @@ -- Get the sip_profile if (extension ~= nil and domain_name ~= nil) then - sip_profile = notify.get_profile(extension, domain_name); + sip_profiles = notify.get_profiles(extension, domain_name); end - if (sip_profile ~= nil) then + if (sip_profiles ~= nil) then freeswitch.consoleLog("NOTICE", "[feature_event] SIP NOTIFY: CFWD set to "..forward_all_enabled.."\n"); --Do Not Disturb - notify.dnd(extension, domain_name, sip_profile, do_not_disturb); + notify.dnd(extension, domain_name, sip_profiles, do_not_disturb); --Forward all forward_immediate_enabled = forward_all_enabled; @@ -281,7 +281,7 @@ end freeswitch.consoleLog("NOTICE", "[feature_event] forward_immediate_destination "..forward_immediate_destination.."\n"); - notify.forward_immediate(extension, domain_name, sip_profile, forward_immediate_enabled, forward_immediate_destination); + notify.forward_immediate(extension, domain_name, sip_profiles, forward_immediate_enabled, forward_immediate_destination); --Forward busy --workaround for freeswitch not sending NOTIFY when destination values are nil. Send 0. @@ -290,7 +290,7 @@ end freeswitch.consoleLog("NOTICE", "[feature_event] forward_busy_destination "..forward_busy_destination.."\n"); - notify.forward_busy(extension, domain_name, sip_profile, forward_busy_enabled, forward_busy_destination); + notify.forward_busy(extension, domain_name, sip_profiles, forward_busy_enabled, forward_busy_destination); --Forward No Answer ring_count = math.ceil (call_timeout / 6); @@ -300,7 +300,7 @@ end freeswitch.consoleLog("NOTICE", "[feature_event] forward_no_answer_destination "..forward_no_answer_destination.."\n"); - notify.forward_no_answer(extension, domain_name, sip_profile, forward_no_answer_enabled, forward_no_answer_destination, ring_count); + notify.forward_no_answer(extension, domain_name, sip_profiles, forward_no_answer_enabled, forward_no_answer_destination, ring_count); end end diff --git a/app/scripts/resources/scripts/do_not_disturb.lua b/app/scripts/resources/scripts/do_not_disturb.lua index 9c30436fb4..bb70185552 100644 --- a/app/scripts/resources/scripts/do_not_disturb.lua +++ b/app/scripts/resources/scripts/do_not_disturb.lua @@ -227,15 +227,15 @@ -- Get the sip_profile if (extension ~= nil and domain_name ~= nil) then - sip_profile = notify.get_profile(extension, domain_name); + sip_profiles = notify.get_profiles(extension, domain_name); end -- check if not nil - if (sip_profile ~= nil) then + if (sip_profiles ~= nil) then freeswitch.consoleLog("NOTICE", "[feature_event] SIP NOTIFY: CFWD set to "..forward_all_enabled.."\n"); --Do Not Disturb - notify.dnd(extension, domain_name, sip_profile, do_not_disturb); + notify.dnd(extension, domain_name, sip_profiles, do_not_disturb); --Forward all forward_immediate_enabled = forward_all_enabled; @@ -246,7 +246,7 @@ forward_immediate_destination = '0'; end - notify.forward_immediate(extension, domain_name, sip_profile, forward_immediate_enabled, forward_immediate_destination); + notify.forward_immediate(extension, domain_name, sip_profiles, forward_immediate_enabled, forward_immediate_destination); --Forward busy --workaround for freeswitch not sending NOTIFY when destination values are nil. Send 0. @@ -254,7 +254,7 @@ forward_busy_destination = '0'; end - notify.forward_busy(extension, domain_name, sip_profile, forward_busy_enabled, forward_busy_destination); + notify.forward_busy(extension, domain_name, sip_profiles, forward_busy_enabled, forward_busy_destination); --Forward No Answer ring_count = math.ceil (call_timeout / 6); @@ -263,7 +263,7 @@ forward_no_answer_destination = '0'; end - notify.forward_no_answer(extension, domain_name, sip_profile, forward_no_answer_enabled, forward_no_answer_destination, ring_count); + notify.forward_no_answer(extension, domain_name, sip_profiles, forward_no_answer_enabled, forward_no_answer_destination, ring_count); end end From 47d6bac0502b2a7aec82b159fc089d2016903e88 Mon Sep 17 00:00:00 2001 From: agree <37550360+greenbea@users.noreply.github.com> Date: Thu, 18 Mar 2021 14:10:50 -0400 Subject: [PATCH 5/8] Yealink T54w Add missing parameter and variable --- resources/templates/provision/yealink/t54w/y000000000096.cfg | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/templates/provision/yealink/t54w/y000000000096.cfg b/resources/templates/provision/yealink/t54w/y000000000096.cfg index ab3b08ee60..63b5109e67 100644 --- a/resources/templates/provision/yealink/t54w/y000000000096.cfg +++ b/resources/templates/provision/yealink/t54w/y000000000096.cfg @@ -834,6 +834,8 @@ remote_phonebook.data.4.url = {$yealink_remote_phonebook_4_url} remote_phonebook.data.5.name = {$yealink_remote_phonebook_5_name} remote_phonebook.data.5.url = {$yealink_remote_phonebook_5_url} +features.remote_phonebook.enable = {$yealink_remote_phonebook_enable} + ####################################################################################### ## LDAP ## @@ -1139,7 +1141,7 @@ features.no_answer_code= ####################################################################################### ## DND ## ####################################################################################### -features.dnd.allow= +features.dnd.allow= {$yealink_dnd_allow} features.dnd_mode= features.dnd.enable= From 829d3f1abe641bd25c81af8c57e2c256497fb6c7 Mon Sep 17 00:00:00 2001 From: agree <37550360+greenbea@users.noreply.github.com> Date: Thu, 18 Mar 2021 18:06:24 -0400 Subject: [PATCH 6/8] extension settings fix not clearing cache --- .../resources/classes/extension_settings.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/extension_settings/resources/classes/extension_settings.php b/app/extension_settings/resources/classes/extension_settings.php index a8d21ce41f..0fe50b8889 100755 --- a/app/extension_settings/resources/classes/extension_settings.php +++ b/app/extension_settings/resources/classes/extension_settings.php @@ -112,6 +112,16 @@ if (!class_exists('extension_settings')) { $database->app_uuid = $this->app_uuid; $database->delete($array); unset($array); + + //clear the cache + $sql = "select extension, number_alias, user_context from v_extensions "; + $sql .= "where extension_uuid = :extension_uuid "; + $parameters['extension_uuid'] = $extension_uuid; + $database = new database; + $extension = $database->select($sql, $parameters, 'row'); + $cache = new cache; + $cache->delete("directory:".$extension["extension"]."@".$extension["user_context"]); + $cache->delete("directory:".$extension["number_alias"]."@".$extension["user_context"]); //set message message::add($text['message-delete']); From bf2418f131777e960c499e60fab6e5b796aa2392 Mon Sep 17 00:00:00 2001 From: agree <37550360+greenbea@users.noreply.github.com> Date: Thu, 18 Mar 2021 18:09:03 -0400 Subject: [PATCH 7/8] fix extension setting edit not clearing cache --- app/extension_settings/extension_setting_edit.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/extension_settings/extension_setting_edit.php b/app/extension_settings/extension_setting_edit.php index 7e026aa786..6254870e53 100755 --- a/app/extension_settings/extension_setting_edit.php +++ b/app/extension_settings/extension_setting_edit.php @@ -153,7 +153,17 @@ $database->app_name = 'extension settings'; $database->app_uuid = '1416a250-f6e1-4edc-91a6-5c9b883638fd'; $database->save($array); - + + //clear the cache + $sql = "select extension, number_alias, user_context from v_extensions "; + $sql .= "where extension_uuid = :extension_uuid "; + $parameters['extension_uuid'] = $extension_uuid; + $database = new database; + $extension = $database->select($sql, $parameters, 'row'); + $cache = new cache; + $cache->delete("directory:".$extension["extension"]."@".$extension["user_context"]); + $cache->delete("directory:".$extension["number_alias"]."@".$extension["user_context"]); + //redirect the user if (isset($action)) { if ($action == "add") { From b086093ca3aa271360fdf5f9194e491225559db6 Mon Sep 17 00:00:00 2001 From: FusionPBX Date: Fri, 19 Mar 2021 00:47:00 -0600 Subject: [PATCH 8/8] User logs show show current domain by default. Show all domains if the Show All button is pressed. --- core/user_logs/user_logs.php | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/core/user_logs/user_logs.php b/core/user_logs/user_logs.php index a924d64d02..b497244ad7 100644 --- a/core/user_logs/user_logs.php +++ b/core/user_logs/user_logs.php @@ -94,8 +94,15 @@ //get the count $sql = "select count(user_log_uuid) "; $sql .= "from v_user_logs "; + if (permission_exists('user_log_all') && $_GET['show'] == 'all') { + $sql .= "where true "; + } + else { + $sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) "; + $parameters['domain_uuid'] = $_SESSION['domain_uuid']; + } if (isset($search)) { - $sql .= "where ("; + $sql .= "and ("; $sql .= " lower(username) like :search "; $sql .= " or lower(type) like :search "; $sql .= " or lower(result) like :search "; @@ -104,13 +111,6 @@ $sql .= ") "; $parameters['search'] = '%'.$search.'%'; } - else { - $sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) "; - if (isset($sql_search)) { - $sql .= "and ".$sql_search; - } - $parameters['domain_uuid'] = $domain_uuid; - } $database = new database; $num_rows = $database->select($sql, $parameters, 'column'); unset($sql, $parameters); @@ -135,8 +135,15 @@ $sql .= "remote_address, "; $sql .= "user_agent "; $sql .= "from v_user_logs "; - if (isset($_GET["search"])) { - $sql .= "where ("; + if (permission_exists('user_log_all') && $_GET['show'] == 'all') { + $sql .= "where true "; + } + else { + $sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) "; + $parameters['domain_uuid'] = $_SESSION['domain_uuid']; + } + if (isset($search)) { + $sql .= "and ( "; $sql .= " lower(username) like :search "; $sql .= " or lower(type) like :search "; $sql .= " or lower(result) like :search ";