From 14199fca2ee6343e1ae2a7d0dbd55c13ff96afa0 Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Sat, 6 Feb 2021 17:26:37 +0100 Subject: [PATCH 01/19] Switch to PDO model Switch to PDO model and correct transactions --- Sccp_manager.class.php | 32 +++-- Sccp_manager.inc/dbinterface.class.php | 180 +++++++++++++------------ 2 files changed, 112 insertions(+), 100 deletions(-) diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index dba8c84..a4ad284 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -169,6 +169,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { $this->xml_data = simplexml_load_file($xml_vars); $this->initVarfromXml(); // Overwrite Exist } + $this->saveSccpSettings(); } /* @@ -269,25 +270,25 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { /* unused but FPBX API requires it */ public function install() { - + } /* unused but FPBX API requires it */ public function uninstall() { - + } /* unused but FPBX API requires it */ public function backup() { - + } /* unused but FPBX API requires it */ public function restore($backup) { - + } public function getActionBar($request) { @@ -815,7 +816,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { $hw_list[] = array('name' => $idv); } if ($idv == 'all') { - + } } } @@ -1483,10 +1484,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } public function getSccpSettingFromDB() { - $raw_data = $this->dbinterface->get_db_SccpSetting(); - foreach ($raw_data as $var) { - $this->sccpvalues[$var['keyword']] = array('keyword' => $var['keyword'], 'data' => $var['data'], 'seq' => $var['seq'], 'type' => $var['type']); - } + $this->sccpvalues = $this->dbinterface->get_db_SccpSetting(); return; } @@ -1864,19 +1862,25 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { // global $db; // global $amp_conf; - $save_settings = array(); +// $save_settings = array(); if (empty($save_value)) { - foreach ($this->sccpvalues as $key => $val) { + $this->dbinterface->write('sccpsettings', $this->sccpvalues, 'clear'); + +/* foreach ($this->sccpvalues as $key => $val) { if ((trim($val['data']) !== '') or ($val['data'] == '0')) { - $save_settings[] = array($key, $db->escapeSimple($val['data']), $val['seq'], $val['type']); + $save_settings[] = array($key, $val['data'], $val['seq'], $val['type']); + } else { + $unsaved_settings[] = array($key, $val['data'], $val['seq'], $val['type']); } } $this->dbinterface->write('sccpsettings', $save_settings, 'clear'); +*/ } else { $this->dbinterface->write('sccpsettings', $save_value, 'update'); - return true; } return true; +// } +// return true; } /* @@ -2093,7 +2097,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } // [Namesoftkeyset] // type=softkeyset - // + // // ----- It is a very bad idea to add an external configuration file "sccp_custom.conf" !!!! // This will add problems when solving problems caused by unexpected solutions from users. // diff --git a/Sccp_manager.inc/dbinterface.class.php b/Sccp_manager.inc/dbinterface.class.php index efcb398..b4ee6ee 100644 --- a/Sccp_manager.inc/dbinterface.class.php +++ b/Sccp_manager.inc/dbinterface.class.php @@ -21,7 +21,7 @@ class dbinterface public function info() { - $Ver = '13.0.2'; + $Ver = '13.0.2'; // This should be updated return array('Version' => $Ver, 'about' => 'Data access interface ver: ' . $Ver); } @@ -45,25 +45,25 @@ class dbinterface public function HWextension_db_SccpTableData($dataid, $data = array()) { + global $db; + $stmt = ''; + $stmts = ''; if ($dataid == '') { return false; } switch ($dataid) { case "SccpExtension": if (empty($data['name'])) { - $sql = "SELECT * FROM `sccpline` ORDER BY `name`"; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $stmts = $db->prepare('SELECT * FROM sccpline ORDER BY name'); } else { - $sql = "SELECT * FROM `sccpline` WHERE `name`='" . $data['name']. "'"; - ; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $stmts = $db->prepare('SELECT * FROM sccpline WHERE name = $data[name]'); } break; case "SccpDevice": - $filtred =''; - $singlrow = false; + $filtered =''; + $singlerow = false; if (empty($data['fields'])) { - $fld = '`name`,`name` as `mac`, `type`, `button`, `addon`, `_description` as description'; + $fld = 'name, name as mac, type, button, addon, _description as description'; } else { switch ($data['fields']) { case "all": @@ -78,30 +78,29 @@ class dbinterface } } if (!empty($data['name'])) { - $filtred = "`name`='" . $data['name']. "'"; - ; - $singlrow = true; + $filtered = 'name =' . $data['name']. ''; + $singlerow = true; } if (!empty($data['type'])) { switch ($data['type']) { case "cisco-sip": - $filtred = "`TYPE` LIKE '%-sip'"; + $filtered = 'TYPE LIKE \'%-sip\''; break; case "cisco": default: - $filtred = "`TYPE` not LIKE '%-sip'"; + $filtered = 'TYPE not LIKE \'%-sip\''; break; } } - if (empty($filtred)) { - $sql = "SELECT ". $fld ." FROM `sccpdeviceconfig` ORDER BY `name`"; + if (empty($filtered)) { + $sql = 'SELECT ' . $fld . ' FROM sccpdeviceconfig ORDER BY name'; } else { - $sql = "SELECT ". $fld ." FROM `sccpdeviceconfig` WHERE ".$filtred." ORDER BY `name`"; + $sql = 'SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE '. $filtered . ' ORDER BY name'; } - if ($singlrow) { - $raw_settings = sql($sql, "getRow", DB_FETCHMODE_ASSOC); + if ($singlerow) { + $stmt = $db->prepare($sql); } else { - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $stmts = $db->prepare($sql); } break; case "HWSipDevice": @@ -115,26 +114,26 @@ class dbinterface break; case "get_colums_sccpdevice": $sql = "DESCRIBE sccpdevice"; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $stmt = $db->prepare($sql); break; case "get_colums_sccpuser": $sql = "DESCRIBE sccpuser"; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $stmts = $db->prepare($sql); break; case "get_sccpdevice_byid": $sql = 'SELECT t1.*, types.dns, types.buttons, types.loadimage, types.nametemplate as nametemplate, ' . 'addon.buttons as addon_buttons FROM sccpdevice AS t1 ' . 'LEFT JOIN sccpdevmodel as types ON t1.type=types.model ' - . 'LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name="' . $data['id'] . '";'; - $raw_settings = sql($sql, "getRow", DB_FETCHMODE_ASSOC); + . 'LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name="' . $data['id'] . ''; + $stmt = $db->prepare($sql); break; case "get_sccpuser": - $sql = "SELECT * FROM `sccpuser` "; + $sql = 'SELECT * FROM sccpuser '; if (!empty($data['id'])) { - $sql .= 'WHERE name="' . $data['id'] . '" '; + $sql .= 'WHERE name= ' . $data['id'] . ''; } - $sql .= "ORDER BY `name`;"; - $raw_settings = sql($sql, "getRow", DB_FETCHMODE_ASSOC); + $sql .= ' ORDER BY name'; + $stmt = $db->prepare($sql); break; case "get_sccpdevice_buttons": $sql = ''; @@ -145,29 +144,40 @@ class dbinterface $sql .= (empty($sql)) ? 'ref="' . $data['id'] . '" ' : 'and ref="' . $data['id'] . '" '; } if (!empty($sql)) { - $sql = 'SELECT * FROM sccpbuttonconfig WHERE ' .$sql. 'ORDER BY `instance`;'; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $sql = 'SELECT * FROM sccpbuttonconfig WHERE ' .$sql. ' ORDER BY `instance`;'; + $stmts = $db->prepare($sql); } else { $raw_settings = array(); } break; } - + if (!empty($stmt)) { + $stmt->execute(); + $raw_settings = $stmt->fetch(\PDO::FETCH_ASSOC); + } elseif (!empty($stmts)) { + $stmts->execute(); + $raw_settings = $stmts->fetchAll(\PDO::FETCH_ASSOC); + } return $raw_settings; } public function get_db_SccpSetting() { - $sql = "SELECT `keyword`, `data`, `type`, `seq` FROM `sccpsettings` ORDER BY `type`, `seq`"; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); - return $raw_settings; + global $db; + $stmt = $db->prepare('SELECT keyword, data, type, seq FROM sccpsettings ORDER BY type, seq'); + $stmt->execute(); + foreach ($stmt->fetchAll() as $var) { + $mysccpvalues[$var['keyword']] = array('keyword' => $var['keyword'], 'data' => $var['data'], 'seq' => $var['seq'], 'type' => $var['type']); + } + return $mysccpvalues; } public function get_db_sysvalues() { - $sql = "SHOW VARIABLES LIKE '%group_concat%'"; - $raw_settings = sql($sql, "getRow", DB_FETCHMODE_ASSOC); - return $raw_settings; + global $db; + $stmt = $db->prepare('SHOW VARIABLES LIKE \'%group_concat%\''); + $stmt->execute(); + return $stmt->fetch(\PDO::FETCH_ASSOC); } /* @@ -186,20 +196,19 @@ class dbinterface $sel_inf = "*"; break; } - $sel_inf .= ", '0' as 'validate'"; switch ($get) { case "byciscoid": if (!empty($filter)) { if (!empty($filter['model'])) { if (strpos($filter['model'], 'loadInformation')) { - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (`loadinformationid` ='" . $filter['model'] . "') ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid =' . $filter['model'] . ') ORDER BY model'; } else { - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (`loadinformationid` ='loadInformation" . $filter['model'] . "') ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid =loadInformation' . $filter['model'] . ') ORDER BY model'; } } else { // $sql = "SELECT ".$filter['model']; - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; } break; } @@ -207,86 +216,87 @@ class dbinterface case "byid": if (!empty($filter)) { if (!empty($filter['model'])) { - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (`model` ='" . $filter['model'] . "') ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (model =' . $filter['model'] . ') ORDER BY model'; } else { // $sql = "SELECT ".$filter['model']; - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; } break; } break; case "extension": - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (dns = 0) and (enabled > 0) ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns = 0) and (enabled > 0) ORDER BY model'; //check table break; case "enabled": + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE enabled > 0 ORDER BY model '; + break; case "phones": - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) ORDER BY model "; -// $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (enabled > 0) ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) ORDER BY model '; //check table break; case "ciscophones": - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND `vendor` not LIKE '%-sip' ORDER BY model "; -// $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (enabled > 0) ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND vendor NOT LIKE \'%-sip\' ORDER BY model'; break; case "sipphones": - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND `vendor` LIKE '%-sip' ORDER BY model "; -// $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (enabled > 0) ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND `vendor` LIKE \'%-sip\' ORDER BY model'; break; case "all": + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; + break; default: - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; break; } - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); - return $raw_settings; + $stmt = $db->prepare($sql); + $stmt->execute(); + return $stmt->fetchAll(); } - function write($db_name = "", $save_value = array(), $mode = 'update', $key_fld = "", $hwid = "") + function write($table_name = "", $save_value = array(), $mode = 'update', $key_fld = "", $hwid = "") { - // mode clear - Empty tabele before update + // mode clear - Empty table before update // mode update - update / replace record global $db; // global $amp_conf; - $result = "Error"; + $result = false; $delete_value = array(); - switch ($db_name) { + switch ($table_name) { case 'sccpsettings': foreach ($save_value as $key_v => $data) { - if (!empty($data)) { - if (isset($data[1])) { - if ($data[1] == $this->val_null) { + if (!empty($data) && isset($data['data'])) { + if ($data['data'] == $this->val_null) { $delete_value[] = $save_value[$key_v]['keyword']; unset($save_value[$key_v]); } - } - if (isset($data['data'])) { +/* if (isset($data['data'])) { if ($data['data'] == $this->val_null) { $delete_value[] = $save_value[$key_v]['keyword']; unset($save_value[$key_v]); } } - } +*/ } } if ($mode == 'clear') { - $sql = 'truncate `sccpsettings`'; - $stmt = $db->prepare($sql); - $stmt->execute(); - $stmt = $db->prepare('INSERT INTO `sccpsettings` (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); +// $sql = 'truncate `sccpsettings`'; + $db->prepare('TRUNCATE sccpsettings')->execute(); + $stmt = $db->prepare('INSERT INTO sccpsettings (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); $result = $db->executeMultiple($stmt, $save_value); } else { if (!empty($delete_value)) { - $stmt = $db->prepare('DELETE FROM `sccpsettings` WHERE `keyword`=?'); + $stmt = $db->prepare('DELETE FROM sccpsettings WHERE `keyword`=?'); $result = $db->executeMultiple($stmt, $delete_value); } if (!empty($save_value)) { - $stmt = $db->prepare('REPLACE INTO `sccpsettings` (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); + $stmt = $db->prepare('REPLACE INTO sccpsettings (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); $result = $db->executeMultiple($stmt, $save_value); } } break; case 'sccpdevmodel': + break; case 'sccpdevice': + break; case 'sccpuser': - $sql_db = $db_name; + $sql_db = $table_name; $sql_key = ""; $sql_var = ""; foreach ($save_value as $key_v => $data) { @@ -304,23 +314,21 @@ class dbinterface } if (!empty($sql_var)) { if ($mode == 'delete') { - $req = 'DELETE FROM `' . $sql_db . '` WHERE ' . $sql_key . ';'; + $req = 'DELETE FROM sccpuser WHERE ' . $sql_key . ''; } else { if ($mode == 'update') { - $req = 'UPDATE `' . $sql_db . '` SET ' . $sql_var . ' WHERE ' . $sql_key . ';'; + $req = 'UPDATE sccpuser SET ' . $sql_var . WHERE . $sql_key . ''; } else { - $req = 'REPLACE INTO `' . $sql_db . '` SET ' . $sql_var . ';'; + $req = 'REPLACE INTO sccpuser SET ' . $sql_var . ''; } } } - $stmt = $db->prepare($req); - $result = $stmt->execute(); + $result = $db->prepare($req)->execute(); break; case 'sccpbuttons': if (($mode == 'clear') || ($mode == 'delete')) { - $sql = 'DELETE FROM `sccpbuttonconfig` WHERE ref="' . $hwid . '";'; - $stmt = $db->prepare($sql); - $stmt->execute(); + $sql = 'DELETE FROM sccpbuttonconfig WHERE ref=' . $hwid . ''; + $result = $db->prepare($sql)->execute(); } if ($mode == 'delete') { break; @@ -329,13 +337,13 @@ class dbinterface break; } if ($mode == 'replace') { - $sql = 'UPDATE `sccpbuttonconfig` SET `name`=? WHERE `ref`= ? AND `reftype`=? AND `instance`=? AND `buttontype`=?;'; + $sql = 'UPDATE sccpbuttonconfig SET `name`=? WHERE `ref`= ? AND `reftype`=? AND `instance`=? AND `buttontype`=?'; // $sql = 'INSERT INTO `sccpbuttonconfig` (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?);'; // die(print_r($save_value,1)); $stmt = $db->prepare($sql); $result= $db->executeMultiple($stmt, $save_value); } else { - $sql = 'INSERT INTO `sccpbuttonconfig` (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?);'; + $sql = 'INSERT INTO sccpbuttonconfig (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?)'; // die(print_r($save_value,1)); $stmt = $db->prepare($sql); $result = $db->executeMultiple($stmt, $save_value); @@ -356,18 +364,18 @@ class dbinterface $result = exec('mysqldump '.$database.' --password='.$pass.' --user='.$user.' --single-transaction >'.$filename, $output); return $filename; } - + /* * Check Table structure */ public function validate() { global $db; + $result = false; $check_fields = array('430' => array('_hwlang' => "varchar(12)"), '431' => array('private'=> "enum('on','off')"), '433' => array('directed_pickup'=>'') ); - $sql = "DESCRIBE `sccpdevice`;"; - $raw_result = sql($sql, "getAll", DB_FETCHMODE_ASSOC); - $result = 0; - foreach ($raw_result as $value) { + $stmt = $db->prepare('DESCRIBE sccpdevice'); + $stmt->execute(); + foreach ($stmt->fetchAll() as $value) { $id_result[$value['Field']] = $value['Type']; } foreach ($check_fields as $key => $value) { @@ -393,7 +401,7 @@ class dbinterface break; } } - + return $result; } } From c1fb9370bd1666dd856e88540a145022a3dff5e3 Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Sun, 7 Feb 2021 14:48:49 +0100 Subject: [PATCH 02/19] Test for chan_sccp_b version compatibility SoftKeySets fails with chan_sccp-b prior to revision number 11048. Check the version with the installer, and subsequently to ensure do not get exception. --- .../aminterface/oldinterface.class.php | 2 +- Sccp_manager.inc/srvinterface.class.php | 28 +++++++++++++------ install.php | 19 ++++++++++--- views/server.info.php | 3 ++ 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/Sccp_manager.inc/aminterface/oldinterface.class.php b/Sccp_manager.inc/aminterface/oldinterface.class.php index 1719f63..a8d8c86 100644 --- a/Sccp_manager.inc/aminterface/oldinterface.class.php +++ b/Sccp_manager.inc/aminterface/oldinterface.class.php @@ -306,7 +306,7 @@ class oldinterface $result["vCode"] = 433; } else { $result["vCode"] = 430; - } + } } } diff --git a/Sccp_manager.inc/srvinterface.class.php b/Sccp_manager.inc/srvinterface.class.php index cf8eea5..f6b3542 100644 --- a/Sccp_manager.inc/srvinterface.class.php +++ b/Sccp_manager.inc/srvinterface.class.php @@ -15,6 +15,7 @@ class srvinterface { var $error; var $_info; var $ami_mode; + var $useAmiForSoftKeys = true; public function __construct($parent_class = null) { $this->paren_class = $parent_class; @@ -206,24 +207,35 @@ class srvinterface { */ } } - public function get_compatible_sccp() { - + public function get_compatible_sccp($revNumComp=false) { + // only called with args from installer to get revision and compatibility $res = $this->getSCCPVersion(); if (empty($res)) { return 0; } switch ($res["vCode"]) { case 0: - return 0; + $retval = 0; + break; case 433: - return 433; - + $retval = 433; + break; case 432: + $retval = 430; + break; case 431: - return 431; + $retval = 431; + break; default: - return 430; + $retval = 430; } + if ($res['RevisionNum'] < 11048) { + $this->useAmiForSoftKeys = false; + } + if ($revNumComp) { + return array($retval, $this->useAmiForSoftKeys); + } + return $retval; } public function getSCCPVersion() { @@ -236,7 +248,7 @@ class srvinterface { public function sccp_list_keysets() { - if ($this->ami_mode) { + if (($this->ami_mode) && ($this->useAmiForSoftKeys)){ return $this->aminterface->sccp_list_keysets(); } else { return $this->oldinterface->sccp_list_keysets(); diff --git a/install.php b/install.php index 6c4f298..6e5c510 100644 --- a/install.php +++ b/install.php @@ -17,6 +17,7 @@ global $astman; global $version; global $srvinterface; global $mobile_hw; +global $useAmiForSoftKeys; $mobile_hw = '0'; $class = "\\FreePBX\\Modules\\Sccp_manager\\srvinterface"; @@ -375,6 +376,7 @@ $table_req = array('sccpdevice', 'sccpline'); $ss = FreePBX::create()->Sccp_manager; $astman = FreePBX::create()->astman; $sccp_compatible = 0; +$chanSCCPWarning = true; //$db_config = $db_config_v0; $db_config = ''; @@ -445,13 +447,13 @@ function CheckAsteriskVersion() function CheckChanSCCPCompatible() { + global $chanSCCPWarning; global $srvinterface, $astman; if (!$astman) { ie_freepbx('No asterisk manager connection provided!. Installation Failed'); } - $sccp_compatible = $srvinterface->get_compatible_sccp(); - outn("
  • " . _("Sccp model Compatible code : ") . $sccp_compatible . "
  • "); - return $sccp_compatible; + // calling with true returns array with compatibility and RevisionNumber + return $srvinterface->get_compatible_sccp(true); } function InstallDB_Buttons() @@ -964,7 +966,11 @@ function Setup_RealTime() CheckSCCPManagerDBTables($table_req); #CheckPermissions(); CheckAsteriskVersion(); -$sccp_compatible = CheckChanSCCPCompatible(); +$sccp_version = array(); +$sccp_version = CheckChanSCCPCompatible(); +$sccp_compatible = $sccp_version[0]; +$chanSCCPWarning = $sccp_version[1] ^= 1; +outn("
  • " . _("Sccp model Compatible code : ") . $resultReturned[0] . "
  • "); if ($sccp_compatible == 0) { // die_freepbx('Chan Sccp not Found. Install it before continuing'); outn("
    "); @@ -995,6 +1001,11 @@ if (!$sccp_db_ver) { InstallDB_createButtonConfigTrigger(); InstallDB_CreateSccpDeviceConfigView($sccp_compatible); InstallDB_updateDBVer($sccp_compatible); +dbug('chanSCCPWarning',$chanSCCPWarning); +if ($chanSCCPWarning) { + outn("
    "); + outn("Warning: Upgrade chan_sccp_b to use full ami functionality"); +} if (!$sccp_db_ver) { Setup_RealTime(); outn("
    "); diff --git a/views/server.info.php b/views/server.info.php index 3982fed..56da782 100644 --- a/views/server.info.php +++ b/views/server.info.php @@ -36,6 +36,9 @@ $info['aminterface'] = $this->aminterface->info(); $info['XML'] = $this->xmlinterface->info(); $info['sccp_class'] = $driver['sccp']; $info['Core_sccp'] = array('Version' => $core['Version'], 'about' => 'Sccp ver.' . $core['Version'] . ' r' . $core['vCode'] . ' Revision :' . $core['RevisionNum'] . ' Hash :' . $core['RevisionHash']); +if (!$this->srvinterface->useAmiForSoftKeys) { + $info['Core_sccp'] = array('Version' => $core['Version'], 'about' => 'Sccp ver.' . $core['Version'] . ' r' . $core['vCode'] . ' Revision :' . $core['RevisionNum'] . ' Hash :' . $core['RevisionHash'] . ' ----Warning: Upgrade chan_sccp to use full ami functionality'); +} $info['Asterisk'] = array('Version' => FreePBX::Config()->get('ASTVERSION'), 'about' => 'Asterisk.'); From c104b0e8feab92524e2922ee200116b2ceef3067 Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Sat, 6 Feb 2021 17:26:37 +0100 Subject: [PATCH 03/19] Switch to PDO model Switch to PDO model and correct transactions --- Sccp_manager.class.php | 32 +++-- Sccp_manager.inc/dbinterface.class.php | 180 +++++++++++++------------ 2 files changed, 112 insertions(+), 100 deletions(-) diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index dba8c84..a4ad284 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -169,6 +169,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { $this->xml_data = simplexml_load_file($xml_vars); $this->initVarfromXml(); // Overwrite Exist } + $this->saveSccpSettings(); } /* @@ -269,25 +270,25 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { /* unused but FPBX API requires it */ public function install() { - + } /* unused but FPBX API requires it */ public function uninstall() { - + } /* unused but FPBX API requires it */ public function backup() { - + } /* unused but FPBX API requires it */ public function restore($backup) { - + } public function getActionBar($request) { @@ -815,7 +816,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { $hw_list[] = array('name' => $idv); } if ($idv == 'all') { - + } } } @@ -1483,10 +1484,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } public function getSccpSettingFromDB() { - $raw_data = $this->dbinterface->get_db_SccpSetting(); - foreach ($raw_data as $var) { - $this->sccpvalues[$var['keyword']] = array('keyword' => $var['keyword'], 'data' => $var['data'], 'seq' => $var['seq'], 'type' => $var['type']); - } + $this->sccpvalues = $this->dbinterface->get_db_SccpSetting(); return; } @@ -1864,19 +1862,25 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { // global $db; // global $amp_conf; - $save_settings = array(); +// $save_settings = array(); if (empty($save_value)) { - foreach ($this->sccpvalues as $key => $val) { + $this->dbinterface->write('sccpsettings', $this->sccpvalues, 'clear'); + +/* foreach ($this->sccpvalues as $key => $val) { if ((trim($val['data']) !== '') or ($val['data'] == '0')) { - $save_settings[] = array($key, $db->escapeSimple($val['data']), $val['seq'], $val['type']); + $save_settings[] = array($key, $val['data'], $val['seq'], $val['type']); + } else { + $unsaved_settings[] = array($key, $val['data'], $val['seq'], $val['type']); } } $this->dbinterface->write('sccpsettings', $save_settings, 'clear'); +*/ } else { $this->dbinterface->write('sccpsettings', $save_value, 'update'); - return true; } return true; +// } +// return true; } /* @@ -2093,7 +2097,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } // [Namesoftkeyset] // type=softkeyset - // + // // ----- It is a very bad idea to add an external configuration file "sccp_custom.conf" !!!! // This will add problems when solving problems caused by unexpected solutions from users. // diff --git a/Sccp_manager.inc/dbinterface.class.php b/Sccp_manager.inc/dbinterface.class.php index efcb398..b4ee6ee 100644 --- a/Sccp_manager.inc/dbinterface.class.php +++ b/Sccp_manager.inc/dbinterface.class.php @@ -21,7 +21,7 @@ class dbinterface public function info() { - $Ver = '13.0.2'; + $Ver = '13.0.2'; // This should be updated return array('Version' => $Ver, 'about' => 'Data access interface ver: ' . $Ver); } @@ -45,25 +45,25 @@ class dbinterface public function HWextension_db_SccpTableData($dataid, $data = array()) { + global $db; + $stmt = ''; + $stmts = ''; if ($dataid == '') { return false; } switch ($dataid) { case "SccpExtension": if (empty($data['name'])) { - $sql = "SELECT * FROM `sccpline` ORDER BY `name`"; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $stmts = $db->prepare('SELECT * FROM sccpline ORDER BY name'); } else { - $sql = "SELECT * FROM `sccpline` WHERE `name`='" . $data['name']. "'"; - ; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $stmts = $db->prepare('SELECT * FROM sccpline WHERE name = $data[name]'); } break; case "SccpDevice": - $filtred =''; - $singlrow = false; + $filtered =''; + $singlerow = false; if (empty($data['fields'])) { - $fld = '`name`,`name` as `mac`, `type`, `button`, `addon`, `_description` as description'; + $fld = 'name, name as mac, type, button, addon, _description as description'; } else { switch ($data['fields']) { case "all": @@ -78,30 +78,29 @@ class dbinterface } } if (!empty($data['name'])) { - $filtred = "`name`='" . $data['name']. "'"; - ; - $singlrow = true; + $filtered = 'name =' . $data['name']. ''; + $singlerow = true; } if (!empty($data['type'])) { switch ($data['type']) { case "cisco-sip": - $filtred = "`TYPE` LIKE '%-sip'"; + $filtered = 'TYPE LIKE \'%-sip\''; break; case "cisco": default: - $filtred = "`TYPE` not LIKE '%-sip'"; + $filtered = 'TYPE not LIKE \'%-sip\''; break; } } - if (empty($filtred)) { - $sql = "SELECT ". $fld ." FROM `sccpdeviceconfig` ORDER BY `name`"; + if (empty($filtered)) { + $sql = 'SELECT ' . $fld . ' FROM sccpdeviceconfig ORDER BY name'; } else { - $sql = "SELECT ". $fld ." FROM `sccpdeviceconfig` WHERE ".$filtred." ORDER BY `name`"; + $sql = 'SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE '. $filtered . ' ORDER BY name'; } - if ($singlrow) { - $raw_settings = sql($sql, "getRow", DB_FETCHMODE_ASSOC); + if ($singlerow) { + $stmt = $db->prepare($sql); } else { - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $stmts = $db->prepare($sql); } break; case "HWSipDevice": @@ -115,26 +114,26 @@ class dbinterface break; case "get_colums_sccpdevice": $sql = "DESCRIBE sccpdevice"; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $stmt = $db->prepare($sql); break; case "get_colums_sccpuser": $sql = "DESCRIBE sccpuser"; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $stmts = $db->prepare($sql); break; case "get_sccpdevice_byid": $sql = 'SELECT t1.*, types.dns, types.buttons, types.loadimage, types.nametemplate as nametemplate, ' . 'addon.buttons as addon_buttons FROM sccpdevice AS t1 ' . 'LEFT JOIN sccpdevmodel as types ON t1.type=types.model ' - . 'LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name="' . $data['id'] . '";'; - $raw_settings = sql($sql, "getRow", DB_FETCHMODE_ASSOC); + . 'LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name="' . $data['id'] . ''; + $stmt = $db->prepare($sql); break; case "get_sccpuser": - $sql = "SELECT * FROM `sccpuser` "; + $sql = 'SELECT * FROM sccpuser '; if (!empty($data['id'])) { - $sql .= 'WHERE name="' . $data['id'] . '" '; + $sql .= 'WHERE name= ' . $data['id'] . ''; } - $sql .= "ORDER BY `name`;"; - $raw_settings = sql($sql, "getRow", DB_FETCHMODE_ASSOC); + $sql .= ' ORDER BY name'; + $stmt = $db->prepare($sql); break; case "get_sccpdevice_buttons": $sql = ''; @@ -145,29 +144,40 @@ class dbinterface $sql .= (empty($sql)) ? 'ref="' . $data['id'] . '" ' : 'and ref="' . $data['id'] . '" '; } if (!empty($sql)) { - $sql = 'SELECT * FROM sccpbuttonconfig WHERE ' .$sql. 'ORDER BY `instance`;'; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $sql = 'SELECT * FROM sccpbuttonconfig WHERE ' .$sql. ' ORDER BY `instance`;'; + $stmts = $db->prepare($sql); } else { $raw_settings = array(); } break; } - + if (!empty($stmt)) { + $stmt->execute(); + $raw_settings = $stmt->fetch(\PDO::FETCH_ASSOC); + } elseif (!empty($stmts)) { + $stmts->execute(); + $raw_settings = $stmts->fetchAll(\PDO::FETCH_ASSOC); + } return $raw_settings; } public function get_db_SccpSetting() { - $sql = "SELECT `keyword`, `data`, `type`, `seq` FROM `sccpsettings` ORDER BY `type`, `seq`"; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); - return $raw_settings; + global $db; + $stmt = $db->prepare('SELECT keyword, data, type, seq FROM sccpsettings ORDER BY type, seq'); + $stmt->execute(); + foreach ($stmt->fetchAll() as $var) { + $mysccpvalues[$var['keyword']] = array('keyword' => $var['keyword'], 'data' => $var['data'], 'seq' => $var['seq'], 'type' => $var['type']); + } + return $mysccpvalues; } public function get_db_sysvalues() { - $sql = "SHOW VARIABLES LIKE '%group_concat%'"; - $raw_settings = sql($sql, "getRow", DB_FETCHMODE_ASSOC); - return $raw_settings; + global $db; + $stmt = $db->prepare('SHOW VARIABLES LIKE \'%group_concat%\''); + $stmt->execute(); + return $stmt->fetch(\PDO::FETCH_ASSOC); } /* @@ -186,20 +196,19 @@ class dbinterface $sel_inf = "*"; break; } - $sel_inf .= ", '0' as 'validate'"; switch ($get) { case "byciscoid": if (!empty($filter)) { if (!empty($filter['model'])) { if (strpos($filter['model'], 'loadInformation')) { - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (`loadinformationid` ='" . $filter['model'] . "') ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid =' . $filter['model'] . ') ORDER BY model'; } else { - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (`loadinformationid` ='loadInformation" . $filter['model'] . "') ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid =loadInformation' . $filter['model'] . ') ORDER BY model'; } } else { // $sql = "SELECT ".$filter['model']; - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; } break; } @@ -207,86 +216,87 @@ class dbinterface case "byid": if (!empty($filter)) { if (!empty($filter['model'])) { - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (`model` ='" . $filter['model'] . "') ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (model =' . $filter['model'] . ') ORDER BY model'; } else { // $sql = "SELECT ".$filter['model']; - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; } break; } break; case "extension": - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (dns = 0) and (enabled > 0) ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns = 0) and (enabled > 0) ORDER BY model'; //check table break; case "enabled": + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE enabled > 0 ORDER BY model '; + break; case "phones": - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) ORDER BY model "; -// $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (enabled > 0) ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) ORDER BY model '; //check table break; case "ciscophones": - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND `vendor` not LIKE '%-sip' ORDER BY model "; -// $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (enabled > 0) ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND vendor NOT LIKE \'%-sip\' ORDER BY model'; break; case "sipphones": - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND `vendor` LIKE '%-sip' ORDER BY model "; -// $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (enabled > 0) ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND `vendor` LIKE \'%-sip\' ORDER BY model'; break; case "all": + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; + break; default: - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; break; } - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); - return $raw_settings; + $stmt = $db->prepare($sql); + $stmt->execute(); + return $stmt->fetchAll(); } - function write($db_name = "", $save_value = array(), $mode = 'update', $key_fld = "", $hwid = "") + function write($table_name = "", $save_value = array(), $mode = 'update', $key_fld = "", $hwid = "") { - // mode clear - Empty tabele before update + // mode clear - Empty table before update // mode update - update / replace record global $db; // global $amp_conf; - $result = "Error"; + $result = false; $delete_value = array(); - switch ($db_name) { + switch ($table_name) { case 'sccpsettings': foreach ($save_value as $key_v => $data) { - if (!empty($data)) { - if (isset($data[1])) { - if ($data[1] == $this->val_null) { + if (!empty($data) && isset($data['data'])) { + if ($data['data'] == $this->val_null) { $delete_value[] = $save_value[$key_v]['keyword']; unset($save_value[$key_v]); } - } - if (isset($data['data'])) { +/* if (isset($data['data'])) { if ($data['data'] == $this->val_null) { $delete_value[] = $save_value[$key_v]['keyword']; unset($save_value[$key_v]); } } - } +*/ } } if ($mode == 'clear') { - $sql = 'truncate `sccpsettings`'; - $stmt = $db->prepare($sql); - $stmt->execute(); - $stmt = $db->prepare('INSERT INTO `sccpsettings` (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); +// $sql = 'truncate `sccpsettings`'; + $db->prepare('TRUNCATE sccpsettings')->execute(); + $stmt = $db->prepare('INSERT INTO sccpsettings (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); $result = $db->executeMultiple($stmt, $save_value); } else { if (!empty($delete_value)) { - $stmt = $db->prepare('DELETE FROM `sccpsettings` WHERE `keyword`=?'); + $stmt = $db->prepare('DELETE FROM sccpsettings WHERE `keyword`=?'); $result = $db->executeMultiple($stmt, $delete_value); } if (!empty($save_value)) { - $stmt = $db->prepare('REPLACE INTO `sccpsettings` (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); + $stmt = $db->prepare('REPLACE INTO sccpsettings (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); $result = $db->executeMultiple($stmt, $save_value); } } break; case 'sccpdevmodel': + break; case 'sccpdevice': + break; case 'sccpuser': - $sql_db = $db_name; + $sql_db = $table_name; $sql_key = ""; $sql_var = ""; foreach ($save_value as $key_v => $data) { @@ -304,23 +314,21 @@ class dbinterface } if (!empty($sql_var)) { if ($mode == 'delete') { - $req = 'DELETE FROM `' . $sql_db . '` WHERE ' . $sql_key . ';'; + $req = 'DELETE FROM sccpuser WHERE ' . $sql_key . ''; } else { if ($mode == 'update') { - $req = 'UPDATE `' . $sql_db . '` SET ' . $sql_var . ' WHERE ' . $sql_key . ';'; + $req = 'UPDATE sccpuser SET ' . $sql_var . WHERE . $sql_key . ''; } else { - $req = 'REPLACE INTO `' . $sql_db . '` SET ' . $sql_var . ';'; + $req = 'REPLACE INTO sccpuser SET ' . $sql_var . ''; } } } - $stmt = $db->prepare($req); - $result = $stmt->execute(); + $result = $db->prepare($req)->execute(); break; case 'sccpbuttons': if (($mode == 'clear') || ($mode == 'delete')) { - $sql = 'DELETE FROM `sccpbuttonconfig` WHERE ref="' . $hwid . '";'; - $stmt = $db->prepare($sql); - $stmt->execute(); + $sql = 'DELETE FROM sccpbuttonconfig WHERE ref=' . $hwid . ''; + $result = $db->prepare($sql)->execute(); } if ($mode == 'delete') { break; @@ -329,13 +337,13 @@ class dbinterface break; } if ($mode == 'replace') { - $sql = 'UPDATE `sccpbuttonconfig` SET `name`=? WHERE `ref`= ? AND `reftype`=? AND `instance`=? AND `buttontype`=?;'; + $sql = 'UPDATE sccpbuttonconfig SET `name`=? WHERE `ref`= ? AND `reftype`=? AND `instance`=? AND `buttontype`=?'; // $sql = 'INSERT INTO `sccpbuttonconfig` (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?);'; // die(print_r($save_value,1)); $stmt = $db->prepare($sql); $result= $db->executeMultiple($stmt, $save_value); } else { - $sql = 'INSERT INTO `sccpbuttonconfig` (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?);'; + $sql = 'INSERT INTO sccpbuttonconfig (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?)'; // die(print_r($save_value,1)); $stmt = $db->prepare($sql); $result = $db->executeMultiple($stmt, $save_value); @@ -356,18 +364,18 @@ class dbinterface $result = exec('mysqldump '.$database.' --password='.$pass.' --user='.$user.' --single-transaction >'.$filename, $output); return $filename; } - + /* * Check Table structure */ public function validate() { global $db; + $result = false; $check_fields = array('430' => array('_hwlang' => "varchar(12)"), '431' => array('private'=> "enum('on','off')"), '433' => array('directed_pickup'=>'') ); - $sql = "DESCRIBE `sccpdevice`;"; - $raw_result = sql($sql, "getAll", DB_FETCHMODE_ASSOC); - $result = 0; - foreach ($raw_result as $value) { + $stmt = $db->prepare('DESCRIBE sccpdevice'); + $stmt->execute(); + foreach ($stmt->fetchAll() as $value) { $id_result[$value['Field']] = $value['Type']; } foreach ($check_fields as $key => $value) { @@ -393,7 +401,7 @@ class dbinterface break; } } - + return $result; } } From 22e1939acedd711114e4e8ef85593343ebdb9c2b Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Sun, 7 Feb 2021 16:09:35 +0100 Subject: [PATCH 04/19] Cleaning up Simplify structure and fix errors --- Sccp_manager.inc/dbinterface.class.php | 71 ++++++++++++-------------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/Sccp_manager.inc/dbinterface.class.php b/Sccp_manager.inc/dbinterface.class.php index b4ee6ee..674f69e 100644 --- a/Sccp_manager.inc/dbinterface.class.php +++ b/Sccp_manager.inc/dbinterface.class.php @@ -31,20 +31,21 @@ class dbinterface */ public function get_db_SccpTableByID($dataid, $data = array(), $indexField = '') { - $resut = array(); + $result = array(); $raw = $this->HWextension_db_SccpTableData($dataid, $data); if (empty($raw) || empty($indexField)) { return $raw; } foreach ($raw as $value) { $id = $value[$indexField]; - $resut[$id] = $value; + $result[$id] = $value; } return $resut; } public function HWextension_db_SccpTableData($dataid, $data = array()) { + // $stmt is a single row fetch, $stmts is a fetchAll. global $db; $stmt = ''; $stmts = ''; @@ -52,14 +53,14 @@ class dbinterface return false; } switch ($dataid) { - case "SccpExtension": + case 'SccpExtension': if (empty($data['name'])) { $stmts = $db->prepare('SELECT * FROM sccpline ORDER BY name'); } else { $stmts = $db->prepare('SELECT * FROM sccpline WHERE name = $data[name]'); } break; - case "SccpDevice": + case 'SccpDevice': $filtered =''; $singlerow = false; if (empty($data['fields'])) { @@ -103,20 +104,20 @@ class dbinterface $stmts = $db->prepare($sql); } break; - case "HWSipDevice": + case 'HWSipDevice': $raw_settings = $this->getDb_model_info($get = "sipphones", $format_list = "model"); break; - case "HWDevice": + case 'HWDevice': $raw_settings = $this->getDb_model_info($get = "ciscophones", $format_list = "model"); break; - case "HWextension": + case 'HWextension': $raw_settings = $this->getDb_model_info($get = "extension", $format_list = "model"); break; - case "get_colums_sccpdevice": + case 'get_colums_sccpdevice': $sql = "DESCRIBE sccpdevice"; $stmt = $db->prepare($sql); break; - case "get_colums_sccpuser": + case 'get_colums_sccpuser': $sql = "DESCRIBE sccpuser"; $stmts = $db->prepare($sql); break; @@ -127,7 +128,7 @@ class dbinterface . 'LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name="' . $data['id'] . ''; $stmt = $db->prepare($sql); break; - case "get_sccpuser": + case 'get_sccpuser': $sql = 'SELECT * FROM sccpuser '; if (!empty($data['id'])) { $sql .= 'WHERE name= ' . $data['id'] . ''; @@ -135,13 +136,13 @@ class dbinterface $sql .= ' ORDER BY name'; $stmt = $db->prepare($sql); break; - case "get_sccpdevice_buttons": + case 'get_sccpdevice_buttons': $sql = ''; if (!empty($data['buttontype'])) { $sql .= 'buttontype="' . $data['buttontype'] . '" '; } if (!empty($data['id'])) { - $sql .= (empty($sql)) ? 'ref="' . $data['id'] . '" ' : 'and ref="' . $data['id'] . '" '; + $sql .= (empty($sql)) ? 'ref="' . $data['id'] . '" ' : 'and ref="' . $data['id'] . ''; } if (!empty($sql)) { $sql = 'SELECT * FROM sccpbuttonconfig WHERE ' .$sql. ' ORDER BY `instance`;'; @@ -204,7 +205,7 @@ class dbinterface if (strpos($filter['model'], 'loadInformation')) { $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid =' . $filter['model'] . ') ORDER BY model'; } else { - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid =loadInformation' . $filter['model'] . ') ORDER BY model'; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid = loadInformation' . $filter['model'] . ') ORDER BY model'; } } else { // $sql = "SELECT ".$filter['model']; @@ -326,36 +327,32 @@ class dbinterface $result = $db->prepare($req)->execute(); break; case 'sccpbuttons': - if (($mode == 'clear') || ($mode == 'delete')) { - $sql = 'DELETE FROM sccpbuttonconfig WHERE ref=' . $hwid . ''; - $result = $db->prepare($sql)->execute(); + switch ($mode) { + case 'clear': // no break here as clear is same as delete + case 'delete': + $sql = 'DELETE FROM sccpbuttonconfig WHERE ref=' . $hwid . ''; + $result = $db->prepare($sql)->execute(); + break; + case 'replace': + if (!empty($save_value)) { + $sql = 'UPDATE sccpbuttonconfig SET `name`=? WHERE `ref`= ? AND `reftype`=? AND `instance`=? AND `buttontype`=?'; + $stmt = $db->prepare($sql); + $result= $db->executeMultiple($stmt, $save_value); + } + break; + default: + if (!empty($save_value)) { + $sql = 'INSERT INTO sccpbuttonconfig (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?)'; + $stmt = $db->prepare($sql); + $result = $db->executeMultiple($stmt, $save_value); + } } - if ($mode == 'delete') { - break; - } - if (empty($save_value)) { - break; - } - if ($mode == 'replace') { - $sql = 'UPDATE sccpbuttonconfig SET `name`=? WHERE `ref`= ? AND `reftype`=? AND `instance`=? AND `buttontype`=?'; -// $sql = 'INSERT INTO `sccpbuttonconfig` (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?);'; -// die(print_r($save_value,1)); - $stmt = $db->prepare($sql); - $result= $db->executeMultiple($stmt, $save_value); - } else { - $sql = 'INSERT INTO sccpbuttonconfig (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?)'; -// die(print_r($save_value,1)); - $stmt = $db->prepare($sql); - $result = $db->executeMultiple($stmt, $save_value); - } - - break; } return $result; } /* - * My be Replace by SccpTables ??! + * Maybe Replace by SccpTables ??! * */ public function dump_sccp_tables($data_path, $database, $user, $pass) From 6664ab97af043a77030cd51fe7e866c369d9c59c Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Mon, 8 Feb 2021 15:27:35 +0100 Subject: [PATCH 05/19] Further clean ups and annotations Document changes --- Sccp_manager.class.php | 18 ++---- Sccp_manager.inc/dbinterface.class.php | 76 ++++++++++---------------- assets/js/sccp_manager.js | 11 ++-- views/advserver.model.php | 33 +++++------ 4 files changed, 56 insertions(+), 82 deletions(-) diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index a4ad284..41f577d 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -869,6 +869,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } break; case 'getDeviceModel': +dbug('getting Device model'); switch ($request['type']) { case 'all': case 'extension': @@ -929,6 +930,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { return $result; break; case 'getExtensionGrid': +dbug('getting Extension Grid'); $result = $this->dbinterface->HWextension_db_SccpTableData('SccpExtension'); if (empty($result)) { return array(); @@ -952,6 +954,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { return $result; break; case 'getPhoneGrid': +dbug('getting Phone Grid'); $cmd_type = !empty($request['type']) ? $request['type'] : ''; $result = $this->dbinterface->HWextension_db_SccpTableData('SccpDevice', array('type' => $cmd_type)); @@ -1865,22 +1868,10 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { // $save_settings = array(); if (empty($save_value)) { $this->dbinterface->write('sccpsettings', $this->sccpvalues, 'clear'); - -/* foreach ($this->sccpvalues as $key => $val) { - if ((trim($val['data']) !== '') or ($val['data'] == '0')) { - $save_settings[] = array($key, $val['data'], $val['seq'], $val['type']); - } else { - $unsaved_settings[] = array($key, $val['data'], $val['seq'], $val['type']); - } - } - $this->dbinterface->write('sccpsettings', $save_settings, 'clear'); -*/ } else { $this->dbinterface->write('sccpsettings', $save_value, 'update'); } return true; -// } -// return true; } /* @@ -2140,9 +2131,8 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } else { $dir_list = $this->findAllFiles($dir, $file_ext, 'fileonly'); } - $raw_settings = $this->dbinterface->getDb_model_info($get, $format_list, $filter); - +dbug('reloading table'); if ($validate) { for ($i = 0; $i < count($raw_settings); $i++) { $raw_settings[$i]['validate'] = '-;-'; diff --git a/Sccp_manager.inc/dbinterface.class.php b/Sccp_manager.inc/dbinterface.class.php index 674f69e..a4bd67e 100644 --- a/Sccp_manager.inc/dbinterface.class.php +++ b/Sccp_manager.inc/dbinterface.class.php @@ -121,7 +121,7 @@ class dbinterface $sql = "DESCRIBE sccpuser"; $stmts = $db->prepare($sql); break; - case "get_sccpdevice_byid": + case 'get_sccpdevice_byid': $sql = 'SELECT t1.*, types.dns, types.buttons, types.loadimage, types.nametemplate as nametemplate, ' . 'addon.buttons as addon_buttons FROM sccpdevice AS t1 ' . 'LEFT JOIN sccpdevmodel as types ON t1.type=types.model ' @@ -185,21 +185,15 @@ class dbinterface * Get Sccp Device Model information */ - function getDb_model_info($get = "all", $format_list = "all", $filter = array()) + function getDb_model_info($get = 'all', $format_list = 'all', $filter = array()) { global $db; - switch ($format_list) { - case "model": - $sel_inf = "model, vendor, dns, buttons"; - break; - case "all": - default: - $sel_inf = "*"; - break; + $sel_inf = '*, 0 as validate'; + if ($format_list === 'model') { + $sel_inf = 'model, vendor, dns, buttons, 0 as validate'; } - $sel_inf .= ", '0' as 'validate'"; switch ($get) { - case "byciscoid": + case 'byciscoid': if (!empty($filter)) { if (!empty($filter['model'])) { if (strpos($filter['model'], 'loadInformation')) { @@ -214,7 +208,7 @@ class dbinterface break; } break; - case "byid": + case 'byid': if (!empty($filter)) { if (!empty($filter['model'])) { $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (model =' . $filter['model'] . ') ORDER BY model'; @@ -225,31 +219,29 @@ class dbinterface break; } break; - case "extension": + case 'extension': $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns = 0) and (enabled > 0) ORDER BY model'; //check table break; - case "enabled": - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE enabled > 0 ORDER BY model '; + case 'enabled': + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE enabled > 0 ORDER BY model '; //previously this fell through to phones. break; - case "phones": + case 'phones': $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) ORDER BY model '; //check table break; - case "ciscophones": + case 'ciscophones': $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND vendor NOT LIKE \'%-sip\' ORDER BY model'; break; - case "sipphones": + case 'sipphones': $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND `vendor` LIKE \'%-sip\' ORDER BY model'; break; - case "all": - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; - break; + case 'all': // Fall through to default default: $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; break; } $stmt = $db->prepare($sql); $stmt->execute(); - return $stmt->fetchAll(); + return $stmt->fetchAll(\PDO::FETCH_ASSOC); } function write($table_name = "", $save_value = array(), $mode = 'update', $key_fld = "", $hwid = "") @@ -318,7 +310,7 @@ class dbinterface $req = 'DELETE FROM sccpuser WHERE ' . $sql_key . ''; } else { if ($mode == 'update') { - $req = 'UPDATE sccpuser SET ' . $sql_var . WHERE . $sql_key . ''; + $req = 'UPDATE sccpuser SET ' . $sql_var . 'WHERE ' . $sql_key . ''; } else { $req = 'REPLACE INTO sccpuser SET ' . $sql_var . ''; } @@ -368,37 +360,29 @@ class dbinterface public function validate() { global $db; - $result = false; - $check_fields = array('430' => array('_hwlang' => "varchar(12)"), '431' => array('private'=> "enum('on','off')"), '433' => array('directed_pickup'=>'') ); + $result = 0; + $check_fields = [ + '430' => ['_hwlang' => "varchar(12)"], + '431' => ['private'=> "enum('on','off')"], + '433' => ['directed_pickup'=>''] + ]; $stmt = $db->prepare('DESCRIBE sccpdevice'); $stmt->execute(); - foreach ($stmt->fetchAll() as $value) { + foreach ($stmt->fetchAll(\PDO::FETCH_ASSOC) as $value) { $id_result[$value['Field']] = $value['Type']; } foreach ($check_fields as $key => $value) { - $sub_result = true; - foreach ($value as $skey => $svalue) { - if (!empty($svalue)) { - if (empty($id_result[$skey])) { - $sub_result = false; - } else { - if (strtolower($id_result[$skey]) != strtolower($svalue)) { - $sub_result = false; - } - } - } else { - if (!empty($id_result[$skey])) { - $sub_result = false; + if (!empty(array_intersect_assoc($value, $id_result))) { + $result = $key; + } else { + // no match but maybe checking against an empty string so just need to check key does not exist + foreach ($value as $skey => $svalue) { + if (empty($svalue) && (!isset($id_result[$skey]))) { + $result = $key; } } } - if ($sub_result) { - $result = $key; - } else { - break; - } } - return $result; } } diff --git a/assets/js/sccp_manager.js b/assets/js/sccp_manager.js index b8502ff..d163635 100644 --- a/assets/js/sccp_manager.js +++ b/assets/js/sccp_manager.js @@ -241,7 +241,7 @@ $(document).ready(function () { } e.preventDefault(); }); - + // Form.buttons - Form.adddevice $('.futuretype').change(function (e) { var kid = $(this).data('id'); @@ -256,7 +256,7 @@ $(document).ready(function () { } } }); - + }); $('.buttontype').change(function (e) { @@ -627,7 +627,7 @@ $(document).ready(function () { i++; }); } - + if (datas === '') { if (confirm(conf_msg)) { datas = 'name[0]=all'; @@ -692,7 +692,7 @@ $(document).ready(function () { //}); -// Bootstrap table Enabled / Disabled buttons ( class="btn-tab-select") +// Bootstrap table Enable / Disable buttons ( class="btn-tab-select") $("table").on('check-all.bs.table', function (rows) { var id_fld = $(this).data('id'); $(".btn-tab-select").each(function () { @@ -1011,7 +1011,7 @@ function bs_page_reload() } function bs_alert(data, status, reload) { - + if (document.getElementById('hwalert') === null) { if (Array.isArray(data)) { data.forEach(function (entry) { @@ -1075,4 +1075,3 @@ function sleep(milliseconds) } } } - diff --git a/views/advserver.model.php b/views/advserver.model.php index d19ea78..0a999b4 100644 --- a/views/advserver.model.php +++ b/views/advserver.model.php @@ -13,12 +13,13 @@
    - +
    @@ -108,8 +109,8 @@
    Help.
    - - + +
    @@ -129,7 +130,7 @@
    Help.
    - +
    @@ -143,7 +144,7 @@ +
    @@ -169,7 +170,7 @@ Help.
    - +
    @@ -190,12 +191,12 @@ Help.
    - +
    + @@ -214,7 +215,7 @@ // function DispayInputFormatter(value, row, index) { // return (value == null) ? '' : ''; // } - + function DispayActionsModelFormatter(value, row, index) { var exp_model = ''; // exp_model += ''; @@ -236,12 +237,12 @@ return value; } - + function SetRowColor(row, index) { var tclass = "active"; if (row['enabled'] === 1) { tclass = (index % 2 === 0) ? "info" : "info"; - } + } if ((row['validate'] === 'yes;yes') || (row['validate'] === 'yes;-')) { // tclass = (row['enabled'] === '1') ? "danger" : "warning"; } else { @@ -249,7 +250,7 @@ } return {classes: tclass}; } - + function load_model(elmnt,clr) { // $("#edit_devmodel").text(clr); var drow = $("#table-models").bootstrapTable('getRowByUniqueId',clr); From 89d4e45f5ebfca2e2ff3a3cff7be518a4a1d9b60 Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Mon, 8 Feb 2021 17:41:19 +0100 Subject: [PATCH 06/19] Update Transactions and fix errors Reduce quoting level, and fix errors introduced by prior commits --- Sccp_manager.class.php | 4 +- Sccp_manager.inc/dbinterface.class.php | 63 ++++++++++++++------------ 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index 41f577d..1b77a3f 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -1165,7 +1165,7 @@ dbug('getting Phone Grid'); $save_settings = array(); $save_codec = array(); $name_dev = ''; - $db_field = $this->dbinterface->HWextension_db_SccpTableData("get_colums_sccpdevice"); + $db_field = $this->dbinterface->HWextension_db_SccpTableData("get_columns_sccpdevice"); $hw_id = (empty($get_settings['sccp_deviceid'])) ? 'new' : $get_settings['sccp_deviceid']; $hw_type = (empty($get_settings['sccp_device_typeid'])) ? 'sccpdevice' : $get_settings['sccp_device_typeid']; $update_hw = ($hw_id == 'new') ? 'update' : 'clear'; @@ -1407,7 +1407,7 @@ dbug('getting Phone Grid'); ); */ $name_dev = ''; - $db_field = $this->dbinterface->HWextension_db_SccpTableData("get_colums_sccpuser"); + $db_field = $this->dbinterface->HWextension_db_SccpTableData("get_columns_sccpuser"); // $hw_id = (empty($get_settings['sccp_deviceid'])) ? 'new' : $get_settings['sccp_deviceid']; // $update_hw = ($hw_id == 'new') ? 'update' : 'clear'; $hw_prefix = 'SEP'; diff --git a/Sccp_manager.inc/dbinterface.class.php b/Sccp_manager.inc/dbinterface.class.php index a4bd67e..0d3ee83 100644 --- a/Sccp_manager.inc/dbinterface.class.php +++ b/Sccp_manager.inc/dbinterface.class.php @@ -113,19 +113,19 @@ class dbinterface case 'HWextension': $raw_settings = $this->getDb_model_info($get = "extension", $format_list = "model"); break; - case 'get_colums_sccpdevice': - $sql = "DESCRIBE sccpdevice"; + case 'get_columns_sccpdevice': + $sql = 'DESCRIBE sccpdevice'; $stmt = $db->prepare($sql); break; - case 'get_colums_sccpuser': - $sql = "DESCRIBE sccpuser"; + case 'get_columns_sccpuser': + $sql = 'DESCRIBE sccpuser'; $stmts = $db->prepare($sql); break; case 'get_sccpdevice_byid': - $sql = 'SELECT t1.*, types.dns, types.buttons, types.loadimage, types.nametemplate as nametemplate, ' - . 'addon.buttons as addon_buttons FROM sccpdevice AS t1 ' - . 'LEFT JOIN sccpdevmodel as types ON t1.type=types.model ' - . 'LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name="' . $data['id'] . ''; + $sql = 'SELECT t1.*, types.dns, types.buttons, types.loadimage, types.nametemplate as nametemplate, + addon.buttons as addon_buttons FROM sccpdevice AS t1 + LEFT JOIN sccpdevmodel as types ON t1.type=types.model + LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name =\'' . $data['id'] . '\''; $stmt = $db->prepare($sql); break; case 'get_sccpuser': @@ -246,6 +246,13 @@ class dbinterface function write($table_name = "", $save_value = array(), $mode = 'update', $key_fld = "", $hwid = "") { +//dbug('entering write for table', $table_name); +if ($table_name === 'sccpdevmodel'){ +dbug('entering write with save_value', $save_value); +dbug('entering write with mode', $mode); +dbug('entering write with key_fld', $key_fld); +dbug('entering write with hwid', $hwid); +} // mode clear - Empty table before update // mode update - update / replace record global $db; @@ -271,25 +278,22 @@ class dbinterface if ($mode == 'clear') { // $sql = 'truncate `sccpsettings`'; $db->prepare('TRUNCATE sccpsettings')->execute(); - $stmt = $db->prepare('INSERT INTO sccpsettings (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); + $stmt = $db->prepare('INSERT INTO sccpsettings (keyword, data, seq, type) VALUES (?,?,?,?)'); $result = $db->executeMultiple($stmt, $save_value); } else { if (!empty($delete_value)) { - $stmt = $db->prepare('DELETE FROM sccpsettings WHERE `keyword`=?'); + $stmt = $db->prepare('DELETE FROM sccpsettings WHERE keyword = ?'); $result = $db->executeMultiple($stmt, $delete_value); } if (!empty($save_value)) { - $stmt = $db->prepare('REPLACE INTO sccpsettings (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); + $stmt = $db->prepare('REPLACE INTO sccpsettings (keyword, data, seq, type) VALUES (?,?,?,?)'); $result = $db->executeMultiple($stmt, $save_value); } } break; - case 'sccpdevmodel': - break; - case 'sccpdevice': - break; + case 'sccpdevmodel': // Fall through to next intentionally + case 'sccpdevice': // Fall through to next intentionally case 'sccpuser': - $sql_db = $table_name; $sql_key = ""; $sql_var = ""; foreach ($save_value as $key_v => $data) { @@ -297,23 +301,24 @@ class dbinterface $sql_var .= ', '; } if ($data === $this->val_null) { - $sql_var .= '`' . $key_v . '`=NULL'; + $sql_var .= $key_v . '= NULL'; } else { - $sql_var .= '`' . $key_v . '`="' . $data . '"'; + $sql_var .= $key_v . ' = \'' . $data . '\''; } if ($key_fld == $key_v) { - $sql_key = '`' . $key_v . '`="' . $data . '"'; + $sql_key = $key_v . ' = \'' . $data . '\''; } } if (!empty($sql_var)) { - if ($mode == 'delete') { - $req = 'DELETE FROM sccpuser WHERE ' . $sql_key . ''; - } else { - if ($mode == 'update') { - $req = 'UPDATE sccpuser SET ' . $sql_var . 'WHERE ' . $sql_key . ''; - } else { - $req = 'REPLACE INTO sccpuser SET ' . $sql_var . ''; - } + switch ($mode) { + case 'delete': + $req = 'DELETE FROM '. $table_name . ' WHERE ' . $sql_key; + break; + case 'update': + $req = 'UPDATE ' . $table_name . ' SET ' . $sql_var . ' WHERE ' . $sql_key; + break; + default: + $req = 'REPLACE INTO ' . $table_name . ' SET ' . $sql_var; } } $result = $db->prepare($req)->execute(); @@ -327,14 +332,14 @@ class dbinterface break; case 'replace': if (!empty($save_value)) { - $sql = 'UPDATE sccpbuttonconfig SET `name`=? WHERE `ref`= ? AND `reftype`=? AND `instance`=? AND `buttontype`=?'; + $sql = 'UPDATE sccpbuttonconfig SET name =? WHERE ref = ? AND reftype =? AND instance =? AND buttontype =?'; $stmt = $db->prepare($sql); $result= $db->executeMultiple($stmt, $save_value); } break; default: if (!empty($save_value)) { - $sql = 'INSERT INTO sccpbuttonconfig (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?)'; + $sql = 'INSERT INTO sccpbuttonconfig (ref, reftype, instance, buttontype, name, options) VALUES (?,?,?,?,?,?)'; $stmt = $db->prepare($sql); $result = $db->executeMultiple($stmt, $save_value); } From 175346c2c1e45fa80fa26c5bb826cdd8001e9844 Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Tue, 9 Feb 2021 12:31:06 +0100 Subject: [PATCH 07/19] Use bindParam on db executes Use bind param to have stricter typing Fix bug in Sccp-Manager where key and keyword were not the same --- Sccp_manager.class.php | 10 ++--- Sccp_manager.inc/dbinterface.class.php | 52 +++++++++++--------------- 2 files changed, 26 insertions(+), 36 deletions(-) diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index 1b77a3f..9e170ed 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -869,7 +869,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } break; case 'getDeviceModel': -dbug('getting Device model'); +//dbug('getting Device model'); switch ($request['type']) { case 'all': case 'extension': @@ -930,7 +930,7 @@ dbug('getting Device model'); return $result; break; case 'getExtensionGrid': -dbug('getting Extension Grid'); +//dbug('getting Extension Grid'); $result = $this->dbinterface->HWextension_db_SccpTableData('SccpExtension'); if (empty($result)) { return array(); @@ -954,7 +954,7 @@ dbug('getting Extension Grid'); return $result; break; case 'getPhoneGrid': -dbug('getting Phone Grid'); +//dbug('getting Phone Grid'); $cmd_type = !empty($request['type']) ? $request['type'] : ''; $result = $this->dbinterface->HWextension_db_SccpTableData('SccpDevice', array('type' => $cmd_type)); @@ -1736,7 +1736,7 @@ dbug('getting Phone Grid'); } } - $this->sccpvalues['sccp_compatible'] = array('keyword' => 'compatible', 'data' => $ver_id, 'type' => '1', 'seq' => '99'); + $this->sccpvalues['sccp_compatible'] = array('keyword' => 'sccp_compatible', 'data' => $ver_id, 'type' => '1', 'seq' => '99'); $this->sccppath = $this->extconfigs->validate_init_path($confDir, $this->sccpvalues, $sccp_driver_replace); $driver = $this->FreePBX->Core->getAllDriversInfo(); // ?????? @@ -2132,7 +2132,7 @@ dbug('getting Phone Grid'); $dir_list = $this->findAllFiles($dir, $file_ext, 'fileonly'); } $raw_settings = $this->dbinterface->getDb_model_info($get, $format_list, $filter); -dbug('reloading table'); +//dbug('reloading table'); if ($validate) { for ($i = 0; $i < count($raw_settings); $i++) { $raw_settings[$i]['validate'] = '-;-'; diff --git a/Sccp_manager.inc/dbinterface.class.php b/Sccp_manager.inc/dbinterface.class.php index 0d3ee83..b57c116 100644 --- a/Sccp_manager.inc/dbinterface.class.php +++ b/Sccp_manager.inc/dbinterface.class.php @@ -246,48 +246,38 @@ class dbinterface function write($table_name = "", $save_value = array(), $mode = 'update', $key_fld = "", $hwid = "") { -//dbug('entering write for table', $table_name); -if ($table_name === 'sccpdevmodel'){ -dbug('entering write with save_value', $save_value); -dbug('entering write with mode', $mode); -dbug('entering write with key_fld', $key_fld); -dbug('entering write with hwid', $hwid); -} // mode clear - Empty table before update // mode update - update / replace record global $db; -// global $amp_conf; $result = false; $delete_value = array(); switch ($table_name) { case 'sccpsettings': - foreach ($save_value as $key_v => $data) { - if (!empty($data) && isset($data['data'])) { - if ($data['data'] == $this->val_null) { - $delete_value[] = $save_value[$key_v]['keyword']; - unset($save_value[$key_v]); - } -/* if (isset($data['data'])) { - if ($data['data'] == $this->val_null) { - $delete_value[] = $save_value[$key_v]['keyword']; - unset($save_value[$key_v]); - } - } -*/ } - } + $time = -microtime(true); if ($mode == 'clear') { -// $sql = 'truncate `sccpsettings`'; $db->prepare('TRUNCATE sccpsettings')->execute(); - $stmt = $db->prepare('INSERT INTO sccpsettings (keyword, data, seq, type) VALUES (?,?,?,?)'); - $result = $db->executeMultiple($stmt, $save_value); + $stmt = $db->prepare('INSERT INTO sccpsettings (keyword, data, seq, type) VALUES (:keyword,:data,:seq,:type)'); } else { - if (!empty($delete_value)) { - $stmt = $db->prepare('DELETE FROM sccpsettings WHERE keyword = ?'); - $result = $db->executeMultiple($stmt, $delete_value); + $stmt = $db->prepare('REPLACE INTO sccpsettings (keyword, data, seq, type) VALUES (:keyword,:data,:seq,:type)'); + } + foreach ($save_value as $key => $dataArr) { + if (!empty($dataArr) && isset($dataArr['data'])) { + if ($dataArr['data'] == $this->val_null) { + $delete_value[] = $save_value[$key]['keyword']; + break; + } } - if (!empty($save_value)) { - $stmt = $db->prepare('REPLACE INTO sccpsettings (keyword, data, seq, type) VALUES (?,?,?,?)'); - $result = $db->executeMultiple($stmt, $save_value); + $stmt->bindParam(':keyword',$dataArr['keyword'],\PDO::PARAM_STR); + $stmt->bindParam(':data',$dataArr['data'],\PDO::PARAM_STR); + $stmt->bindParam(':seq',$dataArr['seq'],\PDO::PARAM_INT); + $stmt->bindParam(':type',$dataArr['type'],\PDO::PARAM_INT); + $result = $stmt->execute(); + } + if (!empty($delete_value)) { + $stmt = $db->prepare('DELETE FROM sccpsettings WHERE keyword = :keyword'); + foreach ($delete_value as $del_key) { + $stmt->bindParam(':keyword',$del_key,\PDO::PARAM_STR); + $result = $stmt->execute(); } } break; From b3d31b669a64997075ce451d14f3a346bb38c090 Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Tue, 9 Feb 2021 12:43:26 +0100 Subject: [PATCH 08/19] Fix assignment sccp_compatible Sccpvalues key and keyword must be same or causes hidden DB warnings because of duplicate primary keys after write / read / write --- Sccp_manager.class.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index dba8c84..e96a6bd 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -269,25 +269,25 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { /* unused but FPBX API requires it */ public function install() { - + } /* unused but FPBX API requires it */ public function uninstall() { - + } /* unused but FPBX API requires it */ public function backup() { - + } /* unused but FPBX API requires it */ public function restore($backup) { - + } public function getActionBar($request) { @@ -815,7 +815,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { $hw_list[] = array('name' => $idv); } if ($idv == 'all') { - + } } } @@ -1735,7 +1735,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } } - $this->sccpvalues['sccp_compatible'] = array('keyword' => 'compatible', 'data' => $ver_id, 'type' => '1', 'seq' => '99'); + $this->sccpvalues['sccp_compatible'] = array('keyword' => 'sccp_compatible', 'data' => $ver_id, 'type' => '1', 'seq' => '99'); $this->sccppath = $this->extconfigs->validate_init_path($confDir, $this->sccpvalues, $sccp_driver_replace); $driver = $this->FreePBX->Core->getAllDriversInfo(); // ?????? @@ -2093,7 +2093,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } // [Namesoftkeyset] // type=softkeyset - // + // // ----- It is a very bad idea to add an external configuration file "sccp_custom.conf" !!!! // This will add problems when solving problems caused by unexpected solutions from users. // From 7993eec48710202a0ba3111cac30858acf8a64df Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Sun, 7 Feb 2021 14:48:49 +0100 Subject: [PATCH 09/19] Test for chan_sccp_b version compatibility SoftKeySets fails with chan_sccp-b prior to revision number 11048. Check the version with the installer, and subsequently to ensure do not get exception. --- .../aminterface/oldinterface.class.php | 2 +- Sccp_manager.inc/srvinterface.class.php | 28 +++++++++++++------ install.php | 19 ++++++++++--- views/server.info.php | 3 ++ 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/Sccp_manager.inc/aminterface/oldinterface.class.php b/Sccp_manager.inc/aminterface/oldinterface.class.php index 1719f63..a8d8c86 100644 --- a/Sccp_manager.inc/aminterface/oldinterface.class.php +++ b/Sccp_manager.inc/aminterface/oldinterface.class.php @@ -306,7 +306,7 @@ class oldinterface $result["vCode"] = 433; } else { $result["vCode"] = 430; - } + } } } diff --git a/Sccp_manager.inc/srvinterface.class.php b/Sccp_manager.inc/srvinterface.class.php index cf8eea5..f6b3542 100644 --- a/Sccp_manager.inc/srvinterface.class.php +++ b/Sccp_manager.inc/srvinterface.class.php @@ -15,6 +15,7 @@ class srvinterface { var $error; var $_info; var $ami_mode; + var $useAmiForSoftKeys = true; public function __construct($parent_class = null) { $this->paren_class = $parent_class; @@ -206,24 +207,35 @@ class srvinterface { */ } } - public function get_compatible_sccp() { - + public function get_compatible_sccp($revNumComp=false) { + // only called with args from installer to get revision and compatibility $res = $this->getSCCPVersion(); if (empty($res)) { return 0; } switch ($res["vCode"]) { case 0: - return 0; + $retval = 0; + break; case 433: - return 433; - + $retval = 433; + break; case 432: + $retval = 430; + break; case 431: - return 431; + $retval = 431; + break; default: - return 430; + $retval = 430; } + if ($res['RevisionNum'] < 11048) { + $this->useAmiForSoftKeys = false; + } + if ($revNumComp) { + return array($retval, $this->useAmiForSoftKeys); + } + return $retval; } public function getSCCPVersion() { @@ -236,7 +248,7 @@ class srvinterface { public function sccp_list_keysets() { - if ($this->ami_mode) { + if (($this->ami_mode) && ($this->useAmiForSoftKeys)){ return $this->aminterface->sccp_list_keysets(); } else { return $this->oldinterface->sccp_list_keysets(); diff --git a/install.php b/install.php index 6c4f298..6e5c510 100644 --- a/install.php +++ b/install.php @@ -17,6 +17,7 @@ global $astman; global $version; global $srvinterface; global $mobile_hw; +global $useAmiForSoftKeys; $mobile_hw = '0'; $class = "\\FreePBX\\Modules\\Sccp_manager\\srvinterface"; @@ -375,6 +376,7 @@ $table_req = array('sccpdevice', 'sccpline'); $ss = FreePBX::create()->Sccp_manager; $astman = FreePBX::create()->astman; $sccp_compatible = 0; +$chanSCCPWarning = true; //$db_config = $db_config_v0; $db_config = ''; @@ -445,13 +447,13 @@ function CheckAsteriskVersion() function CheckChanSCCPCompatible() { + global $chanSCCPWarning; global $srvinterface, $astman; if (!$astman) { ie_freepbx('No asterisk manager connection provided!. Installation Failed'); } - $sccp_compatible = $srvinterface->get_compatible_sccp(); - outn("
  • " . _("Sccp model Compatible code : ") . $sccp_compatible . "
  • "); - return $sccp_compatible; + // calling with true returns array with compatibility and RevisionNumber + return $srvinterface->get_compatible_sccp(true); } function InstallDB_Buttons() @@ -964,7 +966,11 @@ function Setup_RealTime() CheckSCCPManagerDBTables($table_req); #CheckPermissions(); CheckAsteriskVersion(); -$sccp_compatible = CheckChanSCCPCompatible(); +$sccp_version = array(); +$sccp_version = CheckChanSCCPCompatible(); +$sccp_compatible = $sccp_version[0]; +$chanSCCPWarning = $sccp_version[1] ^= 1; +outn("
  • " . _("Sccp model Compatible code : ") . $resultReturned[0] . "
  • "); if ($sccp_compatible == 0) { // die_freepbx('Chan Sccp not Found. Install it before continuing'); outn("
    "); @@ -995,6 +1001,11 @@ if (!$sccp_db_ver) { InstallDB_createButtonConfigTrigger(); InstallDB_CreateSccpDeviceConfigView($sccp_compatible); InstallDB_updateDBVer($sccp_compatible); +dbug('chanSCCPWarning',$chanSCCPWarning); +if ($chanSCCPWarning) { + outn("
    "); + outn("Warning: Upgrade chan_sccp_b to use full ami functionality"); +} if (!$sccp_db_ver) { Setup_RealTime(); outn("
    "); diff --git a/views/server.info.php b/views/server.info.php index 3982fed..56da782 100644 --- a/views/server.info.php +++ b/views/server.info.php @@ -36,6 +36,9 @@ $info['aminterface'] = $this->aminterface->info(); $info['XML'] = $this->xmlinterface->info(); $info['sccp_class'] = $driver['sccp']; $info['Core_sccp'] = array('Version' => $core['Version'], 'about' => 'Sccp ver.' . $core['Version'] . ' r' . $core['vCode'] . ' Revision :' . $core['RevisionNum'] . ' Hash :' . $core['RevisionHash']); +if (!$this->srvinterface->useAmiForSoftKeys) { + $info['Core_sccp'] = array('Version' => $core['Version'], 'about' => 'Sccp ver.' . $core['Version'] . ' r' . $core['vCode'] . ' Revision :' . $core['RevisionNum'] . ' Hash :' . $core['RevisionHash'] . ' ----Warning: Upgrade chan_sccp to use full ami functionality'); +} $info['Asterisk'] = array('Version' => FreePBX::Config()->get('ASTVERSION'), 'about' => 'Asterisk.'); From 5e5633ed7b0c0001ce13b43e299be9d0bd76427e Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Sat, 6 Feb 2021 17:26:37 +0100 Subject: [PATCH 10/19] Switch to PDO model Switch to PDO model and correct transactions --- Sccp_manager.class.php | 20 +-- Sccp_manager.inc/dbinterface.class.php | 180 +++++++++++++------------ 2 files changed, 106 insertions(+), 94 deletions(-) diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index e96a6bd..c4be0a1 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -169,6 +169,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { $this->xml_data = simplexml_load_file($xml_vars); $this->initVarfromXml(); // Overwrite Exist } + $this->saveSccpSettings(); } /* @@ -1483,10 +1484,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } public function getSccpSettingFromDB() { - $raw_data = $this->dbinterface->get_db_SccpSetting(); - foreach ($raw_data as $var) { - $this->sccpvalues[$var['keyword']] = array('keyword' => $var['keyword'], 'data' => $var['data'], 'seq' => $var['seq'], 'type' => $var['type']); - } + $this->sccpvalues = $this->dbinterface->get_db_SccpSetting(); return; } @@ -1864,19 +1862,25 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { // global $db; // global $amp_conf; - $save_settings = array(); +// $save_settings = array(); if (empty($save_value)) { - foreach ($this->sccpvalues as $key => $val) { + $this->dbinterface->write('sccpsettings', $this->sccpvalues, 'clear'); + +/* foreach ($this->sccpvalues as $key => $val) { if ((trim($val['data']) !== '') or ($val['data'] == '0')) { - $save_settings[] = array($key, $db->escapeSimple($val['data']), $val['seq'], $val['type']); + $save_settings[] = array($key, $val['data'], $val['seq'], $val['type']); + } else { + $unsaved_settings[] = array($key, $val['data'], $val['seq'], $val['type']); } } $this->dbinterface->write('sccpsettings', $save_settings, 'clear'); +*/ } else { $this->dbinterface->write('sccpsettings', $save_value, 'update'); - return true; } return true; +// } +// return true; } /* diff --git a/Sccp_manager.inc/dbinterface.class.php b/Sccp_manager.inc/dbinterface.class.php index efcb398..b4ee6ee 100644 --- a/Sccp_manager.inc/dbinterface.class.php +++ b/Sccp_manager.inc/dbinterface.class.php @@ -21,7 +21,7 @@ class dbinterface public function info() { - $Ver = '13.0.2'; + $Ver = '13.0.2'; // This should be updated return array('Version' => $Ver, 'about' => 'Data access interface ver: ' . $Ver); } @@ -45,25 +45,25 @@ class dbinterface public function HWextension_db_SccpTableData($dataid, $data = array()) { + global $db; + $stmt = ''; + $stmts = ''; if ($dataid == '') { return false; } switch ($dataid) { case "SccpExtension": if (empty($data['name'])) { - $sql = "SELECT * FROM `sccpline` ORDER BY `name`"; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $stmts = $db->prepare('SELECT * FROM sccpline ORDER BY name'); } else { - $sql = "SELECT * FROM `sccpline` WHERE `name`='" . $data['name']. "'"; - ; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $stmts = $db->prepare('SELECT * FROM sccpline WHERE name = $data[name]'); } break; case "SccpDevice": - $filtred =''; - $singlrow = false; + $filtered =''; + $singlerow = false; if (empty($data['fields'])) { - $fld = '`name`,`name` as `mac`, `type`, `button`, `addon`, `_description` as description'; + $fld = 'name, name as mac, type, button, addon, _description as description'; } else { switch ($data['fields']) { case "all": @@ -78,30 +78,29 @@ class dbinterface } } if (!empty($data['name'])) { - $filtred = "`name`='" . $data['name']. "'"; - ; - $singlrow = true; + $filtered = 'name =' . $data['name']. ''; + $singlerow = true; } if (!empty($data['type'])) { switch ($data['type']) { case "cisco-sip": - $filtred = "`TYPE` LIKE '%-sip'"; + $filtered = 'TYPE LIKE \'%-sip\''; break; case "cisco": default: - $filtred = "`TYPE` not LIKE '%-sip'"; + $filtered = 'TYPE not LIKE \'%-sip\''; break; } } - if (empty($filtred)) { - $sql = "SELECT ". $fld ." FROM `sccpdeviceconfig` ORDER BY `name`"; + if (empty($filtered)) { + $sql = 'SELECT ' . $fld . ' FROM sccpdeviceconfig ORDER BY name'; } else { - $sql = "SELECT ". $fld ." FROM `sccpdeviceconfig` WHERE ".$filtred." ORDER BY `name`"; + $sql = 'SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE '. $filtered . ' ORDER BY name'; } - if ($singlrow) { - $raw_settings = sql($sql, "getRow", DB_FETCHMODE_ASSOC); + if ($singlerow) { + $stmt = $db->prepare($sql); } else { - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $stmts = $db->prepare($sql); } break; case "HWSipDevice": @@ -115,26 +114,26 @@ class dbinterface break; case "get_colums_sccpdevice": $sql = "DESCRIBE sccpdevice"; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $stmt = $db->prepare($sql); break; case "get_colums_sccpuser": $sql = "DESCRIBE sccpuser"; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $stmts = $db->prepare($sql); break; case "get_sccpdevice_byid": $sql = 'SELECT t1.*, types.dns, types.buttons, types.loadimage, types.nametemplate as nametemplate, ' . 'addon.buttons as addon_buttons FROM sccpdevice AS t1 ' . 'LEFT JOIN sccpdevmodel as types ON t1.type=types.model ' - . 'LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name="' . $data['id'] . '";'; - $raw_settings = sql($sql, "getRow", DB_FETCHMODE_ASSOC); + . 'LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name="' . $data['id'] . ''; + $stmt = $db->prepare($sql); break; case "get_sccpuser": - $sql = "SELECT * FROM `sccpuser` "; + $sql = 'SELECT * FROM sccpuser '; if (!empty($data['id'])) { - $sql .= 'WHERE name="' . $data['id'] . '" '; + $sql .= 'WHERE name= ' . $data['id'] . ''; } - $sql .= "ORDER BY `name`;"; - $raw_settings = sql($sql, "getRow", DB_FETCHMODE_ASSOC); + $sql .= ' ORDER BY name'; + $stmt = $db->prepare($sql); break; case "get_sccpdevice_buttons": $sql = ''; @@ -145,29 +144,40 @@ class dbinterface $sql .= (empty($sql)) ? 'ref="' . $data['id'] . '" ' : 'and ref="' . $data['id'] . '" '; } if (!empty($sql)) { - $sql = 'SELECT * FROM sccpbuttonconfig WHERE ' .$sql. 'ORDER BY `instance`;'; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); + $sql = 'SELECT * FROM sccpbuttonconfig WHERE ' .$sql. ' ORDER BY `instance`;'; + $stmts = $db->prepare($sql); } else { $raw_settings = array(); } break; } - + if (!empty($stmt)) { + $stmt->execute(); + $raw_settings = $stmt->fetch(\PDO::FETCH_ASSOC); + } elseif (!empty($stmts)) { + $stmts->execute(); + $raw_settings = $stmts->fetchAll(\PDO::FETCH_ASSOC); + } return $raw_settings; } public function get_db_SccpSetting() { - $sql = "SELECT `keyword`, `data`, `type`, `seq` FROM `sccpsettings` ORDER BY `type`, `seq`"; - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); - return $raw_settings; + global $db; + $stmt = $db->prepare('SELECT keyword, data, type, seq FROM sccpsettings ORDER BY type, seq'); + $stmt->execute(); + foreach ($stmt->fetchAll() as $var) { + $mysccpvalues[$var['keyword']] = array('keyword' => $var['keyword'], 'data' => $var['data'], 'seq' => $var['seq'], 'type' => $var['type']); + } + return $mysccpvalues; } public function get_db_sysvalues() { - $sql = "SHOW VARIABLES LIKE '%group_concat%'"; - $raw_settings = sql($sql, "getRow", DB_FETCHMODE_ASSOC); - return $raw_settings; + global $db; + $stmt = $db->prepare('SHOW VARIABLES LIKE \'%group_concat%\''); + $stmt->execute(); + return $stmt->fetch(\PDO::FETCH_ASSOC); } /* @@ -186,20 +196,19 @@ class dbinterface $sel_inf = "*"; break; } - $sel_inf .= ", '0' as 'validate'"; switch ($get) { case "byciscoid": if (!empty($filter)) { if (!empty($filter['model'])) { if (strpos($filter['model'], 'loadInformation')) { - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (`loadinformationid` ='" . $filter['model'] . "') ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid =' . $filter['model'] . ') ORDER BY model'; } else { - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (`loadinformationid` ='loadInformation" . $filter['model'] . "') ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid =loadInformation' . $filter['model'] . ') ORDER BY model'; } } else { // $sql = "SELECT ".$filter['model']; - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; } break; } @@ -207,86 +216,87 @@ class dbinterface case "byid": if (!empty($filter)) { if (!empty($filter['model'])) { - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (`model` ='" . $filter['model'] . "') ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (model =' . $filter['model'] . ') ORDER BY model'; } else { // $sql = "SELECT ".$filter['model']; - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; } break; } break; case "extension": - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (dns = 0) and (enabled > 0) ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns = 0) and (enabled > 0) ORDER BY model'; //check table break; case "enabled": + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE enabled > 0 ORDER BY model '; + break; case "phones": - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) ORDER BY model "; -// $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (enabled > 0) ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) ORDER BY model '; //check table break; case "ciscophones": - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND `vendor` not LIKE '%-sip' ORDER BY model "; -// $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (enabled > 0) ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND vendor NOT LIKE \'%-sip\' ORDER BY model'; break; case "sipphones": - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND `vendor` LIKE '%-sip' ORDER BY model "; -// $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel WHERE (enabled > 0) ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND `vendor` LIKE \'%-sip\' ORDER BY model'; break; case "all": + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; + break; default: - $sql = "SELECT " . $sel_inf . " FROM sccpdevmodel ORDER BY model "; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; break; } - $raw_settings = sql($sql, "getAll", DB_FETCHMODE_ASSOC); - return $raw_settings; + $stmt = $db->prepare($sql); + $stmt->execute(); + return $stmt->fetchAll(); } - function write($db_name = "", $save_value = array(), $mode = 'update', $key_fld = "", $hwid = "") + function write($table_name = "", $save_value = array(), $mode = 'update', $key_fld = "", $hwid = "") { - // mode clear - Empty tabele before update + // mode clear - Empty table before update // mode update - update / replace record global $db; // global $amp_conf; - $result = "Error"; + $result = false; $delete_value = array(); - switch ($db_name) { + switch ($table_name) { case 'sccpsettings': foreach ($save_value as $key_v => $data) { - if (!empty($data)) { - if (isset($data[1])) { - if ($data[1] == $this->val_null) { + if (!empty($data) && isset($data['data'])) { + if ($data['data'] == $this->val_null) { $delete_value[] = $save_value[$key_v]['keyword']; unset($save_value[$key_v]); } - } - if (isset($data['data'])) { +/* if (isset($data['data'])) { if ($data['data'] == $this->val_null) { $delete_value[] = $save_value[$key_v]['keyword']; unset($save_value[$key_v]); } } - } +*/ } } if ($mode == 'clear') { - $sql = 'truncate `sccpsettings`'; - $stmt = $db->prepare($sql); - $stmt->execute(); - $stmt = $db->prepare('INSERT INTO `sccpsettings` (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); +// $sql = 'truncate `sccpsettings`'; + $db->prepare('TRUNCATE sccpsettings')->execute(); + $stmt = $db->prepare('INSERT INTO sccpsettings (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); $result = $db->executeMultiple($stmt, $save_value); } else { if (!empty($delete_value)) { - $stmt = $db->prepare('DELETE FROM `sccpsettings` WHERE `keyword`=?'); + $stmt = $db->prepare('DELETE FROM sccpsettings WHERE `keyword`=?'); $result = $db->executeMultiple($stmt, $delete_value); } if (!empty($save_value)) { - $stmt = $db->prepare('REPLACE INTO `sccpsettings` (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); + $stmt = $db->prepare('REPLACE INTO sccpsettings (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); $result = $db->executeMultiple($stmt, $save_value); } } break; case 'sccpdevmodel': + break; case 'sccpdevice': + break; case 'sccpuser': - $sql_db = $db_name; + $sql_db = $table_name; $sql_key = ""; $sql_var = ""; foreach ($save_value as $key_v => $data) { @@ -304,23 +314,21 @@ class dbinterface } if (!empty($sql_var)) { if ($mode == 'delete') { - $req = 'DELETE FROM `' . $sql_db . '` WHERE ' . $sql_key . ';'; + $req = 'DELETE FROM sccpuser WHERE ' . $sql_key . ''; } else { if ($mode == 'update') { - $req = 'UPDATE `' . $sql_db . '` SET ' . $sql_var . ' WHERE ' . $sql_key . ';'; + $req = 'UPDATE sccpuser SET ' . $sql_var . WHERE . $sql_key . ''; } else { - $req = 'REPLACE INTO `' . $sql_db . '` SET ' . $sql_var . ';'; + $req = 'REPLACE INTO sccpuser SET ' . $sql_var . ''; } } } - $stmt = $db->prepare($req); - $result = $stmt->execute(); + $result = $db->prepare($req)->execute(); break; case 'sccpbuttons': if (($mode == 'clear') || ($mode == 'delete')) { - $sql = 'DELETE FROM `sccpbuttonconfig` WHERE ref="' . $hwid . '";'; - $stmt = $db->prepare($sql); - $stmt->execute(); + $sql = 'DELETE FROM sccpbuttonconfig WHERE ref=' . $hwid . ''; + $result = $db->prepare($sql)->execute(); } if ($mode == 'delete') { break; @@ -329,13 +337,13 @@ class dbinterface break; } if ($mode == 'replace') { - $sql = 'UPDATE `sccpbuttonconfig` SET `name`=? WHERE `ref`= ? AND `reftype`=? AND `instance`=? AND `buttontype`=?;'; + $sql = 'UPDATE sccpbuttonconfig SET `name`=? WHERE `ref`= ? AND `reftype`=? AND `instance`=? AND `buttontype`=?'; // $sql = 'INSERT INTO `sccpbuttonconfig` (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?);'; // die(print_r($save_value,1)); $stmt = $db->prepare($sql); $result= $db->executeMultiple($stmt, $save_value); } else { - $sql = 'INSERT INTO `sccpbuttonconfig` (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?);'; + $sql = 'INSERT INTO sccpbuttonconfig (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?)'; // die(print_r($save_value,1)); $stmt = $db->prepare($sql); $result = $db->executeMultiple($stmt, $save_value); @@ -356,18 +364,18 @@ class dbinterface $result = exec('mysqldump '.$database.' --password='.$pass.' --user='.$user.' --single-transaction >'.$filename, $output); return $filename; } - + /* * Check Table structure */ public function validate() { global $db; + $result = false; $check_fields = array('430' => array('_hwlang' => "varchar(12)"), '431' => array('private'=> "enum('on','off')"), '433' => array('directed_pickup'=>'') ); - $sql = "DESCRIBE `sccpdevice`;"; - $raw_result = sql($sql, "getAll", DB_FETCHMODE_ASSOC); - $result = 0; - foreach ($raw_result as $value) { + $stmt = $db->prepare('DESCRIBE sccpdevice'); + $stmt->execute(); + foreach ($stmt->fetchAll() as $value) { $id_result[$value['Field']] = $value['Type']; } foreach ($check_fields as $key => $value) { @@ -393,7 +401,7 @@ class dbinterface break; } } - + return $result; } } From 22a4eb6e9e65b2ed5c3684744f91c469b3ebe374 Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Sun, 7 Feb 2021 16:09:35 +0100 Subject: [PATCH 11/19] Cleaning up Simplify structure and fix errors --- Sccp_manager.inc/dbinterface.class.php | 71 ++++++++++++-------------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/Sccp_manager.inc/dbinterface.class.php b/Sccp_manager.inc/dbinterface.class.php index b4ee6ee..674f69e 100644 --- a/Sccp_manager.inc/dbinterface.class.php +++ b/Sccp_manager.inc/dbinterface.class.php @@ -31,20 +31,21 @@ class dbinterface */ public function get_db_SccpTableByID($dataid, $data = array(), $indexField = '') { - $resut = array(); + $result = array(); $raw = $this->HWextension_db_SccpTableData($dataid, $data); if (empty($raw) || empty($indexField)) { return $raw; } foreach ($raw as $value) { $id = $value[$indexField]; - $resut[$id] = $value; + $result[$id] = $value; } return $resut; } public function HWextension_db_SccpTableData($dataid, $data = array()) { + // $stmt is a single row fetch, $stmts is a fetchAll. global $db; $stmt = ''; $stmts = ''; @@ -52,14 +53,14 @@ class dbinterface return false; } switch ($dataid) { - case "SccpExtension": + case 'SccpExtension': if (empty($data['name'])) { $stmts = $db->prepare('SELECT * FROM sccpline ORDER BY name'); } else { $stmts = $db->prepare('SELECT * FROM sccpline WHERE name = $data[name]'); } break; - case "SccpDevice": + case 'SccpDevice': $filtered =''; $singlerow = false; if (empty($data['fields'])) { @@ -103,20 +104,20 @@ class dbinterface $stmts = $db->prepare($sql); } break; - case "HWSipDevice": + case 'HWSipDevice': $raw_settings = $this->getDb_model_info($get = "sipphones", $format_list = "model"); break; - case "HWDevice": + case 'HWDevice': $raw_settings = $this->getDb_model_info($get = "ciscophones", $format_list = "model"); break; - case "HWextension": + case 'HWextension': $raw_settings = $this->getDb_model_info($get = "extension", $format_list = "model"); break; - case "get_colums_sccpdevice": + case 'get_colums_sccpdevice': $sql = "DESCRIBE sccpdevice"; $stmt = $db->prepare($sql); break; - case "get_colums_sccpuser": + case 'get_colums_sccpuser': $sql = "DESCRIBE sccpuser"; $stmts = $db->prepare($sql); break; @@ -127,7 +128,7 @@ class dbinterface . 'LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name="' . $data['id'] . ''; $stmt = $db->prepare($sql); break; - case "get_sccpuser": + case 'get_sccpuser': $sql = 'SELECT * FROM sccpuser '; if (!empty($data['id'])) { $sql .= 'WHERE name= ' . $data['id'] . ''; @@ -135,13 +136,13 @@ class dbinterface $sql .= ' ORDER BY name'; $stmt = $db->prepare($sql); break; - case "get_sccpdevice_buttons": + case 'get_sccpdevice_buttons': $sql = ''; if (!empty($data['buttontype'])) { $sql .= 'buttontype="' . $data['buttontype'] . '" '; } if (!empty($data['id'])) { - $sql .= (empty($sql)) ? 'ref="' . $data['id'] . '" ' : 'and ref="' . $data['id'] . '" '; + $sql .= (empty($sql)) ? 'ref="' . $data['id'] . '" ' : 'and ref="' . $data['id'] . ''; } if (!empty($sql)) { $sql = 'SELECT * FROM sccpbuttonconfig WHERE ' .$sql. ' ORDER BY `instance`;'; @@ -204,7 +205,7 @@ class dbinterface if (strpos($filter['model'], 'loadInformation')) { $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid =' . $filter['model'] . ') ORDER BY model'; } else { - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid =loadInformation' . $filter['model'] . ') ORDER BY model'; + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid = loadInformation' . $filter['model'] . ') ORDER BY model'; } } else { // $sql = "SELECT ".$filter['model']; @@ -326,36 +327,32 @@ class dbinterface $result = $db->prepare($req)->execute(); break; case 'sccpbuttons': - if (($mode == 'clear') || ($mode == 'delete')) { - $sql = 'DELETE FROM sccpbuttonconfig WHERE ref=' . $hwid . ''; - $result = $db->prepare($sql)->execute(); + switch ($mode) { + case 'clear': // no break here as clear is same as delete + case 'delete': + $sql = 'DELETE FROM sccpbuttonconfig WHERE ref=' . $hwid . ''; + $result = $db->prepare($sql)->execute(); + break; + case 'replace': + if (!empty($save_value)) { + $sql = 'UPDATE sccpbuttonconfig SET `name`=? WHERE `ref`= ? AND `reftype`=? AND `instance`=? AND `buttontype`=?'; + $stmt = $db->prepare($sql); + $result= $db->executeMultiple($stmt, $save_value); + } + break; + default: + if (!empty($save_value)) { + $sql = 'INSERT INTO sccpbuttonconfig (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?)'; + $stmt = $db->prepare($sql); + $result = $db->executeMultiple($stmt, $save_value); + } } - if ($mode == 'delete') { - break; - } - if (empty($save_value)) { - break; - } - if ($mode == 'replace') { - $sql = 'UPDATE sccpbuttonconfig SET `name`=? WHERE `ref`= ? AND `reftype`=? AND `instance`=? AND `buttontype`=?'; -// $sql = 'INSERT INTO `sccpbuttonconfig` (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?);'; -// die(print_r($save_value,1)); - $stmt = $db->prepare($sql); - $result= $db->executeMultiple($stmt, $save_value); - } else { - $sql = 'INSERT INTO sccpbuttonconfig (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?)'; -// die(print_r($save_value,1)); - $stmt = $db->prepare($sql); - $result = $db->executeMultiple($stmt, $save_value); - } - - break; } return $result; } /* - * My be Replace by SccpTables ??! + * Maybe Replace by SccpTables ??! * */ public function dump_sccp_tables($data_path, $database, $user, $pass) From 124f7052ebeedbfc1e749312a14f71227b02fcef Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Mon, 8 Feb 2021 15:27:35 +0100 Subject: [PATCH 12/19] Further clean ups and annotations Document changes --- Sccp_manager.class.php | 18 ++---- Sccp_manager.inc/dbinterface.class.php | 76 ++++++++++---------------- assets/js/sccp_manager.js | 11 ++-- views/advserver.model.php | 33 +++++------ 4 files changed, 56 insertions(+), 82 deletions(-) diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index c4be0a1..12254fb 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -869,6 +869,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } break; case 'getDeviceModel': +dbug('getting Device model'); switch ($request['type']) { case 'all': case 'extension': @@ -929,6 +930,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { return $result; break; case 'getExtensionGrid': +dbug('getting Extension Grid'); $result = $this->dbinterface->HWextension_db_SccpTableData('SccpExtension'); if (empty($result)) { return array(); @@ -952,6 +954,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { return $result; break; case 'getPhoneGrid': +dbug('getting Phone Grid'); $cmd_type = !empty($request['type']) ? $request['type'] : ''; $result = $this->dbinterface->HWextension_db_SccpTableData('SccpDevice', array('type' => $cmd_type)); @@ -1865,22 +1868,10 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { // $save_settings = array(); if (empty($save_value)) { $this->dbinterface->write('sccpsettings', $this->sccpvalues, 'clear'); - -/* foreach ($this->sccpvalues as $key => $val) { - if ((trim($val['data']) !== '') or ($val['data'] == '0')) { - $save_settings[] = array($key, $val['data'], $val['seq'], $val['type']); - } else { - $unsaved_settings[] = array($key, $val['data'], $val['seq'], $val['type']); - } - } - $this->dbinterface->write('sccpsettings', $save_settings, 'clear'); -*/ } else { $this->dbinterface->write('sccpsettings', $save_value, 'update'); } return true; -// } -// return true; } /* @@ -2140,9 +2131,8 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } else { $dir_list = $this->findAllFiles($dir, $file_ext, 'fileonly'); } - $raw_settings = $this->dbinterface->getDb_model_info($get, $format_list, $filter); - +dbug('reloading table'); if ($validate) { for ($i = 0; $i < count($raw_settings); $i++) { $raw_settings[$i]['validate'] = '-;-'; diff --git a/Sccp_manager.inc/dbinterface.class.php b/Sccp_manager.inc/dbinterface.class.php index 674f69e..a4bd67e 100644 --- a/Sccp_manager.inc/dbinterface.class.php +++ b/Sccp_manager.inc/dbinterface.class.php @@ -121,7 +121,7 @@ class dbinterface $sql = "DESCRIBE sccpuser"; $stmts = $db->prepare($sql); break; - case "get_sccpdevice_byid": + case 'get_sccpdevice_byid': $sql = 'SELECT t1.*, types.dns, types.buttons, types.loadimage, types.nametemplate as nametemplate, ' . 'addon.buttons as addon_buttons FROM sccpdevice AS t1 ' . 'LEFT JOIN sccpdevmodel as types ON t1.type=types.model ' @@ -185,21 +185,15 @@ class dbinterface * Get Sccp Device Model information */ - function getDb_model_info($get = "all", $format_list = "all", $filter = array()) + function getDb_model_info($get = 'all', $format_list = 'all', $filter = array()) { global $db; - switch ($format_list) { - case "model": - $sel_inf = "model, vendor, dns, buttons"; - break; - case "all": - default: - $sel_inf = "*"; - break; + $sel_inf = '*, 0 as validate'; + if ($format_list === 'model') { + $sel_inf = 'model, vendor, dns, buttons, 0 as validate'; } - $sel_inf .= ", '0' as 'validate'"; switch ($get) { - case "byciscoid": + case 'byciscoid': if (!empty($filter)) { if (!empty($filter['model'])) { if (strpos($filter['model'], 'loadInformation')) { @@ -214,7 +208,7 @@ class dbinterface break; } break; - case "byid": + case 'byid': if (!empty($filter)) { if (!empty($filter['model'])) { $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (model =' . $filter['model'] . ') ORDER BY model'; @@ -225,31 +219,29 @@ class dbinterface break; } break; - case "extension": + case 'extension': $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns = 0) and (enabled > 0) ORDER BY model'; //check table break; - case "enabled": - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE enabled > 0 ORDER BY model '; + case 'enabled': + $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE enabled > 0 ORDER BY model '; //previously this fell through to phones. break; - case "phones": + case 'phones': $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) ORDER BY model '; //check table break; - case "ciscophones": + case 'ciscophones': $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND vendor NOT LIKE \'%-sip\' ORDER BY model'; break; - case "sipphones": + case 'sipphones': $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND `vendor` LIKE \'%-sip\' ORDER BY model'; break; - case "all": - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; - break; + case 'all': // Fall through to default default: $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; break; } $stmt = $db->prepare($sql); $stmt->execute(); - return $stmt->fetchAll(); + return $stmt->fetchAll(\PDO::FETCH_ASSOC); } function write($table_name = "", $save_value = array(), $mode = 'update', $key_fld = "", $hwid = "") @@ -318,7 +310,7 @@ class dbinterface $req = 'DELETE FROM sccpuser WHERE ' . $sql_key . ''; } else { if ($mode == 'update') { - $req = 'UPDATE sccpuser SET ' . $sql_var . WHERE . $sql_key . ''; + $req = 'UPDATE sccpuser SET ' . $sql_var . 'WHERE ' . $sql_key . ''; } else { $req = 'REPLACE INTO sccpuser SET ' . $sql_var . ''; } @@ -368,37 +360,29 @@ class dbinterface public function validate() { global $db; - $result = false; - $check_fields = array('430' => array('_hwlang' => "varchar(12)"), '431' => array('private'=> "enum('on','off')"), '433' => array('directed_pickup'=>'') ); + $result = 0; + $check_fields = [ + '430' => ['_hwlang' => "varchar(12)"], + '431' => ['private'=> "enum('on','off')"], + '433' => ['directed_pickup'=>''] + ]; $stmt = $db->prepare('DESCRIBE sccpdevice'); $stmt->execute(); - foreach ($stmt->fetchAll() as $value) { + foreach ($stmt->fetchAll(\PDO::FETCH_ASSOC) as $value) { $id_result[$value['Field']] = $value['Type']; } foreach ($check_fields as $key => $value) { - $sub_result = true; - foreach ($value as $skey => $svalue) { - if (!empty($svalue)) { - if (empty($id_result[$skey])) { - $sub_result = false; - } else { - if (strtolower($id_result[$skey]) != strtolower($svalue)) { - $sub_result = false; - } - } - } else { - if (!empty($id_result[$skey])) { - $sub_result = false; + if (!empty(array_intersect_assoc($value, $id_result))) { + $result = $key; + } else { + // no match but maybe checking against an empty string so just need to check key does not exist + foreach ($value as $skey => $svalue) { + if (empty($svalue) && (!isset($id_result[$skey]))) { + $result = $key; } } } - if ($sub_result) { - $result = $key; - } else { - break; - } } - return $result; } } diff --git a/assets/js/sccp_manager.js b/assets/js/sccp_manager.js index b8502ff..d163635 100644 --- a/assets/js/sccp_manager.js +++ b/assets/js/sccp_manager.js @@ -241,7 +241,7 @@ $(document).ready(function () { } e.preventDefault(); }); - + // Form.buttons - Form.adddevice $('.futuretype').change(function (e) { var kid = $(this).data('id'); @@ -256,7 +256,7 @@ $(document).ready(function () { } } }); - + }); $('.buttontype').change(function (e) { @@ -627,7 +627,7 @@ $(document).ready(function () { i++; }); } - + if (datas === '') { if (confirm(conf_msg)) { datas = 'name[0]=all'; @@ -692,7 +692,7 @@ $(document).ready(function () { //}); -// Bootstrap table Enabled / Disabled buttons ( class="btn-tab-select") +// Bootstrap table Enable / Disable buttons ( class="btn-tab-select") $("table").on('check-all.bs.table', function (rows) { var id_fld = $(this).data('id'); $(".btn-tab-select").each(function () { @@ -1011,7 +1011,7 @@ function bs_page_reload() } function bs_alert(data, status, reload) { - + if (document.getElementById('hwalert') === null) { if (Array.isArray(data)) { data.forEach(function (entry) { @@ -1075,4 +1075,3 @@ function sleep(milliseconds) } } } - diff --git a/views/advserver.model.php b/views/advserver.model.php index d19ea78..0a999b4 100644 --- a/views/advserver.model.php +++ b/views/advserver.model.php @@ -13,12 +13,13 @@
    - +
    @@ -108,8 +109,8 @@
    Help.
    - - + +
    @@ -129,7 +130,7 @@
    Help.
    - +
    @@ -143,7 +144,7 @@ +
    @@ -169,7 +170,7 @@ Help.
    - +
    @@ -190,12 +191,12 @@ Help.
    - +
    + @@ -214,7 +215,7 @@ // function DispayInputFormatter(value, row, index) { // return (value == null) ? '' : ''; // } - + function DispayActionsModelFormatter(value, row, index) { var exp_model = ''; // exp_model += ''; @@ -236,12 +237,12 @@ return value; } - + function SetRowColor(row, index) { var tclass = "active"; if (row['enabled'] === 1) { tclass = (index % 2 === 0) ? "info" : "info"; - } + } if ((row['validate'] === 'yes;yes') || (row['validate'] === 'yes;-')) { // tclass = (row['enabled'] === '1') ? "danger" : "warning"; } else { @@ -249,7 +250,7 @@ } return {classes: tclass}; } - + function load_model(elmnt,clr) { // $("#edit_devmodel").text(clr); var drow = $("#table-models").bootstrapTable('getRowByUniqueId',clr); From 7d7b8cdd05da5dcc19597c848d842adb82db0a8e Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Mon, 8 Feb 2021 17:41:19 +0100 Subject: [PATCH 13/19] Update Transactions and fix errors Reduce quoting level, and fix errors introduced by prior commits --- Sccp_manager.class.php | 4 +- Sccp_manager.inc/dbinterface.class.php | 63 ++++++++++++++------------ 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index 12254fb..6f63211 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -1165,7 +1165,7 @@ dbug('getting Phone Grid'); $save_settings = array(); $save_codec = array(); $name_dev = ''; - $db_field = $this->dbinterface->HWextension_db_SccpTableData("get_colums_sccpdevice"); + $db_field = $this->dbinterface->HWextension_db_SccpTableData("get_columns_sccpdevice"); $hw_id = (empty($get_settings['sccp_deviceid'])) ? 'new' : $get_settings['sccp_deviceid']; $hw_type = (empty($get_settings['sccp_device_typeid'])) ? 'sccpdevice' : $get_settings['sccp_device_typeid']; $update_hw = ($hw_id == 'new') ? 'update' : 'clear'; @@ -1407,7 +1407,7 @@ dbug('getting Phone Grid'); ); */ $name_dev = ''; - $db_field = $this->dbinterface->HWextension_db_SccpTableData("get_colums_sccpuser"); + $db_field = $this->dbinterface->HWextension_db_SccpTableData("get_columns_sccpuser"); // $hw_id = (empty($get_settings['sccp_deviceid'])) ? 'new' : $get_settings['sccp_deviceid']; // $update_hw = ($hw_id == 'new') ? 'update' : 'clear'; $hw_prefix = 'SEP'; diff --git a/Sccp_manager.inc/dbinterface.class.php b/Sccp_manager.inc/dbinterface.class.php index a4bd67e..0d3ee83 100644 --- a/Sccp_manager.inc/dbinterface.class.php +++ b/Sccp_manager.inc/dbinterface.class.php @@ -113,19 +113,19 @@ class dbinterface case 'HWextension': $raw_settings = $this->getDb_model_info($get = "extension", $format_list = "model"); break; - case 'get_colums_sccpdevice': - $sql = "DESCRIBE sccpdevice"; + case 'get_columns_sccpdevice': + $sql = 'DESCRIBE sccpdevice'; $stmt = $db->prepare($sql); break; - case 'get_colums_sccpuser': - $sql = "DESCRIBE sccpuser"; + case 'get_columns_sccpuser': + $sql = 'DESCRIBE sccpuser'; $stmts = $db->prepare($sql); break; case 'get_sccpdevice_byid': - $sql = 'SELECT t1.*, types.dns, types.buttons, types.loadimage, types.nametemplate as nametemplate, ' - . 'addon.buttons as addon_buttons FROM sccpdevice AS t1 ' - . 'LEFT JOIN sccpdevmodel as types ON t1.type=types.model ' - . 'LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name="' . $data['id'] . ''; + $sql = 'SELECT t1.*, types.dns, types.buttons, types.loadimage, types.nametemplate as nametemplate, + addon.buttons as addon_buttons FROM sccpdevice AS t1 + LEFT JOIN sccpdevmodel as types ON t1.type=types.model + LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name =\'' . $data['id'] . '\''; $stmt = $db->prepare($sql); break; case 'get_sccpuser': @@ -246,6 +246,13 @@ class dbinterface function write($table_name = "", $save_value = array(), $mode = 'update', $key_fld = "", $hwid = "") { +//dbug('entering write for table', $table_name); +if ($table_name === 'sccpdevmodel'){ +dbug('entering write with save_value', $save_value); +dbug('entering write with mode', $mode); +dbug('entering write with key_fld', $key_fld); +dbug('entering write with hwid', $hwid); +} // mode clear - Empty table before update // mode update - update / replace record global $db; @@ -271,25 +278,22 @@ class dbinterface if ($mode == 'clear') { // $sql = 'truncate `sccpsettings`'; $db->prepare('TRUNCATE sccpsettings')->execute(); - $stmt = $db->prepare('INSERT INTO sccpsettings (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); + $stmt = $db->prepare('INSERT INTO sccpsettings (keyword, data, seq, type) VALUES (?,?,?,?)'); $result = $db->executeMultiple($stmt, $save_value); } else { if (!empty($delete_value)) { - $stmt = $db->prepare('DELETE FROM sccpsettings WHERE `keyword`=?'); + $stmt = $db->prepare('DELETE FROM sccpsettings WHERE keyword = ?'); $result = $db->executeMultiple($stmt, $delete_value); } if (!empty($save_value)) { - $stmt = $db->prepare('REPLACE INTO sccpsettings (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)'); + $stmt = $db->prepare('REPLACE INTO sccpsettings (keyword, data, seq, type) VALUES (?,?,?,?)'); $result = $db->executeMultiple($stmt, $save_value); } } break; - case 'sccpdevmodel': - break; - case 'sccpdevice': - break; + case 'sccpdevmodel': // Fall through to next intentionally + case 'sccpdevice': // Fall through to next intentionally case 'sccpuser': - $sql_db = $table_name; $sql_key = ""; $sql_var = ""; foreach ($save_value as $key_v => $data) { @@ -297,23 +301,24 @@ class dbinterface $sql_var .= ', '; } if ($data === $this->val_null) { - $sql_var .= '`' . $key_v . '`=NULL'; + $sql_var .= $key_v . '= NULL'; } else { - $sql_var .= '`' . $key_v . '`="' . $data . '"'; + $sql_var .= $key_v . ' = \'' . $data . '\''; } if ($key_fld == $key_v) { - $sql_key = '`' . $key_v . '`="' . $data . '"'; + $sql_key = $key_v . ' = \'' . $data . '\''; } } if (!empty($sql_var)) { - if ($mode == 'delete') { - $req = 'DELETE FROM sccpuser WHERE ' . $sql_key . ''; - } else { - if ($mode == 'update') { - $req = 'UPDATE sccpuser SET ' . $sql_var . 'WHERE ' . $sql_key . ''; - } else { - $req = 'REPLACE INTO sccpuser SET ' . $sql_var . ''; - } + switch ($mode) { + case 'delete': + $req = 'DELETE FROM '. $table_name . ' WHERE ' . $sql_key; + break; + case 'update': + $req = 'UPDATE ' . $table_name . ' SET ' . $sql_var . ' WHERE ' . $sql_key; + break; + default: + $req = 'REPLACE INTO ' . $table_name . ' SET ' . $sql_var; } } $result = $db->prepare($req)->execute(); @@ -327,14 +332,14 @@ class dbinterface break; case 'replace': if (!empty($save_value)) { - $sql = 'UPDATE sccpbuttonconfig SET `name`=? WHERE `ref`= ? AND `reftype`=? AND `instance`=? AND `buttontype`=?'; + $sql = 'UPDATE sccpbuttonconfig SET name =? WHERE ref = ? AND reftype =? AND instance =? AND buttontype =?'; $stmt = $db->prepare($sql); $result= $db->executeMultiple($stmt, $save_value); } break; default: if (!empty($save_value)) { - $sql = 'INSERT INTO sccpbuttonconfig (`ref`, `reftype`,`instance`, `buttontype`, `name`, `options`) VALUES (?,?,?,?,?,?)'; + $sql = 'INSERT INTO sccpbuttonconfig (ref, reftype, instance, buttontype, name, options) VALUES (?,?,?,?,?,?)'; $stmt = $db->prepare($sql); $result = $db->executeMultiple($stmt, $save_value); } From 73ea3023eb1dea7b27f60418b9da18d9b08389d0 Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Tue, 9 Feb 2021 12:31:06 +0100 Subject: [PATCH 14/19] Use bindParam on db executes Use bind param to have stricter typing Fix bug in Sccp-Manager where key and keyword were not the same --- Sccp_manager.class.php | 8 ++-- Sccp_manager.inc/dbinterface.class.php | 52 +++++++++++--------------- 2 files changed, 25 insertions(+), 35 deletions(-) diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index 6f63211..9e170ed 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -869,7 +869,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } break; case 'getDeviceModel': -dbug('getting Device model'); +//dbug('getting Device model'); switch ($request['type']) { case 'all': case 'extension': @@ -930,7 +930,7 @@ dbug('getting Device model'); return $result; break; case 'getExtensionGrid': -dbug('getting Extension Grid'); +//dbug('getting Extension Grid'); $result = $this->dbinterface->HWextension_db_SccpTableData('SccpExtension'); if (empty($result)) { return array(); @@ -954,7 +954,7 @@ dbug('getting Extension Grid'); return $result; break; case 'getPhoneGrid': -dbug('getting Phone Grid'); +//dbug('getting Phone Grid'); $cmd_type = !empty($request['type']) ? $request['type'] : ''; $result = $this->dbinterface->HWextension_db_SccpTableData('SccpDevice', array('type' => $cmd_type)); @@ -2132,7 +2132,7 @@ dbug('getting Phone Grid'); $dir_list = $this->findAllFiles($dir, $file_ext, 'fileonly'); } $raw_settings = $this->dbinterface->getDb_model_info($get, $format_list, $filter); -dbug('reloading table'); +//dbug('reloading table'); if ($validate) { for ($i = 0; $i < count($raw_settings); $i++) { $raw_settings[$i]['validate'] = '-;-'; diff --git a/Sccp_manager.inc/dbinterface.class.php b/Sccp_manager.inc/dbinterface.class.php index 0d3ee83..b57c116 100644 --- a/Sccp_manager.inc/dbinterface.class.php +++ b/Sccp_manager.inc/dbinterface.class.php @@ -246,48 +246,38 @@ class dbinterface function write($table_name = "", $save_value = array(), $mode = 'update', $key_fld = "", $hwid = "") { -//dbug('entering write for table', $table_name); -if ($table_name === 'sccpdevmodel'){ -dbug('entering write with save_value', $save_value); -dbug('entering write with mode', $mode); -dbug('entering write with key_fld', $key_fld); -dbug('entering write with hwid', $hwid); -} // mode clear - Empty table before update // mode update - update / replace record global $db; -// global $amp_conf; $result = false; $delete_value = array(); switch ($table_name) { case 'sccpsettings': - foreach ($save_value as $key_v => $data) { - if (!empty($data) && isset($data['data'])) { - if ($data['data'] == $this->val_null) { - $delete_value[] = $save_value[$key_v]['keyword']; - unset($save_value[$key_v]); - } -/* if (isset($data['data'])) { - if ($data['data'] == $this->val_null) { - $delete_value[] = $save_value[$key_v]['keyword']; - unset($save_value[$key_v]); - } - } -*/ } - } + $time = -microtime(true); if ($mode == 'clear') { -// $sql = 'truncate `sccpsettings`'; $db->prepare('TRUNCATE sccpsettings')->execute(); - $stmt = $db->prepare('INSERT INTO sccpsettings (keyword, data, seq, type) VALUES (?,?,?,?)'); - $result = $db->executeMultiple($stmt, $save_value); + $stmt = $db->prepare('INSERT INTO sccpsettings (keyword, data, seq, type) VALUES (:keyword,:data,:seq,:type)'); } else { - if (!empty($delete_value)) { - $stmt = $db->prepare('DELETE FROM sccpsettings WHERE keyword = ?'); - $result = $db->executeMultiple($stmt, $delete_value); + $stmt = $db->prepare('REPLACE INTO sccpsettings (keyword, data, seq, type) VALUES (:keyword,:data,:seq,:type)'); + } + foreach ($save_value as $key => $dataArr) { + if (!empty($dataArr) && isset($dataArr['data'])) { + if ($dataArr['data'] == $this->val_null) { + $delete_value[] = $save_value[$key]['keyword']; + break; + } } - if (!empty($save_value)) { - $stmt = $db->prepare('REPLACE INTO sccpsettings (keyword, data, seq, type) VALUES (?,?,?,?)'); - $result = $db->executeMultiple($stmt, $save_value); + $stmt->bindParam(':keyword',$dataArr['keyword'],\PDO::PARAM_STR); + $stmt->bindParam(':data',$dataArr['data'],\PDO::PARAM_STR); + $stmt->bindParam(':seq',$dataArr['seq'],\PDO::PARAM_INT); + $stmt->bindParam(':type',$dataArr['type'],\PDO::PARAM_INT); + $result = $stmt->execute(); + } + if (!empty($delete_value)) { + $stmt = $db->prepare('DELETE FROM sccpsettings WHERE keyword = :keyword'); + foreach ($delete_value as $del_key) { + $stmt->bindParam(':keyword',$del_key,\PDO::PARAM_STR); + $result = $stmt->execute(); } } break; From 6bfa3112812b55531607c5096431edde458c79ad Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Thu, 11 Feb 2021 12:46:37 +0100 Subject: [PATCH 15/19] Final version Standardise some calls and add notes --- Sccp_manager.class.php | 26 +++-- Sccp_manager.inc/dbinterface.class.php | 129 +++++++++++-------------- 2 files changed, 73 insertions(+), 82 deletions(-) diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index 9e170ed..2475a63 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -169,7 +169,11 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { $this->xml_data = simplexml_load_file($xml_vars); $this->initVarfromXml(); // Overwrite Exist } - $this->saveSccpSettings(); + + if (get_class($freepbx) === 'FreePBX') { + // only save settings when building a new FreePBX object + $this->saveSccpSettings(); + } } /* @@ -643,6 +647,8 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } public function ajaxRequest($req, &$setting) { + // Called first by BMO. Must return true or request will be aborted. + // See https://wiki.freepbx.org/display/FOP/BMO+Ajax+Calls switch ($req) { case 'backupsettings': case 'savesettings': @@ -671,11 +677,13 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { case 'delete_dialplan': return true; break; + default: + return false; } - return false; } - // !TODO!: this should go into it's only ajam.html.php file (see: dahdiconfig) + // !TODO!: this should go into it's only ajax.html.php file (see: dahdiconfig) + // ajaxHandler is called after ajaxRequest returns true public function ajaxHandler() { $request = $_REQUEST; $msg = array(); @@ -823,7 +831,6 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { $res = $this->updateSccpButtons($hw_list); $msg .= $res['Response'] . ' raw: ' . $res['data'] . ' '; return array('status' => true, 'message' => 'Update Butons Labels Complite ' . $msg, 'reload' => true); - case 'model_add': $save_settings = array(); $key_name = array('model', 'vendor', 'dns', 'buttons', 'loadimage', 'loadinformationid', 'nametemplate'); @@ -847,7 +854,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { return $save_settings; break; case 'model_enabled': - $model_set = '1'; + $model_set = '1'; // fall through intentionally case 'model_disabled': if ($request['command'] == 'model_disabled') { $model_set = '0'; @@ -860,7 +867,6 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } } return array('status' => true, 'table_reload' => true); - break; case 'model_delete': if (!empty($request['model'])) { @@ -1288,7 +1294,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } $this->dbinterface->write("sccpdevice", $save_settings, 'replace'); $save_buttons = $this->getPhoneButtons($get_settings, $name_dev, $hw_type); - $this->dbinterface->write("sccpbuttons", $save_buttons, $update_hw, '', $name_dev); + $this->dbinterface->write("sccpbuttons", $save_buttons, $update_hw, 'add', $name_dev); //was empty so would fall through to INSERT $this->createSccpDeviceXML($name_dev); if ($hw_id == 'new') { $this->srvinterface->sccpDeviceReset($name_dev); @@ -1480,9 +1486,9 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } } $this->dbinterface->write("sccpuser", $save_settings, 'replace', 'name'); - $this->dbinterface->write("sccpbuttons", $save_buttons, 'clear', '', $name_dev); + $this->dbinterface->write("sccpbuttons", $save_buttons, 'delete', '', $name_dev); //standardise to delete return $save_buttons; - + // Why is there a second return here??????? return $save_settings; } @@ -1867,7 +1873,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { // $save_settings = array(); if (empty($save_value)) { - $this->dbinterface->write('sccpsettings', $this->sccpvalues, 'clear'); + $this->dbinterface->write('sccpsettings', $this->sccpvalues, 'replace'); } else { $this->dbinterface->write('sccpsettings', $save_value, 'update'); } diff --git a/Sccp_manager.inc/dbinterface.class.php b/Sccp_manager.inc/dbinterface.class.php index b57c116..692f3ab 100644 --- a/Sccp_manager.inc/dbinterface.class.php +++ b/Sccp_manager.inc/dbinterface.class.php @@ -57,12 +57,11 @@ class dbinterface if (empty($data['name'])) { $stmts = $db->prepare('SELECT * FROM sccpline ORDER BY name'); } else { - $stmts = $db->prepare('SELECT * FROM sccpline WHERE name = $data[name]'); + $stmts = $db->prepare('SELECT * FROM sccpline WHERE name = :name'); + $stmt->bindParam(':name', $data['name'],\PDO::PARAM_STR); } break; case 'SccpDevice': - $filtered =''; - $singlerow = false; if (empty($data['fields'])) { $fld = 'name, name as mac, type, button, addon, _description as description'; } else { @@ -78,30 +77,21 @@ class dbinterface break; } } - if (!empty($data['name'])) { - $filtered = 'name =' . $data['name']. ''; - $singlerow = true; - } - if (!empty($data['type'])) { + if (!empty($data['name'])) { //either filter by name or by type + $stmt = $db->prepare('SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE name = :name ORDER BY name'); + $stmt->bindParam(':name', $data['name'],\PDO::PARAM_STR); + } elseif (!empty($data['type'])) { switch ($data['type']) { case "cisco-sip": - $filtered = 'TYPE LIKE \'%-sip\''; + $stmts = $db->prepare('SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE TYPE LIKE \'%-sip\' ORDER BY name'); break; - case "cisco": + case "cisco": // Fall through to default intentionally default: - $filtered = 'TYPE not LIKE \'%-sip\''; + $stmts = $db->prepare('SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE TYPE not LIKE \'%-sip\' ORDER BY name'); break; } - } - if (empty($filtered)) { - $sql = 'SELECT ' . $fld . ' FROM sccpdeviceconfig ORDER BY name'; - } else { - $sql = 'SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE '. $filtered . ' ORDER BY name'; - } - if ($singlerow) { - $stmt = $db->prepare($sql); - } else { - $stmts = $db->prepare($sql); + } else { //no filter and no name provided - return all + $stmts = $db->prepare('SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE ORDER BY name'); } break; case 'HWSipDevice': @@ -114,39 +104,34 @@ class dbinterface $raw_settings = $this->getDb_model_info($get = "extension", $format_list = "model"); break; case 'get_columns_sccpdevice': - $sql = 'DESCRIBE sccpdevice'; - $stmt = $db->prepare($sql); + $stmts = $db->prepare('DESCRIBE sccpdevice'); break; case 'get_columns_sccpuser': - $sql = 'DESCRIBE sccpuser'; - $stmts = $db->prepare($sql); + $stmts = $db->prepare('DESCRIBE sccpuser'); break; case 'get_sccpdevice_byid': - $sql = 'SELECT t1.*, types.dns, types.buttons, types.loadimage, types.nametemplate as nametemplate, + $stmt = $db->prepare('SELECT t1.*, types.dns, types.buttons, types.loadimage, types.nametemplate as nametemplate, addon.buttons as addon_buttons FROM sccpdevice AS t1 LEFT JOIN sccpdevmodel as types ON t1.type=types.model - LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name =\'' . $data['id'] . '\''; - $stmt = $db->prepare($sql); + LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name = :name'); + $stmt->bindParam(':name', $data['id'],\PDO::PARAM_STR); break; case 'get_sccpuser': - $sql = 'SELECT * FROM sccpuser '; - if (!empty($data['id'])) { - $sql .= 'WHERE name= ' . $data['id'] . ''; - } - $sql .= ' ORDER BY name'; - $stmt = $db->prepare($sql); + $stmt = $db->prepare('SELECT * FROM sccpuser WHERE name = :name'); + $stmt->bindParam(':name', $data['id'],\PDO::PARAM_STR); break; case 'get_sccpdevice_buttons': $sql = ''; if (!empty($data['buttontype'])) { - $sql .= 'buttontype="' . $data['buttontype'] . '" '; + $sql .= 'buttontype = :buttontype'; } if (!empty($data['id'])) { - $sql .= (empty($sql)) ? 'ref="' . $data['id'] . '" ' : 'and ref="' . $data['id'] . ''; + $sql .= (empty($sql)) ? 'ref = :ref' : ' and ref = :ref'; } if (!empty($sql)) { - $sql = 'SELECT * FROM sccpbuttonconfig WHERE ' .$sql. ' ORDER BY `instance`;'; - $stmts = $db->prepare($sql); + $stmts = $db->prepare('SELECT * FROM sccpbuttonconfig WHERE ' .$sql. ' ORDER BY instance'); + $stmts->bindParam(':buttontype', $data['buttontype'],\PDO::PARAM_STR); + $stmts->bindParam(':ref', $data['id'],\PDO::PARAM_STR); } else { $raw_settings = array(); } @@ -197,13 +182,12 @@ class dbinterface if (!empty($filter)) { if (!empty($filter['model'])) { if (strpos($filter['model'], 'loadInformation')) { - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid =' . $filter['model'] . ') ORDER BY model'; + $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid =' . $filter['model'] . ') ORDER BY model'); } else { - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid = loadInformation' . $filter['model'] . ') ORDER BY model'; + $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid = loadInformation' . $filter['model'] . ') ORDER BY model'); } } else { -// $sql = "SELECT ".$filter['model']; - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; + $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'); } break; } @@ -211,35 +195,34 @@ class dbinterface case 'byid': if (!empty($filter)) { if (!empty($filter['model'])) { - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (model =' . $filter['model'] . ') ORDER BY model'; + $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE model = :model ORDER BY model'); + $stmt->bindParam(':model', $filter['model'],\PDO::PARAM_STR); } else { -// $sql = "SELECT ".$filter['model']; - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; + $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'); } break; } break; case 'extension': - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns = 0) and (enabled > 0) ORDER BY model'; //check table + $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns = 0) and (enabled = 1) ORDER BY model'); break; case 'enabled': - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE enabled > 0 ORDER BY model '; //previously this fell through to phones. - break; + //$stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE enabled = 1 ORDER BY model'); //previously this fell through to phones. + //break; // above includes expansion modules but was not original behaviour so commented out. Falls through to phones. case 'phones': - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) ORDER BY model '; //check table + $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled = 1) ORDER BY model '); break; case 'ciscophones': - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND vendor NOT LIKE \'%-sip\' ORDER BY model'; + $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled = 1) AND vendor NOT LIKE \'%-sip\' ORDER BY model'); break; case 'sipphones': - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled > 0) AND `vendor` LIKE \'%-sip\' ORDER BY model'; + $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled = 1) AND `vendor` LIKE \'%-sip\' ORDER BY model'); break; case 'all': // Fall through to default default: - $sql = 'SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'; + $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'); break; } - $stmt = $db->prepare($sql); $stmt->execute(); return $stmt->fetchAll(\PDO::FETCH_ASSOC); } @@ -253,8 +236,7 @@ class dbinterface $delete_value = array(); switch ($table_name) { case 'sccpsettings': - $time = -microtime(true); - if ($mode == 'clear') { + if ($mode == 'replace') { // Change mode name to be more transparent $db->prepare('TRUNCATE sccpsettings')->execute(); $stmt = $db->prepare('INSERT INTO sccpsettings (keyword, data, seq, type) VALUES (:keyword,:data,:seq,:type)'); } else { @@ -282,7 +264,7 @@ class dbinterface } break; case 'sccpdevmodel': // Fall through to next intentionally - case 'sccpdevice': // Fall through to next intentionally + case 'sccpdevice': // Fall through to next intentionally case 'sccpuser': $sql_key = ""; $sql_var = ""; @@ -293,46 +275,49 @@ class dbinterface if ($data === $this->val_null) { $sql_var .= $key_v . '= NULL'; } else { - $sql_var .= $key_v . ' = \'' . $data . '\''; + $sql_var .= $key_v . ' = \'' . $data . '\''; //quote data as normally is string } - if ($key_fld == $key_v) { - $sql_key = $key_v . ' = \'' . $data . '\''; + if ($key_v === $key_fld) { + $sql_key = $key_v . ' = \'' . $data . '\''; //quote data as normally is string } } if (!empty($sql_var)) { switch ($mode) { case 'delete': - $req = 'DELETE FROM '. $table_name . ' WHERE ' . $sql_key; + $stmt = $db->prepare('DELETE FROM '. $table_name . ' WHERE ' . $sql_key); break; case 'update': - $req = 'UPDATE ' . $table_name . ' SET ' . $sql_var . ' WHERE ' . $sql_key; + $stmt = $db->prepare('UPDATE ' . $table_name . ' SET ' . $sql_var . ' WHERE ' . $sql_key); break; - default: - $req = 'REPLACE INTO ' . $table_name . ' SET ' . $sql_var; + case 'replace': + $stmt = $db->prepare('REPLACE INTO ' . $table_name . ' VALUES ' . $sql_var); + break; + // no default mode - must be explicit. } } - $result = $db->prepare($req)->execute(); + $result = $stmt->execute(); break; case 'sccpbuttons': switch ($mode) { - case 'clear': // no break here as clear is same as delete case 'delete': - $sql = 'DELETE FROM sccpbuttonconfig WHERE ref=' . $hwid . ''; - $result = $db->prepare($sql)->execute(); + $sql = 'DELETE FROM sccpbuttonconfig WHERE ref = :hwid'; + $stmt = $db->prepare($sql); + $stmt->bindParam(':hwid', $hwid,\PDO::PARAM_STR); + $result = $stmt->execute(); break; case 'replace': if (!empty($save_value)) { - $sql = 'UPDATE sccpbuttonconfig SET name =? WHERE ref = ? AND reftype =? AND instance =? AND buttontype =?'; - $stmt = $db->prepare($sql); + $stmt = $db->prepare('UPDATE sccpbuttonconfig SET name =? WHERE ref = ? AND reftype =? AND instance =? AND buttontype =?'); $result= $db->executeMultiple($stmt, $save_value); } break; - default: + case 'add': if (!empty($save_value)) { - $sql = 'INSERT INTO sccpbuttonconfig (ref, reftype, instance, buttontype, name, options) VALUES (?,?,?,?,?,?)'; - $stmt = $db->prepare($sql); + $stmt = $db->prepare('INSERT INTO sccpbuttonconfig (ref, reftype, instance, buttontype, name, options) VALUES (?,?,?,?,?,?)'); $result = $db->executeMultiple($stmt, $save_value); } + break; + // No default case - must be specific in request. } } return $result; From 80923f5ce1abde5aaa6eeab630379c06cf0abede Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Thu, 11 Feb 2021 12:52:08 +0100 Subject: [PATCH 16/19] Remove dbugs --- Sccp_manager.class.php | 6 +----- install.php | 1 - 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index 2475a63..f1e69a4 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -875,7 +875,6 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { } break; case 'getDeviceModel': -//dbug('getting Device model'); switch ($request['type']) { case 'all': case 'extension': @@ -936,7 +935,6 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { return $result; break; case 'getExtensionGrid': -//dbug('getting Extension Grid'); $result = $this->dbinterface->HWextension_db_SccpTableData('SccpExtension'); if (empty($result)) { return array(); @@ -960,7 +958,6 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { return $result; break; case 'getPhoneGrid': -//dbug('getting Phone Grid'); $cmd_type = !empty($request['type']) ? $request['type'] : ''; $result = $this->dbinterface->HWextension_db_SccpTableData('SccpDevice', array('type' => $cmd_type)); @@ -1873,7 +1870,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { // $save_settings = array(); if (empty($save_value)) { - $this->dbinterface->write('sccpsettings', $this->sccpvalues, 'replace'); + $this->dbinterface->write('sccpsettings', $this->sccpvalues, 'replace'); //Change to replace as clearer } else { $this->dbinterface->write('sccpsettings', $save_value, 'update'); } @@ -2138,7 +2135,6 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { $dir_list = $this->findAllFiles($dir, $file_ext, 'fileonly'); } $raw_settings = $this->dbinterface->getDb_model_info($get, $format_list, $filter); -//dbug('reloading table'); if ($validate) { for ($i = 0; $i < count($raw_settings); $i++) { $raw_settings[$i]['validate'] = '-;-'; diff --git a/install.php b/install.php index 6e5c510..70fdc3f 100644 --- a/install.php +++ b/install.php @@ -1001,7 +1001,6 @@ if (!$sccp_db_ver) { InstallDB_createButtonConfigTrigger(); InstallDB_CreateSccpDeviceConfigView($sccp_compatible); InstallDB_updateDBVer($sccp_compatible); -dbug('chanSCCPWarning',$chanSCCPWarning); if ($chanSCCPWarning) { outn("
    "); outn("Warning: Upgrade chan_sccp_b to use full ami functionality"); From 3362f5a7cfe8a30edcfdfd8de5c37631562242b3 Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Thu, 11 Feb 2021 15:01:57 +0100 Subject: [PATCH 17/19] Update dbinterface.class.php --- Sccp_manager.inc/dbinterface.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sccp_manager.inc/dbinterface.class.php b/Sccp_manager.inc/dbinterface.class.php index 692f3ab..8571569 100644 --- a/Sccp_manager.inc/dbinterface.class.php +++ b/Sccp_manager.inc/dbinterface.class.php @@ -40,7 +40,7 @@ class dbinterface $id = $value[$indexField]; $result[$id] = $value; } - return $resut; + return $result; } public function HWextension_db_SccpTableData($dataid, $data = array()) From cc8eb549d09655090ba096dba4f7ad3f08161e9c Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Sat, 13 Mar 2021 11:21:12 +0100 Subject: [PATCH 18/19] Fix exception if sccpsettings table does not exist Before the installer can create sccpsettings, FreePBX instantiates an SCCP_Manager object which requires sccpsettings. Catch the exception and create the table --- Sccp_manager.inc/dbinterface.class.php | 28 +++++++++++++++++++++----- install.php | 19 +++++++++-------- uninstall.php | 8 ++++++++ 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/Sccp_manager.inc/dbinterface.class.php b/Sccp_manager.inc/dbinterface.class.php index 8571569..9f3cc5f 100644 --- a/Sccp_manager.inc/dbinterface.class.php +++ b/Sccp_manager.inc/dbinterface.class.php @@ -150,12 +150,30 @@ class dbinterface public function get_db_SccpSetting() { global $db; - $stmt = $db->prepare('SELECT keyword, data, type, seq FROM sccpsettings ORDER BY type, seq'); - $stmt->execute(); - foreach ($stmt->fetchAll() as $var) { - $mysccpvalues[$var['keyword']] = array('keyword' => $var['keyword'], 'data' => $var['data'], 'seq' => $var['seq'], 'type' => $var['type']); + try { + $stmt = $db->prepare('SELECT keyword, data, type, seq FROM sccpsettings ORDER BY type, seq'); + $stmt->execute(); + foreach ($stmt->fetchAll() as $var) { + $mysccpvalues[$var['keyword']] = array('keyword' => $var['keyword'], 'data' => $var['data'], 'seq' => $var['seq'], 'type' => $var['type']); + } + return $mysccpvalues; + } catch(\PDOException $e) { + // sccpsettings table does not yet exist. FreePBX is instantiating + // a SCCP_Manager object from the Installer before the installer can + // create the table so will create here. + $stmt = $db-> prepare('CREATE TABLE IF NOT EXISTS sccpsettings ( + keyword VARCHAR (50) NOT NULL, + data VARCHAR (255) NOT NULL, + seq TINYINT (1), + type TINYINT (1) NOT NULL default 0, + PRIMARY KEY (keyword, seq, type ) + );'); + $check = $stmt->execute(); + if (\DB::IsError($check)) { + die_freepbx("Can not create sccpsettings table, error: $check\n"); + } + return array(); } - return $mysccpvalues; } public function get_db_sysvalues() diff --git a/install.php b/install.php index 70fdc3f..ebdd734 100644 --- a/install.php +++ b/install.php @@ -27,7 +27,6 @@ if (!class_exists($class, false)) { if (class_exists($class, false)) { $srvinterface = new $class(); } - function Get_DB_config($sccp_compatible) { global $mobile_hw; @@ -484,16 +483,16 @@ function InstallDB_sccpsettings() { global $db; outn("
  • " . _("Creating sccpsettings table...") . "
  • "); - $sql = "CREATE TABLE IF NOT EXISTS `sccpsettings` ( - `keyword` VARCHAR (50) NOT NULL default '', - `data` VARCHAR (255) NOT NULL default '', - `seq` TINYINT (1), - `type` TINYINT (1) NOT NULL default '0', - PRIMARY KEY (`keyword`,`seq`,`type`) - );"; - $check = $db->query($sql); + $stmt = $db-> prepare('CREATE TABLE IF NOT EXISTS sccpsettings ( + keyword VARCHAR (50) NOT NULL, + data VARCHAR (255) NOT NULL, + seq TINYINT (1), + type TINYINT (1) NOT NULL, + PRIMARY KEY (keyword, seq, type ) + );'); + $check = $stmt->execute(); if (DB::IsError($check)) { - die_freepbx("Can not create sccpsettings table, error:$check\n"); + die_freepbx("Can not create sccpsettings table, error: $check\n"); } return true; } diff --git a/uninstall.php b/uninstall.php index 0a58e13..6974b3b 100644 --- a/uninstall.php +++ b/uninstall.php @@ -56,6 +56,14 @@ if (!empty($version)) { sql("DELETE FROM kvstore WHERE module = 'sccpsettings'"); sql("DELETE FROM kvstore WHERE module = 'Sccp_manager'"); } + // By accessing the database, we have recreated sccpsettings table so now delete + // Need to rewrite this uninstaller. + $sql = "DROP TABLE IF EXISTS sccpsettings"; + $result = $db->query($sql); + if (DB::IsError($result)) { + die_freepbx($result->getDebugInfo()); + } + unset($result); /* Comment: Maybe save in sccpsettings, if the chan_sccp tables already existed in the database or if they were created by install.php */ /* So that you know if it is safe to drop/delete them */ From 7030ec2bb5393be4a85616bcf920d8c1ce31e7b1 Mon Sep 17 00:00:00 2001 From: steve-lad <72376554+steve-lad@users.noreply.github.com> Date: Sat, 13 Mar 2021 14:58:30 +0100 Subject: [PATCH 19/19] Migrate from global db object As per FreePBX BMO, no longer use global db object --- Sccp_manager.inc/dbinterface.class.php | 94 +++++++++++++------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/Sccp_manager.inc/dbinterface.class.php b/Sccp_manager.inc/dbinterface.class.php index 9f3cc5f..5192647 100644 --- a/Sccp_manager.inc/dbinterface.class.php +++ b/Sccp_manager.inc/dbinterface.class.php @@ -46,7 +46,7 @@ class dbinterface public function HWextension_db_SccpTableData($dataid, $data = array()) { // $stmt is a single row fetch, $stmts is a fetchAll. - global $db; + $dbh = \FreePBX::Database(); $stmt = ''; $stmts = ''; if ($dataid == '') { @@ -55,9 +55,9 @@ class dbinterface switch ($dataid) { case 'SccpExtension': if (empty($data['name'])) { - $stmts = $db->prepare('SELECT * FROM sccpline ORDER BY name'); + $stmts = $dbh->prepare('SELECT * FROM sccpline ORDER BY name'); } else { - $stmts = $db->prepare('SELECT * FROM sccpline WHERE name = :name'); + $stmts = $dbh->prepare('SELECT * FROM sccpline WHERE name = :name'); $stmt->bindParam(':name', $data['name'],\PDO::PARAM_STR); } break; @@ -78,20 +78,20 @@ class dbinterface } } if (!empty($data['name'])) { //either filter by name or by type - $stmt = $db->prepare('SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE name = :name ORDER BY name'); + $stmt = $dbh->prepare('SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE name = :name ORDER BY name'); $stmt->bindParam(':name', $data['name'],\PDO::PARAM_STR); } elseif (!empty($data['type'])) { switch ($data['type']) { case "cisco-sip": - $stmts = $db->prepare('SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE TYPE LIKE \'%-sip\' ORDER BY name'); + $stmts = $dbh->prepare('SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE TYPE LIKE \'%-sip\' ORDER BY name'); break; case "cisco": // Fall through to default intentionally default: - $stmts = $db->prepare('SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE TYPE not LIKE \'%-sip\' ORDER BY name'); + $stmts = $dbh->prepare('SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE TYPE not LIKE \'%-sip\' ORDER BY name'); break; } } else { //no filter and no name provided - return all - $stmts = $db->prepare('SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE ORDER BY name'); + $stmts = $dbh->prepare('SELECT ' . $fld . ' FROM sccpdeviceconfig WHERE ORDER BY name'); } break; case 'HWSipDevice': @@ -104,20 +104,20 @@ class dbinterface $raw_settings = $this->getDb_model_info($get = "extension", $format_list = "model"); break; case 'get_columns_sccpdevice': - $stmts = $db->prepare('DESCRIBE sccpdevice'); + $stmts = $dbh->prepare('DESCRIBE sccpdevice'); break; case 'get_columns_sccpuser': - $stmts = $db->prepare('DESCRIBE sccpuser'); + $stmts = $dbh->prepare('DESCRIBE sccpuser'); break; case 'get_sccpdevice_byid': - $stmt = $db->prepare('SELECT t1.*, types.dns, types.buttons, types.loadimage, types.nametemplate as nametemplate, + $stmt = $dbh->prepare('SELECT t1.*, types.dns, types.buttons, types.loadimage, types.nametemplate as nametemplate, addon.buttons as addon_buttons FROM sccpdevice AS t1 LEFT JOIN sccpdevmodel as types ON t1.type=types.model LEFT JOIN sccpdevmodel as addon ON t1.addon=addon.model WHERE name = :name'); $stmt->bindParam(':name', $data['id'],\PDO::PARAM_STR); break; case 'get_sccpuser': - $stmt = $db->prepare('SELECT * FROM sccpuser WHERE name = :name'); + $stmt = $dbh->prepare('SELECT * FROM sccpuser WHERE name = :name'); $stmt->bindParam(':name', $data['id'],\PDO::PARAM_STR); break; case 'get_sccpdevice_buttons': @@ -129,7 +129,7 @@ class dbinterface $sql .= (empty($sql)) ? 'ref = :ref' : ' and ref = :ref'; } if (!empty($sql)) { - $stmts = $db->prepare('SELECT * FROM sccpbuttonconfig WHERE ' .$sql. ' ORDER BY instance'); + $stmts = $dbh->prepare('SELECT * FROM sccpbuttonconfig WHERE ' .$sql. ' ORDER BY instance'); $stmts->bindParam(':buttontype', $data['buttontype'],\PDO::PARAM_STR); $stmts->bindParam(':ref', $data['id'],\PDO::PARAM_STR); } else { @@ -149,9 +149,9 @@ class dbinterface public function get_db_SccpSetting() { - global $db; + $dbh = \FreePBX::Database(); try { - $stmt = $db->prepare('SELECT keyword, data, type, seq FROM sccpsettings ORDER BY type, seq'); + $stmt = $dbh->prepare('SELECT keyword, data, type, seq FROM sccpsettings ORDER BY type, seq'); $stmt->execute(); foreach ($stmt->fetchAll() as $var) { $mysccpvalues[$var['keyword']] = array('keyword' => $var['keyword'], 'data' => $var['data'], 'seq' => $var['seq'], 'type' => $var['type']); @@ -161,25 +161,25 @@ class dbinterface // sccpsettings table does not yet exist. FreePBX is instantiating // a SCCP_Manager object from the Installer before the installer can // create the table so will create here. - $stmt = $db-> prepare('CREATE TABLE IF NOT EXISTS sccpsettings ( + $stmt = $dbh-> prepare('CREATE TABLE IF NOT EXISTS sccpsettings ( keyword VARCHAR (50) NOT NULL, data VARCHAR (255) NOT NULL, seq TINYINT (1), type TINYINT (1) NOT NULL default 0, PRIMARY KEY (keyword, seq, type ) );'); - $check = $stmt->execute(); - if (\DB::IsError($check)) { - die_freepbx("Can not create sccpsettings table, error: $check\n"); - } + $stmt->execute(); + //if ($dbh::IsError($check)) { + // die_freepbx("Can not create sccpsettings table, error: $check\n"); + //} return array(); } } public function get_db_sysvalues() { - global $db; - $stmt = $db->prepare('SHOW VARIABLES LIKE \'%group_concat%\''); + $dbh = \FreePBX::Database(); + $stmt = $dbh->prepare('SHOW VARIABLES LIKE \'%group_concat%\''); $stmt->execute(); return $stmt->fetch(\PDO::FETCH_ASSOC); } @@ -190,7 +190,7 @@ class dbinterface function getDb_model_info($get = 'all', $format_list = 'all', $filter = array()) { - global $db; + $dbh = \FreePBX::Database(); $sel_inf = '*, 0 as validate'; if ($format_list === 'model') { $sel_inf = 'model, vendor, dns, buttons, 0 as validate'; @@ -200,12 +200,12 @@ class dbinterface if (!empty($filter)) { if (!empty($filter['model'])) { if (strpos($filter['model'], 'loadInformation')) { - $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid =' . $filter['model'] . ') ORDER BY model'); + $stmt = $dbh->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid =' . $filter['model'] . ') ORDER BY model'); } else { - $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid = loadInformation' . $filter['model'] . ') ORDER BY model'); + $stmt = $dbh->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (loadinformationid = loadInformation' . $filter['model'] . ') ORDER BY model'); } } else { - $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'); + $stmt = $dbh->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'); } break; } @@ -213,32 +213,32 @@ class dbinterface case 'byid': if (!empty($filter)) { if (!empty($filter['model'])) { - $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE model = :model ORDER BY model'); + $stmt = $dbh->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE model = :model ORDER BY model'); $stmt->bindParam(':model', $filter['model'],\PDO::PARAM_STR); } else { - $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'); + $stmt = $dbh->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'); } break; } break; case 'extension': - $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns = 0) and (enabled = 1) ORDER BY model'); + $stmt = $dbh->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns = 0) and (enabled = 1) ORDER BY model'); break; case 'enabled': //$stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE enabled = 1 ORDER BY model'); //previously this fell through to phones. //break; // above includes expansion modules but was not original behaviour so commented out. Falls through to phones. case 'phones': - $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled = 1) ORDER BY model '); + $stmt = $dbh->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled = 1) ORDER BY model '); break; case 'ciscophones': - $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled = 1) AND vendor NOT LIKE \'%-sip\' ORDER BY model'); + $stmt = $dbh->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled = 1) AND vendor NOT LIKE \'%-sip\' ORDER BY model'); break; case 'sipphones': - $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled = 1) AND `vendor` LIKE \'%-sip\' ORDER BY model'); + $stmt = $dbh->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel WHERE (dns > 0) and (enabled = 1) AND `vendor` LIKE \'%-sip\' ORDER BY model'); break; case 'all': // Fall through to default default: - $stmt = $db->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'); + $stmt = $dbh->prepare('SELECT ' . $sel_inf . ' FROM sccpdevmodel ORDER BY model'); break; } $stmt->execute(); @@ -249,16 +249,16 @@ class dbinterface { // mode clear - Empty table before update // mode update - update / replace record - global $db; + $dbh = \FreePBX::Database(); $result = false; $delete_value = array(); switch ($table_name) { case 'sccpsettings': if ($mode == 'replace') { // Change mode name to be more transparent - $db->prepare('TRUNCATE sccpsettings')->execute(); - $stmt = $db->prepare('INSERT INTO sccpsettings (keyword, data, seq, type) VALUES (:keyword,:data,:seq,:type)'); + $dbh->prepare('TRUNCATE sccpsettings')->execute(); + $stmt = $dbh->prepare('INSERT INTO sccpsettings (keyword, data, seq, type) VALUES (:keyword,:data,:seq,:type)'); } else { - $stmt = $db->prepare('REPLACE INTO sccpsettings (keyword, data, seq, type) VALUES (:keyword,:data,:seq,:type)'); + $stmt = $dbh->prepare('REPLACE INTO sccpsettings (keyword, data, seq, type) VALUES (:keyword,:data,:seq,:type)'); } foreach ($save_value as $key => $dataArr) { if (!empty($dataArr) && isset($dataArr['data'])) { @@ -274,7 +274,7 @@ class dbinterface $result = $stmt->execute(); } if (!empty($delete_value)) { - $stmt = $db->prepare('DELETE FROM sccpsettings WHERE keyword = :keyword'); + $stmt = $dbh->prepare('DELETE FROM sccpsettings WHERE keyword = :keyword'); foreach ($delete_value as $del_key) { $stmt->bindParam(':keyword',$del_key,\PDO::PARAM_STR); $result = $stmt->execute(); @@ -302,13 +302,13 @@ class dbinterface if (!empty($sql_var)) { switch ($mode) { case 'delete': - $stmt = $db->prepare('DELETE FROM '. $table_name . ' WHERE ' . $sql_key); + $stmt = $dbh->prepare('DELETE FROM '. $table_name . ' WHERE ' . $sql_key); break; case 'update': - $stmt = $db->prepare('UPDATE ' . $table_name . ' SET ' . $sql_var . ' WHERE ' . $sql_key); + $stmt = $dbh->prepare('UPDATE ' . $table_name . ' SET ' . $sql_var . ' WHERE ' . $sql_key); break; case 'replace': - $stmt = $db->prepare('REPLACE INTO ' . $table_name . ' VALUES ' . $sql_var); + $stmt = $dbh->prepare('REPLACE INTO ' . $table_name . ' VALUES ' . $sql_var); break; // no default mode - must be explicit. } @@ -319,20 +319,20 @@ class dbinterface switch ($mode) { case 'delete': $sql = 'DELETE FROM sccpbuttonconfig WHERE ref = :hwid'; - $stmt = $db->prepare($sql); + $stmt = $dbh->prepare($sql); $stmt->bindParam(':hwid', $hwid,\PDO::PARAM_STR); $result = $stmt->execute(); break; case 'replace': if (!empty($save_value)) { - $stmt = $db->prepare('UPDATE sccpbuttonconfig SET name =? WHERE ref = ? AND reftype =? AND instance =? AND buttontype =?'); - $result= $db->executeMultiple($stmt, $save_value); + $stmt = $dbh->prepare('UPDATE sccpbuttonconfig SET name =? WHERE ref = ? AND reftype =? AND instance =? AND buttontype =?'); + $result= $dbh->executeMultiple($stmt, $save_value); } break; case 'add': if (!empty($save_value)) { - $stmt = $db->prepare('INSERT INTO sccpbuttonconfig (ref, reftype, instance, buttontype, name, options) VALUES (?,?,?,?,?,?)'); - $result = $db->executeMultiple($stmt, $save_value); + $stmt = $dbh->prepare('INSERT INTO sccpbuttonconfig (ref, reftype, instance, buttontype, name, options) VALUES (?,?,?,?,?,?)'); + $result = $dbh->executeMultiple($stmt, $save_value); } break; // No default case - must be specific in request. @@ -357,14 +357,14 @@ class dbinterface */ public function validate() { - global $db; + $dbh = \FreePBX::Database(); $result = 0; $check_fields = [ '430' => ['_hwlang' => "varchar(12)"], '431' => ['private'=> "enum('on','off')"], '433' => ['directed_pickup'=>''] ]; - $stmt = $db->prepare('DESCRIBE sccpdevice'); + $stmt = $dbh->prepare('DESCRIBE sccpdevice'); $stmt->execute(); foreach ($stmt->fetchAll(\PDO::FETCH_ASSOC) as $value) { $id_result[$value['Field']] = $value['Type'];