| 
									
										
										
										
											2013-02-17 00:41:40 +08:00
										 |  |  | <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Lotw extends CI_Controller { | 
					
						
							| 
									
										
										
										
											2020-08-27 04:26:37 +08:00
										 |  |  |  /* | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							|  |  |  | 	| Controller: Lotw | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 	| | 
					
						
							| 
									
										
										
										
											2023-07-27 15:16:55 +08:00
										 |  |  | 	| This Controller handles all things LoTW, upload and download. | 
					
						
							| 
									
										
										
										
											2020-08-27 04:26:37 +08:00
										 |  |  | 	| | 
					
						
							|  |  |  | 	| | 
					
						
							|  |  |  | 	|	Note: | 
					
						
							|  |  |  | 	|	If you plan on using any of the code within this class please credit | 
					
						
							|  |  |  | 	| 	Cloudlog or Peter, 2M0SQL, a lot of hard work went into building the | 
					
						
							|  |  |  | 	|	signing of files. | 
					
						
							|  |  |  | 	| | 
					
						
							|  |  |  | 	|	Big Thanks to Rodrigo PY2RAF for all the help and information about OpenSSL | 
					
						
							|  |  |  | 	| | 
					
						
							|  |  |  | 	*/ | 
					
						
							| 
									
										
										
										
											2013-02-17 00:41:40 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* Controls who can access the controller and its functions */ | 
					
						
							|  |  |  | 	function __construct() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		parent::__construct(); | 
					
						
							|  |  |  | 		$this->load->helper(array('form', 'url')); | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-12 00:05:15 +08:00
										 |  |  | 		// Load language files
 | 
					
						
							|  |  |  | 		$this->lang->load('lotw'); | 
					
						
							| 
									
										
										
										
											2013-02-17 00:41:40 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-14 00:28:22 +08:00
										 |  |  | 	/* | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							|  |  |  | 	| Function: index | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 	| | 
					
						
							| 
									
										
										
										
											2020-08-14 00:28:22 +08:00
										 |  |  | 	| Default function for the controller which loads when doing /lotw | 
					
						
							|  |  |  | 	| this shows all the uploaded lotw p12 certificates the user has uploaded | 
					
						
							|  |  |  | 	| | 
					
						
							|  |  |  | 	*/ | 
					
						
							| 
									
										
										
										
											2020-08-14 00:24:07 +08:00
										 |  |  | 	public function index() { | 
					
						
							| 
									
										
										
										
											2020-09-02 21:48:13 +08:00
										 |  |  | 		$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'); } | 
					
						
							| 
									
										
										
										
											2020-09-04 06:20:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-06 04:42:07 +08:00
										 |  |  | 		// Fire OpenSSL missing error if not found
 | 
					
						
							|  |  |  | 		if (!extension_loaded('openssl')) { | 
					
						
							|  |  |  | 			echo "You must install php OpenSSL for LoTW functions to work"; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-14 00:28:22 +08:00
										 |  |  | 		// Load required models for page generation
 | 
					
						
							| 
									
										
										
										
											2020-08-14 00:24:07 +08:00
										 |  |  | 		$this->load->model('LotwCert'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-27 15:16:55 +08:00
										 |  |  | 		// Get Array of the logged in users LoTW certs.
 | 
					
						
							| 
									
										
										
										
											2020-08-14 00:24:07 +08:00
										 |  |  | 		$data['lotw_cert_results'] = $this->LotwCert->lotw_certs($this->session->userdata('user_id')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-14 00:28:22 +08:00
										 |  |  | 		// Set Page Title
 | 
					
						
							| 
									
										
										
										
											2020-08-14 00:24:07 +08:00
										 |  |  | 		$data['page_title'] = "Logbook of the World"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-14 00:28:22 +08:00
										 |  |  | 		// Load Views
 | 
					
						
							| 
									
										
										
										
											2020-08-14 00:24:07 +08:00
										 |  |  | 		$this->load->view('interface_assets/header', $data); | 
					
						
							|  |  |  | 		$this->load->view('lotw_views/index'); | 
					
						
							|  |  |  | 		$this->load->view('interface_assets/footer'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 	/* | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							|  |  |  | 	| Function: cert_upload | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 	| | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 	| Nothing fancy just shows the cert_upload form for uploading p12 files | 
					
						
							|  |  |  | 	| | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	public function cert_upload() { | 
					
						
							| 
									
										
										
										
											2020-09-02 21:48:13 +08:00
										 |  |  | 		$this->load->model('user_model'); | 
					
						
							| 
									
										
										
										
											2020-12-28 21:42:26 +08:00
										 |  |  | 		$this->load->model('dxcc'); | 
					
						
							| 
									
										
										
										
											2020-09-02 21:48:13 +08:00
										 |  |  | 		if(!$this->user_model->authorize(2)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-28 21:42:26 +08:00
										 |  |  | 		// Load DXCC Countrys List
 | 
					
						
							|  |  |  | 		$data['dxcc_list'] = $this->dxcc->list(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 		// Set Page Title
 | 
					
						
							|  |  |  | 		$data['page_title'] = "Logbook of the World"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Load Views
 | 
					
						
							|  |  |  | 		$this->load->view('interface_assets/header', $data); | 
					
						
							|  |  |  | 		$this->load->view('lotw_views/upload_cert', array('error' => ' ' )); | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 		$this->load->view('interface_assets/footer'); | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							|  |  |  | 	| Function: do_cert_upload | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 	| | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 	| do_cert_upload is called from cert_upload form submit and handles uploading | 
					
						
							|  |  |  | 	| and processing of p12 files and storing the data into mysql | 
					
						
							|  |  |  | 	| | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	public function do_cert_upload() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-09-02 21:48:13 +08:00
										 |  |  | 		$this->load->model('user_model'); | 
					
						
							| 
									
										
										
										
											2020-12-28 21:42:26 +08:00
										 |  |  | 		$this->load->model('dxcc'); | 
					
						
							| 
									
										
										
										
											2020-09-02 21:48:13 +08:00
										 |  |  | 		if(!$this->user_model->authorize(2)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); } | 
					
						
							| 
									
										
										
										
											2020-09-02 21:02:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-06 04:42:07 +08:00
										 |  |  | 		// Fire OpenSSL missing error if not found
 | 
					
						
							|  |  |  | 		if (!extension_loaded('openssl')) { | 
					
						
							|  |  |  | 			echo "You must install php OpenSSL for LoTW functions to work"; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-02 21:02:58 +08:00
										 |  |  |     	// create folder to store certs while processing
 | 
					
						
							|  |  |  |     	if (!file_exists('./uploads/lotw/certs')) { | 
					
						
							|  |  |  | 		    mkdir('./uploads/lotw/certs', 0755, true); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 		$config['upload_path']          = './uploads/lotw/certs'; | 
					
						
							|  |  |  |     	$config['allowed_types']        = 'p12'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->load->library('upload', $config); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ( ! $this->upload->do_upload('userfile')) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |         	// Upload of P12 Failed
 | 
					
						
							|  |  |  |             $error = array('error' => $this->upload->display_errors()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-12 22:12:53 +08:00
										 |  |  | 			// Load DXCC Countrys List
 | 
					
						
							|  |  |  | 			$data['dxcc_list'] = $this->dxcc->list(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-26 20:21:23 +08:00
										 |  |  | 			// Set Page Title
 | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 			$data['page_title'] = "Logbook of the World"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// Load Views
 | 
					
						
							|  |  |  | 			$this->load->view('interface_assets/header', $data); | 
					
						
							|  |  |  | 			$this->load->view('lotw_views/upload_cert', $error); | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 			$this->load->view('interface_assets/footer'); | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |         	// Load database queries
 | 
					
						
							|  |  |  |         	$this->load->model('LotwCert'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         	//Upload of P12 successful
 | 
					
						
							|  |  |  |         	$data = array('upload_data' => $this->upload->data()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         	$info = $this->decrypt_key($data['upload_data']['full_path']); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-28 21:42:26 +08:00
										 |  |  | 			// Check to see if certificate is already in the system
 | 
					
						
							| 
									
										
										
										
											2023-04-19 21:32:32 +08:00
										 |  |  | 			$new_certificate = $this->LotwCert->find_cert($info['issued_callsign'], $info['dxcc-id'], $this->session->userdata('user_id')); | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-30 18:33:09 +08:00
										 |  |  |         	if($new_certificate == 0) { | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  |         		// New Certificate Store in Database
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         		// Store Certificate Data into MySQL
 | 
					
						
							| 
									
										
										
										
											2023-04-19 21:32:32 +08:00
										 |  |  |         		$this->LotwCert->store_certificate($this->session->userdata('user_id'), $info['issued_callsign'], $info['dxcc-id'], $info['validFrom'], $info['validTo_Date'], $info['qso-first-date'], $info['qso-end-date'], $info['pem_key'], $info['general_cert']); | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         		// Cert success flash message
 | 
					
						
							| 
									
										
										
										
											2023-03-30 18:33:09 +08:00
										 |  |  |         		$this->session->set_flashdata('Success', $info['issued_callsign'].' Certificate Imported.'); | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  |         	} else { | 
					
						
							| 
									
										
										
										
											2023-03-30 18:33:09 +08:00
										 |  |  |         		// Certificate is in the system time to update
 | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-22 00:18:58 +08:00
										 |  |  | 				$this->LotwCert->update_certificate($this->session->userdata('user_id'), $info['issued_callsign'], $info['dxcc-id'], $info['validFrom'], $info['validTo_Date'], $info['qso-first-date'], $info['qso-end-date'], $info['pem_key'], $info['general_cert']); | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         		// Cert success flash message
 | 
					
						
							| 
									
										
										
										
											2023-03-30 18:33:09 +08:00
										 |  |  |         		$this->session->set_flashdata('Success', $info['issued_callsign'].' Certificate Updated.'); | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         	// p12 certificate processed time to delete the file
 | 
					
						
							|  |  |  |         	unlink($data['upload_data']['full_path']); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-27 15:16:55 +08:00
										 |  |  | 			// Get Array of the logged in users LoTW certs.
 | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 			$data['lotw_cert_results'] = $this->LotwCert->lotw_certs($this->session->userdata('user_id')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	        // Set Page Title
 | 
					
						
							|  |  |  | 			$data['page_title'] = "Logbook of the World"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// Load Views
 | 
					
						
							|  |  |  | 			$this->load->view('interface_assets/header', $data); | 
					
						
							|  |  |  | 			$this->load->view('lotw_views/index'); | 
					
						
							|  |  |  | 			$this->load->view('interface_assets/footer'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-23 05:26:04 +08:00
										 |  |  |     /* | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							|  |  |  | 	| Function: lotw_upload | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 	| | 
					
						
							| 
									
										
										
										
											2023-07-27 15:16:55 +08:00
										 |  |  | 	| This function Uploads to LoTW | 
					
						
							| 
									
										
										
										
											2020-08-23 05:26:04 +08:00
										 |  |  | 	| | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	public function lotw_upload() { | 
					
						
							| 
									
										
										
										
											2020-09-06 04:42:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-12 23:56:12 +08:00
										 |  |  | 		$this->load->model('user_model'); | 
					
						
							|  |  |  | 		$this->user_model->authorize(2); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-06 04:42:07 +08:00
										 |  |  | 		// Fire OpenSSL missing error if not found
 | 
					
						
							|  |  |  | 		if (!extension_loaded('openssl')) { | 
					
						
							|  |  |  | 			echo "You must install php OpenSSL for LoTW functions to work"; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-09-06 04:42:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-23 05:26:04 +08:00
										 |  |  | 		// Get Station Profile Data
 | 
					
						
							| 
									
										
										
										
											2020-09-06 04:42:55 +08:00
										 |  |  | 		$this->load->model('Stations'); | 
					
						
							| 
									
										
										
										
											2020-08-23 05:26:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-12 23:56:12 +08:00
										 |  |  | 		if ($this->user_model->authorize(2)) { | 
					
						
							|  |  |  | 			$station_profiles = $this->Stations->all_of_user($this->session->userdata('user_id')); | 
					
						
							|  |  |  | 			$sync_user_id=$this->session->userdata('user_id'); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			$station_profiles = $this->Stations->all(); | 
					
						
							|  |  |  | 			$sync_user_id=null; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-08-23 05:26:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-06 04:42:55 +08:00
										 |  |  | 		// Array of QSO IDs being Uploaded
 | 
					
						
							| 
									
										
										
										
											2020-08-27 04:04:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-06 04:42:55 +08:00
										 |  |  | 		$qso_id_array = array(); | 
					
						
							| 
									
										
										
										
											2020-08-27 04:04:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-06 04:42:55 +08:00
										 |  |  | 		// Build TQ8 Outputs
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 		if ($station_profiles->num_rows() >= 1) { | 
					
						
							| 
									
										
										
										
											2020-08-27 04:04:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 			foreach ($station_profiles->result() as $station_profile) { | 
					
						
							| 
									
										
										
										
											2020-08-23 05:26:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				// Get Certificate Data
 | 
					
						
							|  |  |  | 				$this->load->model('LotwCert'); | 
					
						
							|  |  |  | 				$data['station_profile'] = $station_profile; | 
					
						
							|  |  |  | 				$data['lotw_cert_info'] = $this->LotwCert->lotw_cert_details($station_profile->station_callsign, $station_profile->station_dxcc); | 
					
						
							| 
									
										
										
										
											2020-08-23 05:26:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-27 15:16:55 +08:00
										 |  |  | 				// If Station Profile has no LoTW Cert continue on.
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				if(!isset($data['lotw_cert_info']->cert_dxcc_id)) { | 
					
						
							|  |  |  | 					continue; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-09-02 18:45:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				// Check if LoTW certificate itself is valid
 | 
					
						
							|  |  |  | 				// Validty of QSO dates will be checked later
 | 
					
						
							|  |  |  | 				$current_date = date('Y-m-d H:i:s'); | 
					
						
							|  |  |  | 				if ($current_date <= $data['lotw_cert_info']->date_created) { | 
					
						
							|  |  |  | 					echo $data['lotw_cert_info']->callsign.": LoTW certificate not valid yet!"; | 
					
						
							|  |  |  | 					continue; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				if ($current_date >= $data['lotw_cert_info']->date_expires) { | 
					
						
							|  |  |  | 					echo $data['lotw_cert_info']->callsign.": LoTW certificate expired!"; | 
					
						
							|  |  |  | 					continue; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2022-08-24 22:04:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				// Get QSOs
 | 
					
						
							| 
									
										
										
										
											2020-08-26 00:50:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				$this->load->model('Logbook_model'); | 
					
						
							| 
									
										
										
										
											2020-08-26 00:50:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				$data['qsos'] = $this->Logbook_model->get_lotw_qsos_to_upload($data['station_profile']->station_id, $data['lotw_cert_info']->qso_start_date, $data['lotw_cert_info']->qso_end_date); | 
					
						
							| 
									
										
										
										
											2020-08-26 00:50:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				// Nothing to upload
 | 
					
						
							|  |  |  | 				if(empty($data['qsos']->result())){ | 
					
						
							|  |  |  | 					if ($this->user_model->authorize(2)) {	// Only be verbose if we have a session
 | 
					
						
							| 
									
										
										
										
											2020-09-08 07:48:27 +08:00
										 |  |  | 						echo $station_profile->station_callsign." (".$station_profile->station_profile_name.") No QSOs to Upload <br>"; | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 					continue; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-09-02 19:02:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				foreach ($data['qsos']->result() as $temp_qso) { | 
					
						
							|  |  |  | 					array_push($qso_id_array, $temp_qso->COL_PRIMARY_KEY); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-08-27 04:04:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				// Build File to save
 | 
					
						
							|  |  |  | 				$adif_to_save = $this->load->view('lotw_views/adif_views/adif_export', $data, TRUE); | 
					
						
							| 
									
										
										
										
											2020-09-07 03:33:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				// create folder to store upload file
 | 
					
						
							|  |  |  | 				if (!file_exists('./uploads/lotw')) { | 
					
						
							|  |  |  | 					mkdir('./uploads/lotw', 0775, true); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-10-22 04:04:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				// Build Filename
 | 
					
						
							|  |  |  | 				$filename_for_saving = './uploads/lotw/'.preg_replace('/[^a-z0-9]+/', '-', strtolower($data['lotw_cert_info']->callsign))."-".date("Y-m-d-H-i-s")."-cloudlog.tq8"; | 
					
						
							| 
									
										
										
										
											2020-08-27 04:04:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				$gzdata = gzencode($adif_to_save, 9); | 
					
						
							|  |  |  | 				$fp = fopen($filename_for_saving, "w"); | 
					
						
							|  |  |  | 				fwrite($fp, $gzdata); | 
					
						
							|  |  |  | 				fclose($fp); | 
					
						
							| 
									
										
										
										
											2020-08-27 04:04:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				//The URL that accepts the file upload.
 | 
					
						
							|  |  |  | 				$url = 'https://lotw.arrl.org/lotw/upload'; | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				//The name of the field for the uploaded file.
 | 
					
						
							|  |  |  | 				$uploadFieldName = 'upfile'; | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				//The full path to the file that you want to upload
 | 
					
						
							|  |  |  | 				$filePath = realpath($filename_for_saving); | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				//Initiate cURL
 | 
					
						
							|  |  |  | 				$ch = curl_init(); | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				//Set the URL
 | 
					
						
							|  |  |  | 				curl_setopt($ch, CURLOPT_URL, $url); | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				//Set the HTTP request to POST
 | 
					
						
							|  |  |  | 				curl_setopt($ch, CURLOPT_POST, true); | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				//Tell cURL to return the output as a string.
 | 
					
						
							|  |  |  | 				curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-13 22:39:59 +08:00
										 |  |  | 				//Use the recommended way, creating a CURLFile object.
 | 
					
						
							|  |  |  | 				$uploadfile = curl_file_create($filePath); | 
					
						
							|  |  |  | 				$uploadfile->setPostFilename(basename($filePath)); | 
					
						
							| 
									
										
										
										
											2024-05-13 22:39:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				//Setup our POST fields
 | 
					
						
							|  |  |  | 				$postFields = array( | 
					
						
							| 
									
										
										
										
											2024-05-13 22:39:31 +08:00
										 |  |  | 					$uploadFieldName => $uploadfile | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields); | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				//Execute the request
 | 
					
						
							|  |  |  | 				$result = curl_exec($ch); | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				//If an error occured, throw an exception
 | 
					
						
							|  |  |  | 				//with the error message.
 | 
					
						
							|  |  |  | 				if(curl_errno($ch)){ | 
					
						
							|  |  |  | 					throw new Exception(curl_error($ch)); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				$pos = strpos($result, "<!-- .UPL.  accepted -->"); | 
					
						
							| 
									
										
										
										
											2020-08-27 04:04:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 				if ($pos === false) { | 
					
						
							|  |  |  | 					// Upload of TQ8 Failed for unknown reason
 | 
					
						
							|  |  |  | 					echo $station_profile->station_callsign." (".$station_profile->station_profile_name.") Upload Failed"."<br>"; | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					// Upload of TQ8 was successfull
 | 
					
						
							| 
									
										
										
										
											2020-08-27 04:04:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 					echo "Upload Successful - ".$filename_for_saving."<br>"; | 
					
						
							| 
									
										
										
										
											2020-08-27 04:04:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 					$this->LotwCert->last_upload($data['lotw_cert_info']->lotw_cert_id); | 
					
						
							| 
									
										
										
										
											2020-08-27 04:20:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 					// Mark QSOs as Sent
 | 
					
						
							|  |  |  | 					foreach ($qso_id_array as $qso_number) { | 
					
						
							|  |  |  | 						$this->Logbook_model->mark_lotw_sent($qso_number); | 
					
						
							| 
									
										
										
										
											2020-08-27 04:04:17 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2020-08-23 05:26:04 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				// Delete TQ8 File - This is done regardless of whether upload was succcessful
 | 
					
						
							|  |  |  | 				unlink(realpath($filename_for_saving)); | 
					
						
							| 
									
										
										
										
											2020-08-23 05:26:04 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2023-07-27 15:16:55 +08:00
										 |  |  | 			echo "No Station Profiles found to upload to LoTW"; | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-08-23 05:26:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-07 00:35:45 +08:00
										 |  |  | 			/* | 
					
						
							|  |  |  | 			|	Download QSO Matches from LoTW | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 			 */ | 
					
						
							|  |  |  | 		if ($this->user_model->authorize(2)) { | 
					
						
							| 
									
										
										
										
											2020-09-08 07:12:11 +08:00
										 |  |  | 			echo "<br><br>"; | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 			$sync_user_id=$this->session->userdata('user_id'); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			$sync_user_id=null; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		echo $this->lotw_download($sync_user_id); | 
					
						
							| 
									
										
										
										
											2020-08-23 05:26:04 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 	/* | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							|  |  |  | 	| Function: delete_cert | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 	| | 
					
						
							| 
									
										
										
										
											2023-07-27 15:16:55 +08:00
										 |  |  | 	| Deletes LoTW certificate from the MySQL table | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 	| | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  |     public function delete_cert($cert_id) { | 
					
						
							| 
									
										
										
										
											2020-09-02 21:48:13 +08:00
										 |  |  |     	$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'); } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  |     	$this->load->model('LotwCert'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-30 18:33:09 +08:00
										 |  |  |     	$this->LotwCert->delete_certificate($this->session->userdata('user_id'), $cert_id); | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-30 18:33:09 +08:00
										 |  |  |     	$this->session->set_flashdata('Success', 'Certificate Deleted.'); | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     	redirect('/lotw/'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							|  |  |  | 	| Function: decrypt_key | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 	| | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 	| Accepts p12 file and optional password and encrypts the file returning | 
					
						
							| 
									
										
										
										
											2023-07-27 15:16:55 +08:00
										 |  |  | 	| the required fields for LoTW and the PEM Key | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 	| | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	public function decrypt_key($file, $password = "") { | 
					
						
							| 
									
										
										
										
											2020-09-02 21:48:13 +08:00
										 |  |  | 		$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'); } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-14 06:03:25 +08:00
										 |  |  | 		$results = array(); | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 		$password = $password; // Only needed if 12 has a password set
 | 
					
						
							|  |  |  | 		$filename = file_get_contents('file://'.$file); | 
					
						
							| 
									
										
										
										
											2020-08-14 06:03:25 +08:00
										 |  |  | 		$worked = openssl_pkcs12_read($filename, $results, $password); | 
					
						
							| 
									
										
										
										
											2020-08-26 23:31:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		$data['general_cert'] = $results['cert']; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-14 06:03:25 +08:00
										 |  |  | 		if($worked) { | 
					
						
							| 
									
										
										
										
											2020-08-14 06:34:10 +08:00
										 |  |  | 			// Reading p12 successful
 | 
					
						
							|  |  |  | 		    $new_password = "cloudlog"; // set default password
 | 
					
						
							| 
									
										
										
										
											2020-08-14 06:03:25 +08:00
										 |  |  | 			$result = null; | 
					
						
							|  |  |  | 			$worked = openssl_pkey_export($results['pkey'], $result, $new_password); | 
					
						
							| 
									
										
										
										
											2020-08-26 23:31:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-14 06:03:25 +08:00
										 |  |  | 			if($worked) { | 
					
						
							| 
									
										
										
										
											2020-08-14 06:34:10 +08:00
										 |  |  | 				// Store PEM Key in Array
 | 
					
						
							|  |  |  | 			    $data['pem_key'] = $result; | 
					
						
							| 
									
										
										
										
											2020-08-14 06:03:25 +08:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 				// Error Log Error Message
 | 
					
						
							|  |  |  | 			    log_message('error', openssl_error_string()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-27 15:16:55 +08:00
										 |  |  | 			    // Set warning message redirect to LoTW main page
 | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 			    $this->session->set_flashdata('Warning', openssl_error_string()); | 
					
						
							|  |  |  | 				redirect('/lotw/'); | 
					
						
							| 
									
										
										
										
											2020-08-14 06:03:25 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 			// Reading p12 failed log error message
 | 
					
						
							|  |  |  | 			log_message('error', openssl_error_string()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-27 15:16:55 +08:00
										 |  |  | 			// Set warning message redirect to LoTW main page
 | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 			$this->session->set_flashdata('Warning', openssl_error_string()); | 
					
						
							|  |  |  | 			redirect('/lotw/'); | 
					
						
							| 
									
										
										
										
											2020-08-14 06:03:25 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-08-14 06:34:10 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// Read Cert Data
 | 
					
						
							|  |  |  | 		$certdata= openssl_x509_parse($results['cert'],0); | 
					
						
							| 
									
										
										
										
											2023-11-24 20:08:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-14 06:34:10 +08:00
										 |  |  | 		// Store Variables
 | 
					
						
							|  |  |  | 		$data['issued_callsign'] = $certdata['subject']['undefined']; | 
					
						
							|  |  |  | 		$data['issued_name'] = $certdata['subject']['commonName']; | 
					
						
							| 
									
										
										
										
											2022-08-24 18:16:41 +08:00
										 |  |  | 		$data['validFrom'] = date('Y-m-d H:i:s', $certdata['validFrom_time_t']); | 
					
						
							|  |  |  | 		$data['validTo_Date'] = date('Y-m-d H:i:s', $certdata['validTo_time_t']); | 
					
						
							| 
									
										
										
										
											2022-08-24 19:13:55 +08:00
										 |  |  | 		// https://oidref.com/1.3.6.1.4.1.12348.1
 | 
					
						
							| 
									
										
										
										
											2022-08-24 18:16:41 +08:00
										 |  |  | 		$data['qso-first-date'] = $certdata['extensions']['1.3.6.1.4.1.12348.1.2']; | 
					
						
							|  |  |  | 		$data['qso-end-date'] = $certdata['extensions']['1.3.6.1.4.1.12348.1.3']; | 
					
						
							| 
									
										
										
										
											2023-04-19 21:32:32 +08:00
										 |  |  | 		$data['dxcc-id'] = $certdata['extensions']['1.3.6.1.4.1.12348.1.4']; | 
					
						
							| 
									
										
										
										
											2020-08-14 06:34:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-18 00:02:54 +08:00
										 |  |  | 		return $data; | 
					
						
							| 
									
										
										
										
											2020-08-14 06:03:25 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-07 03:38:45 +08:00
										 |  |  | 	/* | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							|  |  |  | 	| Function: loadFromFile | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 	| | 
					
						
							| 
									
										
										
										
											2020-09-07 03:38:45 +08:00
										 |  |  | 	|	$filepath is the ADIF file, $display_view is used to hide the output if its internal script | 
					
						
							|  |  |  | 	| | 
					
						
							|  |  |  | 	|	Internal function that takes the LoTW ADIF and imports into the log | 
					
						
							|  |  |  | 	| | 
					
						
							|  |  |  | 	*/ | 
					
						
							| 
									
										
										
										
											2020-09-07 03:27:23 +08:00
										 |  |  | 	private function loadFromFile($filepath, $display_view = "TRUE") | 
					
						
							| 
									
										
										
										
											2013-02-24 07:42:18 +08:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2020-07-01 14:34:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-03 04:24:16 +08:00
										 |  |  | 		// Figure out how we should be marking QSLs confirmed via LoTW
 | 
					
						
							|  |  |  | 		$query = $query = $this->db->query('SELECT lotw_rcvd_mark FROM config'); | 
					
						
							|  |  |  | 		$q = $query->row(); | 
					
						
							|  |  |  | 		$config['lotw_rcvd_mark'] = $q->lotw_rcvd_mark; | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-24 08:40:06 +08:00
										 |  |  | 		ini_set('memory_limit', '-1'); | 
					
						
							| 
									
										
										
										
											2013-02-24 07:42:18 +08:00
										 |  |  | 		set_time_limit(0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->load->library('adif_parser'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->adif_parser->load_from_file($filepath); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->adif_parser->initialize(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-11 06:07:55 +08:00
										 |  |  | 		$tableheaders = "<table width=\"100%\">"; | 
					
						
							| 
									
										
										
										
											2013-11-16 05:28:56 +08:00
										 |  |  | 			$tableheaders .= "<tr class=\"titles\">"; | 
					
						
							| 
									
										
										
										
											2020-09-06 23:37:03 +08:00
										 |  |  | 				$tableheaders .= "<td>Station Callsign</td>"; | 
					
						
							| 
									
										
										
										
											2013-11-16 05:28:56 +08:00
										 |  |  | 				$tableheaders .= "<td>QSO Date</td>"; | 
					
						
							|  |  |  | 				$tableheaders .= "<td>Call</td>"; | 
					
						
							|  |  |  | 				$tableheaders .= "<td>Mode</td>"; | 
					
						
							|  |  |  | 				$tableheaders .= "<td>LoTW QSL Received</td>"; | 
					
						
							|  |  |  | 				$tableheaders .= "<td>Date LoTW Confirmed</td>"; | 
					
						
							| 
									
										
										
										
											2020-08-11 06:07:55 +08:00
										 |  |  | 				$tableheaders .= "<td>State</td>"; | 
					
						
							| 
									
										
										
										
											2021-07-28 06:49:54 +08:00
										 |  |  | 				$tableheaders .= "<td>Gridsquare</td>"; | 
					
						
							| 
									
										
										
										
											2022-05-09 20:44:32 +08:00
										 |  |  | 				$tableheaders .= "<td>IOTA</td>"; | 
					
						
							| 
									
										
										
										
											2013-11-16 05:28:56 +08:00
										 |  |  | 				$tableheaders .= "<td>Log Status</td>"; | 
					
						
							|  |  |  | 				$tableheaders .= "<td>LoTW Status</td>"; | 
					
						
							| 
									
										
										
										
											2016-01-10 07:53:50 +08:00
										 |  |  | 			$tableheaders .= "</tr>"; | 
					
						
							| 
									
										
										
										
											2013-11-16 05:28:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			$table = ""; | 
					
						
							|  |  |  | 			while($record = $this->adif_parser->get_record()) | 
					
						
							| 
									
										
										
										
											2013-02-24 07:42:18 +08:00
										 |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-16 05:28:56 +08:00
										 |  |  | 				$time_on = date('Y-m-d', strtotime($record['qso_date'])) ." ".date('H:i', strtotime($record['time_on'])); | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-16 05:28:56 +08:00
										 |  |  | 				$qsl_date = date('Y-m-d', strtotime($record['qslrdate'])) ." ".date('H:i', strtotime($record['qslrdate'])); | 
					
						
							| 
									
										
										
										
											2013-02-24 07:42:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-16 05:28:56 +08:00
										 |  |  | 				if (isset($record['time_off'])) { | 
					
						
							|  |  |  | 					$time_off = date('Y-m-d', strtotime($record['qso_date'])) ." ".date('H:i', strtotime($record['time_off'])); | 
					
						
							|  |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 				   $time_off = date('Y-m-d', strtotime($record['qso_date'])) ." ".date('H:i', strtotime($record['time_on'])); | 
					
						
							| 
									
										
										
										
											2013-11-16 05:28:56 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-16 05:28:56 +08:00
										 |  |  | 				// If we have a positive match from LoTW, record it in the DB according to the user's preferences
 | 
					
						
							|  |  |  | 				if ($record['qsl_rcvd'] == "Y") | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					$record['qsl_rcvd'] = $config['lotw_rcvd_mark']; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-06 01:13:17 +08:00
										 |  |  | 				$status = $this->logbook_model->import_check($time_on, $record['call'], $record['band'], $record['mode'], $record['station_callsign']); | 
					
						
							| 
									
										
										
										
											2020-05-01 19:29:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-12 16:48:22 +08:00
										 |  |  | 				if($status[0] == "Found") { | 
					
						
							| 
									
										
										
										
											2020-08-11 06:07:55 +08:00
										 |  |  | 					if (isset($record['state'])) { | 
					
						
							|  |  |  | 						$state = $record['state']; | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						$state = ""; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2021-07-28 06:49:54 +08:00
										 |  |  | 					// Present only if the QSLing station specified a single valid grid square value in its station location uploaded to LoTW.
 | 
					
						
							|  |  |  | 					if (isset($record['gridsquare'])) { | 
					
						
							|  |  |  | 						$qsl_gridsquare = $record['gridsquare']; | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						$qsl_gridsquare = ""; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-12 23:30:15 +08:00
										 |  |  | 					if (isset($record['vucc_grids'])) { | 
					
						
							|  |  |  | 						$qsl_vucc_grids = $record['vucc_grids']; | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						$qsl_vucc_grids = ""; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-09 20:44:32 +08:00
										 |  |  | 					if (isset($record['iota'])) { | 
					
						
							|  |  |  | 						$iota = $record['iota']; | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						$iota = ""; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2020-08-11 06:07:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-10 07:46:02 +08:00
										 |  |  | 					if (isset($record['cnty'])) { | 
					
						
							|  |  |  | 						$cnty = $record['cnty']; | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						$cnty = ""; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-01 02:06:27 +08:00
										 |  |  | 					if (isset($record['cqz'])) { | 
					
						
							|  |  |  | 						$cqz = $record['cqz']; | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						$cqz = ""; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					if (isset($record['ituz'])) { | 
					
						
							|  |  |  | 						$ituz = $record['ituz']; | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						$ituz = ""; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-12 23:30:15 +08:00
										 |  |  | 					$lotw_status = $this->logbook_model->lotw_update($time_on, $record['call'], $record['band'], $qsl_date, $record['qsl_rcvd'], $state, $qsl_gridsquare, $qsl_vucc_grids, $iota, $cnty, $cqz, $ituz, $record['station_callsign']); | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-12 17:15:14 +08:00
										 |  |  | 					$table .= "<tr>"; | 
					
						
							|  |  |  | 						$table .= "<td>".$record['station_callsign']."</td>"; | 
					
						
							|  |  |  | 						$table .= "<td>".$time_on."</td>"; | 
					
						
							|  |  |  | 						$table .= "<td>".$record['call']."</td>"; | 
					
						
							|  |  |  | 						$table .= "<td>".$record['mode']."</td>"; | 
					
						
							|  |  |  | 						$table .= "<td>".$record['qsl_rcvd']."</td>"; | 
					
						
							|  |  |  | 						$table .= "<td>".$qsl_date."</td>"; | 
					
						
							|  |  |  | 						$table .= "<td>".$state."</td>"; | 
					
						
							| 
									
										
										
										
											2023-07-12 23:30:15 +08:00
										 |  |  | 						$table .= "<td>".($qsl_gridsquare != '' ? $qsl_gridsquare : $qsl_vucc_grids)."</td>"; | 
					
						
							| 
									
										
										
										
											2023-07-12 17:15:14 +08:00
										 |  |  | 						$table .= "<td>".$iota."</td>"; | 
					
						
							|  |  |  | 						$table .= "<td>QSO Record: ".$status[0]."</td>"; | 
					
						
							| 
									
										
										
										
											2023-07-12 16:48:22 +08:00
										 |  |  | 						$table .= "<td>LoTW Record: ".$lotw_status."</td>"; | 
					
						
							| 
									
										
										
										
											2023-07-12 17:15:14 +08:00
										 |  |  | 					$table .= "</tr>"; | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					$table .= "<tr>"; | 
					
						
							|  |  |  | 						$table .= "<td>".$record['station_callsign']."</td>"; | 
					
						
							|  |  |  | 						$table .= "<td>".$time_on."</td>"; | 
					
						
							|  |  |  | 						$table .= "<td>".$record['call']."</td>"; | 
					
						
							|  |  |  | 						$table .= "<td>".$record['mode']."</td>"; | 
					
						
							|  |  |  | 						$table .= "<td>".$record['qsl_rcvd']."</td>"; | 
					
						
							| 
									
										
										
										
											2023-07-12 16:48:22 +08:00
										 |  |  | 						$table .= "<td></td>"; | 
					
						
							| 
									
										
										
										
											2023-07-12 17:15:14 +08:00
										 |  |  | 						$table .= "<td></td>"; | 
					
						
							|  |  |  | 						$table .= "<td></td>"; | 
					
						
							|  |  |  | 						$table .= "<td></td>"; | 
					
						
							|  |  |  | 						$table .= "<td>QSO Record: ".$status[0]."</td>"; | 
					
						
							|  |  |  | 						$table .= "<td></td>"; | 
					
						
							|  |  |  | 					$table .= "</tr>"; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-11-16 05:28:56 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-16 05:28:56 +08:00
										 |  |  | 			if ($table != "") | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				$table .= "</table>"; | 
					
						
							|  |  |  | 				$data['lotw_table_headers'] = $tableheaders; | 
					
						
							|  |  |  | 				$data['lotw_table'] = $table; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-24 08:40:06 +08:00
										 |  |  | 		unlink($filepath); | 
					
						
							| 
									
										
										
										
											2013-02-24 07:42:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-12 23:56:12 +08:00
										 |  |  | 		$this->load->model('user_model'); | 
					
						
							|  |  |  | 		if ($this->user_model->authorize(2)) {	// Only Output results if authorized User
 | 
					
						
							|  |  |  | 			if(isset($data['lotw_table_headers'])) { | 
					
						
							|  |  |  | 				if($display_view == TRUE) { | 
					
						
							|  |  |  | 					$data['page_title'] = "LoTW ADIF Information"; | 
					
						
							|  |  |  | 					$this->load->view('interface_assets/header', $data); | 
					
						
							|  |  |  | 					$this->load->view('lotw/analysis'); | 
					
						
							|  |  |  | 					$this->load->view('interface_assets/footer'); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					return $tableheaders.$table; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-09-07 03:26:19 +08:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2023-07-12 23:56:12 +08:00
										 |  |  | 				echo "Downloaded LoTW report contains no matches."; | 
					
						
							| 
									
										
										
										
											2020-09-07 03:26:19 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-09-07 00:44:06 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-02-24 07:42:18 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-02-17 00:41:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-07 03:38:45 +08:00
										 |  |  | 	/* | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							|  |  |  | 	| Function: lotw_download | 
					
						
							|  |  |  | 	|-------------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 	| | 
					
						
							|  |  |  | 	|	Collects users with LoTW usernames and passwords and runs through them | 
					
						
							| 
									
										
										
										
											2020-09-07 03:38:45 +08:00
										 |  |  | 	|	downloading matching QSOs. | 
					
						
							|  |  |  | 	| | 
					
						
							|  |  |  | 	*/ | 
					
						
							| 
									
										
										
										
											2023-07-12 23:56:12 +08:00
										 |  |  | 	function lotw_download($sync_user_id = null) { | 
					
						
							| 
									
										
										
										
											2020-09-06 23:26:15 +08:00
										 |  |  | 		$this->load->model('user_model'); | 
					
						
							|  |  |  | 		$this->load->model('logbook_model'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-06 23:55:30 +08:00
										 |  |  | 		$query = $this->user_model->get_all_lotw_users(); | 
					
						
							| 
									
										
										
										
											2020-09-06 23:32:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-06 23:55:30 +08:00
										 |  |  | 		if ($query->num_rows() >= 1) { | 
					
						
							| 
									
										
										
										
											2023-11-24 20:49:30 +08:00
										 |  |  | 			$result = ''; | 
					
						
							| 
									
										
										
										
											2023-11-30 19:26:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			// Get URL for downloading LoTW
 | 
					
						
							|  |  |  | 			$url_query = $this->db->query('SELECT lotw_download_url FROM config'); | 
					
						
							|  |  |  | 			$q = $url_query->row(); | 
					
						
							| 
									
										
										
										
											2023-11-30 20:15:36 +08:00
										 |  |  | 			$lotw_base_url = $q->lotw_download_url; | 
					
						
							| 
									
										
										
										
											2023-11-30 19:26:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-12 23:56:12 +08:00
										 |  |  | 			foreach ($query->result() as $user) { | 
					
						
							|  |  |  | 				if ( ($sync_user_id != null) && ($sync_user_id != $user->user_id) ) { continue; } | 
					
						
							| 
									
										
										
										
											2020-09-06 23:26:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-24 20:49:30 +08:00
										 |  |  | 				// Validate that LoTW credentials are not empty
 | 
					
						
							|  |  |  | 				// TODO: We don't actually see the error message
 | 
					
						
							|  |  |  | 				if ($user->user_lotw_password == '') { | 
					
						
							|  |  |  | 					$result = "You have not defined your ARRL LoTW credentials!"; | 
					
						
							|  |  |  | 					continue; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-06 23:55:30 +08:00
										 |  |  | 				$config['upload_path'] = './uploads/'; | 
					
						
							|  |  |  | 				$file = $config['upload_path'] . 'lotwreport_download.adi'; | 
					
						
							| 
									
										
										
										
											2023-04-12 04:40:53 +08:00
										 |  |  | 				if (file_exists($file) && ! is_writable($file)) { | 
					
						
							| 
									
										
										
										
											2023-11-24 20:49:30 +08:00
										 |  |  | 					$result = "Temporary download file ".$file." is not writable. Aborting!"; | 
					
						
							|  |  |  | 					continue; | 
					
						
							| 
									
										
										
										
											2023-04-12 04:40:53 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-09-06 23:55:30 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				// Get credentials for LoTW
 | 
					
						
							| 
									
										
										
										
											2020-09-07 00:33:15 +08:00
										 |  |  | 		    	$data['user_lotw_name'] = urlencode($user->user_lotw_name); | 
					
						
							|  |  |  | 				$data['user_lotw_password'] = urlencode($user->user_lotw_password); | 
					
						
							| 
									
										
										
										
											2020-09-06 23:55:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-24 20:49:30 +08:00
										 |  |  | 				$lotw_last_qsl_date = date('Y-m-d', strtotime($this->logbook_model->lotw_last_qsl_date($user->user_id))); | 
					
						
							| 
									
										
										
										
											2020-09-06 23:26:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-06 23:55:30 +08:00
										 |  |  | 				// Build URL for LoTW report file
 | 
					
						
							| 
									
										
										
										
											2023-11-30 20:15:36 +08:00
										 |  |  | 				$lotw_url = $lotw_base_url."?"; | 
					
						
							| 
									
										
										
										
											2020-09-06 23:55:30 +08:00
										 |  |  | 				$lotw_url .= "login=" . $data['user_lotw_name']; | 
					
						
							|  |  |  | 				$lotw_url .= "&password=" . $data['user_lotw_password']; | 
					
						
							|  |  |  | 				$lotw_url .= "&qso_query=1&qso_qsl='yes'&qso_qsldetail='yes'&qso_mydetail='yes'"; | 
					
						
							| 
									
										
										
										
											2020-09-06 23:26:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-09 20:44:32 +08:00
										 |  |  | 				$lotw_url .= "&qso_qslsince="; | 
					
						
							|  |  |  | 				$lotw_url .= "$lotw_last_qsl_date"; | 
					
						
							| 
									
										
										
										
											2020-09-06 23:26:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-12 04:40:53 +08:00
										 |  |  | 				if (! is_writable(dirname($file))) { | 
					
						
							| 
									
										
										
										
											2023-11-24 20:49:30 +08:00
										 |  |  | 					$result = "Temporary download directory ".dirname($file)." is not writable. Aborting!"; | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 					continue; | 
					
						
							| 
									
										
										
										
											2023-04-12 04:40:53 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-09-06 23:55:30 +08:00
										 |  |  | 				file_put_contents($file, file_get_contents($lotw_url)); | 
					
						
							| 
									
										
										
										
											2023-04-12 05:19:32 +08:00
										 |  |  | 				if (file_get_contents($file, false, null, 0, 39) != "ARRL Logbook of the World Status Report") { | 
					
						
							| 
									
										
										
										
											2023-11-24 20:49:30 +08:00
										 |  |  | 					$result = "LoTW downloading failed for User ".$data['user_lotw_name']." either due to it being down or incorrect logins."; | 
					
						
							| 
									
										
										
										
											2023-07-13 15:13:56 +08:00
										 |  |  | 					continue; | 
					
						
							| 
									
										
										
										
											2023-04-12 05:19:32 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-09-06 23:55:30 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				ini_set('memory_limit', '-1'); | 
					
						
							| 
									
										
										
										
											2023-11-24 20:49:30 +08:00
										 |  |  | 				$result = $this->loadFromFile($file, false); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			return $result; | 
					
						
							| 
									
										
										
										
											2020-09-06 23:55:30 +08:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2023-07-27 15:16:55 +08:00
										 |  |  | 			return "No LoTW User details found to carry out matches."; | 
					
						
							| 
									
										
										
										
											2020-09-06 23:55:30 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-09-06 23:26:15 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 	public function import() { | 
					
						
							| 
									
										
										
										
											2020-07-01 14:34:51 +08:00
										 |  |  | 		$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'); } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-17 00:41:40 +08:00
										 |  |  | 		$data['page_title'] = "LoTW ADIF Import"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$config['upload_path'] = './uploads/'; | 
					
						
							|  |  |  | 		$config['allowed_types'] = 'adi|ADI'; | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-17 00:41:40 +08:00
										 |  |  | 		$this->load->library('upload', $config); | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-24 03:25:36 +08:00
										 |  |  | 		$this->load->model('logbook_model'); | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-23 08:30:33 +08:00
										 |  |  | 		if ($this->input->post('lotwimport') == 'fetch') | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2013-02-23 08:30:33 +08:00
										 |  |  | 			$file = $config['upload_path'] . 'lotwreport_download.adi'; | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-23 08:57:44 +08:00
										 |  |  | 			// Get credentials for LoTW
 | 
					
						
							|  |  |  | 			$query = $this->user_model->get_by_id($this->session->userdata('user_id')); | 
					
						
							| 
									
										
										
										
											2020-04-26 05:11:13 +08:00
										 |  |  |     	    $q = $query->row(); | 
					
						
							| 
									
										
										
										
											2020-09-07 00:33:15 +08:00
										 |  |  |     	    $data['user_lotw_name'] = urlencode($q->user_lotw_name); | 
					
						
							|  |  |  | 			$data['user_lotw_password'] = urlencode($q->user_lotw_password); | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-03 04:24:16 +08:00
										 |  |  | 			// Get URL for downloading LoTW
 | 
					
						
							|  |  |  | 			$query = $query = $this->db->query('SELECT lotw_download_url FROM config'); | 
					
						
							|  |  |  | 			$q = $query->row(); | 
					
						
							|  |  |  | 			$lotw_url = $q->lotw_download_url; | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-24 03:25:36 +08:00
										 |  |  | 			// Validate that LoTW credentials are not empty
 | 
					
						
							|  |  |  | 			// TODO: We don't actually see the error message
 | 
					
						
							|  |  |  | 			if ($data['user_lotw_name'] == '' || $data['user_lotw_password'] == '') | 
					
						
							|  |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2013-03-07 13:33:39 +08:00
										 |  |  | 				$this->session->set_flashdata('warning', 'You have not defined your ARRL LoTW credentials!'); redirect('lotw/import'); | 
					
						
							| 
									
										
										
										
											2013-02-24 03:25:36 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-26 05:11:13 +08:00
										 |  |  |             $customDate = $this->input->post('from'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if ($customDate != NULL) { | 
					
						
							|  |  |  |                 $lotw_last_qsl_date = date($customDate); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else { | 
					
						
							|  |  |  |                 // Query the logbook to determine when the last LoTW confirmation was
 | 
					
						
							| 
									
										
										
										
											2023-07-12 23:56:12 +08:00
										 |  |  |                 $lotw_last_qsl_date = date('Y-m-d', strtotime($this->logbook_model->lotw_last_qsl_date($this->session->userdata['user_id']))); | 
					
						
							| 
									
										
										
										
											2020-04-26 05:11:13 +08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-23 08:57:44 +08:00
										 |  |  | 			// Build URL for LoTW report file
 | 
					
						
							| 
									
										
										
										
											2013-03-03 04:24:16 +08:00
										 |  |  | 			$lotw_url .= "?"; | 
					
						
							| 
									
										
										
										
											2013-02-23 08:57:44 +08:00
										 |  |  | 			$lotw_url .= "login=" . $data['user_lotw_name']; | 
					
						
							|  |  |  | 			$lotw_url .= "&password=" . $data['user_lotw_password']; | 
					
						
							| 
									
										
										
										
											2019-05-22 21:57:20 +08:00
										 |  |  | 			$lotw_url .= "&qso_query=1&qso_qsl='yes'&qso_qsldetail='yes'&qso_mydetail='yes'"; | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-09 20:44:32 +08:00
										 |  |  | 			$lotw_url .= "&qso_qslsince="; | 
					
						
							|  |  |  | 			$lotw_url .= "$lotw_last_qsl_date"; | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-24 23:15:01 +08:00
										 |  |  | 			if ($this->input->post('callsign') != '0') { | 
					
						
							|  |  |  | 				$lotw_url .= "&qso_owncall=".$this->input->post('callsign'); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-11 05:27:20 +08:00
										 |  |  | 			if (is_writable(dirname($file)) && (!file_exists($file) || is_writable($file))) { | 
					
						
							|  |  |  | 				file_put_contents($file, file_get_contents($lotw_url)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				ini_set('memory_limit', '-1'); | 
					
						
							|  |  |  | 				$this->loadFromFile($file); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				if (!is_writable(dirname($file))) { | 
					
						
							|  |  |  | 					$data['errormsg'] = 'Directory '.dirname($file).' is not writable!'; | 
					
						
							|  |  |  | 				} else if (!is_writable($file)) { | 
					
						
							|  |  |  | 					$data['errormsg'] = 'File '.$file.' is not writable!'; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				$this->load->model('Stations'); | 
					
						
							|  |  |  | 				$data['callsigns'] = $this->Stations->callsigns_of_user($this->session->userdata('user_id')); | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-11 05:27:20 +08:00
										 |  |  | 				$this->load->view('interface_assets/header', $data); | 
					
						
							|  |  |  | 				$this->load->view('lotw/import', $data); | 
					
						
							|  |  |  | 				$this->load->view('interface_assets/footer'); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-02-17 00:41:40 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2013-02-23 08:30:33 +08:00
										 |  |  | 			if ( ! $this->upload->do_upload()) | 
					
						
							| 
									
										
										
										
											2013-02-22 10:19:58 +08:00
										 |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-23 08:30:33 +08:00
										 |  |  | 				$data['error'] = $this->upload->display_errors(); | 
					
						
							| 
									
										
										
										
											2023-11-24 23:15:01 +08:00
										 |  |  | 				$this->load->model('Stations'); | 
					
						
							|  |  |  | 				$data['callsigns'] = $this->Stations->callsigns_of_user($this->session->userdata('user_id')); | 
					
						
							| 
									
										
										
										
											2013-02-23 08:30:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-15 00:29:06 +08:00
										 |  |  | 				$this->load->view('interface_assets/header', $data); | 
					
						
							| 
									
										
										
										
											2023-11-24 23:15:01 +08:00
										 |  |  | 				$this->load->view('lotw/import', $data); | 
					
						
							| 
									
										
										
										
											2019-01-15 00:29:06 +08:00
										 |  |  | 				$this->load->view('interface_assets/footer'); | 
					
						
							| 
									
										
										
										
											2013-02-22 10:19:58 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			else | 
					
						
							| 
									
										
										
										
											2013-02-17 00:41:40 +08:00
										 |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2013-02-22 10:13:42 +08:00
										 |  |  | 				$data = array('upload_data' => $this->upload->data()); | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-24 08:40:06 +08:00
										 |  |  | 				$this->loadFromFile('./uploads/'.$data['upload_data']['file_name']); | 
					
						
							| 
									
										
										
										
											2013-02-22 10:13:42 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-02-17 00:41:40 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-02-23 08:30:33 +08:00
										 |  |  | 	} // end function
 | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	public function export() { | 
					
						
							| 
									
										
										
										
											2020-07-01 14:34:51 +08:00
										 |  |  | 		$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'); } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-14 00:24:07 +08:00
										 |  |  | 		$data['page_title'] = "LoTW .TQ8 Upload"; | 
					
						
							| 
									
										
										
										
											2013-03-05 12:59:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		$config['upload_path'] = './uploads/'; | 
					
						
							|  |  |  | 		$config['allowed_types'] = 'tq8|TQ8'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->load->library('upload', $config); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ( ! $this->upload->do_upload()) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$data['error'] = $this->upload->display_errors(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-15 00:29:06 +08:00
										 |  |  | 			$this->load->view('interface_assets/header', $data); | 
					
						
							| 
									
										
										
										
											2013-03-05 12:59:33 +08:00
										 |  |  | 			$this->load->view('lotw/export'); | 
					
						
							| 
									
										
										
										
											2019-01-15 00:29:06 +08:00
										 |  |  | 			$this->load->view('interface_assets/footer'); | 
					
						
							| 
									
										
										
										
											2013-03-05 12:59:33 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2013-03-05 12:59:33 +08:00
										 |  |  | 			$data = array('upload_data' => $this->upload->data()); | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-06 09:19:52 +08:00
										 |  |  | 			// Figure out how we should be marking QSLs confirmed via LoTW
 | 
					
						
							|  |  |  | 			$query = $query = $this->db->query('SELECT lotw_login_url FROM config'); | 
					
						
							|  |  |  | 			$q = $query->row(); | 
					
						
							|  |  |  | 			$config['lotw_login_url'] = $q->lotw_login_url; | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-07 13:33:39 +08:00
										 |  |  | 			// Set some fields that we're going to need for ARRL login
 | 
					
						
							| 
									
										
										
										
											2013-03-06 09:19:52 +08:00
										 |  |  | 			$query = $this->user_model->get_by_id($this->session->userdata('user_id')); | 
					
						
							|  |  |  |     		$q = $query->row(); | 
					
						
							| 
									
										
										
										
											2013-03-07 13:33:39 +08:00
										 |  |  |     		$fields['login'] = $q->user_lotw_name; | 
					
						
							|  |  |  | 			$fields['password'] = $q->user_lotw_password; | 
					
						
							|  |  |  | 			$fields['acct_sel'] = ""; | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-07 13:33:39 +08:00
										 |  |  | 			if ($fields['login'] == '' || $fields['password'] == '') | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				$this->session->set_flashdata('warning', 'You have not defined your ARRL LoTW credentials!'); redirect('lotw/status'); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-05 12:59:33 +08:00
										 |  |  | 			// Curl stuff goes here
 | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-06 09:19:52 +08:00
										 |  |  | 			// First we need to get a cookie
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// options
 | 
					
						
							|  |  |  | 			$cookie_file_path = "./uploads/cookies.txt"; | 
					
						
							|  |  |  | 			$agent            = "Mozilla/4.0 (compatible;)"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// begin script
 | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 			$ch = curl_init(); | 
					
						
							| 
									
										
										
										
											2013-03-06 09:19:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			// extra headers
 | 
					
						
							|  |  |  | 			$headers[] = "Accept: */*"; | 
					
						
							|  |  |  | 			$headers[] = "Connection: Keep-Alive"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// basic curl options for all requests
 | 
					
						
							|  |  |  | 			curl_setopt($ch, CURLOPT_HTTPHEADER,  $headers); | 
					
						
							|  |  |  | 			curl_setopt($ch, CURLOPT_HEADER,  0); | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-06 09:19:52 +08:00
										 |  |  | 			// TODO: These SSL things should probably be set to true :)
 | 
					
						
							|  |  |  | 			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); | 
					
						
							|  |  |  | 			curl_setopt($ch, CURLOPT_USERAGENT, $agent); | 
					
						
							|  |  |  | 			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); | 
					
						
							|  |  |  | 			curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); | 
					
						
							|  |  |  | 			curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); | 
					
						
							|  |  |  | 			curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); | 
					
						
							| 
									
										
										
										
											2013-03-06 09:19:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			// Set login URL
 | 
					
						
							| 
									
										
										
										
											2013-03-07 13:33:39 +08:00
										 |  |  | 			curl_setopt($ch, CURLOPT_URL, $config['lotw_login_url']); | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-06 09:19:52 +08:00
										 |  |  | 			// set postfields using what we extracted from the form
 | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 			$POSTFIELDS = http_build_query($fields); | 
					
						
							| 
									
										
										
										
											2013-03-06 09:19:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			// set post options
 | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 			curl_setopt($ch, CURLOPT_POST, 1); | 
					
						
							|  |  |  | 			curl_setopt($ch, CURLOPT_POSTFIELDS, $POSTFIELDS); | 
					
						
							| 
									
										
										
										
											2013-03-06 09:19:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			// perform login
 | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 			$result = curl_exec($ch); | 
					
						
							| 
									
										
										
										
											2013-03-07 13:33:39 +08:00
										 |  |  | 			if (stristr($result, "Username/password incorrect")) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			   $this->session->set_flashdata('warning', 'Your ARRL username and/or password is incorrect.'); redirect('lotw/status'); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-06 09:19:52 +08:00
										 |  |  | 			// Now we need to use that cookie and upload the file
 | 
					
						
							|  |  |  | 			// change URL to upload destination URL
 | 
					
						
							|  |  |  | 			curl_setopt($ch, CURLOPT_URL, $config['lotw_login_url']); | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-06 09:19:52 +08:00
										 |  |  | 			// Grab the file
 | 
					
						
							|  |  |  | 			$postfile = array( | 
					
						
							|  |  |  |         		"upfile"=>"@./uploads/".$data['upload_data']['file_name'], | 
					
						
							|  |  |  |     		); | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-06 09:19:52 +08:00
										 |  |  |     		//Upload it
 | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  |     		curl_setopt($ch, CURLOPT_POSTFIELDS, $postfile); | 
					
						
							| 
									
										
										
										
											2013-03-06 09:19:52 +08:00
										 |  |  |     		$response = curl_exec($ch); | 
					
						
							| 
									
										
										
										
											2013-03-07 13:33:39 +08:00
										 |  |  | 			if (stristr($response, "accepted")) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			   $this->session->set_flashdata('lotw_status', 'accepted'); | 
					
						
							|  |  |  | 			   $data['page_title'] = "LoTW .TQ8 Sent"; | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-03-07 13:33:39 +08:00
										 |  |  | 			elseif (stristr($response, "rejected")) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 					$this->session->set_flashdata('lotw_status', 'rejected'); | 
					
						
							|  |  |  | 					$data['page_title'] = "LoTW .TQ8 Sent"; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				// If we're here, we didn't find what we're looking for in the ARRL response
 | 
					
						
							|  |  |  | 				// and LoTW is probably down or broken.
 | 
					
						
							|  |  |  | 				$this->session->set_flashdata('warning', 'Did not receive proper response from LoTW. Try again later.'); | 
					
						
							|  |  |  | 				$data['page_title'] = "LoTW .TQ8 Not Sent"; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-06 09:19:52 +08:00
										 |  |  | 			// Now we need to clean up
 | 
					
						
							|  |  |  | 			unlink($cookie_file_path); | 
					
						
							|  |  |  | 			unlink('./uploads/'.$data['upload_data']['file_name']); | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-15 00:29:06 +08:00
										 |  |  | 			$this->load->view('interface_assets/header', $data); | 
					
						
							| 
									
										
										
										
											2013-03-07 13:33:39 +08:00
										 |  |  | 			$this->load->view('lotw/status'); | 
					
						
							| 
									
										
										
										
											2019-01-15 00:29:06 +08:00
										 |  |  | 			$this->load->view('interface_assets/footer'); | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-03-05 12:59:33 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-16 21:31:23 +08:00
										 |  |  | 	/* | 
					
						
							| 
									
										
										
										
											2023-07-27 15:16:55 +08:00
										 |  |  | 		Load the ARRL LoTW User Activity CSV and saves into uploads/lotw_users.csv | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 	*/ | 
					
						
							| 
									
										
										
										
											2020-09-21 21:02:50 +08:00
										 |  |  | 	public function load_users() { | 
					
						
							|  |  |  | 		$contents = file_get_contents('https://lotw.arrl.org/lotw-user-activity.csv', true); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  |         if($contents === FALSE) { | 
					
						
							| 
									
										
										
										
											2023-02-09 00:32:08 +08:00
										 |  |  |             echo "Something went wrong with fetching the LoTW users file."; | 
					
						
							| 
									
										
										
										
											2020-09-21 21:02:50 +08:00
										 |  |  |         } else { | 
					
						
							|  |  |  |             $file = './updates/lotw_users.csv'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-09 00:32:08 +08:00
										 |  |  |             if (file_put_contents($file, $contents) !== FALSE) {     // Save our content to the file.
 | 
					
						
							|  |  |  |                 echo "LoTW User Data Saved."; | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 echo "FAILED: Could not write to LoTW users file"; | 
					
						
							| 
									
										
										
										
											2020-09-21 21:02:50 +08:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-06-16 21:31:23 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* | 
					
						
							| 
									
										
										
										
											2023-07-27 15:16:55 +08:00
										 |  |  | 		Check if callsign is an active LoTW user and return whether its true or not | 
					
						
							| 
									
										
										
										
											2019-06-16 21:31:23 +08:00
										 |  |  | 	*/ | 
					
						
							|  |  |  | 	function lotw_usercheck($callsign) { | 
					
						
							| 
									
										
										
										
											2020-09-21 21:02:50 +08:00
										 |  |  | 		$f = fopen('./updates/lotw_users.csv', "r"); | 
					
						
							| 
									
										
										
										
											2020-09-22 00:45:12 +08:00
										 |  |  | 		$result = false; | 
					
						
							|  |  |  | 		while ($row = fgetcsv($f)) { | 
					
						
							|  |  |  | 		    if ($row[0] == strtoupper($callsign)) { | 
					
						
							|  |  |  | 			$result = $row[0]; | 
					
						
							|  |  |  | 			echo "Found"; | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		    } else { | 
					
						
							|  |  |  | 			echo "Not Found"; | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		    } | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		fclose($f); | 
					
						
							| 
									
										
										
										
											2019-06-16 21:31:23 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-26 00:50:52 +08:00
										 |  |  | 	function signlog($sign_key, $string) { | 
					
						
							| 
									
										
										
										
											2020-08-13 06:53:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-26 00:50:52 +08:00
										 |  |  | 		$qso_string = $string; | 
					
						
							| 
									
										
										
										
											2020-08-13 06:53:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-26 00:50:52 +08:00
										 |  |  | 		$key = $sign_key; | 
					
						
							| 
									
										
										
										
											2020-08-13 06:53:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-26 00:50:52 +08:00
										 |  |  | 		$pkeyid = openssl_pkey_get_private($key, 'cloudlog'); | 
					
						
							| 
									
										
										
										
											2020-08-14 06:03:25 +08:00
										 |  |  | 		//openssl_sign($plaintext, $signature, $pkeyid, OPENSSL_ALGO_SHA1 );
 | 
					
						
							|  |  |  | 		//openssl_free_key($pkeyid);
 | 
					
						
							| 
									
										
										
										
											2020-08-13 06:53:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-14 06:03:25 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if(openssl_sign($qso_string, $signature, $pkeyid, OPENSSL_ALGO_SHA1)) { | 
					
						
							| 
									
										
										
										
											2023-01-02 23:15:56 +08:00
										 |  |  | 		  if (defined('PHP_MAJOR_VERSION') && PHP_MAJOR_VERSION < 8) { | 
					
						
							|  |  |  | 		    openssl_free_key($pkeyid); | 
					
						
							|  |  |  | 		  } | 
					
						
							| 
									
										
										
										
											2020-08-14 06:03:25 +08:00
										 |  |  | 		  $signature_b64 = base64_encode($signature); | 
					
						
							| 
									
										
										
										
											2024-05-13 22:38:30 +08:00
										 |  |  | 		  return $signature_b64."\n"; | 
					
						
							| 
									
										
										
										
											2020-08-14 06:03:25 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-08-13 06:53:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-04 06:20:22 +08:00
										 |  |  | 	/* | 
					
						
							|  |  |  | 	|	Function: lotw_satellite_map | 
					
						
							|  |  |  | 	|	Requires: OSCAR Satellite name $satname | 
					
						
							|  |  |  | 	| | 
					
						
							| 
									
										
										
										
											2023-07-27 15:16:55 +08:00
										 |  |  | 	|	Outputs if LoTW uses a different satellite name | 
					
						
							| 
									
										
										
										
											2020-09-04 06:20:22 +08:00
										 |  |  | 	| | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	function lotw_satellite_map($satname) { | 
					
						
							|  |  |  | 		$arr = array( | 
					
						
							|  |  |  | 			"ARISS"		=>	"ISS", | 
					
						
							|  |  |  | 			"UKUBE1"	=>	"UKUBE-1", | 
					
						
							|  |  |  | 			"KEDR"		=>	"ARISSAT-1", | 
					
						
							|  |  |  | 			"TO-108"	=>	"CAS-6", | 
					
						
							|  |  |  | 			"TAURUS"	=>	"TAURUS-1", | 
					
						
							| 
									
										
										
										
											2020-09-06 05:03:30 +08:00
										 |  |  | 			"AISAT1"	=>	"AISAT-1", | 
					
						
							| 
									
										
										
										
											2021-11-04 19:39:51 +08:00
										 |  |  | 			'UVSQ'		=>	"UVSQ-SAT", | 
					
						
							|  |  |  | 			'CAS-3H'	=>	"LILACSAT-2", | 
					
						
							| 
									
										
										
										
											2022-11-16 21:48:40 +08:00
										 |  |  | 			'IO-117'	=>	"GREENCUBE", | 
					
						
							| 
									
										
										
										
											2023-05-16 08:37:55 +08:00
										 |  |  | 			"TEVEL1"	=>	"TEVEL-1", | 
					
						
							|  |  |  | 			"TEVEL2"	=>	"TEVEL-2", | 
					
						
							|  |  |  | 			"TEVEL3"	=>	"TEVEL-3", | 
					
						
							|  |  |  | 			"TEVEL4"	=>	"TEVEL-4", | 
					
						
							|  |  |  | 			"TEVEL5"	=>	"TEVEL-5", | 
					
						
							|  |  |  | 			"TEVEL6"	=>	"TEVEL-6", | 
					
						
							|  |  |  | 			"TEVEL7"	=>	"TEVEL-7", | 
					
						
							|  |  |  | 			"TEVEL8"	=>	"TEVEL-8", | 
					
						
							| 
									
										
										
										
											2023-11-01 23:57:25 +08:00
										 |  |  | 			"INSPR7"	=> "INSPIRE-SAT 7", | 
					
						
							| 
									
										
										
										
											2020-09-04 06:20:22 +08:00
										 |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return array_search(strtoupper($satname),$arr,true); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-05-02 01:52:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-16 02:04:24 +08:00
										 |  |  | 	/* | 
					
						
							|  |  |  | 	|	Function: lotw_ca_province_map | 
					
						
							|  |  |  | 	|	Requires: candian province map $ca_province | 
					
						
							| 
									
										
										
										
											2022-03-15 21:14:03 +08:00
										 |  |  | 	*/ | 
					
						
							|  |  |  | 	function lotw_ca_province_map($ca_prov) { | 
					
						
							|  |  |  | 		switch ($ca_prov): | 
					
						
							|  |  |  | 			case "QC": | 
					
						
							|  |  |  | 				return "PQ"; | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2024-05-15 01:10:43 +08:00
										 |  |  | 			case "NL": | 
					
						
							|  |  |  | 				return "NF"; | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2022-03-15 21:14:03 +08:00
										 |  |  | 			default: | 
					
						
							|  |  |  | 				return $ca_prov; | 
					
						
							|  |  |  | 		endswitch; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-19 01:06:21 +08:00
										 |  |  | 	/* | 
					
						
							|  |  |  | 	|	Function: mode_map | 
					
						
							| 
									
										
										
										
											2021-03-20 06:55:58 +08:00
										 |  |  | 	|	Requires: mode as $mode, submode as $submode | 
					
						
							| 
									
										
										
										
											2021-03-19 01:06:21 +08:00
										 |  |  | 	| | 
					
						
							|  |  |  | 	|	This converts ADIF modes to the mode that LoTW expects if its non standard | 
					
						
							|  |  |  | 	*/ | 
					
						
							| 
									
										
										
										
											2021-03-20 06:55:58 +08:00
										 |  |  | 	function mode_map($mode, $submode) { | 
					
						
							| 
									
										
										
										
											2021-03-19 01:06:21 +08:00
										 |  |  | 		switch ($mode): | 
					
						
							|  |  |  | 			case "PKT": | 
					
						
							| 
									
										
										
										
											2021-03-19 01:08:01 +08:00
										 |  |  | 				return "PACKET"; | 
					
						
							| 
									
										
										
										
											2021-03-19 01:06:21 +08:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2021-03-20 06:55:58 +08:00
										 |  |  | 			case "MFSK": | 
					
						
							|  |  |  | 				if ($submode == "FT4") { | 
					
						
							|  |  |  | 					return "FT4"; | 
					
						
							|  |  |  | 					break; | 
					
						
							| 
									
										
										
										
											2021-11-04 19:43:17 +08:00
										 |  |  | 				} elseif ($submode == "FST4") { | 
					
						
							| 
									
										
										
										
											2021-11-20 20:51:01 +08:00
										 |  |  | 					return "FST4"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "MFSK16") { | 
					
						
							|  |  |  | 					return "MFSK16"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "MFSK8") { | 
					
						
							|  |  |  | 					return "MFSK8"; | 
					
						
							|  |  |  | 					break; | 
					
						
							| 
									
										
										
										
											2021-11-04 19:43:17 +08:00
										 |  |  | 				} elseif ($submode == "Q65") { | 
					
						
							| 
									
										
										
										
											2021-11-20 20:51:01 +08:00
										 |  |  | 					return "Q65"; | 
					
						
							|  |  |  | 					break; | 
					
						
							| 
									
										
										
										
											2021-03-20 06:55:58 +08:00
										 |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2021-11-20 20:51:01 +08:00
										 |  |  | 					return "DATA"; | 
					
						
							| 
									
										
										
										
											2021-03-20 06:55:58 +08:00
										 |  |  | 					break; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2022-01-05 01:10:32 +08:00
										 |  |  | 			case "PSK": | 
					
						
							|  |  |  | 				if ($submode == "PSK31") { | 
					
						
							|  |  |  | 					return "PSK31"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "PSK63") { | 
					
						
							| 
									
										
										
										
											2022-01-06 06:17:45 +08:00
										 |  |  | 					return "PSK63"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "BPSK125") { | 
					
						
							|  |  |  | 					return "PSK125"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "BPSK31") { | 
					
						
							|  |  |  | 					return "PSK31"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "BPSK63") { | 
					
						
							|  |  |  | 					return "PSK63"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "FSK31") { | 
					
						
							|  |  |  | 					return "FSK31"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "PSK10") { | 
					
						
							|  |  |  | 					return "PSK10"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "PSK125") { | 
					
						
							|  |  |  | 					return "PSK125"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "PSK500") { | 
					
						
							|  |  |  | 					return "PSK500"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "PSK63F") { | 
					
						
							|  |  |  | 					return "PSK63F"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "PSKAM10") { | 
					
						
							|  |  |  | 					return "PSKAM"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "PSKAM31") { | 
					
						
							|  |  |  | 					return "PSKAM"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "PSKAM50") { | 
					
						
							|  |  |  | 					return "PSKAM"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "PSKFEC31") { | 
					
						
							|  |  |  | 					return "PSKFEC31"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "QPSK125") { | 
					
						
							|  |  |  | 					return "PSK125"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "QPSK31") { | 
					
						
							|  |  |  | 					return "PSK31"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "QPSK63") { | 
					
						
							|  |  |  | 					return "PSK63"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} elseif ($submode == "PSK2K") { | 
					
						
							|  |  |  | 					return "PSK2K"; | 
					
						
							|  |  |  | 					break; | 
					
						
							| 
									
										
										
										
											2022-01-05 01:10:32 +08:00
										 |  |  | 				} else { | 
					
						
							|  |  |  | 					return "DATA"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2021-03-19 01:06:21 +08:00
										 |  |  | 			default: | 
					
						
							| 
									
										
										
										
											2021-03-19 01:08:01 +08:00
										 |  |  | 				return $mode; | 
					
						
							| 
									
										
										
										
											2021-03-19 01:06:21 +08:00
										 |  |  | 		endswitch; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-10 07:50:42 +08:00
										 |  |  | } // end class
 |