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)) {