Added all the parts to allow uploading p12 files into Cloudlog plus storing the data
这个提交包含在:
父节点
7852fbe6d1
当前提交
90831f407b
共有 7 个文件被更改,包括 297 次插入 和 18 次删除
|
|
@ -21,7 +21,7 @@ $config['migration_enabled'] = TRUE;
|
||||||
| be upgraded / downgraded to.
|
| be upgraded / downgraded to.
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
$config['migration_version'] = 42;
|
$config['migration_version'] = 43;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -117,7 +117,7 @@ return array(
|
||||||
'json' => array('application/json', 'text/json'),
|
'json' => array('application/json', 'text/json'),
|
||||||
'pem' => array('application/x-x509-user-cert', 'application/x-pem-file', 'application/octet-stream'),
|
'pem' => array('application/x-x509-user-cert', 'application/x-pem-file', 'application/octet-stream'),
|
||||||
'p10' => array('application/x-pkcs10', 'application/pkcs10'),
|
'p10' => array('application/x-pkcs10', 'application/pkcs10'),
|
||||||
'p12' => 'application/x-pkcs12',
|
'p12' => 'application/octet-stream',
|
||||||
'p7a' => 'application/x-pkcs7-signature',
|
'p7a' => 'application/x-pkcs7-signature',
|
||||||
'p7c' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'),
|
'p7c' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'),
|
||||||
'p7m' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'),
|
'p7m' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'),
|
||||||
|
|
|
||||||
|
|
@ -34,10 +34,157 @@ class Lotw extends CI_Controller {
|
||||||
$this->load->view('interface_assets/footer');
|
$this->load->view('interface_assets/footer');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function key() {
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Function: cert_upload
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Nothing fancy just shows the cert_upload form for uploading p12 files
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
public function cert_upload() {
|
||||||
|
// 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' => ' ' ));
|
||||||
|
$this->load->view('interface_assets/footer');
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Function: do_cert_upload
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| 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()
|
||||||
|
{
|
||||||
|
$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());
|
||||||
|
|
||||||
|
// 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', $error);
|
||||||
|
$this->load->view('interface_assets/footer');
|
||||||
|
}
|
||||||
|
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']);
|
||||||
|
|
||||||
|
// Check to see if certificate is already in the system
|
||||||
|
$new_certficiate = $this->LotwCert->find_cert($info['issued_callsign'], $this->session->userdata('user_id'));
|
||||||
|
|
||||||
|
// Check DXCC & Store Country Name
|
||||||
|
$this->load->model('Logbook_model');
|
||||||
|
$dxcc_check = $this->Logbook_model->check_dxcc_table($info['issued_callsign'], $info['validFrom']);
|
||||||
|
$dxcc = $dxcc_check[1];
|
||||||
|
|
||||||
|
if($new_certficiate == 0) {
|
||||||
|
// New Certificate Store in Database
|
||||||
|
|
||||||
|
// Store Certificate Data into MySQL
|
||||||
|
$this->LotwCert->store_certficiate($this->session->userdata('user_id'), $info['issued_callsign'], $dxcc, $info['validFrom'], $info['validTo_Date'], $info['pem_key']);
|
||||||
|
|
||||||
|
// Cert success flash message
|
||||||
|
$this->session->set_flashdata('Success', $info['issued_callsign'].' Certficiate Imported.');
|
||||||
|
} else {
|
||||||
|
// Certficiate is in the system time to update
|
||||||
|
|
||||||
|
$this->LotwCert->update_certficiate($this->session->userdata('user_id'), $info['issued_callsign'], $dxcc, $info['validFrom'], $info['validTo_Date'], $info['pem_key']);
|
||||||
|
|
||||||
|
// Cert success flash message
|
||||||
|
$this->session->set_flashdata('Success', $info['issued_callsign'].' Certficiate Updated.');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// p12 certificate processed time to delete the file
|
||||||
|
unlink($data['upload_data']['full_path']);
|
||||||
|
|
||||||
|
// Get Array of the logged in users LOTW certs.
|
||||||
|
$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');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Function: delete_cert
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Deletes LOTW certificate from the MySQL table
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
public function delete_cert($cert_id) {
|
||||||
|
$this->load->model('LotwCert');
|
||||||
|
|
||||||
|
$this->LotwCert->delete_certficiate($this->session->userdata('user_id'), $cert_id);
|
||||||
|
|
||||||
|
$this->session->set_flashdata('Success', 'Certficiate Deleted.');
|
||||||
|
|
||||||
|
redirect('/lotw/');
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Function: peter
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Temp function to test development bits
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
public function peter() {
|
||||||
|
$this->load->model('LotwCert');
|
||||||
|
$this->load->model('Logbook_model');
|
||||||
|
$dxcc = $this->Logbook_model->check_dxcc_table("2M0SQL", "2020-05-07 17:20:27");
|
||||||
|
|
||||||
|
print_r($dxcc);
|
||||||
|
// Get Array of the logged in users LOTW certs.
|
||||||
|
echo $this->LotwCert->find_cert($this->session->userdata('user_id'), "2M0SQL");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Function: decrypt_key
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Accepts p12 file and optional password and encrypts the file returning
|
||||||
|
| the required fields for LOTW and the PEM Key
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
public function decrypt_key($file, $password = "") {
|
||||||
$results = array();
|
$results = array();
|
||||||
$password = "";
|
$password = $password; // Only needed if 12 has a password set
|
||||||
$filename = file_get_contents('file:///mnt/c/lotw/php/file-to-read.p12');
|
$filename = file_get_contents('file://'.$file);
|
||||||
$worked = openssl_pkcs12_read($filename, $results, $password);
|
$worked = openssl_pkcs12_read($filename, $results, $password);
|
||||||
if($worked) {
|
if($worked) {
|
||||||
// Reading p12 successful
|
// Reading p12 successful
|
||||||
|
|
@ -48,11 +195,20 @@ class Lotw extends CI_Controller {
|
||||||
// Store PEM Key in Array
|
// Store PEM Key in Array
|
||||||
$data['pem_key'] = $result;
|
$data['pem_key'] = $result;
|
||||||
} else {
|
} else {
|
||||||
echo openssl_error_string();
|
// Error Log Error Message
|
||||||
|
log_message('error', openssl_error_string());
|
||||||
|
|
||||||
|
// Set warning message redirect to LOTW main page
|
||||||
|
$this->session->set_flashdata('Warning', openssl_error_string());
|
||||||
|
redirect('/lotw/');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Reading p12 failed
|
// Reading p12 failed log error message
|
||||||
echo openssl_error_string();
|
log_message('error', openssl_error_string());
|
||||||
|
|
||||||
|
// Set warning message redirect to LOTW main page
|
||||||
|
$this->session->set_flashdata('Warning', openssl_error_string());
|
||||||
|
redirect('/lotw/');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read Cert Data
|
// Read Cert Data
|
||||||
|
|
@ -61,10 +217,10 @@ class Lotw extends CI_Controller {
|
||||||
// Store Variables
|
// Store Variables
|
||||||
$data['issued_callsign'] = $certdata['subject']['undefined'];
|
$data['issued_callsign'] = $certdata['subject']['undefined'];
|
||||||
$data['issued_name'] = $certdata['subject']['commonName'];
|
$data['issued_name'] = $certdata['subject']['commonName'];
|
||||||
$data['validFrom_Date'] = date("d-m-Y H:i:s", strtotime($certdata['validFrom']));
|
$data['validFrom'] = $certdata['extensions']['1.3.6.1.4.1.12348.1.2'];
|
||||||
$data['validTo_Date'] = date("d-m-Y H:i:s", strtotime($certdata['validTo']));
|
$data['validTo_Date'] = $certdata['extensions']['1.3.6.1.4.1.12348.1.3'];
|
||||||
|
|
||||||
print_r($data);
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function loadFromFile($filepath)
|
private function loadFromFile($filepath)
|
||||||
|
|
@ -431,7 +587,7 @@ class Lotw extends CI_Controller {
|
||||||
|
|
||||||
$key = "";
|
$key = "";
|
||||||
|
|
||||||
$pkeyid = openssl_pkey_get_private($key, 'cloudlog');
|
$pkeyid = openssl_pkey_get_private($key, 'peter');
|
||||||
//openssl_sign($plaintext, $signature, $pkeyid, OPENSSL_ALGO_SHA1 );
|
//openssl_sign($plaintext, $signature, $pkeyid, OPENSSL_ALGO_SHA1 );
|
||||||
//openssl_free_key($pkeyid);
|
//openssl_free_key($pkeyid);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
class Migration_add_key_to_lotw_certs extends CI_Migration {
|
||||||
|
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
$fields = array(
|
||||||
|
'cert_key TEXT',
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
$this->dbforge->add_column('lotw_certs', $fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
$this->dbforge->drop_column('lotw_certs', 'key');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -18,11 +18,53 @@ class LotwCert extends CI_Model {
|
||||||
*/
|
*/
|
||||||
function lotw_certs($user_id) {
|
function lotw_certs($user_id) {
|
||||||
$this->db->where('user_id', $user_id);
|
$this->db->where('user_id', $user_id);
|
||||||
|
$this->db->group_by("callsign");
|
||||||
|
$this->db->order_by('cert_dxcc', 'ASC');
|
||||||
$query = $this->db->get('lotw_certs');
|
$query = $this->db->get('lotw_certs');
|
||||||
|
|
||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function find_cert($callsign, $user_id) {
|
||||||
|
$this->db->where('user_id', $user_id);
|
||||||
|
$this->db->where('callsign', $callsign);
|
||||||
|
$query = $this->db->get('lotw_certs');
|
||||||
|
|
||||||
|
return $query->num_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
function store_certficiate($user_id, $callsign, $dxcc, $date_created, $date_expires, $cert_key) {
|
||||||
|
$data = array(
|
||||||
|
'user_id' => $user_id,
|
||||||
|
'callsign' => $callsign,
|
||||||
|
'cert_dxcc' => $dxcc,
|
||||||
|
'date_created' => $date_created,
|
||||||
|
'date_expires' => $date_expires,
|
||||||
|
'cert_key' => $cert_key,
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->db->insert('lotw_certs', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_certficiate($user_id, $callsign, $dxcc, $date_created, $date_expires, $cert_key) {
|
||||||
|
$data = array(
|
||||||
|
'cert_dxcc' => $dxcc,
|
||||||
|
'date_created' => $date_created,
|
||||||
|
'date_expires' => $date_expires,
|
||||||
|
'cert_key' => $cert_key,
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->db->where('user_id', $user_id);
|
||||||
|
$this->db->where('callsign', $callsign);
|
||||||
|
$this->db->update('lotw_certs', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function delete_certficiate($user_id, $lotw_cert_id) {
|
||||||
|
$this->db->where('lotw_cert_id', $lotw_cert_id);
|
||||||
|
$this->db->where('user_id', $user_id);
|
||||||
|
$this->db->delete('lotw_certs');
|
||||||
|
}
|
||||||
|
|
||||||
function empty_table($table) {
|
function empty_table($table) {
|
||||||
$this->db->empty_table($table);
|
$this->db->empty_table($table);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
<!-- Card Starts -->
|
<!-- Card Starts -->
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<a class="btn btn-success btn-sm float-right" href="#" role="button"><i class="fas fa-cloud-upload-alt"></i> Upload Certificate</a>Available Certificates
|
<a class="btn btn-success btn-sm float-right" href="<?php echo site_url('/lotw/cert_upload'); ?>" role="button"><i class="fas fa-cloud-upload-alt"></i> Upload Certificate</a>Available Certificates
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
|
|
@ -15,6 +15,12 @@
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
|
<?php if(isset($_SESSION['Success'])) { ?>
|
||||||
|
<div class="alert alert-success" role="alert">
|
||||||
|
<?php echo $_SESSION['Success']; ?>
|
||||||
|
</div>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
<?php if ($lotw_cert_results->num_rows() > 0) { ?>
|
<?php if ($lotw_cert_results->num_rows() > 0) { ?>
|
||||||
|
|
||||||
<div class="table-responsive">
|
<div class="table-responsive">
|
||||||
|
|
@ -26,6 +32,7 @@
|
||||||
<th scope="col">Date Created</th>
|
<th scope="col">Date Created</th>
|
||||||
<th scope="col">Date Expires</th>
|
<th scope="col">Date Expires</th>
|
||||||
<th scope="col">Status</th>
|
<th scope="col">Status</th>
|
||||||
|
<th scope="col">Options</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|
||||||
|
|
@ -34,10 +41,30 @@
|
||||||
<?php foreach ($lotw_cert_results->result() as $row) { ?>
|
<?php foreach ($lotw_cert_results->result() as $row) { ?>
|
||||||
<tr>
|
<tr>
|
||||||
<td><?php echo $row->callsign; ?></td>
|
<td><?php echo $row->callsign; ?></td>
|
||||||
<td><?php echo $row->cert_dxcc; ?></td>
|
<td><?php echo ucfirst($row->cert_dxcc); ?></td>
|
||||||
<td><?php echo $row->date_created; ?></td>
|
<td><?php
|
||||||
<td><?php echo $row->date_expires; ?></td>
|
$valid_form = strtotime( $row->date_created );
|
||||||
<td></td>
|
$new_valid_from = date($this->config->item('qso_date_format'), $valid_form );
|
||||||
|
echo $new_valid_from; ?>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<?php
|
||||||
|
$valid_to = strtotime( $row->date_expires );
|
||||||
|
$new_valid_to = date($this->config->item('qso_date_format'), $valid_to );
|
||||||
|
echo $new_valid_to; ?>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<?php $current_date = date('Y-m-d H:i:s'); ?>
|
||||||
|
|
||||||
|
<?php if ($current_date <= $row->date_expires) { ?>
|
||||||
|
<span class="badge badge-success">Valid</span>
|
||||||
|
<?php } else { ?>
|
||||||
|
<span class="badge badge-dark">Expired</span>
|
||||||
|
<?php } ?>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a class="btn btn-primary btn-sm" href="<?php echo site_url('lotw/delete_cert/'.$row->lotw_cert_id); ?>" role="button"><i class="far fa-trash-alt"></i> Delete</a>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
<div class="container lotw">
|
||||||
|
|
||||||
|
<h1><?php echo $page_title; ?></h1>
|
||||||
|
|
||||||
|
<!-- Card Starts -->
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
Upload Certificate
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
<?php if($error != " ") { ?>
|
||||||
|
<div class="alert alert-danger" role="alert">
|
||||||
|
<?php echo $error; ?>
|
||||||
|
</div>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
<?php echo form_open_multipart('lotw/do_cert_upload');?>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="exampleFormControlFile1">Upload LoTW P12 File</label>
|
||||||
|
<input type="file" name="userfile" class="form-control-file" id="exampleFormControlFile1">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="submit" value="upload" class="btn btn-primary">Submit</button>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Card Ends -->
|
||||||
|
|
||||||
|
</div>
|
||||||
正在加载…
在新工单中引用