add more pki features, bug fixes, try not to use jquery
This commit is contained in:
parent
38932aef44
commit
6c388c8129
18 changed files with 675 additions and 1068 deletions
45
browser_app/confirm-modal.js
Normal file
45
browser_app/confirm-modal.js
Normal file
|
@ -0,0 +1,45 @@
|
|||
"use strict";
|
||||
|
||||
const $ = document.querySelector.bind(document)
|
||||
const _ = document.getElementById
|
||||
|
||||
export class ConfirmDialog {
|
||||
|
||||
constructor(message) {
|
||||
this._div = document.getElementById('confirm-dialog-template').content.querySelector('div').cloneNode(true);
|
||||
this._div.querySelector('.modal-body').innerHTML = message;
|
||||
}
|
||||
|
||||
show() {
|
||||
var self = this;
|
||||
this._promise = new Promise((resolve, reject) => {
|
||||
self._resolve = resolve;
|
||||
self._reject = reject;
|
||||
});
|
||||
|
||||
this._div.querySelectorAll('.close').forEach(function (o){
|
||||
o.onclick=self.cancel.bind(self);
|
||||
});
|
||||
|
||||
this._div.querySelector('.process').onclick = () => {
|
||||
self._close();
|
||||
self._resolve();
|
||||
};
|
||||
|
||||
$('.messages-box').appendChild(this._div);
|
||||
return this._promise
|
||||
}
|
||||
|
||||
cancel() {
|
||||
this._close()
|
||||
this._reject('canceled by user');
|
||||
}
|
||||
|
||||
_close() {
|
||||
$('.messages-box').removeChild(this._div);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1,14 +1,20 @@
|
|||
import 'jquery';
|
||||
import 'bootstrap';
|
||||
import 'jquery-form'
|
||||
import {ConfirmDialog} from './confirm-modal.js';
|
||||
|
||||
window.$ =window.jQuery = require('jquery');
|
||||
jQuery = window.$ = window.jQuery = require('jquery');
|
||||
var forge = require('node-forge');
|
||||
var QRCode = require("qrcode-svg");
|
||||
var pki = require('node-forge/lib/pki');
|
||||
var asn1 = require('node-forge/lib/asn1');
|
||||
var pkcs12 = require('node-forge/lib/pkcs12');
|
||||
var util = require('node-forge/lib/util');
|
||||
import SimpleFormSubmit from "simple-form-submit";
|
||||
|
||||
const $ = document.querySelector.bind(document);
|
||||
const $$ = document.querySelectorAll.bind(document);
|
||||
|
||||
|
||||
/*
|
||||
Convert an ArrayBuffer into a string
|
||||
|
@ -32,12 +38,13 @@ function randBase32() {
|
|||
return result;
|
||||
}
|
||||
|
||||
window.$(document).ready(function () {
|
||||
$('#sidebarCollapse').on('click', function () {
|
||||
$('nav.sidebar').toggleClass('d-none');
|
||||
});
|
||||
});
|
||||
window.ConfirmDialog = ConfirmDialog;
|
||||
|
||||
window.$(document).ready(function () {
|
||||
$('#sidebarCollapse').onclick = function () {
|
||||
$('nav.sidebar').classList.toggle('d-none');
|
||||
};
|
||||
});
|
||||
|
||||
window.totp = {
|
||||
init_list: function(){
|
||||
|
@ -46,18 +53,18 @@ window.totp = {
|
|||
//create new TOTP secret, create qrcode and ask for token.
|
||||
var form = $('form');
|
||||
var secret = randBase32();
|
||||
var input_secret = form.find('#secret')
|
||||
if(input_secret.val() == '') {
|
||||
input_secret.val(secret);
|
||||
var input_secret = form.querySelector('#secret')
|
||||
if(input_secret.value == '') {
|
||||
input_secret.value = secret;
|
||||
}
|
||||
|
||||
form.find('#name').on('change',window.totp.generate_qrcode);
|
||||
form.querySelector('#name').on('change',window.totp.generate_qrcode);
|
||||
window.totp.generate_qrcode();
|
||||
},
|
||||
generate_qrcode: function(){
|
||||
var form = $('form');
|
||||
var secret = form.find('#secret').val();
|
||||
var name = form.find('#name').val();
|
||||
var secret = form.querySelector('#secret').value;
|
||||
var name = form.querySelector('#name').value;
|
||||
var issuer = 'Lenticular%20Cloud';
|
||||
var svg_container = $('#svg-container')
|
||||
var svg = new QRCode(`otpauth://totp/${issuer}:${name}?secret=${secret}&issuer=${issuer}`).svg();
|
||||
|
@ -84,48 +91,52 @@ window.client_cert = {
|
|||
},
|
||||
generate_private_key: function() {
|
||||
var form = $('form#gen-key-form');
|
||||
var key_size = form.find('#key-size').val();
|
||||
var valid_time = form.find('input[name=valid_time]').val();
|
||||
$('button#generate-key')[0].style['display'] = 'none';
|
||||
var key_size = form.querySelector('#key-size').value;
|
||||
var valid_time = form.querySelector('input[name=valid_time]').value;
|
||||
$('button#generate-key').style['display'] = 'none';
|
||||
pki.rsa.generateKeyPair({bits: key_size, workers: 2}, function(err, keypair) {
|
||||
console.log(keypair);
|
||||
form.data('keypair', keypair);
|
||||
|
||||
//returns the exported key to a hidden form
|
||||
var form_sign_key = $('#gen-key-sign form');
|
||||
form_sign_key.find('textarea[name=publickey]').val(pki.publicKeyToPem(keypair.publicKey));
|
||||
form_sign_key.find('input[name=valid_time]').val(valid_time);
|
||||
form_sign_key.querySelector('textarea[name=publickey]').value = pki.publicKeyToPem(keypair.publicKey);
|
||||
form_sign_key.querySelector('input[name=valid_time]').value = valid_time;
|
||||
|
||||
form_sign_key.ajaxForm({
|
||||
success: function(response) {
|
||||
// get certificate
|
||||
var data = response['data'];
|
||||
|
||||
var certs = [
|
||||
pki.certificateFromPem(data.cert),
|
||||
pki.certificateFromPem(data.ca_cert)
|
||||
];
|
||||
var password = form.find('#cert-password').val();
|
||||
var keypair = form.data('keypair');
|
||||
var p12Asn1;
|
||||
if (password == '') {
|
||||
p12Asn1 = pkcs12.toPkcs12Asn1(keypair.privateKey, certs, null, {algorithm: '3des'}); // without password
|
||||
} else {
|
||||
p12Asn1 = pkcs12.toPkcs12Asn1(keypair.privateKey, certs, password, {algorithm: '3des'}); // without password
|
||||
}
|
||||
var p12Der = asn1.toDer(p12Asn1).getBytes();
|
||||
var p12b64 = util.encode64(p12Der);
|
||||
SimpleFormSubmit.submitForm(form_sign_key.action, form_sign_key)
|
||||
.then(response => {
|
||||
response.json().then( response => {
|
||||
// get certificate
|
||||
var data = response.data;
|
||||
var certs = [
|
||||
pki.certificateFromPem(data.cert),
|
||||
pki.certificateFromPem(data.ca_cert)
|
||||
];
|
||||
var password = form.querySelector('#cert-password').value;
|
||||
var p12Asn1;
|
||||
if (password == '') {
|
||||
p12Asn1 = pkcs12.toPkcs12Asn1(keypair.privateKey, certs, null, {algorithm: '3des'}); // without password
|
||||
} else {
|
||||
p12Asn1 = pkcs12.toPkcs12Asn1(keypair.privateKey, certs, password, {algorithm: '3des'}); // without password
|
||||
}
|
||||
var p12Der = asn1.toDer(p12Asn1).getBytes();
|
||||
var p12b64 = util.encode64(p12Der);
|
||||
|
||||
|
||||
var button = $('#save-button')[0];
|
||||
button.href= "data:application/x-pkcs12;base64," + p12b64
|
||||
button.style['display'] ='block';
|
||||
}
|
||||
|
||||
});
|
||||
// submit hidden form
|
||||
form_sign_key.submit();
|
||||
var button = $('#save-button');
|
||||
button.href= "data:application/x-pkcs12;base64," + p12b64
|
||||
button.style['display'] ='block';
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
revoke_certificate: function(href, id){
|
||||
var dialog = new ConfirmDialog(`Are you sure to revoke the certificate with the fingerprint ${id}?`);
|
||||
dialog.show().then(()=>{
|
||||
fetch(href, {
|
||||
method: 'DELETE'
|
||||
});
|
||||
});
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -3,3 +3,13 @@
|
|||
@import "~@fortawesome/fontawesome-free/css/all.css";
|
||||
//@import "~datatables.net-bs4/css/dataTables.bootstrap4.css";
|
||||
|
||||
|
||||
|
||||
.messages-box {
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
margin-top: 30px;
|
||||
z-index: 500;
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue