From 2898f5e3c9e9b1a121a614471117a0e2acb0e27f Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Tue, 20 Jul 2021 09:32:01 +0200 Subject: [PATCH] Fix bug codecs storage codecs were stored as a ',' separated list while chan-sccp expects a ';' separated list Correct all existing db values when running installer make sure that disallow is not unset in installer (set to all) make sure that disallow is not empty correct help text --- Sccp_manager.class.php | 2 +- install.php | 15 ++++++++++++++- sccpManClasses/Sccp.class.php.v433 | 15 +++++++++++---- sccpManClasses/amInterfaceClasses/Event.class.php | 4 ++-- sccpManTraits/ajaxHelper.php | 4 ++-- views/server.codec.php | 2 +- 6 files changed, 31 insertions(+), 11 deletions(-) diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index caa8fe3..1d3b1d5 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -718,7 +718,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { // No site defaults so return chan-sccp defaults $val = $this->sccpvalues['allow']['systemdefault']; } - $siteCodecs = array_fill_keys(explode(',',$val), 1); + $siteCodecs = array_fill_keys(explode(';',$val), 1); switch ($type) { case 'audio': $fpbxCodecs = $this->FreePBX->Codecs->getAudio(); diff --git a/install.php b/install.php index 8ca382c..8f930ee 100644 --- a/install.php +++ b/install.php @@ -165,7 +165,7 @@ function Get_DB_config($sccp_compatible) 'transfer' => array('create' => "enum('yes','no') NOT NULL default 'yes'", 'modify' => "enum('yes','no')"), 'vmnum' => array('def_modify' => "*97"), 'musicclass' => array('def_modify' => "default"), - 'disallow' => array('create' => "VARCHAR(255) NULL DEFAULT NULL"), + 'disallow' => array('create' => "VARCHAR(255) NULL DEFAULT 'all'", 'modify' => 'VARCHAR(255)'), 'allow' => array('create' => "VARCHAR(255) NULL DEFAULT NULL"), 'id' => array('create' => 'MEDIUMINT(9) NOT NULL AUTO_INCREMENT, ADD UNIQUE(id);', 'modify' => "MEDIUMINT(9)", 'index' => 'id'), 'echocancel' => array('create' => "enum('yes','no') NOT NULL default 'yes'", 'modify' => "enum('yes','no')"), @@ -983,7 +983,10 @@ function cleanUpSccpSettings() { // 2 special cases deny|permit & disallow|allow where need to parse on |. $newKeyword = explode("|", $valueArray['Name'], 2); if (isset($newKeyword[1])) { + // chan-sccp sets sysdef as comma separated list for sccp.conf, but expects ; separated list + // when returned from db $newSysDef = explode("|", $valueArray['DefaultValue'], 2); + $newSysDef = str_replace(',',';', $newSysDef); $i = 0; foreach ($newKeyword as $dummy) { if (array_key_exists($newKeyword[$i],$settingsFromDb)) { @@ -1032,5 +1035,15 @@ function cleanUpSccpSettings() { )"; $results = $db->query($sql); } + // have to correct prior verion sccpline lists for allow/disallow and deny permit. Prior + // versions used csl, but chan-sccp expects ; separated lists when returned by db. + + outn("
  • " . _("Replacing invalid values in sccpline") . "
  • "); + $db->query("UPDATE sccpline SET allow = REPLACE(allow, ',',';') WHERE allow like '%,%'"); + $db->query("UPDATE sccpline SET disallow = REPLACE(disallow, ',',';') WHERE disallow like '%,%'"); + + // Ensure that disallow is set to all if unset (and not NULL) + $db->query("UPDATE sccpline SET disallow = 'all' WHERE disallow like ''"); + } ?> diff --git a/sccpManClasses/Sccp.class.php.v433 b/sccpManClasses/Sccp.class.php.v433 index b06aa4d..255c50e 100644 --- a/sccpManClasses/Sccp.class.php.v433 +++ b/sccpManClasses/Sccp.class.php.v433 @@ -85,6 +85,13 @@ class Sccp extends \FreePBX\modules\Core\Driver { } // This will produce an array where site defaults take precedence over system defaults $this->line_defaults = array_intersect_key($siteDefaults,$sccpDefaults); + // If have no site codecs, use system defaults - must have a codec! + if (empty($this->line_defaults['allow'])) { + $this->line_defaults['allow'] = $sccpDefaults['allow']; + } + if (empty($this->line_defaults['disallow'])) { + $this->line_defaults['disallow'] = $sccpDefaults['disallow']; + } unset($raw_settings, $siteDefaults, $sccpDefaults); } @@ -121,7 +128,7 @@ class Sccp extends \FreePBX\modules\Core\Driver { $allow_codec[] = str_replace('codec_','',$key); } } - $settings['allow']['value'] = implode(",", $allow_codec); + $settings['allow']['value'] = implode(";", $allow_codec); // Reset to line defaults if no value selected if (empty($settings['allow']['value'])) { $settings['allow']['value'] = $this->line_defaults['allow']; @@ -238,7 +245,7 @@ class Sccp extends \FreePBX\modules\Core\Driver { $currentComponent->addTabTranslation('sccp',_('SCCP')); // get site and system defaults - $systemCodecs = array_fill_keys(explode(',',$this->line_defaults['allow']),true); + $systemCodecs = array_fill_keys(explode(';',$this->line_defaults['allow']),true); $siteAudioCodecs = array_intersect_key($systemCodecs, $this->freepbx->Codecs->getAudio()); $siteVideoCodecs = array_intersect_key($systemCodecs, $this->freepbx->Codecs->getVideo()); @@ -249,7 +256,7 @@ class Sccp extends \FreePBX\modules\Core\Driver { } } else { // have allowed codecs for this line - foreach (explode(',',$deviceInfo['allow']) as $lineCodec) { + foreach (explode(';',$deviceInfo['allow']) as $lineCodec) { $activeCodecs[] = "devinfo_codec_{$lineCodec}"; } } @@ -264,7 +271,7 @@ class Sccp extends \FreePBX\modules\Core\Driver { } $tmparr['disallow'] = array('prompttext' => _('Disallowed Codecs'), - 'value' => $this->line_defaults[(string)$child->name], + 'value' => $this->line_defaults['disallow'], 'tt' => 'Codecs that are disallowed. Default and recommended value is all', 'level' => 1, 'section' => $section_с, diff --git a/sccpManClasses/amInterfaceClasses/Event.class.php b/sccpManClasses/amInterfaceClasses/Event.class.php index a08c50f..dea0c25 100644 --- a/sccpManClasses/amInterfaceClasses/Event.class.php +++ b/sccpManClasses/amInterfaceClasses/Event.class.php @@ -101,7 +101,7 @@ class SCCPShowDevice_Event extends Event public function getCapabilities() { $ret = array(); - $codecs = explode(", ", substr($this->getKey('Capabilities'), 1, -1)); + $codecs = explode(';', substr($this->getKey('Capabilities'), 1, -1)); foreach ($codecs as $codec) { $codec_parts = explode(" ", $codec); $ret[] = array("name" => $codec_parts[0], "value" => substr($codec_parts[1], 1, -1)); @@ -112,7 +112,7 @@ class SCCPShowDevice_Event extends Event public function getCodecsPreference() { $ret = array(); - $codecs = explode(", ", substr($this->getKey('CodecsPreference'), 1, -1)); + $codecs = explode(';', substr($this->getKey('CodecsPreference'), 1, -1)); foreach ($codecs as $codec) { $codec_parts = explode(" ", $codec); $ret[] = array("name" => $codec_parts[0], "value" => substr($codec_parts[1], 1, -1)); diff --git a/sccpManTraits/ajaxHelper.php b/sccpManTraits/ajaxHelper.php index cc46ec1..da51c2c 100644 --- a/sccpManTraits/ajaxHelper.php +++ b/sccpManTraits/ajaxHelper.php @@ -405,7 +405,7 @@ trait ajaxHelper { // if uncheck all codecs, audiocodecs key is missing so nothing changes in db. // Unsetting all codecs will now return to chan-sccp defaults. if (!isset($request['audiocodecs'])) { - $request['audiocodecs'] = array_fill_keys(explode(',',$this->sccpvalues['allow']['systemdefault']),true); + $request['audiocodecs'] = array_fill_keys(explode(';',$this->sccpvalues['allow']['systemdefault']),true); } foreach ($request as $key => $value) { // Originally saved all to sccpvalues. Now will save to db defaults if appropriate @@ -506,7 +506,7 @@ trait ajaxHelper { $save_codec[$i] = $keycodeс; $i++; }; - $tmpv = implode(",", $save_codec); + $tmpv = implode(";", $save_codec); if (!($this->sccpvalues['allow']['data'] == $tmpv)) { $save_settings['allow'] = array( 'keyword' => 'allow', diff --git a/views/server.codec.php b/views/server.codec.php index 2e2a8a9..89b2a86 100644 --- a/views/server.codec.php +++ b/views/server.codec.php @@ -44,7 +44,7 @@ if (empty($sccp_disallow_def)) {
    - +