From 0bd1f7b1ca7fa40ca893069dbdb90cfe9347fe93 Mon Sep 17 00:00:00 2001 From: phl0 Date: Mon, 26 Jan 2026 09:55:19 +0100 Subject: [PATCH 1/4] Skip callbook lookups if credentials are empty/not set --- application/libraries/Callbook.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/application/libraries/Callbook.php b/application/libraries/Callbook.php index 698c1724b..6d20466cb 100644 --- a/application/libraries/Callbook.php +++ b/application/libraries/Callbook.php @@ -55,26 +55,30 @@ class Callbook { case 'qrz': if ($this->ci->config->item('qrz_username') == null || $this->ci->config->item('qrz_password') == null) { $callbook['error'] = 'Lookup not configured. Please review configuration.'; + } else { + $callbook = $this->qrz($this->ci->config->item('qrz_username'), $this->ci->config->item('qrz_password'), $callsign, $this->ci->config->item('use_fullname')); } - $callbook = $this->qrz($this->ci->config->item('qrz_username'), $this->ci->config->item('qrz_password'), $callsign, $this->ci->config->item('use_fullname')); break; case 'qrzcq': if ($this->ci->config->item('qrzcq_username') == null || $this->ci->config->item('qrzcq_password') == null) { $callbook['error'] = 'Lookup not configured. Please review configuration.'; + } else { + $callbook = $this->qrzcq($this->ci->config->item('qrzcq_username'), $this->ci->config->item('qrzcq_password'), $callsign); } - $callbook = $this->qrzcq($this->ci->config->item('qrzcq_username'), $this->ci->config->item('qrzcq_password'), $callsign); break; case 'hamqth': if ($this->ci->config->item('hamqth_username') == null || $this->ci->config->item('hamqth_password') == null) { $callbook['error'] = 'Lookup not configured. Please review configuration.'; + } else { + $callbook = $this->hamqth($this->ci->config->item('hamqth_username'), $this->ci->config->item('hamqth_password'), $callsign); } - $callbook = $this->hamqth($this->ci->config->item('hamqth_username'), $this->ci->config->item('hamqth_password'), $callsign); break; case 'qrzru': if ($this->ci->config->item('qrzru_username') == null || $this->ci->config->item('qrzru_password') == null) { $callbook['error'] = 'Lookup not configured. Please review configuration.'; + } else { + $callbook = $this->qrzru($this->ci->config->item('qrzru_username'), $this->ci->config->item('qrzru_password'), $callsign); } - $callbook = $this->qrzru($this->ci->config->item('qrzru_username'), $this->ci->config->item('qrzru_password'), $callsign); break; default: $callbook['error'] = 'No callbook defined. Please review configuration.'; From 08a3b39dba4ca92eb44b2b2014a6f029040fe271 Mon Sep 17 00:00:00 2001 From: phl0 Date: Mon, 26 Jan 2026 11:55:02 +0100 Subject: [PATCH 2/4] Empty callbook source if all lookups fail --- application/controllers/Logbook.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/controllers/Logbook.php b/application/controllers/Logbook.php index 414cf6d1c..fc529f452 100644 --- a/application/controllers/Logbook.php +++ b/application/controllers/Logbook.php @@ -221,7 +221,7 @@ class Logbook extends CI_Controller { $return['latlng'] = $this->qralatlng($return['callsign_qra']); $return['bearing'] = $this->bearing($return['callsign_qra'], $measurement_base, $station_id); } - $return['callbook_source'] = $callbook['source']; + $return['callbook_source'] = $callbook['source'] ?? ''; echo json_encode($return, JSON_PRETTY_PRINT); From 0df25b2a45329f73369317c50450525d6ccee2ea Mon Sep 17 00:00:00 2001 From: phl0 Date: Wed, 28 Jan 2026 00:46:39 +0100 Subject: [PATCH 3/4] More detailed error messages for failed callbook lookups --- application/controllers/Logbook.php | 13 +- application/libraries/Callbook.php | 221 ++++++++++++++++------------ application/libraries/Hamqth.php | 7 +- application/libraries/Qrz.php | 10 +- application/libraries/Qrzcq.php | 7 +- application/libraries/Qrzru.php | 7 +- 6 files changed, 160 insertions(+), 105 deletions(-) diff --git a/application/controllers/Logbook.php b/application/controllers/Logbook.php index fc529f452..bbdf05827 100644 --- a/application/controllers/Logbook.php +++ b/application/controllers/Logbook.php @@ -921,9 +921,16 @@ class Logbook extends CI_Controller { $this->load->model('logbook_model'); $callsigninfo['grid_worked'] = $this->logbook_model->check_if_grid_worked_in_logbook(strtoupper(substr($callsigninfo['callsign']['gridsquare'],0,4)), null, $band)->num_rows(); } - - if (isset($callsigninfo['callsign']['error'])) { - $callsigninfo['error'] = $callsigninfo['callsign']['error']; + $source_callbooks = $this->config->item('callbook'); + if (is_array($source_callbooks)) { + $callsigninfo['error'] = ''.__('All callbook lookups failed or provided no results.').''; + foreach($source_callbooks as $source) { + $callsigninfo['error'] .= "
".$callsigninfo['callsign']['error_'.$source.'_name'].': '.$callsigninfo['callsign']['error_'.$source]; + } + } else { + if (isset($callsigninfo['callsign']['error'])) { + $callsigninfo['error'] = $callsigninfo['callsign']['error']; + } } $callsigninfo['lookupcall'] = strtoupper($lookupcall); diff --git a/application/libraries/Callbook.php b/application/libraries/Callbook.php index 6d20466cb..a4f572f94 100644 --- a/application/libraries/Callbook.php +++ b/application/libraries/Callbook.php @@ -20,6 +20,7 @@ class Callbook { public function getCallbookData($callsign) { // Load callbook configuration from config.php $source_callbooks = $this->ci->config->item('callbook'); + $callbook_errors = array(); // Check if the source callbook is a single element or an array if (is_array($source_callbooks)) { @@ -28,10 +29,12 @@ class Callbook { $callbook = $this->queryCallbook($callsign, $source); if (!isset($callbook['error']) || $callbook['error'] == '') { break; + } else { + $callbook_errors['error_'.$source] = $callbook['error']; + $callbook_errors['error_'.$source.'_name'] = $callbook['source']; } } - } - else { + } else { // Single callbook lookup (default behavior) $callbook = $this->queryCallbook($callsign, $source_callbooks); } @@ -47,38 +50,30 @@ class Callbook { $callbook['gridsquare'] = ''; } + if (isset($callbook['error']) && $callbook['error'] != '') { + if (is_array($source_callbooks)) { + foreach ($source_callbooks as $source) { + $callbook['error_'.$source] = $callbook_errors['error_'.$source]; + $callbook['error_'.$source.'_name'] = $callbook_errors['error_'.$source.'_name']; + } + } + } return $callbook; } function queryCallbook($callsign, $source) { switch ($source) { case 'qrz': - if ($this->ci->config->item('qrz_username') == null || $this->ci->config->item('qrz_password') == null) { - $callbook['error'] = 'Lookup not configured. Please review configuration.'; - } else { - $callbook = $this->qrz($this->ci->config->item('qrz_username'), $this->ci->config->item('qrz_password'), $callsign, $this->ci->config->item('use_fullname')); - } + $callbook = $this->qrz($callsign, $this->ci->config->item('use_fullname')); break; case 'qrzcq': - if ($this->ci->config->item('qrzcq_username') == null || $this->ci->config->item('qrzcq_password') == null) { - $callbook['error'] = 'Lookup not configured. Please review configuration.'; - } else { - $callbook = $this->qrzcq($this->ci->config->item('qrzcq_username'), $this->ci->config->item('qrzcq_password'), $callsign); - } + $callbook = $this->qrzcq($callsign); break; case 'hamqth': - if ($this->ci->config->item('hamqth_username') == null || $this->ci->config->item('hamqth_password') == null) { - $callbook['error'] = 'Lookup not configured. Please review configuration.'; - } else { - $callbook = $this->hamqth($this->ci->config->item('hamqth_username'), $this->ci->config->item('hamqth_password'), $callsign); - } + $callbook = $this->hamqth($callsign); break; case 'qrzru': - if ($this->ci->config->item('qrzru_username') == null || $this->ci->config->item('qrzru_password') == null) { - $callbook['error'] = 'Lookup not configured. Please review configuration.'; - } else { - $callbook = $this->qrzru($this->ci->config->item('qrzru_username'), $this->ci->config->item('qrzru_password'), $callsign); - } + $callbook = $this->qrzru($callsign); break; default: $callbook['error'] = 'No callbook defined. Please review configuration.'; @@ -88,122 +83,156 @@ class Callbook { return $callbook; } - function qrz($username, $password, $callsign, $fullname) { + function qrz($callsign, $fullname) { if (!$this->ci->load->is_loaded('qrz')) { $this->ci->load->library('qrz'); } + if ($this->ci->config->item('qrz_username') == null || $this->ci->config->item('qrz_password') == null) { + $callbook['error'] = 'Lookup not configured. Please review configuration.'; + $callbook['source'] = $this->ci->qrz->sourcename(); + } else { + $username = $this->ci->config->item('qrz_username'); + $password = $this->ci->config->item('qrz_password'); - if (!$this->ci->session->userdata('qrz_session_key')) { - $qrz_session_key = $this->ci->qrz->session($username, $password); - $this->ci->session->set_userdata('qrz_session_key', $qrz_session_key); - } + if (!$this->ci->session->userdata('qrz_session_key')) { + $qrz_session_key = $this->ci->qrz->session($username, $password); + $this->ci->session->set_userdata('qrz_session_key', $qrz_session_key); + } - $callbook = $this->ci->qrz->search($callsign, $this->ci->session->userdata('qrz_session_key'), $fullname); - - if ($callbook['error'] ?? '' == 'Invalid session key') { - $qrz_session_key = $this->ci->qrz->session($username, $password); - $this->ci->session->set_userdata('qrz_session_key', $qrz_session_key); $callbook = $this->ci->qrz->search($callsign, $this->ci->session->userdata('qrz_session_key'), $fullname); - } - if (strpos($callbook['error'] ?? '', 'Not found') !== false && strpos($callsign, "/") !== false) { - $plaincall = $this->get_plaincall($callsign); - // Now try again but give back reduced data, as we can't validate location and stuff (true at the end) - $callbook = $this->ci->qrz->search($plaincall, $this->ci->session->userdata('qrz_session_key'), $fullname, true); + if ($callbook['error'] ?? '' == 'Invalid session key') { + $qrz_session_key = $this->ci->qrz->session($username, $password); + $this->ci->session->set_userdata('qrz_session_key', $qrz_session_key); + $callbook = $this->ci->qrz->search($callsign, $this->ci->session->userdata('qrz_session_key'), $fullname); + } + + if (strpos($callbook['error'] ?? '', 'Not found') !== false && strpos($callsign, "/") !== false) { + $plaincall = $this->get_plaincall($callsign); + // Now try again but give back reduced data, as we can't validate location and stuff (true at the end) + $callbook = $this->ci->qrz->search($plaincall, $this->ci->session->userdata('qrz_session_key'), $fullname, true); + } } + $callbook['source'] = $this->ci->qrz->sourcename(); return $callbook; } - function qrzcq($username, $password, $callsign) { + function qrzcq($callsign) { if (!$this->ci->load->is_loaded('qrzcq')) { $this->ci->load->library('qrzcq'); } + if ($this->ci->config->item('qrzcq_username') == null || $this->ci->config->item('qrzcq_password') == null) { + $callbook['error'] = 'Lookup not configured. Please review configuration.'; + $callbook['source'] = $this->ci->qrzcq->sourcename(); + } else { + $username = $this->ci->config->item('qrzcq_username'); + $password = $this->ci->config->item('qrzcq_password'); - if (!$this->ci->session->userdata('qrzcq_session_key')) { - $result = $this->ci->qrzcq->session($username, $password); - if ($result[0] == 0) { - $this->ci->session->set_userdata('qrzcq_session_key', $result[1]); - } else { - $data['error'] = __("QRZCQ Error").": ".$result[1]; - return $data; + if (!$this->ci->session->userdata('qrzcq_session_key')) { + $result = $this->ci->qrzcq->session($username, $password); + if ($result[0] == 0) { + $this->ci->session->set_userdata('qrzcq_session_key', $result[1]); + } else { + $data['error'] = __("QRZCQ Error").": ".$result[1]; + $data['source'] = $this->ci->qrzcq->sourcename(); + return $data; + } + } + + $callbook = $this->ci->qrzcq->search($callsign, $this->ci->session->userdata('qrzcq_session_key')); + + if ($callbook['error'] ?? '' == 'Invalid session key') { + $qrzcq_session_key = $this->ci->qrzcq->session($username, $password); + $this->ci->session->set_userdata('qrzcq_session_key', $qrzcq_session_key); + $callbook = $this->ci->qrzcq->search($callsign, $this->ci->session->userdata('qrzcq_session_key')); + } + + if (strpos($callbook['error'] ?? '', 'Not found') !== false && strpos($callsign, "/") !== false) { + $plaincall = $this->get_plaincall($callsign); + // Now try again but give back reduced data, as we can't validate location and stuff (true at the end) + $callbook = $this->ci->qrzcq->search($plaincall, $this->ci->session->userdata('qrzcq_session_key'), true); } } - - $callbook = $this->ci->qrzcq->search($callsign, $this->ci->session->userdata('qrzcq_session_key')); - - if ($callbook['error'] ?? '' == 'Invalid session key') { - $qrzcq_session_key = $this->ci->qrzcq->session($username, $password); - $this->ci->session->set_userdata('qrzcq_session_key', $qrzcq_session_key); - $callbook = $this->ci->qrzcq->search($callsign, $this->ci->session->userdata('qrzcq_session_key')); - } - - if (strpos($callbook['error'] ?? '', 'Not found') !== false && strpos($callsign, "/") !== false) { - $plaincall = $this->get_plaincall($callsign); - // Now try again but give back reduced data, as we can't validate location and stuff (true at the end) - $callbook = $this->ci->qrzcq->search($plaincall, $this->ci->session->userdata('qrzcq_session_key'), true); - } + $callbook['source'] = $this->ci->qrzcq->sourcename(); return $callbook; } - function hamqth($username, $password, $callsign) { + function hamqth($callsign) { // Load the HamQTH library if (!$this->ci->load->is_loaded('hamqth')) { $this->ci->load->library('hamqth'); } + if ($this->ci->config->item('hamqth_username') == null || $this->ci->config->item('hamqth_password') == null) { + $callbook['error'] = 'Lookup not configured. Please review configuration.'; + $callbook['source'] = $this->ci->hamqth->sourcename(); + } else { + $username = $this->ci->config->item('hamqth_username'); + $password = $this->ci->config->item('hamqth_password'); - if (!$this->ci->session->userdata('hamqth_session_key')) { - $hamqth_session_key = $this->ci->hamqth->session($username, $password); - if ($hamqth_session_key == false) { - $callbook['error'] = __("Error obtaining a session key for HamQTH query"); - return $callbook; - } else { + if (!$this->ci->session->userdata('hamqth_session_key')) { + $hamqth_session_key = $this->ci->hamqth->session($username, $password); + if ($hamqth_session_key == false) { + $callbook['error'] = __("Error obtaining a session key for HamQTH query"); + $callbook['source'] = $this->ci->hamqth->sourcename(); + return $callbook; + } else { + $this->ci->session->set_userdata('hamqth_session_key', $hamqth_session_key); + } + } + + $callbook = $this->ci->hamqth->search($callsign, $this->ci->session->userdata('hamqth_session_key')); + + // If HamQTH session has expired, start a new session and retry the search. + if ($callbook['error'] == "Session does not exist or expired") { + $hamqth_session_key = $this->ci->hamqth->session($username, $password); $this->ci->session->set_userdata('hamqth_session_key', $hamqth_session_key); + $callbook = $this->ci->hamqth->search($callsign, $this->ci->session->userdata('hamqth_session_key')); + } + + if (strpos($callbook['error'] ?? '', 'Not found') !== false && strpos($callsign, "/") !== false) { + $plaincall = $this->get_plaincall($callsign); + // Now try again but give back reduced data, as we can't validate location and stuff (true at the end) + $callbook = $this->ci->hamqth->search($plaincall, $this->ci->session->userdata('hamqth_session_key'), true); } } - - $callbook = $this->ci->hamqth->search($callsign, $this->ci->session->userdata('hamqth_session_key')); - - // If HamQTH session has expired, start a new session and retry the search. - if ($callbook['error'] == "Session does not exist or expired") { - $hamqth_session_key = $this->ci->hamqth->session($username, $password); - $this->ci->session->set_userdata('hamqth_session_key', $hamqth_session_key); - $callbook = $this->ci->hamqth->search($callsign, $this->ci->session->userdata('hamqth_session_key')); - } - - if (strpos($callbook['error'] ?? '', 'Not found') !== false && strpos($callsign, "/") !== false) { - $plaincall = $this->get_plaincall($callsign); - // Now try again but give back reduced data, as we can't validate location and stuff (true at the end) - $callbook = $this->ci->hamqth->search($plaincall, $this->ci->session->userdata('hamqth_session_key'), true); - } + $callbook['source'] = $this->ci->hamqth->sourcename(); return $callbook; } - function qrzru($username, $password, $callsign) { + function qrzru($callsign) { if (!$this->ci->load->is_loaded('qrzru')) { $this->ci->load->library('qrzru'); } + if ($this->ci->config->item('qrzru_username') == null || $this->ci->config->item('qrzru_password') == null) { + $callbook['error'] = 'Lookup not configured. Please review configuration.'; + $callbook['source'] = $this->ci->qrzru->sourcename(); + } else { + $username = $this->ci->config->item('qrzru_username'); + $password = $this->ci->config->item('qrzru_password'); - if (!$this->ci->session->userdata('qrzru_session_key')) { - $result = $this->ci->qrzru->session($username, $password); - $this->ci->session->set_userdata('qrzru_session_key', $result); - } + if (!$this->ci->session->userdata('qrzru_session_key')) { + $result = $this->ci->qrzru->session($username, $password); + $this->ci->session->set_userdata('qrzru_session_key', $result); + } - $callbook = $this->ci->qrzru->search($callsign, $this->ci->session->userdata('qrzru_session_key')); - - if ($callbook['error'] ?? '' == 'Session does not exist or expired') { - $qrzru_session_key = $this->ci->qrzru->session($username, $password); - $this->ci->session->set_userdata('qrzru_session_key', $qrzru_session_key); $callbook = $this->ci->qrzru->search($callsign, $this->ci->session->userdata('qrzru_session_key')); - } - if (strpos($callbook['error'] ?? '', 'Callsign not found') !== false && strpos($callsign, "/") !== false) { - $plaincall = $this->get_plaincall($callsign); - // Now try again but give back reduced data, as we can't validate location and stuff (true at the end) - $callbook = $this->ci->qrzru->search($plaincall, $this->ci->session->userdata('qrzru_session_key'), true); + if ($callbook['error'] ?? '' == 'Session does not exist or expired') { + $qrzru_session_key = $this->ci->qrzru->session($username, $password); + $this->ci->session->set_userdata('qrzru_session_key', $qrzru_session_key); + $callbook = $this->ci->qrzru->search($callsign, $this->ci->session->userdata('qrzru_session_key')); + } + + if (strpos($callbook['error'] ?? '', 'Callsign not found') !== false && strpos($callsign, "/") !== false) { + $plaincall = $this->get_plaincall($callsign); + // Now try again but give back reduced data, as we can't validate location and stuff (true at the end) + $callbook = $this->ci->qrzru->search($plaincall, $this->ci->session->userdata('qrzru_session_key'), true); + } } + $callbook['source'] = $this->ci->qrzru->sourcename(); return $callbook; } diff --git a/application/libraries/Hamqth.php b/application/libraries/Hamqth.php index 44ac17e35..c71005a45 100644 --- a/application/libraries/Hamqth.php +++ b/application/libraries/Hamqth.php @@ -7,6 +7,8 @@ class Hamqth { + public $callbookname = 'HamQTH'; + // Return session key public function session($username, $password) { // URL to the XML Source @@ -126,8 +128,11 @@ class Hamqth { } } finally { - $data['source'] = 'HamQTH'; return $data; } } + + public function sourcename() { + return $this->callbookname; + } } diff --git a/application/libraries/Qrz.php b/application/libraries/Qrz.php index 6c536a603..24c37b5c9 100644 --- a/application/libraries/Qrz.php +++ b/application/libraries/Qrz.php @@ -4,9 +4,10 @@ Controls the interaction with the QRZ.com Subscription based XML API. */ - class Qrz { + public $callbookname = 'QRZ'; + // Return session key public function session($username, $password) { // URL to the XML Source @@ -60,7 +61,6 @@ class Qrz { return true; } - public function search($callsign, $key, $use_fullname = false, $reduced = false) { $data = null; $ci = & get_instance(); @@ -186,8 +186,12 @@ class Qrz { $data['cqzone'] = ''; } } finally { - $data['source'] = 'QRZ'; return $data; } } + + public function sourcename() { + return $this->callbookname; + } + } diff --git a/application/libraries/Qrzcq.php b/application/libraries/Qrzcq.php index 70e549b38..7abbfc84c 100644 --- a/application/libraries/Qrzcq.php +++ b/application/libraries/Qrzcq.php @@ -7,6 +7,8 @@ class Qrzcq { + public $callbookname = 'QRZCQ'; + // Return session key public function session($username, $password) { // URL to the XML Source @@ -144,8 +146,11 @@ class Qrzcq { } } finally { - $data['source'] = 'QRZCQ'; return $data; } } + + public function sourcename() { + return $this->callbookname; + } } diff --git a/application/libraries/Qrzru.php b/application/libraries/Qrzru.php index c8427cf6f..82493ae9b 100644 --- a/application/libraries/Qrzru.php +++ b/application/libraries/Qrzru.php @@ -7,6 +7,8 @@ class Qrzru { + public $callbookname = 'QRZ.ru'; + // Return session key public function session($username, $password) { // URL to the XML Source @@ -115,8 +117,11 @@ class Qrzru { $data['cqz'] = ''; } } finally { - $data['source'] = 'QRZ.ru'; return $data; } } + + public function sourcename() { + return $this->callbookname; + } } From 076f73ebfddadb8bbc2c8ebfd746f6c61e38a47d Mon Sep 17 00:00:00 2001 From: phl0 Date: Wed, 28 Jan 2026 07:44:55 +0100 Subject: [PATCH 4/4] Safeguard against empty vars --- application/libraries/Callbook.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/application/libraries/Callbook.php b/application/libraries/Callbook.php index a4f572f94..d3bbe6ab1 100644 --- a/application/libraries/Callbook.php +++ b/application/libraries/Callbook.php @@ -53,8 +53,10 @@ class Callbook { if (isset($callbook['error']) && $callbook['error'] != '') { if (is_array($source_callbooks)) { foreach ($source_callbooks as $source) { - $callbook['error_'.$source] = $callbook_errors['error_'.$source]; - $callbook['error_'.$source.'_name'] = $callbook_errors['error_'.$source.'_name']; + if (isset($callbook_errors['error_'.$source])) { + $callbook['error_'.$source] = $callbook_errors['error_'.$source]; + $callbook['error_'.$source.'_name'] = $callbook_errors['error_'.$source.'_name']; + } } } }