From 7fb09280fcdcecf777247b55413385aff2753532 Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Wed, 27 Aug 2025 10:39:05 +0100 Subject: [PATCH 01/11] Update general_words_lang.php --- application/language/swedish/general_words_lang.php | 1 - 1 file changed, 1 deletion(-) diff --git a/application/language/swedish/general_words_lang.php b/application/language/swedish/general_words_lang.php index ff042cc1..f01f7dc0 100644 --- a/application/language/swedish/general_words_lang.php +++ b/application/language/swedish/general_words_lang.php @@ -1,4 +1,3 @@ -<<<<<<< HEAD Date: Wed, 27 Aug 2025 10:44:42 +0100 Subject: [PATCH 02/11] Add Portuguese language support to config Added a case for 'portuguese' in the language configuration switch statement to support Portuguese localization. --- application/config/config.sample.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/application/config/config.sample.php b/application/config/config.sample.php index 4f1c9371..115b87b4 100644 --- a/application/config/config.sample.php +++ b/application/config/config.sample.php @@ -198,6 +198,9 @@ case 'finnish': case 'russian': $config['language'] = $lang; break; +case 'portuguese': + $config['language'] = $lang; + break; case 'english': $config['language'] = $lang; break; From 22b67fb925358b580af069afca2f43b14f183837 Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Wed, 27 Aug 2025 10:46:20 +0100 Subject: [PATCH 03/11] Add Portuguese language support to config Added a case for 'portuguese' in the language selection switch statement to support Portuguese in the configuration. --- install/config/config.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/install/config/config.php b/install/config/config.php index 1950c5af..f50cb1df 100644 --- a/install/config/config.php +++ b/install/config/config.php @@ -200,6 +200,9 @@ case 'finnish': case 'russian': $config['language'] = $lang; break; +case 'portuguese': + $config['language'] = $lang; + break; case 'english': $config['language'] = $lang; break; From 04ccd0809c9a5eda6c4d0111e9ee43f5cf3ff835 Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Fri, 29 Aug 2025 10:59:42 +0100 Subject: [PATCH 04/11] Refactor Adif controller for code style and readability Improved code formatting and consistency in the Adif controller by updating brace placement, indentation, and spacing. Enhanced readability and maintainability without changing core logic or functionality. --- application/controllers/Adif.php | 138 ++++++++++++++++--------------- 1 file changed, 71 insertions(+), 67 deletions(-) diff --git a/application/controllers/Adif.php b/application/controllers/Adif.php index 18cdb2ac..8bf35f0c 100644 --- a/application/controllers/Adif.php +++ b/application/controllers/Adif.php @@ -1,6 +1,7 @@ -load->helper(array('form', 'url')); $this->load->model('user_model'); - if(!$this->user_model->authorize(2)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); } + if (!$this->user_model->authorize(2)) { + $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); + redirect('dashboard'); + } } /* Shows Export Views */ - public function export() { + public function export() + { $data['page_title'] = "ADIF Export"; @@ -65,7 +70,8 @@ class adif extends CI_Controller { $this->load->view('adif/data/exportsat', $data); } - public function export_custom() { + public function export_custom() + { // Set memory limit to unlimited to allow heavy usage ini_set('memory_limit', '-1'); @@ -74,10 +80,10 @@ class adif extends CI_Controller { $station_id = $this->security->xss_clean($this->input->post('station_profile')); // Used for exporting QSOs not previously exported to LoTW - if ($this->input->post('exportLotw') == 1) { - $exportLotw = true; - } else { - $exportLotw = false; + if ($this->input->post('exportLotw') == 1) { + $exportLotw = true; + } else { + $exportLotw = false; } $data['qsos'] = $this->adif_data->export_custom($this->input->post('from'), $this->input->post('to'), $station_id, $exportLotw); @@ -87,29 +93,28 @@ class adif extends CI_Controller { if ($this->input->post('markLotw') == 1) { - foreach ($data['qsos']->result() as $qso) - { - $this->adif_data->mark_lotw_sent($qso->COL_PRIMARY_KEY); - } - } - } + foreach ($data['qsos']->result() as $qso) { + $this->adif_data->mark_lotw_sent($qso->COL_PRIMARY_KEY); + } + } + } - public function mark_lotw() { - // Set memory limit to unlimited to allow heavy usage - ini_set('memory_limit', '-1'); + public function mark_lotw() + { + // Set memory limit to unlimited to allow heavy usage + ini_set('memory_limit', '-1'); $station_id = $this->security->xss_clean($this->input->post('station_profile')); - $this->load->model('adif_data'); + $this->load->model('adif_data'); - $data['qsos'] = $this->adif_data->export_custom($this->input->post('from'), $this->input->post('to'), $station_id); + $data['qsos'] = $this->adif_data->export_custom($this->input->post('from'), $this->input->post('to'), $station_id); - foreach ($data['qsos']->result() as $qso) - { - $this->adif_data->mark_lotw_sent($qso->COL_PRIMARY_KEY); - } + foreach ($data['qsos']->result() as $qso) { + $this->adif_data->mark_lotw_sent($qso->COL_PRIMARY_KEY); + } - $this->load->view('adif/mark_lotw', $data); - } + $this->load->view('adif/mark_lotw', $data); + } public function export_lotw() { @@ -122,21 +127,21 @@ class adif extends CI_Controller { $this->load->view('adif/data/exportall', $data); - foreach ($data['qsos']->result() as $qso) - { + foreach ($data['qsos']->result() as $qso) { $this->adif_data->mark_lotw_sent($qso->COL_PRIMARY_KEY); } } - public function index() { + public function index() + { $this->load->model('stations'); $data['page_title'] = "ADIF Import / Export"; $data['max_upload'] = ini_get('upload_max_filesize'); $data['station_profile'] = $this->stations->all_of_user(); - $active_station_id = $this->stations->find_active(); - $station_profile = $this->stations->profile($active_station_id); + $active_station_id = $this->stations->find_active(); + $station_profile = $this->stations->profile($active_station_id); $data['active_station_info'] = $station_profile->row(); @@ -145,13 +150,14 @@ class adif extends CI_Controller { $this->load->view('interface_assets/footer'); } - public function import() { + public function import() + { $this->load->model('stations'); $data['station_profile'] = $this->stations->all_of_user(); - log_message("debug","Started ADIF Import"); + log_message("debug", "Started ADIF Import"); - $active_station_id = $this->stations->find_active(); - $station_profile = $this->stations->profile($active_station_id); + $active_station_id = $this->stations->find_active(); + $station_profile = $this->stations->profile($active_station_id); $data['active_station_info'] = $station_profile->row(); @@ -163,7 +169,7 @@ class adif extends CI_Controller { $this->load->library('upload', $config); - if ( ! $this->upload->do_upload()) { + if (! $this->upload->do_upload()) { $data['error'] = $this->upload->display_errors(); $data['max_upload'] = ini_get('upload_max_filesize'); @@ -181,39 +187,38 @@ class adif extends CI_Controller { $this->load->library('adif_parser'); - $this->adif_parser->load_from_file('./uploads/'.$data['upload_data']['file_name']); - unlink('./uploads/'.$data['upload_data']['file_name']); - $data['upload_data']=''; // free memory + $this->adif_parser->load_from_file('./uploads/' . $data['upload_data']['file_name']); + unlink('./uploads/' . $data['upload_data']['file_name']); + $data['upload_data'] = ''; // free memory $this->adif_parser->initialize(); $custom_errors = ""; - $alladif=[]; - while($record = $this->adif_parser->get_record()) - { - if(count($record) == 0) { + $alladif = []; + while ($record = $this->adif_parser->get_record()) { + if (count($record) == 0) { break; }; - array_push($alladif,$record); + array_push($alladif, $record); }; - $record=''; // free memory - $custom_errors = $this->logbook_model->import_bulk($alladif, $this->input->post('station_profile'), $this->input->post('skipDuplicate'), $this->input->post('markClublog'),$this->input->post('markLotw'), $this->input->post('dxccAdif'), $this->input->post('markQrz'), $this->input->post('markHrd'), true, $this->input->post('operatorName'), false, $this->input->post('skipStationCheck')); + $record = ''; // free memory + $custom_errors = $this->logbook_model->import_bulk($alladif, $this->input->post('station_profile'), $this->input->post('skipDuplicate'), $this->input->post('markClublog'), $this->input->post('markLotw'), $this->input->post('dxccAdif'), $this->input->post('markQrz'), $this->input->post('markHrd'), true, $this->input->post('operatorName'), false, $this->input->post('skipStationCheck')); } else { - $custom_errors='Station Profile not valid for User'; + $custom_errors = 'Station Profile not valid for User'; } $data['adif_errors'] = $custom_errors; $data['skip_dupes'] = $this->input->post('skipDuplicate'); - log_message("debug","Finished ADIF Import"); + log_message("debug", "Finished ADIF Import"); $data['page_title'] = "ADIF Imported"; $this->load->view('interface_assets/header', $data); $this->load->view('adif/import_success'); $this->load->view('interface_assets/footer'); - } } - public function dcl() { + public function dcl() + { $this->load->model('stations'); $data['station_profile'] = $this->stations->all_of_user(); @@ -225,7 +230,7 @@ class adif extends CI_Controller { $this->load->library('upload', $config); - if ( ! $this->upload->do_upload()) { + if (! $this->upload->do_upload()) { $data['error'] = $this->upload->display_errors(); $data['max_upload'] = ini_get('upload_max_filesize'); @@ -243,34 +248,33 @@ class adif extends CI_Controller { $this->load->library('adif_parser'); - $this->adif_parser->load_from_file('./uploads/'.$data['upload_data']['file_name']); + $this->adif_parser->load_from_file('./uploads/' . $data['upload_data']['file_name']); $this->adif_parser->initialize(); $error_count = array(0, 0, 0); $custom_errors = ""; - while($record = $this->adif_parser->get_record()) - { - if(count($record) == 0) { + while ($record = $this->adif_parser->get_record()) { + if (count($record) == 0) { break; }; $dok_result = $this->logbook_model->update_dok($record, $this->input->post('ignoreAmbiguous'), $this->input->post('onlyConfirmed'), $this->input->post('overwriteDok')); if (!empty($dok_result)) { switch ($dok_result[0]) { - case 0: - $error_count[0]++; - break; - case 1: - $custom_errors .= $dok_result[1]; - $error_count[1]++; - break; - case 2: - $custom_errors .= $dok_result[1]; - $error_count[2]++; + case 0: + $error_count[0]++; + break; + case 1: + $custom_errors .= $dok_result[1]; + $error_count[1]++; + break; + case 2: + $custom_errors .= $dok_result[1]; + $error_count[2]++; } } }; - unlink('./uploads/'.$data['upload_data']['file_name']); + unlink('./uploads/' . $data['upload_data']['file_name']); $data['dcl_error_count'] = $error_count; $data['dcl_errors'] = $custom_errors; $data['page_title'] = "DCL Data Imported"; @@ -278,7 +282,7 @@ class adif extends CI_Controller { $this->load->view('adif/dcl_success'); $this->load->view('interface_assets/footer'); } - } + } } /* End of file adif.php */ From f1dbceafd3def2b0a352dd4613d9dd016f8028b5 Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Tue, 2 Sep 2025 12:58:01 +0100 Subject: [PATCH 05/11] Add 4m band support to frequencyToBand function Extended the frequencyToBand function to recognize frequencies between 70 MHz and 72 MHz as the 4m band. --- assets/js/radiohelpers.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/assets/js/radiohelpers.js b/assets/js/radiohelpers.js index 102038d8..ccd8c436 100644 --- a/assets/js/radiohelpers.js +++ b/assets/js/radiohelpers.js @@ -34,6 +34,9 @@ function frequencyToBand(frequency) { else if(result >= 50000000 && result <= 56000000) { return '6m'; } + else if(result >= 70000000 && result <= 72000000) { + return '4m'; + } else if(result >= 144000000 && result <= 148000000) { return '2m'; } From 72ea1e3353cd41c6e05c7bb8705aafcc5b53186e Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Tue, 9 Sep 2025 14:19:15 +0100 Subject: [PATCH 06/11] Remove limit validation and update SQL join in logbook Removed the limit parameter validation and sanitization from Api.php, delegating limit handling elsewhere. Changed the SQL query in Logbook_model.php to use LEFT JOIN for station_profile, ensuring all logbook records are included even if no matching station_profile exists. --- application/controllers/Api.php | 9 --------- application/models/Logbook_model.php | 12 ++++++------ 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/application/controllers/Api.php b/application/controllers/Api.php index afdbeca7..529bb8d2 100644 --- a/application/controllers/Api.php +++ b/application/controllers/Api.php @@ -857,15 +857,6 @@ class API extends CI_Controller { return; } - // Validate and sanitize limit parameter - $limit = intval($limit); - if ($limit <= 0) { - $limit = 10; // default - } - if ($limit > 50) { - $limit = 50; // maximum - } - $this->load->model('logbooks_model'); $this->load->model('logbook_model'); diff --git a/application/models/Logbook_model.php b/application/models/Logbook_model.php index c00b2327..24a0d9e6 100755 --- a/application/models/Logbook_model.php +++ b/application/models/Logbook_model.php @@ -1945,13 +1945,13 @@ class Logbook_model extends CI_Model $location_list = "'" . implode("','", $logbooks_locations_array) . "'"; $sql = "SELECT * FROM ( select * from " . $this->config->item('table_name') . " - WHERE station_id IN(" . $location_list . ") - order by col_time_on desc, col_primary_key desc - limit " . $num . + WHERE station_id IN(" . $location_list . ") + order by col_time_on desc, col_primary_key desc + limit " . $num . ") hrd - JOIN station_profile ON station_profile.station_id = hrd.station_id - LEFT JOIN dxcc_entities ON hrd.col_dxcc = dxcc_entities.adif - order by col_time_on desc, col_primary_key desc"; + LEFT JOIN station_profile ON station_profile.station_id = hrd.station_id // Changed to LEFT JOIN + LEFT JOIN dxcc_entities ON hrd.col_dxcc = dxcc_entities.adif + order by col_time_on desc, col_primary_key desc"; $query = $this->db->query($sql); From 3f8f81364bedb25897f0c49d156b2c15e21a4b9a Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Tue, 9 Sep 2025 14:19:51 +0100 Subject: [PATCH 07/11] Update Logbook_model.php --- application/models/Logbook_model.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/application/models/Logbook_model.php b/application/models/Logbook_model.php index 24a0d9e6..c00b2327 100755 --- a/application/models/Logbook_model.php +++ b/application/models/Logbook_model.php @@ -1945,13 +1945,13 @@ class Logbook_model extends CI_Model $location_list = "'" . implode("','", $logbooks_locations_array) . "'"; $sql = "SELECT * FROM ( select * from " . $this->config->item('table_name') . " - WHERE station_id IN(" . $location_list . ") - order by col_time_on desc, col_primary_key desc - limit " . $num . + WHERE station_id IN(" . $location_list . ") + order by col_time_on desc, col_primary_key desc + limit " . $num . ") hrd - LEFT JOIN station_profile ON station_profile.station_id = hrd.station_id // Changed to LEFT JOIN - LEFT JOIN dxcc_entities ON hrd.col_dxcc = dxcc_entities.adif - order by col_time_on desc, col_primary_key desc"; + JOIN station_profile ON station_profile.station_id = hrd.station_id + LEFT JOIN dxcc_entities ON hrd.col_dxcc = dxcc_entities.adif + order by col_time_on desc, col_primary_key desc"; $query = $this->db->query($sql); From 5c4c1c2cd5beca8e335354093d28b36829210db5 Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Tue, 9 Sep 2025 14:21:21 +0100 Subject: [PATCH 08/11] Fix SQL JOIN in get_last_qsos for station_profile Changed the SQL query in get_last_qsos to use LEFT JOIN for station_profile instead of JOIN. This ensures that QSOs are returned even if there is no matching station_profile, improving data completeness. --- application/models/Logbook_model.php | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/application/models/Logbook_model.php b/application/models/Logbook_model.php index c00b2327..f66dff65 100755 --- a/application/models/Logbook_model.php +++ b/application/models/Logbook_model.php @@ -1932,7 +1932,6 @@ class Logbook_model extends CI_Model function get_last_qsos($num, $StationLocationsArray = null) { - if ($StationLocationsArray == null) { $CI = &get_instance(); $CI->load->model('logbooks_model'); @@ -1945,13 +1944,13 @@ class Logbook_model extends CI_Model $location_list = "'" . implode("','", $logbooks_locations_array) . "'"; $sql = "SELECT * FROM ( select * from " . $this->config->item('table_name') . " - WHERE station_id IN(" . $location_list . ") - order by col_time_on desc, col_primary_key desc - limit " . $num . + WHERE station_id IN(" . $location_list . ") + order by col_time_on desc, col_primary_key desc + limit " . $num . ") hrd - JOIN station_profile ON station_profile.station_id = hrd.station_id - LEFT JOIN dxcc_entities ON hrd.col_dxcc = dxcc_entities.adif - order by col_time_on desc, col_primary_key desc"; + LEFT JOIN station_profile ON station_profile.station_id = hrd.station_id + LEFT JOIN dxcc_entities ON hrd.col_dxcc = dxcc_entities.adif + order by col_time_on desc, col_primary_key desc"; $query = $this->db->query($sql); From 11c83f5908778828127543e601cc0cd51c183548 Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Tue, 9 Sep 2025 14:21:53 +0100 Subject: [PATCH 09/11] Update Api.php --- application/controllers/Api.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/controllers/Api.php b/application/controllers/Api.php index 529bb8d2..6d90f949 100644 --- a/application/controllers/Api.php +++ b/application/controllers/Api.php @@ -848,7 +848,7 @@ class API extends CI_Controller { * "logbook_slug": "my-public-logbook" * } */ - function recent_qsos($public_slug = null, $limit = 10) { + function recent_qsos($public_slug = null, $limit) { header('Content-type: application/json'); if($public_slug == null) { From b7c065dbdd90d84551b9a8aef95d310195767733 Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Tue, 9 Sep 2025 14:25:40 +0100 Subject: [PATCH 10/11] Add input validation for recent_qsos limit parameter The recent_qsos API endpoint now validates and sanitizes the $limit parameter, enforcing a default of 10, a minimum of 1, and a maximum of 50. Additionally, get_last_qsos in Logbook_model ensures $num is always an integer to prevent SQL injection. --- application/controllers/Api.php | 14 +++++++++++++- application/models/Logbook_model.php | 3 +++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/application/controllers/Api.php b/application/controllers/Api.php index 6d90f949..695ba185 100644 --- a/application/controllers/Api.php +++ b/application/controllers/Api.php @@ -848,9 +848,21 @@ class API extends CI_Controller { * "logbook_slug": "my-public-logbook" * } */ - function recent_qsos($public_slug = null, $limit) { + function recent_qsos($public_slug = null, $limit = 10) { header('Content-type: application/json'); + // Validate and sanitize $limit + if (!is_numeric($limit)) { + $limit = 10; // Default to 10 if not numeric + } else { + $limit = intval($limit); + if ($limit < 1) { + $limit = 1; // Minimum limit of 1 + } elseif ($limit > 50) { + $limit = 50; // Maximum limit of 50 + } + } + if($public_slug == null) { http_response_code(400); echo json_encode(['status' => 'failed', 'reason' => 'missing public_slug parameter']); diff --git a/application/models/Logbook_model.php b/application/models/Logbook_model.php index f66dff65..f133c698 100755 --- a/application/models/Logbook_model.php +++ b/application/models/Logbook_model.php @@ -1932,6 +1932,9 @@ class Logbook_model extends CI_Model function get_last_qsos($num, $StationLocationsArray = null) { + // Ensure $num is always an integer to prevent SQL injection + $num = intval($num); + if ($StationLocationsArray == null) { $CI = &get_instance(); $CI->load->model('logbooks_model'); From 952007467dcd83a9d1bbc33c440858566c8c6ca0 Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Fri, 12 Sep 2025 13:14:31 +0100 Subject: [PATCH 11/11] Add latitude and longitude to DXCC lookup results Enhanced the DXCC lookup in Logbook_model to include latitude and longitude in the returned array. Updated API controller to utilize these new fields when returning recent QSOs and callsign lookups, providing more detailed location data in API responses. --- application/controllers/Api.php | 369 ++++++++++++++------------- application/models/Logbook_model.php | 10 +- 2 files changed, 191 insertions(+), 188 deletions(-) diff --git a/application/controllers/Api.php b/application/controllers/Api.php index 695ba185..de9c5fdf 100644 --- a/application/controllers/Api.php +++ b/application/controllers/Api.php @@ -1,6 +1,7 @@ -user_model->validate_session() == 0) { + if ($this->user_model->validate_session() == 0) { // user is not logged in redirect('user/login'); } @@ -31,12 +32,13 @@ class API extends CI_Controller { } - function edit($key) { + function edit($key) + { $this->load->model('user_model'); // Check if users logged in - if($this->user_model->validate_session() == 0) { + if ($this->user_model->validate_session() == 0) { // user is not logged in redirect('user/login'); } @@ -45,40 +47,37 @@ class API extends CI_Controller { $this->load->helper(array('form', 'url')); - $this->load->library('form_validation'); + $this->load->library('form_validation'); - $this->form_validation->set_rules('api_desc', 'API Description', 'required'); - $this->form_validation->set_rules('api_key', 'API Key is required do not change this field', 'required'); + $this->form_validation->set_rules('api_desc', 'API Description', 'required'); + $this->form_validation->set_rules('api_key', 'API Key is required do not change this field', 'required'); - $data['api_info'] = $this->api_model->key_description($key); + $data['api_info'] = $this->api_model->key_description($key); - if ($this->form_validation->run() == FALSE) - { - $data['page_title'] = "Edit API Description"; + if ($this->form_validation->run() == FALSE) { + $data['page_title'] = "Edit API Description"; $this->load->view('interface_assets/header', $data); $this->load->view('api/description'); $this->load->view('interface_assets/footer'); - } - else - { + } else { // Success! $this->api_model->update_key_description($this->input->post('api_key'), $this->input->post('api_desc')); - $this->session->set_flashdata('notice', 'API Key '.$this->input->post('api_key')." description has been updated."); + $this->session->set_flashdata('notice', 'API Key ' . $this->input->post('api_key') . " description has been updated."); redirect('api/help'); } - } - function generate($rights) { + function generate($rights) + { $this->load->model('user_model'); // Check if users logged in - if($this->user_model->validate_session() == 0) { + if ($this->user_model->validate_session() == 0) { // user is not logged in redirect('user/login'); } @@ -91,12 +90,13 @@ class API extends CI_Controller { redirect('api/help'); } - function delete($key) { + function delete($key) + { $this->load->model('user_model'); // Check if users logged in - if($this->user_model->validate_session() == 0) { + if ($this->user_model->validate_session() == 0) { // user is not logged in redirect('user/login'); } @@ -106,31 +106,33 @@ class API extends CI_Controller { $this->api_model->delete_key($key); - $this->session->set_flashdata('notice', 'API Key '.$key." has been deleted"); + $this->session->set_flashdata('notice', 'API Key ' . $key . " has been deleted"); redirect('api/help'); } // Example of authing - function auth($key) { + function auth($key) + { $this->load->model('api_model'); - header("Content-type: text/xml"); - if($this->api_model->access($key) == "No Key Found" || $this->api_model->access($key) == "Key Disabled") { + header("Content-type: text/xml"); + if ($this->api_model->access($key) == "No Key Found" || $this->api_model->access($key) == "Key Disabled") { echo ""; echo "Key Invalid - either not found or disabled"; echo ""; } else { echo ""; echo "Valid"; - echo "".$this->api_model->access($key).""; + echo "" . $this->api_model->access($key) . ""; echo ""; } } - function check_auth($key) { + function check_auth($key) + { $this->load->model('api_model'); - header("Content-type: text/xml"); - if($this->api_model->access($key) == "No Key Found" || $this->api_model->access($key) == "Key Disabled") { + header("Content-type: text/xml"); + if ($this->api_model->access($key) == "No Key Found" || $this->api_model->access($key) == "Key Disabled") { // set the content type as json header("Content-type: application/json"); @@ -150,23 +152,24 @@ class API extends CI_Controller { } } - function station_info($key) { + function station_info($key) + { $this->load->model('api_model'); $this->load->model('stations'); header("Content-type: application/json"); - if(substr($this->api_model->access($key),0,1) == 'r') { /* Checkpermission for _r_eading */ + if (substr($this->api_model->access($key), 0, 1) == 'r') { /* Checkpermission for _r_eading */ $this->api_model->update_last_used($key); $userid = $this->api_model->key_userid($key); - $station_ids = array(); - $stations=$this->stations->all_of_user($userid); - foreach ($stations->result() as $row) { - $result['station_id']=$row->station_id; - $result['station_profile_name']=$row->station_profile_name; - $result['station_gridsquare']=$row->station_gridsquare; - $result['station_callsign']=$row->station_callsign;; - $result['station_active']=$row->station_active; - array_push($station_ids, $result); - } + $station_ids = array(); + $stations = $this->stations->all_of_user($userid); + foreach ($stations->result() as $row) { + $result['station_id'] = $row->station_id; + $result['station_profile_name'] = $row->station_profile_name; + $result['station_gridsquare'] = $row->station_gridsquare; + $result['station_callsign'] = $row->station_callsign;; + $result['station_active'] = $row->station_active; + array_push($station_ids, $result); + } echo json_encode($station_ids); } else { http_response_code(401); @@ -175,12 +178,13 @@ class API extends CI_Controller { } - /* + /* * * Function: QSO * Task: allows passing of ADIF data to Cloudlog */ - function qso() { + function qso() + { header('Content-type: application/json'); $this->load->model('api_model'); @@ -194,29 +198,29 @@ class API extends CI_Controller { $obj = json_decode(file_get_contents("php://input"), true); if ($obj === NULL) { // Decoding not valid try simple www-x-form-urlencoded - $objTmp = file_get_contents("php://input"); - parse_str($objTmp, $obj); - if ($obj === NULL) { - echo json_encode(['status' => 'failed', 'reason' => "wrong JSON"]); - die(); - } + $objTmp = file_get_contents("php://input"); + parse_str($objTmp, $obj); + if ($obj === NULL) { + echo json_encode(['status' => 'failed', 'reason' => "wrong JSON"]); + die(); + } } - if(!isset($obj['key']) || $this->api_model->authorize($obj['key']) == 0) { - http_response_code(401); - echo json_encode(['status' => 'failed', 'reason' => "missing api key"]); - die(); + if (!isset($obj['key']) || $this->api_model->authorize($obj['key']) == 0) { + http_response_code(401); + echo json_encode(['status' => 'failed', 'reason' => "missing api key"]); + die(); } $userid = $this->api_model->key_userid($obj['key']); - if(!isset($obj['station_profile_id']) || $this->stations->check_station_against_user($obj['station_profile_id'], $userid) == false) { + if (!isset($obj['station_profile_id']) || $this->stations->check_station_against_user($obj['station_profile_id'], $userid) == false) { http_response_code(401); echo json_encode(['status' => 'failed', 'reason' => "station id does not belong to the API key owner."]); die(); } - if($obj['type'] == "adif" && $obj['string'] != "") { + if ($obj['type'] == "adif" && $obj['string'] != "") { // Load the logbook model for adding QSO records $this->load->model('logbook_model'); @@ -227,22 +231,20 @@ class API extends CI_Controller { $this->adif_parser->feed($obj['string']); // Create QSO Record - while($record = $this->adif_parser->get_record()) - { - if(count($record) == 0) - { + while ($record = $this->adif_parser->get_record()) { + if (count($record) == 0) { break; }; - if(isset($obj['station_profile_id'])) { - if(isset($record['station_callsign']) && $this->stations->check_station_against_callsign($obj['station_profile_id'], $record['station_callsign']) == false) { + if (isset($obj['station_profile_id'])) { + if (isset($record['station_callsign']) && $this->stations->check_station_against_callsign($obj['station_profile_id'], $record['station_callsign']) == false) { http_response_code(401); echo json_encode(['status' => 'failed', 'reason' => "station callsign does not match station callsign in station profile."]); die(); } - if(!(isset($record['call'])) || (trim($record['call']) == '')) { + if (!(isset($record['call'])) || (trim($record['call']) == '')) { http_response_code(401); echo json_encode(['status' => 'failed', 'reason' => "QSO Call is empty."]); die(); @@ -252,23 +254,21 @@ class API extends CI_Controller { $msg = $this->logbook_model->import($record, $obj['station_profile_id'], NULL, NULL, NULL, NULL, NULL, NULL, false, false, true); - if ( $msg == "" ) { + if ($msg == "") { $return_count++; } else { $return_msg[] = $msg; } } - }; http_response_code(201); - echo json_encode(['status' => 'created', 'type' => $obj['type'], 'string' => $obj['string'], 'imported_count' => $return_count, 'messages' => $return_msg ]); - + echo json_encode(['status' => 'created', 'type' => $obj['type'], 'string' => $obj['string'], 'imported_count' => $return_count, 'messages' => $return_msg]); } - } // API function to check if a callsign is in the logbook already - function logbook_check_callsign() { + function logbook_check_callsign() + { header('Content-type: application/json'); $this->load->model('api_model'); @@ -276,29 +276,29 @@ class API extends CI_Controller { // Decode JSON and store $obj = json_decode(file_get_contents("php://input"), true); if ($obj === NULL) { - echo json_encode(['status' => 'failed', 'reason' => "wrong JSON"]); + echo json_encode(['status' => 'failed', 'reason' => "wrong JSON"]); return; } - if(!isset($obj['key']) || $this->api_model->authorize($obj['key']) == 0) { - http_response_code(401); - echo json_encode(['status' => 'failed', 'reason' => "missing api key"]); + if (!isset($obj['key']) || $this->api_model->authorize($obj['key']) == 0) { + http_response_code(401); + echo json_encode(['status' => 'failed', 'reason' => "missing api key"]); return; } - if(!isset($obj['logbook_public_slug']) || !isset($obj['callsign'])) { - http_response_code(401); - echo json_encode(['status' => 'failed', 'reason' => "missing fields"]); + if (!isset($obj['logbook_public_slug']) || !isset($obj['callsign'])) { + http_response_code(401); + echo json_encode(['status' => 'failed', 'reason' => "missing fields"]); return; } - if($obj['logbook_public_slug'] != "" && $obj['callsign'] != "") { + if ($obj['logbook_public_slug'] != "" && $obj['callsign'] != "") { $logbook_slug = $obj['logbook_public_slug']; $callsign = $obj['callsign']; // If $obj['band'] exists - if(isset($obj['band'])) { + if (isset($obj['band'])) { $band = $obj['band']; } else { $band = null; @@ -306,13 +306,12 @@ class API extends CI_Controller { $this->load->model('logbooks_model'); - if($this->logbooks_model->public_slug_exists($logbook_slug)) { + if ($this->logbooks_model->public_slug_exists($logbook_slug)) { $logbook_id = $this->logbooks_model->public_slug_exists_logbook_id($logbook_slug); - if($logbook_id != false) - { + if ($logbook_id != false) { // Get associated station locations for mysql queries $logbooks_locations_array = $this->logbooks_model->list_logbook_relationships($logbook_id); - + if (!$logbooks_locations_array) { // Logbook not found http_response_code(404); @@ -322,7 +321,7 @@ class API extends CI_Controller { } else { // Logbook not found http_response_code(404); - echo json_encode(['status' => 'failed', 'reason' => $logbook_slug." has no associated station locations"]); + echo json_encode(['status' => 'failed', 'reason' => $logbook_slug . " has no associated station locations"]); die(); } // Search Logbook for callsign @@ -331,8 +330,7 @@ class API extends CI_Controller { $result = $this->logbook_model->check_if_callsign_worked_in_logbook($callsign, $logbooks_locations_array, $band); http_response_code(201); - if($result > 0) - { + if ($result > 0) { echo json_encode(['callsign' => $callsign, 'result' => 'Found']); } else { echo json_encode(['callsign' => $callsign, 'result' => 'Not Found']); @@ -343,13 +341,12 @@ class API extends CI_Controller { echo json_encode(['status' => 'failed', 'reason' => "logbook not found"]); die(); } - } - } // API function to check if a grid is in the logbook already - function logbook_check_grid() { + function logbook_check_grid() + { header('Content-type: application/json'); $this->load->model('api_model'); @@ -357,27 +354,27 @@ class API extends CI_Controller { // Decode JSON and store $obj = json_decode(file_get_contents("php://input"), true); if ($obj === NULL) { - echo json_encode(['status' => 'failed', 'reason' => "wrong JSON"]); + echo json_encode(['status' => 'failed', 'reason' => "wrong JSON"]); } - if(!isset($obj['key']) || $this->api_model->authorize($obj['key']) == 0) { - http_response_code(401); - echo json_encode(['status' => 'failed', 'reason' => "missing api key"]); + if (!isset($obj['key']) || $this->api_model->authorize($obj['key']) == 0) { + http_response_code(401); + echo json_encode(['status' => 'failed', 'reason' => "missing api key"]); } - if(!isset($obj['logbook_public_slug']) || !isset($obj['grid'])) { - http_response_code(401); - echo json_encode(['status' => 'failed', 'reason' => "missing fields"]); + if (!isset($obj['logbook_public_slug']) || !isset($obj['grid'])) { + http_response_code(401); + echo json_encode(['status' => 'failed', 'reason' => "missing fields"]); return; } - if($obj['logbook_public_slug'] != "" && $obj['grid'] != "") { + if ($obj['logbook_public_slug'] != "" && $obj['grid'] != "") { $logbook_slug = $obj['logbook_public_slug']; $grid = $obj['grid']; // If $obj['band'] exists - if(isset($obj['band'])) { + if (isset($obj['band'])) { $band = $obj['band']; } else { $band = null; @@ -385,13 +382,12 @@ class API extends CI_Controller { $this->load->model('logbooks_model'); - if($this->logbooks_model->public_slug_exists($logbook_slug)) { + if ($this->logbooks_model->public_slug_exists($logbook_slug)) { $logbook_id = $this->logbooks_model->public_slug_exists_logbook_id($logbook_slug); - if($logbook_id != false) - { + if ($logbook_id != false) { // Get associated station locations for mysql queries $logbooks_locations_array = $this->logbooks_model->list_logbook_relationships($logbook_id); - + if (!$logbooks_locations_array) { // Logbook not found http_response_code(404); @@ -401,7 +397,7 @@ class API extends CI_Controller { } else { // Logbook not found http_response_code(404); - echo json_encode(['status' => 'failed', 'reason' => $logbook_slug." has no associated station locations"]); + echo json_encode(['status' => 'failed', 'reason' => $logbook_slug . " has no associated station locations"]); die(); } // Search Logbook for callsign @@ -410,8 +406,7 @@ class API extends CI_Controller { $result = $this->logbook_model->check_if_grid_worked_in_logbook($grid, $logbooks_locations_array, $band); http_response_code(201); - if($result > 0) - { + if ($result > 0) { echo json_encode(['gridsquare' => strtoupper($grid), 'result' => 'Found']); } else { echo json_encode(['gridsquare' => strtoupper($grid), 'result' => 'Not Found']); @@ -422,9 +417,7 @@ class API extends CI_Controller { echo json_encode(['status' => 'failed', 'reason' => "logbook not found"]); die(); } - } - } @@ -487,16 +480,16 @@ class API extends CI_Controller { return; } - if(!isset($obj['key']) || $this->api_model->authorize($obj['key']) == 0) { - http_response_code(401); - echo json_encode(['status' => 'failed', 'reason' => "missing api key"]); - return; + if (!isset($obj['key']) || $this->api_model->authorize($obj['key']) == 0) { + http_response_code(401); + echo json_encode(['status' => 'failed', 'reason' => "missing api key"]); + return; } - if(!isset($obj['logbook_public_slug']) || !isset($obj['callsign'])) { - http_response_code(401); - echo json_encode(['status' => 'failed', 'reason' => "missing fields"]); - return; + if (!isset($obj['logbook_public_slug']) || !isset($obj['callsign'])) { + http_response_code(401); + echo json_encode(['status' => 'failed', 'reason' => "missing fields"]); + return; } // Load models @@ -523,10 +516,9 @@ class API extends CI_Controller { ] ]; - if($this->logbooks_model->public_slug_exists($logbook_slug)) { + if ($this->logbooks_model->public_slug_exists($logbook_slug)) { $logbook_id = $this->logbooks_model->public_slug_exists_logbook_id($logbook_slug); - if($logbook_id != false) - { + if ($logbook_id != false) { // Get associated station locations for mysql queries $logbooks_locations_array = $this->logbooks_model->list_logbook_relationships($logbook_id); @@ -539,7 +531,7 @@ class API extends CI_Controller { } else { // Logbook not found http_response_code(404); - echo json_encode(['status' => 'failed', 'reason' => $logbook_slug." has no associated station locations"]); + echo json_encode(['status' => 'failed', 'reason' => $logbook_slug . " has no associated station locations"]); die(); } @@ -604,7 +596,8 @@ class API extends CI_Controller { /* ENDPOINT for Rig Control */ - function radio() { + function radio() + { header('Content-type: application/json'); $this->load->model('api_model'); @@ -618,7 +611,7 @@ class API extends CI_Controller { // Decode JSON and store $obj = json_decode(file_get_contents("php://input"), true); - if(!isset($obj['key']) || $this->api_model->authorize($obj['key']) == 0) { + if (!isset($obj['key']) || $this->api_model->authorize($obj['key']) == 0) { http_response_code(401); echo json_encode(['status' => 'failed', 'reason' => "missing api key"]); die(); @@ -636,7 +629,6 @@ class API extends CI_Controller { $arr = array('status' => 'success'); echo json_encode($arr); - } /* @@ -645,7 +637,8 @@ class API extends CI_Controller { * */ - function statistics($key = null) { + function statistics($key = null) + { header('Content-type: application/json'); $this->load->model('logbook_model'); @@ -656,10 +649,10 @@ class API extends CI_Controller { http_response_code(201); echo json_encode(['Today' => $data['todays_qsos'], 'total_qsos' => $data['total_qsos'], 'month_qsos' => $data['month_qsos'], 'year_qsos' => $data['year_qsos']]); - } - function lookup() { + function lookup() + { // start benchmarking $this->output->enable_profiler(TRUE); /* @@ -679,7 +672,9 @@ class API extends CI_Controller { // Make sure users logged in $this->load->model('user_model'); - if(!$this->user_model->authorize($this->config->item('auth_mode'))) { return; } + if (!$this->user_model->authorize($this->config->item('auth_mode'))) { + return; + } $this->load->model("logbook_model"); @@ -711,9 +706,9 @@ class API extends CI_Controller { * Handle POST data being sent to check lookups * */ - $raw_input = json_decode(file_get_contents("php://input"), true); + $raw_input = json_decode(file_get_contents("php://input"), true); - $lookup_callsign = strtoupper($raw_input['callsign']); + $lookup_callsign = strtoupper($raw_input['callsign']); /* @@ -721,7 +716,7 @@ class API extends CI_Controller { * Handle Callsign field * */ - $return['callsign'] = $lookup_callsign; + $return['callsign'] = $lookup_callsign; /* * @@ -729,65 +724,63 @@ class API extends CI_Controller { * */ - $callsign_dxcc_lookup = $this->logbook_model->dxcc_lookup($lookup_callsign, $date); + $callsign_dxcc_lookup = $this->logbook_model->dxcc_lookup($lookup_callsign, $date); - $last_slash_pos = strrpos($lookup_callsign, '/'); + $last_slash_pos = strrpos($lookup_callsign, '/'); - if(isset($last_slash_pos) && $last_slash_pos > 4) { - $suffix_slash = $last_slash_pos === false ? $lookup_callsign : substr($lookup_callsign, $last_slash_pos + 1); - switch ($suffix_slash) { - case "P": - $suffix_slash_item = "Portable"; - break; - case "M": - $suffix_slash_item = "Mobile"; - case "MM": - $suffix_slash_item = "Maritime Mobile"; - break; - default: - // If its not one of the above suffix slashes its likely dxcc - $ans2 = $this->logbook_model->dxcc_lookup($suffix_slash, $date); - $suffix_slash_item = null; - } - - $return['suffix_slash'] = $suffix_slash_item; + if (isset($last_slash_pos) && $last_slash_pos > 4) { + $suffix_slash = $last_slash_pos === false ? $lookup_callsign : substr($lookup_callsign, $last_slash_pos + 1); + switch ($suffix_slash) { + case "P": + $suffix_slash_item = "Portable"; + break; + case "M": + $suffix_slash_item = "Mobile"; + case "MM": + $suffix_slash_item = "Maritime Mobile"; + break; + default: + // If its not one of the above suffix slashes its likely dxcc + $ans2 = $this->logbook_model->dxcc_lookup($suffix_slash, $date); + $suffix_slash_item = null; } - // If the final slash is a DXCC then find it! - if (isset($ans2['call'])) { - $return['dxcc'] = $ans2['entity']; - $return['dxcc_lat'] = $ans2['lat']; - $return['dxcc_long'] = $ans2['long']; - $return['dxcc_cqz'] = $ans2['cqz']; - } else { - $return['dxcc'] = $callsign_dxcc_lookup['entity']; - $return['dxcc_lat'] = $callsign_dxcc_lookup['lat']; - $return['dxcc_long'] = $callsign_dxcc_lookup['long']; - $return['dxcc_cqz'] = $callsign_dxcc_lookup['cqz']; - } + $return['suffix_slash'] = $suffix_slash_item; + } + + // If the final slash is a DXCC then find it! + if (isset($ans2['call'])) { + $return['dxcc'] = $ans2['entity']; + $return['dxcc_lat'] = $ans2['lat']; + $return['dxcc_long'] = $ans2['long']; + $return['dxcc_cqz'] = $ans2['cqz']; + } else { + $return['dxcc'] = $callsign_dxcc_lookup['entity']; + $return['dxcc_lat'] = $callsign_dxcc_lookup['lat']; + $return['dxcc_long'] = $callsign_dxcc_lookup['long']; + $return['dxcc_cqz'] = $callsign_dxcc_lookup['cqz']; + } /* * * Pool any local data we have for a callsign * */ - $call_lookup_results = $this->logbook_model->call_lookup_result($lookup_callsign); + $call_lookup_results = $this->logbook_model->call_lookup_result($lookup_callsign); - if($call_lookup_results != null) - { - $return['name'] = $call_lookup_results->COL_NAME; - $return['gridsquare'] = $call_lookup_results->COL_GRIDSQUARE; - $return['location'] = $call_lookup_results->COL_QTH; - $return['iota_ref'] = $call_lookup_results->COL_IOTA; - $return['qsl_manager'] = $call_lookup_results->COL_QSL_VIA; - $return['state'] = $call_lookup_results->COL_STATE; - $return['us_county'] = $call_lookup_results->COL_CNTY; - - if ($return['gridsquare'] != "") { - $return['latlng'] = $this->qralatlng($return['gridsquare']); - } + if ($call_lookup_results != null) { + $return['name'] = $call_lookup_results->COL_NAME; + $return['gridsquare'] = $call_lookup_results->COL_GRIDSQUARE; + $return['location'] = $call_lookup_results->COL_QTH; + $return['iota_ref'] = $call_lookup_results->COL_IOTA; + $return['qsl_manager'] = $call_lookup_results->COL_QSL_VIA; + $return['state'] = $call_lookup_results->COL_STATE; + $return['us_county'] = $call_lookup_results->COL_CNTY; + if ($return['gridsquare'] != "") { + $return['latlng'] = $this->qralatlng($return['gridsquare']); } + } /* @@ -809,7 +802,8 @@ class API extends CI_Controller { $this->output->enable_profiler(FALSE); } - function qralatlng($qra) { + function qralatlng($qra) + { $this->load->library('Qra'); $latlng = $this->qra->qra2latlong($qra); return $latlng; @@ -848,7 +842,8 @@ class API extends CI_Controller { * "logbook_slug": "my-public-logbook" * } */ - function recent_qsos($public_slug = null, $limit = 10) { + function recent_qsos($public_slug = null, $limit = 10) + { header('Content-type: application/json'); // Validate and sanitize $limit @@ -863,7 +858,7 @@ class API extends CI_Controller { } } - if($public_slug == null) { + if ($public_slug == null) { http_response_code(400); echo json_encode(['status' => 'failed', 'reason' => 'missing public_slug parameter']); return; @@ -872,9 +867,9 @@ class API extends CI_Controller { $this->load->model('logbooks_model'); $this->load->model('logbook_model'); - if($this->logbooks_model->public_slug_exists($public_slug)) { + if ($this->logbooks_model->public_slug_exists($public_slug)) { $logbook_id = $this->logbooks_model->public_slug_exists_logbook_id($public_slug); - if($logbook_id != false) { + if ($logbook_id != false) { // Get associated station locations for mysql queries $logbooks_locations_array = $this->logbooks_model->list_logbook_relationships($logbook_id); @@ -886,7 +881,7 @@ class API extends CI_Controller { // Get recent QSOs using existing method $recent_qsos_query = $this->logbook_model->get_last_qsos($limit, $logbooks_locations_array); - + if ($recent_qsos_query == null) { http_response_code(404); echo json_encode(['status' => 'failed', 'reason' => 'No QSOs found']); @@ -905,7 +900,7 @@ class API extends CI_Controller { 'rst_sent' => $row->COL_RST_SENT, 'rst_rcvd' => $row->COL_RST_RCVD ); - + // Add optional fields if they exist if ($row->COL_STX_STRING) { $qso['stx_string'] = $row->COL_STX_STRING; @@ -922,7 +917,16 @@ class API extends CI_Controller { if ($row->COL_NAME) { $qso['name'] = $row->COL_NAME; } - + + $dxcc = $this->logbook_model->check_dxcc_table(strtoupper(trim(strtoupper($row->COL_CALL))), $row->COL_TIME_ON); + if (empty($dxcc[0])) { + $dxcc_id = null; + } else { + $qso['country'] = $dxcc[1]; + $qso['lat'] = $dxcc[4]; + $qso['long'] = $dxcc[5]; + } + $qsos[] = $qso; } @@ -932,10 +936,9 @@ class API extends CI_Controller { 'count' => count($qsos), 'logbook_slug' => $public_slug ], JSON_PRETTY_PRINT); - } else { http_response_code(404); - echo json_encode(['status' => 'failed', 'reason' => $public_slug.' has no associated station locations']); + echo json_encode(['status' => 'failed', 'reason' => $public_slug . ' has no associated station locations']); } } else { http_response_code(404); diff --git a/application/models/Logbook_model.php b/application/models/Logbook_model.php index f133c698..c3904c20 100755 --- a/application/models/Logbook_model.php +++ b/application/models/Logbook_model.php @@ -4084,7 +4084,7 @@ class Logbook_model extends CI_Model return null; } } - + /* * Check the dxxc_prefixes table and return (dxcc, country) */ @@ -4093,7 +4093,7 @@ class Logbook_model extends CI_Model $csadditions = '/^P$|^R$|^A$|^M$/'; - $dxcc_exceptions = $this->db->select('`entity`, `adif`, `cqz`, `cont`') + $dxcc_exceptions = $this->db->select('`entity`, `adif`, `cqz`, `cont`,`lat`,`long`') ->where('call', $call) ->where('(start <= ', $date) ->or_where('start is null)', NULL, false) @@ -4103,7 +4103,7 @@ class Logbook_model extends CI_Model if ($dxcc_exceptions->num_rows() > 0) { $row = $dxcc_exceptions->row_array(); - return array($row['adif'], $row['entity'], $row['cqz'], $row['cont']); + return array($row['adif'], $row['entity'], $row['cqz'], $row['cont'], $row['lat'], $row['long']); } if (preg_match('/(^KG4)[A-Z09]{3}/', $call)) { // KG4/ and KG4 5 char calls are Guantanamo Bay. If 4 or 6 char, it is USA $call = "K"; @@ -4158,7 +4158,7 @@ class Logbook_model extends CI_Model // query the table, removing a character from the right until a match for ($i = $len; $i > 0; $i--) { //printf("searching for %s\n", substr($call, 0, $i)); - $dxcc_result = $this->db->select('`call`, `entity`, `adif`, `cqz`, `cont`') + $dxcc_result = $this->db->select('`call`, `entity`, `adif`, `cqz`, `cont`,`lat`,`long`') ->where('call', substr($call, 0, $i)) ->where('(start <= ', $date) ->or_where("start is null)", NULL, false) @@ -4171,7 +4171,7 @@ class Logbook_model extends CI_Model if ($dxcc_result->num_rows() > 0) { $row = $dxcc_result->row_array(); - return array($row['adif'], $row['entity'], $row['cqz'], $row['cont']); + return array($row['adif'], $row['entity'], $row['cqz'], $row['cont'], $row['lat'], $row['long']); } }