mirror of
https://github.com/Ylianst/MeshCommander
synced 2025-12-10 13:23:34 +00:00
Added OCR web server.
This commit is contained in:
@@ -50,6 +50,9 @@ var CreateWsmanComm = function (host, port, user, pass, tls, tlsoptions) {
|
|||||||
// Private method
|
// Private method
|
||||||
//obj.Debug = function (msg) { console.log(msg); }
|
//obj.Debug = function (msg) { console.log(msg); }
|
||||||
|
|
||||||
|
//console.log(obj.socket.remoteAddress + ':' + obj.socket.remotePort);
|
||||||
|
//console.log(obj.socket.localAddress + ':' + obj.socket.localPort);
|
||||||
|
|
||||||
// Private method
|
// Private method
|
||||||
// pri = priority, if set to 1, the call is high priority and put on top of the stack.
|
// pri = priority, if set to 1, the call is high priority and put on top of the stack.
|
||||||
obj.PerformAjax = function (postdata, callback, tag, pri, url, action) {
|
obj.PerformAjax = function (postdata, callback, tag, pri, url, action) {
|
||||||
|
|||||||
13311
index-ocr.html
Normal file
13311
index-ocr.html
Normal file
File diff suppressed because one or more lines are too long
13188
index-org.html
Normal file
13188
index-org.html
Normal file
File diff suppressed because one or more lines are too long
93
index.html
93
index.html
@@ -86,6 +86,11 @@
|
|||||||
<!-- ###BEGIN###{Terminal} -->
|
<!-- ###BEGIN###{Terminal} -->
|
||||||
<script type="text/javascript" src="amt-terminal-0.0.2.js"></script>
|
<script type="text/javascript" src="amt-terminal-0.0.2.js"></script>
|
||||||
<!-- ###END###{Terminal} -->
|
<!-- ###END###{Terminal} -->
|
||||||
|
<!-- ###BEGIN###{PowerControl-Advanced} -->
|
||||||
|
<!-- ###BEGIN###{PowerControl-OneClick} -->
|
||||||
|
<script type="text/javascript" src="webserver-0.0.1.js"></script>
|
||||||
|
<!-- ###END###{PowerControl-Advanced} -->
|
||||||
|
<!-- ###END###{PowerControl-OneClick} -->
|
||||||
<!-- ###BEGIN###{Inflate} -->
|
<!-- ###BEGIN###{Inflate} -->
|
||||||
<script type="text/javascript" src="zlib.js"></script>
|
<script type="text/javascript" src="zlib.js"></script>
|
||||||
<script type="text/javascript" src="zlib-inflate.js"></script>
|
<script type="text/javascript" src="zlib-inflate.js"></script>
|
||||||
@@ -438,6 +443,9 @@
|
|||||||
<div id="id_lmsData2" style="margin:10px"></div>
|
<div id="id_lmsData2" style="margin:10px"></div>
|
||||||
</div>
|
</div>
|
||||||
<!-- ###END###{Mode-LMS} -->
|
<!-- ###END###{Mode-LMS} -->
|
||||||
|
<!-- ###BEGIN###{PowerControl-OneClick} -->
|
||||||
|
<div id=TransferNotification style="display:none;background-color:lightgrey;position:absolute;left:10px;bottom:10px;border-radius:5px;padding:4px;z-index:1000;box-shadow:0px 0px 10px #333"></div>
|
||||||
|
<!-- ###END###{PowerControl-OneClick} -->
|
||||||
<!-- ###BEGIN###{Mode-NodeWebkit} -->
|
<!-- ###BEGIN###{Mode-NodeWebkit} -->
|
||||||
<div id=LeftSideToolBar style="position:absolute;left:0px;bottom:0px;width:52px;top:69px;background:#113962;background:linear-gradient(to bottom, #104893 0%,#113962 100%);color:white;display:none">
|
<div id=LeftSideToolBar style="position:absolute;left:0px;bottom:0px;width:52px;top:69px;background:#113962;background:linear-gradient(to bottom, #104893 0%,#113962 100%);color:white;display:none">
|
||||||
<div style="height:23px"></div>
|
<div style="height:23px"></div>
|
||||||
@@ -1733,6 +1741,11 @@
|
|||||||
// ###BEGIN###{MeshServerConnect}
|
// ###BEGIN###{MeshServerConnect}
|
||||||
var meshCentralServer = null;
|
var meshCentralServer = null;
|
||||||
// ###END###{MeshServerConnect}
|
// ###END###{MeshServerConnect}
|
||||||
|
// ###BEGIN###{PowerControl-Advanced}
|
||||||
|
// ###BEGIN###{PowerControl-OneClick}
|
||||||
|
var webserver = null;
|
||||||
|
// ###END###{PowerControl-OneClick}
|
||||||
|
// ###END###{PowerControl-Advanced}
|
||||||
|
|
||||||
function startup() {
|
function startup() {
|
||||||
// This is a bit freeky, but all HTML input elements are just going to be accessible directly.
|
// This is a bit freeky, but all HTML input elements are just going to be accessible directly.
|
||||||
@@ -1815,16 +1828,16 @@
|
|||||||
if (urlvars['kvmclip']) { QV('id_DeskKvmClipButton', true); }
|
if (urlvars['kvmclip']) { QV('id_DeskKvmClipButton', true); }
|
||||||
// ###END###{DesktopClipboard}
|
// ###END###{DesktopClipboard}
|
||||||
|
|
||||||
// ###BEGIN###{ContextMenus}
|
// ###BEGIN###{ContextMenus}
|
||||||
document.onclick = function (e) { hideContextMenu(); }
|
document.onclick = function (e) { hideContextMenu(); }
|
||||||
// ###END###{ContextMenus}
|
// ###END###{ContextMenus}
|
||||||
|
|
||||||
// ###BEGIN###{SessionRecording}
|
// ###BEGIN###{SessionRecording}
|
||||||
srec_cleanup();
|
srec_cleanup();
|
||||||
Q('srec_PlaySpeed').value = 1;
|
Q('srec_PlaySpeed').value = 1;
|
||||||
// ###END###{SessionRecording}
|
// ###END###{SessionRecording}
|
||||||
|
|
||||||
// ###BEGIN###{Mode-LMS}
|
// ###BEGIN###{Mode-LMS}
|
||||||
// Setup LMS
|
// Setup LMS
|
||||||
lms = CreateLmsControl();
|
lms = CreateLmsControl();
|
||||||
lms.onStateChanged = lmsChangedState;
|
lms.onStateChanged = lmsChangedState;
|
||||||
@@ -1835,14 +1848,14 @@
|
|||||||
QH('id_computername', 'Configuration Console v' + version);
|
QH('id_computername', 'Configuration Console v' + version);
|
||||||
go(101);
|
go(101);
|
||||||
lmsRefresh();
|
lmsRefresh();
|
||||||
// ###END###{Mode-LMS}
|
// ###END###{Mode-LMS}
|
||||||
|
|
||||||
// ###BEGIN###{WsmanBrowser}
|
// ###BEGIN###{WsmanBrowser}
|
||||||
// Add all WSMAN objects to WSMAN browser
|
// Add all WSMAN objects to WSMAN browser
|
||||||
for (var w in AllWsman) { var option = document.createElement('option'); option.text = AllWsman[w]; option.id = 'WSB-' + AllWsman[w]; Q('id_QuerySelect').add(option); }
|
for (var w in AllWsman) { var option = document.createElement('option'); option.text = AllWsman[w]; option.id = 'WSB-' + AllWsman[w]; Q('id_QuerySelect').add(option); }
|
||||||
// ###END###{WsmanBrowser}
|
// ###END###{WsmanBrowser}
|
||||||
|
|
||||||
// ###BEGIN###{Desktop}
|
// ###BEGIN###{Desktop}
|
||||||
// Setup the remote desktop
|
// Setup the remote desktop
|
||||||
desktop = CreateAmtRedirect(CreateAmtRemoteDesktop('Desk', Q('id_mainarea')));
|
desktop = CreateAmtRedirect(CreateAmtRemoteDesktop('Desk', Q('id_mainarea')));
|
||||||
desktop.onStateChanged = onDesktopStateChange;
|
desktop.onStateChanged = onDesktopStateChange;
|
||||||
@@ -1853,9 +1866,9 @@
|
|||||||
var s = '';
|
var s = '';
|
||||||
//for (var c = 1; c < 13; c++) s += '<option value="' + (0xffbd + c) + '">F' + c +;
|
//for (var c = 1; c < 13; c++) s += '<option value="' + (0xffbd + c) + '">F' + c +;
|
||||||
//QH('specialkeylist', s);
|
//QH('specialkeylist', s);
|
||||||
// ###END###{Desktop}
|
// ###END###{Desktop}
|
||||||
|
|
||||||
// ###BEGIN###{Terminal}
|
// ###BEGIN###{Terminal}
|
||||||
// Setup the terminal
|
// Setup the terminal
|
||||||
terminal = CreateAmtRedirect(CreateAmtRemoteTerminal('Term'));
|
terminal = CreateAmtRedirect(CreateAmtRemoteTerminal('Term'));
|
||||||
terminal.onStateChanged = onTerminalStateChange;
|
terminal.onStateChanged = onTerminalStateChange;
|
||||||
@@ -1870,41 +1883,41 @@
|
|||||||
Q('p13').addEventListener('dragover', haltEvent, false);
|
Q('p13').addEventListener('dragover', haltEvent, false);
|
||||||
Q('p13').addEventListener('dragleave', haltEvent, false);
|
Q('p13').addEventListener('dragleave', haltEvent, false);
|
||||||
Q('p13').addEventListener('drop', terminal_FileSelectHandler, false);
|
Q('p13').addEventListener('drop', terminal_FileSelectHandler, false);
|
||||||
// ###END###{Terminal}
|
// ###END###{Terminal}
|
||||||
|
|
||||||
// Main drag & drop
|
// Main drag & drop
|
||||||
document.addEventListener('dragover', haltEvent, false);
|
document.addEventListener('dragover', haltEvent, false);
|
||||||
document.addEventListener('dragleave', haltEvent, false);
|
document.addEventListener('dragleave', haltEvent, false);
|
||||||
document.addEventListener('drop', documentFileSelectHandler, false);
|
document.addEventListener('drop', documentFileSelectHandler, false);
|
||||||
|
|
||||||
// ###BEGIN###{Certificates}
|
// ###BEGIN###{Certificates}
|
||||||
// Setup Terminal drag & drop
|
// Setup Terminal drag & drop
|
||||||
Q('p16').addEventListener('dragover', haltEvent, false);
|
Q('p16').addEventListener('dragover', haltEvent, false);
|
||||||
Q('p16').addEventListener('dragleave', haltEvent, false);
|
Q('p16').addEventListener('dragleave', haltEvent, false);
|
||||||
Q('p16').addEventListener('drop', cert_FileSelectHandler, false);
|
Q('p16').addEventListener('drop', cert_FileSelectHandler, false);
|
||||||
// ###END###{Certificates}
|
// ###END###{Certificates}
|
||||||
|
|
||||||
// ###BEGIN###{CertificateManager}
|
// ###BEGIN###{CertificateManager}
|
||||||
// Setup Certificate Manager drag & drop
|
// Setup Certificate Manager drag & drop
|
||||||
Q('id_certManagerPanel').addEventListener('dragover', haltEvent, false);
|
Q('id_certManagerPanel').addEventListener('dragover', haltEvent, false);
|
||||||
Q('id_certManagerPanel').addEventListener('dragleave', haltEvent, false);
|
Q('id_certManagerPanel').addEventListener('dragleave', haltEvent, false);
|
||||||
Q('id_certManagerPanel').addEventListener('drop', cert_importCertOk2, false);
|
Q('id_certManagerPanel').addEventListener('drop', cert_importCertOk2, false);
|
||||||
// ###END###{CertificateManager}
|
// ###END###{CertificateManager}
|
||||||
|
|
||||||
// ###BEGIN###{CertificateManager}
|
// ###BEGIN###{CertificateManager}
|
||||||
cert_loadCertificates();
|
cert_loadCertificates();
|
||||||
cert_updateCertificateList();
|
cert_updateCertificateList();
|
||||||
// ###END###{CertificateManager}
|
// ###END###{CertificateManager}
|
||||||
|
|
||||||
// ###BEGIN###{FileSaver}
|
// ###BEGIN###{FileSaver}
|
||||||
// ###BEGIN###{Desktop}
|
// ###BEGIN###{Desktop}
|
||||||
// ###BEGIN###{!Mode-NodeWebkit}
|
// ###BEGIN###{!Mode-NodeWebkit}
|
||||||
if (!Q('Desk')['toBlob']) { QV('idx_deskSaveBtn', false); }// On some browsers like IE, we can't save screen shots. Hide the sceeenshot/capture buttons.
|
if (!Q('Desk')['toBlob']) { QV('idx_deskSaveBtn', false); }// On some browsers like IE, we can't save screen shots. Hide the sceeenshot/capture buttons.
|
||||||
// ###END###{!Mode-NodeWebkit}
|
// ###END###{!Mode-NodeWebkit}
|
||||||
// ###END###{Desktop}
|
// ###END###{Desktop}
|
||||||
// ###END###{FileSaver}
|
// ###END###{FileSaver}
|
||||||
|
|
||||||
// ###BEGIN###{ComputerSelector}
|
// ###BEGIN###{ComputerSelector}
|
||||||
|
|
||||||
if (!urlvars['host']) { go(101); }
|
if (!urlvars['host']) { go(101); }
|
||||||
QH('id_computername', format("Remote Management Console v{0}", version));
|
QH('id_computername', format("Remote Management Console v{0}", version));
|
||||||
@@ -1944,9 +1957,9 @@
|
|||||||
updateComputerList();
|
updateComputerList();
|
||||||
// ###END###{ComputerSelector-Local-ScriptOnly}
|
// ###END###{ComputerSelector-Local-ScriptOnly}
|
||||||
}
|
}
|
||||||
// ###BEGIN###{!Mode-NodeWebkit}
|
// ###BEGIN###{!Mode-NodeWebkit}
|
||||||
else if (urlvars['connect']) { loadServerComputer(); }
|
else if (urlvars['connect']) { loadServerComputer(); }
|
||||||
// ###END###{!Mode-NodeWebkit}
|
// ###END###{!Mode-NodeWebkit}
|
||||||
else {
|
else {
|
||||||
// ###BEGIN###{Mode-NodeWebkit}
|
// ###BEGIN###{Mode-NodeWebkit}
|
||||||
if (urlvars['list']) {
|
if (urlvars['list']) {
|
||||||
@@ -1995,10 +2008,10 @@
|
|||||||
}
|
}
|
||||||
// ###END###{Mode-NodeWebkit}
|
// ###END###{Mode-NodeWebkit}
|
||||||
// ###BEGIN###{!Mode-NodeWebkit}
|
// ###BEGIN###{!Mode-NodeWebkit}
|
||||||
// Setup the computer selector
|
// Setup the computer selector
|
||||||
loadComputers();
|
loadComputers();
|
||||||
// ###END###{!Mode-NodeWebkit}
|
// ###END###{!Mode-NodeWebkit}
|
||||||
}
|
}
|
||||||
// ###END###{ComputerSelector-Local}
|
// ###END###{ComputerSelector-Local}
|
||||||
|
|
||||||
// ###BEGIN###{ComputerSelector-Remote}
|
// ###BEGIN###{ComputerSelector-Remote}
|
||||||
@@ -2006,20 +2019,20 @@
|
|||||||
loadServerComputerList();
|
loadServerComputerList();
|
||||||
// ###END###{ComputerSelector-Remote}
|
// ###END###{ComputerSelector-Remote}
|
||||||
|
|
||||||
// ###END###{ComputerSelector}
|
// ###END###{ComputerSelector}
|
||||||
|
|
||||||
// ###BEGIN###{Mode-Firmware}
|
// ###BEGIN###{Mode-Firmware}
|
||||||
connect('/wsman');
|
connect('/wsman');
|
||||||
// ###END###{Mode-Firmware}
|
// ###END###{Mode-Firmware}
|
||||||
|
|
||||||
// ###BEGIN###{USBSetup}
|
// ###BEGIN###{USBSetup}
|
||||||
usb_displaySetupBin();
|
usb_displaySetupBin();
|
||||||
|
|
||||||
// Add all possible variable types to dialog 16
|
// Add all possible variable types to dialog 16
|
||||||
var options = '';
|
var options = '';
|
||||||
for (var i in AmtSetupBinVarIds) { for (var j in AmtSetupBinVarIds[i]) { options += '<option value="' + i + '-' + j + '">' + AmtSetupBinVarIds[i][j][1] } }
|
for (var i in AmtSetupBinVarIds) { for (var j in AmtSetupBinVarIds[i]) { options += '<option value="' + i + '-' + j + '">' + AmtSetupBinVarIds[i][j][1] } }
|
||||||
QH('d16type', options);
|
QH('d16type', options);
|
||||||
// ###END###{USBSetup}
|
// ###END###{USBSetup}
|
||||||
|
|
||||||
document.onkeyup = handleKeyUp;
|
document.onkeyup = handleKeyUp;
|
||||||
document.onkeydown = handleKeyDown;
|
document.onkeydown = handleKeyDown;
|
||||||
@@ -2053,6 +2066,24 @@
|
|||||||
Q('p24filetable').addEventListener('dragover', p24fileDragOver, false);
|
Q('p24filetable').addEventListener('dragover', p24fileDragOver, false);
|
||||||
Q('p24filetable').addEventListener('dragleave', p24fileDragLeave, false);
|
Q('p24filetable').addEventListener('dragleave', p24fileDragLeave, false);
|
||||||
// ###END###{DesktopInbandFiles}
|
// ###END###{DesktopInbandFiles}
|
||||||
|
|
||||||
|
// ###BEGIN###{PowerControl-Advanced}
|
||||||
|
// ###BEGIN###{PowerControl-OneClick}
|
||||||
|
// Create a web server to serve One Client Recovery (OCR) disk image files.
|
||||||
|
webserver = CreateWebServer();
|
||||||
|
webserver.generateCertificate();
|
||||||
|
webserver.start(function () { webserver.setupBootImage('C:\\temp\\ubuntu-18.04-desktop-amd64.iso', '127.0.0.1'); });
|
||||||
|
webserver.onTransfers = function (webserver, transfers) {
|
||||||
|
var x = '';
|
||||||
|
for (var i in transfers) { x += '<div style="width:350px;position:relative;padding:3px"><span style="position:absolute;padding:3px;font-weight:bold">' + transfers[i].xfilename + '</span><div style="height:20px;background-color:#4CAF50;width:' + Math.floor((transfers[i].progress.count * 100) / transfers[i].xsize) + '%;border-radius:4px"></div></div>'; }
|
||||||
|
QV('TransferNotification', transfers.length > 0);
|
||||||
|
QH('TransferNotification', x);
|
||||||
|
}
|
||||||
|
|
||||||
|
//console.log('WebServer Cert Hash RAW', webserver.certHashRaw);
|
||||||
|
//console.log('WebServer Cert Hash HEX', webserver.certHashHex);
|
||||||
|
// ###END###{PowerControl-OneClick}
|
||||||
|
// ###END###{PowerControl-Advanced}
|
||||||
}
|
}
|
||||||
|
|
||||||
function documentFileSelectHandler(e) {
|
function documentFileSelectHandler(e) {
|
||||||
|
|||||||
149
webserver-0.0.1.js
Normal file
149
webserver-0.0.1.js
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
/**
|
||||||
|
* @description One Client Recovery (OCR) web server
|
||||||
|
* @author Ylian Saint-Hilaire
|
||||||
|
* @version v0.0.1
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Construct tiny web server
|
||||||
|
var CreateWebServer = function () {
|
||||||
|
const fs = require('fs');
|
||||||
|
const net = require('net');
|
||||||
|
const tls = require('tls');
|
||||||
|
const path = require("path");
|
||||||
|
var obj = {};
|
||||||
|
var server = null;
|
||||||
|
obj.port = random(1, 65535); // Port used to listen for incoming requests.
|
||||||
|
obj.state = 0; // State of the web server, 0 = Disabled, 2 = Listening.
|
||||||
|
obj.cert = null; // TLS certificate in PEM format.
|
||||||
|
obj.key = null; // TLS certificate private key in PEM format.
|
||||||
|
obj.certHashRaw = null; // SHA384 hash of TLS certificate.
|
||||||
|
obj.certHashHex = null; // SHA384 hash of TLS certificate in HEX.
|
||||||
|
obj.responses = {}; // Table responses to different url paths.
|
||||||
|
obj.transfers = []; // List of currently active file transfers.
|
||||||
|
obj.transfersTimer = null; // When file transfers are active, this is a half second timer.
|
||||||
|
obj.onTransfers = null; // Callback for transfers status.
|
||||||
|
|
||||||
|
// Return a random number between min and max
|
||||||
|
function random(min, max) { return Math.floor(min + Math.random() * (max - min)); }
|
||||||
|
|
||||||
|
// Start the web server
|
||||||
|
obj.start = function (func) {
|
||||||
|
if (server != null) return;
|
||||||
|
obj.state = 1;
|
||||||
|
if ((obj.cert != null) && (obj.key != null)) { server = tls.createServer({ cert: obj.cert, key: obj.key, minVersion: 'TLSv1' }, onConnection); } else { server = net.createServer(onConnection); }
|
||||||
|
server.on('error', function (err) { if (err.code == 'EADDRINUSE') { obj.port = random(1, 65535); server = null; obj.start(func); } else { console.log('WebServer Listen Error', err.code); } });
|
||||||
|
server.listen({ port: obj.port }, function (x) { obj.state = 2; console.log('WebServer listening on ' + obj.port); if (func != null) { func(); } });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called when a new incoming connection is made
|
||||||
|
function onConnection(socket) {
|
||||||
|
if (socket.remoteAddress.startsWith('::ffff:')) { socket.xremoteAddress = socket.remoteAddress.substring(7); } else { socket.xremoteAddress = socket.remoteAddress; }
|
||||||
|
console.log('WebServer, socket connection from ' + socket.xremoteAddress + ':' + socket.remotePort);
|
||||||
|
socket.xdata = ''; // Accumulator
|
||||||
|
socket.on('data', function (data) {
|
||||||
|
this.xdata += data.toString('utf8');
|
||||||
|
console.log('WebServer, socket received data', this.xdata);
|
||||||
|
var headersize = this.xdata.indexOf('\r\n\r\n');
|
||||||
|
if (headersize < 0) { if (this.xdata.length > 4096) { this.close(); } return; }
|
||||||
|
var headers = this.xdata.substring(0, headersize).split('\r\n');
|
||||||
|
if (headers.length < 1) { this.close(); return; }
|
||||||
|
var directives = headers[0].split(' ');
|
||||||
|
if ((directives.length != 3) || (directives[0] != 'GET')) { this.end(); return; }
|
||||||
|
console.log('WebServer, request', directives[0], directives[1]);
|
||||||
|
var responseCode = 404, responseType = 'text/html', responseData = 'Invalid request', r = obj.responses[directives[1]];
|
||||||
|
if (r != null) {
|
||||||
|
if (typeof r == 'string') {
|
||||||
|
responseCode = 200; responseData = obj.responses[directives[1]];
|
||||||
|
} else if (typeof r == 'object') {
|
||||||
|
responseCode = 200;
|
||||||
|
if (r.type) { responseType = r.type; }
|
||||||
|
if (r.data) { responseData = r.data; }
|
||||||
|
if (r.shortfile) { try { responseData = fs.readFileSync(r.shortfile); } catch (ex) { responseCode = 404; responseType = 'text/html'; responseData = 'File not found'; } }
|
||||||
|
if (r.file) {
|
||||||
|
// Send the file header and pipe the rest of the file
|
||||||
|
socket.xfilepath = r.file;
|
||||||
|
socket.xfilename = path.basename(r.file);
|
||||||
|
socket.xsize = fs.statSync(r.file).size;
|
||||||
|
socket.write('HTTP/1.1 200 OK\r\nContent-Type: application/octet-stream\r\nContent-Length: ' + socket.xsize + '\r\nConnection: close\r\n\r\n');
|
||||||
|
var writable = require('stream').Writable;
|
||||||
|
socket.progress = new writable({ write: function (chunk, encoding, flush) { this.count += chunk.length; flush(); } });
|
||||||
|
socket.progress.count = 0;
|
||||||
|
var ws = fs.createReadStream(r.file, { flags: 'r' });
|
||||||
|
ws.pipe(socket.progress); ws.pipe(socket);
|
||||||
|
obj.transfers.push(socket);
|
||||||
|
|
||||||
|
// Start the progress bar timer
|
||||||
|
if (obj.onTransfers != null) { obj.onTransfers(obj, obj.transfers); if (obj.transfersTimer == null) { obj.transfersTimer = setInterval(function () { obj.onTransfers(obj, obj.transfers); }, 500); } }
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
socket.write('HTTP/1.1 ' + responseCode + ' OK\r\nContent-Type: ' + responseType + '\r\nContent-Length: ' + responseData.length + '\r\nConnection: close\r\n\r\n');
|
||||||
|
socket.write(responseData);
|
||||||
|
});
|
||||||
|
socket.on('end', function () { cleanupSocket(this); console.log('WebServer, socket closed'); });
|
||||||
|
socket.on('error', function (err) { cleanupSocket(this); console.log('WebServer, socket error', err); });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the socket from the transfer list and clear the timer if needed
|
||||||
|
function cleanupSocket(socket) {
|
||||||
|
var i = obj.transfers.indexOf(socket);
|
||||||
|
if (i >= 0) {
|
||||||
|
obj.transfers.splice(i, 1);
|
||||||
|
obj.onTransfers(obj, obj.transfers);
|
||||||
|
if (obj.transfers.length == 0) { clearInterval(obj.transfersTimer); obj.transfersTimer = null; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop the web server
|
||||||
|
obj.stop = function () { if (server == null) return; server.close(); server = null; }
|
||||||
|
|
||||||
|
// Generate a TLS certificate (this is really a root cert)
|
||||||
|
obj.generateCertificate = function() {
|
||||||
|
// Generate a keypair and create an X.509v3 certificate
|
||||||
|
var keys = forge.pki.rsa.generateKeyPair(1024);
|
||||||
|
var cert = forge.pki.createCertificate();
|
||||||
|
cert.publicKey = keys.publicKey;
|
||||||
|
cert.serialNumber = '' + Math.floor((Math.random() * 100000) + 1);
|
||||||
|
cert.validity.notBefore = new Date(2018, 0, 1);
|
||||||
|
cert.validity.notAfter = new Date(2049, 11, 31);
|
||||||
|
var attrs = [ { name: 'commonName', value: 'MeshCommander' }, { name: 'countryName', value: 'Unknown' }, { shortName: 'ST', value: 'Unknown' }, { name: 'organizationName', value: 'Unknown' } ];
|
||||||
|
cert.setSubject(attrs);
|
||||||
|
cert.setIssuer(attrs);
|
||||||
|
cert.setExtensions([{ name: 'basicConstraints', cA: true }, { name: 'nsCertType', sslCA: true, emailCA: true, objCA: true }, { name: 'subjectKeyIdentifier' }]); // Root extensions
|
||||||
|
cert.sign(keys.privateKey, forge.md.sha256.create());
|
||||||
|
obj.cert = forge.pki.certificateToPem(cert);
|
||||||
|
obj.key = forge.pki.privateKeyToPem(keys.privateKey);
|
||||||
|
|
||||||
|
// Compute the SHA384 hash of the certificate
|
||||||
|
var md = forge.md.sha384.create();
|
||||||
|
md.start(); md.update(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).getBytes());
|
||||||
|
var digest = md.digest();
|
||||||
|
obj.certHashRaw = digest.data;
|
||||||
|
obj.certHashHex = digest.toHex();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns a UEFI boot parameter in binary
|
||||||
|
function makeUefiBootParam(type, data, len) {
|
||||||
|
if (typeof data == 'number') { if (len == 1) { data = String.fromCharCode(data & 0xFF); } if (len == 2) { data = ShortToStrX(data); } if (len == 4) { data = IntToStrX(data); } }
|
||||||
|
return ShortToStrX(0x8086) + ShortToStrX(type) + IntToStrX(data.length) + data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup UEFI boot image
|
||||||
|
obj.setupBootImage = function(filePath, ip) {
|
||||||
|
if (fs.existsSync(filePath) == false) return null;
|
||||||
|
var name = ('' + Math.random()).substring(2);
|
||||||
|
obj.responses['/' + name] = { type: 'application/octet-stream', file: filePath };
|
||||||
|
console.log('https://' + ip + ':' + obj.port + '/' + name);
|
||||||
|
return {
|
||||||
|
args: btoa(
|
||||||
|
makeUefiBootParam(1, 'http' + ((obj.cert != null)?'s':'') + '://' + ip + ':' + obj.port + '/' + name) + // OCR_EFI_NETWORK_DEVICE_PATH
|
||||||
|
makeUefiBootParam(20, 0, 1) + // OCR_HTTPS_CERT_SYNC_ROOT_CA
|
||||||
|
makeUefiBootParam(23, obj.certHashRaw) + // OCR_HTTPS_SERVER_CERT_HASH_SHA384
|
||||||
|
makeUefiBootParam(30, 60, 2)), // OCR_HTTPS_REQUEST_TIMEOUT (60 seconds)
|
||||||
|
argscount: 4
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user