From 2d85c9878f8a16777baac6ef588494fa3da299f6 Mon Sep 17 00:00:00 2001
From: openbuilds-engineer
Date: Wed, 11 Jul 2018 11:02:41 +0200
Subject: [PATCH] SSL Implementation
---
.gitignore | 1 +
index.js | 180 ++++++++++++++++++++++++++++------------------
ssl/localhost.cer | 36 ++++++++++
ssl/localhost.key | 27 +++++++
4 files changed, 173 insertions(+), 71 deletions(-)
create mode 100644 ssl/localhost.cer
create mode 100644 ssl/localhost.key
diff --git a/.gitignore b/.gitignore
index 8c08aea..6d6441a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
#electron dist
dist
upload
+ssl
# Compiled source #
###################
diff --git a/index.js b/index.js
index 851f572..b82f496 100644
--- a/index.js
+++ b/index.js
@@ -1,12 +1,48 @@
console.log("Starting OpenBuilds Machine Driver v" + require('./package').version)
+var config = {};
+config.webPort = process.env.WEB_PORT || 3000;
+config.posDecimals = process.env.DRO_DECIMALS || 2;
+config.grblWaitTime = 1;
+config.firmwareWaitTime = 4;
+
+var express = require("express");
+var app = express();
+var http = require("http").Server(app);
+var https = require('https');
+
+// var io = require("socket.io")(https);
+
+var ioServer = require('socket.io');
+var io = new ioServer();
+// var oneIo = io.listen(https);
+// var anotherIo = io.listen(https);
+
+var fs = require('fs');
+var httpsOptions = {
+ key: fs.readFileSync('ssl/localhost.key'),
+ cert: fs.readFileSync('ssl/localhost.cer')
+};
+
+const httpsserver = https.createServer(httpsOptions, app).listen(3001, function() {
+ console.log('https: listening on:' + ip.address() + ":3001");
+});
+
+
+const httpserver = http.listen(config.webPort, '0.0.0.0', function() {
+ console.log('http: listening on:' + ip.address() + ":" + config.webPort);
+ // Now refresh library
+ refreshGcodeLibrary();
+});
+
+io.attach(httpserver);
+io.attach(httpsserver);
+
+
+
const grblStrings = require("./grblStrings.js");
var path = require("path");
const join = require('path').join;
-var express = require("express");
-var app = express();
-var http = require("http").Server(app);
-var io = require("socket.io")(http);
const serialport = require('serialport');
var SerialPort = serialport;
var md5 = require('md5');
@@ -26,7 +62,32 @@ var colors = {
var width = 250;
var height = 200;
-var uploadsDir = __dirname + '/upload';
+// Electron app
+const electron = require('electron');
+// Module to control application life.
+const electronApp = electron.app;
+
+console.log("Local User Data: " + electronApp.getPath('userData'))
+
+const BrowserWindow = electron.BrowserWindow;
+const Tray = electron.Tray;
+const nativeImage = require('electron').nativeImage
+const Menu = require('electron').Menu
+// Keep a global reference of the window object, if you don't, the window will
+// be closed automatically when the JavaScript object is garbage collected.
+var appIcon = null,
+ jogWindow = null,
+ mainWindow = null
+
+var uploadsDir = electronApp.getPath('userData') + '/upload/';
+
+fs.existsSync(uploadsDir) || fs.mkdirSync(uploadsDir)
+// fs.mkdir(uploadsDir, err => {
+// if (err && err.code != 'EEXIST') throw 'up'
+// // already exists
+// })
+
+
var oldportslist;
const iconPath = path.join(__dirname, 'app/icon.png');
@@ -38,15 +99,6 @@ const iconAlarm = path.join(__dirname, 'app/icon-bell.png');
var iosocket;
-
-var config = {};
-config.webPort = process.env.WEB_PORT || 3000;
-config.serverVersion = "0.0.1";
-config.apiVersion = "0.0.1";
-config.posDecimals = process.env.DRO_DECIMALS || 2;
-config.grblWaitTime = 1;
-config.firmwareWaitTime = 4;
-
var isAlarmed = false;
var lastmd5sum = '00000000000000000000000000000000'
var lastGcode = []
@@ -269,27 +321,25 @@ var status = {
}
};
-// if (!fs.existsSync(uploadsDir)) {
-// fs.mkdirSync(uploadsDir);
-// }
-
function refreshGcodeLibrary() {
- const dirTree = require('directory-tree');
+ if (fs.existsSync(uploadsDir)) {
+ const dirTree = require('directory-tree');
- var tree = dirTree('./upload', {
- extensions: /\.gcode|\.nc|\.tap|\.cnc|\.gc|\.g-code$/
- }, (item, PATH) => {
- // if a gcode is found, then
- // console.log(item);
- ConvertGCODEtoPNG(item.path, item.path + ".png")
- });
- // console.log("---------------")
- var tree = dirTree('./upload', {
- extensions: /\.gcode|\.png/
- });
- var treeData = JSON.stringify(tree, null, 2)
- // console.log(treeData);
- fs.writeFileSync(join(__dirname, 'upload/data.json'), treeData, 'utf-8')
+ var tree = dirTree(uploadsDir, {
+ extensions: /\.gcode|\.nc|\.tap|\.cnc|\.gc|\.g-code$/
+ }, (item, PATH) => {
+ // if a gcode is found, then
+ // console.log(item);
+ ConvertGCODEtoPNG(item.path, item.path + ".png")
+ });
+ // console.log("---------------")
+ var tree = dirTree(uploadsDir, {
+ extensions: /\.gcode|\.png/
+ });
+ var treeData = JSON.stringify(tree, null, 2)
+ // console.log(treeData);
+ fs.writeFileSync(join(uploadsDir + '/data.json'), treeData, 'utf-8')
+ }
}
function ConvertGCODEtoPNG(file, out) {
@@ -401,12 +451,12 @@ app.post('/upload', function(req, res) {
// }));
});
- // form.on('fileBegin', function(name, file) {
- // // Emitted whenever a new file is detected in the upload stream. Use this event if you want to stream the file to somewhere else while buffering the upload on the file system.
- // console.log('Uploading ' + file.name);
- // file.path = __dirname + '/upload/' + file.name;
- // // io.sockets.in('sessionId').emit('startupload', 'STARTING');
- // });
+ form.on('fileBegin', function(name, file) {
+ // Emitted whenever a new file is detected in the upload stream. Use this event if you want to stream the file to somewhere else while buffering the upload on the file system.
+ console.log('Uploading ' + file.name);
+ file.path = uploadsDir + file.name;
+ // io.sockets.in('sessionId').emit('startupload', 'STARTING');
+ });
form.on('progress', function(bytesReceived, bytesExpected) {
uploadprogress = parseInt(((bytesReceived * 100) / bytesExpected).toFixed(0));
@@ -421,7 +471,7 @@ app.post('/upload', function(req, res) {
console.log('Uploaded ' + file.path);
// io.sockets.in('sessionId').emit('doneupload', 'COMPLETE');
- // refreshGcodeLibrary();
+ refreshGcodeLibrary();
if (jogWindow === null) {
createJogWindow();
@@ -437,20 +487,31 @@ app.post('/upload', function(req, res) {
jogWindow.setAlwaysOnTop(false);
}
setTimeout(function() {
+
fs.readFile(file.path, 'utf8',
function(err, data) {
if (err) {
console.log(err);
- process.exit(1);
+ io.sockets.emit('data', "ERROR: File Upload Failed");
+ appIcon.displayBalloon({
+ icon: nativeImage.createFromPath(iconPath),
+ title: "ERROR: File Upload Failed",
+ content: "OpenBuilds Machine Driver ERROR: File Upload Failed"
+ })
+ // process.exit(1);
}
// console.log(data)
- io.sockets.emit('gcodeupload', data);
+ if (data) {
+ io.sockets.emit('gcodeupload', data);
+ appIcon.displayBalloon({
+ icon: nativeImage.createFromPath(iconPath),
+ title: "GCODE Received",
+ content: "OpenBuilds Machine Driver received new GCODE"
+ })
+ }
});
- appIcon.displayBalloon({
- icon: nativeImage.createFromPath(iconPath),
- title: "GCODE Received",
- content: "OpenBuilds Machine Driver received new GCODE"
- })
+
+
}, 1500);
// console.log("Done, now lets work with " + file.path)
});
@@ -1531,14 +1592,6 @@ io.on("connection", function(socket) {
});
-
-
-http.listen(config.webPort, '0.0.0.0', function() {
- console.log('listening on:' + ip.address() + ":" + config.webPort);
- // Now refresh library
- // refreshGcodeLibrary();
-});
-
function machineSend(gcode) {
// console.log("SENDING: " + gcode)
if (port.isOpen) {
@@ -1994,21 +2047,6 @@ function isElectron() {
return false;
}
-
-// Electron app
-const electron = require('electron');
-// Module to control application life.
-const electronApp = electron.app;
-const BrowserWindow = electron.BrowserWindow;
-const Tray = electron.Tray;
-const nativeImage = require('electron').nativeImage
-const Menu = require('electron').Menu
-// Keep a global reference of the window object, if you don't, the window will
-// be closed automatically when the JavaScript object is garbage collected.
-var appIcon = null,
- jogWindow = null,
- mainWindow = null
-
const shouldQuit = electronApp.makeSingleInstance((commandLine, workingDirectory) => {
// Someone tried to run a second instance, we should focus our window.
if (jogWindow === null) {
@@ -2228,5 +2266,5 @@ if (electronApp) {
}
process.on('uncaughtException', function(error) {
- console.log("Uncaught Error " + error)
+ // console.log("Uncaught Error " + error)
});
\ No newline at end of file
diff --git a/ssl/localhost.cer b/ssl/localhost.cer
new file mode 100644
index 0000000..0d85f6a
--- /dev/null
+++ b/ssl/localhost.cer
@@ -0,0 +1,36 @@
+-----BEGIN CERTIFICATE-----
+MIIGUjCCBTqgAwIBAgIQClWtvwS1NxkRScvn5oVB9jANBgkqhkiG9w0BAQsFADBe
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMR0wGwYDVQQDExRSYXBpZFNTTCBSU0EgQ0EgMjAxODAe
+Fw0xODAzMDUwMDAwMDBaFw0yMDAxMDMxMjAwMDBaMCMxITAfBgNVBAMTGGludmVu
+dGFibGVzbG9jYWxob3N0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAJ6fHhN1etEIA/S7rbE1n46KjdL+Ne3ofe0q0pK4IYCXA44v44yDqsqmAtkh
+hn6XND9DjJGkLEEXI/LbgSGHIHSBD9yxFMfVqPh0/Zv60xxPbn0nFrV69//WFbnF
+KhVFhkkyggglRl6EvpcUVP8pkwc6N3xfmhTfJ3ktsnVJ7JAYLYtAbik89dmVKyRP
+3/uZHRF5A1ftzSuCXreqkWcc3lyiv7QJ1loYs8ryKAmJ50kO4J8c0QZaVrmmchZt
+APRKjXgPR1UpKD2tSWYki5M9mBuXW/IDpI+2cMIyJ8BR6rPYEfLjVsskhrhsp0WD
+isyrVSsD4K/PiuAMYDIraoqpFYMCAwEAAaOCA0UwggNBMB8GA1UdIwQYMBaAFFPK
+F1n8a8ADIS8aruSqqByCVtp1MB0GA1UdDgQWBBSJEd9qPEk/942YZNLmle4lfaTC
+mzBBBgNVHREEOjA4ghhpbnZlbnRhYmxlc2xvY2FsaG9zdC5jb22CHHd3dy5pbnZl
+bnRhYmxlc2xvY2FsaG9zdC5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQG
+CCsGAQUFBwMBBggrBgEFBQcDAjA+BgNVHR8ENzA1MDOgMaAvhi1odHRwOi8vY2Rw
+LnJhcGlkc3NsLmNvbS9SYXBpZFNTTFJTQUNBMjAxOC5jcmwwTAYDVR0gBEUwQzA3
+BglghkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQu
+Y29tL0NQUzAIBgZngQwBAgEwdQYIKwYBBQUHAQEEaTBnMCYGCCsGAQUFBzABhhpo
+dHRwOi8vc3RhdHVzLnJhcGlkc3NsLmNvbTA9BggrBgEFBQcwAoYxaHR0cDovL2Nh
+Y2VydHMucmFwaWRzc2wuY29tL1JhcGlkU1NMUlNBQ0EyMDE4LmNydDAJBgNVHRME
+AjAAMIIBewYKKwYBBAHWeQIEAgSCAWsEggFnAWUAdQCkuQmQtBhYFIe7E6LMZ3AK
+PDWYBPkb37jjd80OyA3cEAAAAWH22uXJAAAEAwBGMEQCIGOH6O/3iLvzcvQ3d62L
++8kLUiFyVBZ/c2E8+RpIO0g7AiA7lJjGysLIsuuzDKQEocTnxw4NSIr+PwVxNYXa
+vE8puwB1AId1v+dZfPiMQ5lfvfNu/1aNR1Y2/0q1YMG06v9eoIMPAAABYfba5qQA
+AAQDAEYwRAIgdunaZF21wBG6N05WSs45UWSzH3Rxz+GqJ4/6ALgGfM0CIBhGqfah
+4cimOZdrNRvn22MoOk4AZcUA2mVMrO2o6ZP6AHUAu9nfvB+KcbWTlCOXqpJ7RzhX
+lQqrUugakJZkNo4e0YUAAAFh9trmjwAABAMARjBEAiA7XN5My2jvCYsT1/TQH8lI
+5r6bPjiJiQvuun5RVtW8lgIgNmo5I4GWcU5WWmGAfYjJx7hPFQqBiwJVqprAh2zl
+ktwwDQYJKoZIhvcNAQELBQADggEBAFaGMqhgUJYFxA6MgJUWJkt34bx+RMBuOF0W
+WPgCckJ82JmMjZihRAXOV5wWVqrhnEU0XLk8gdZvO56wK3p/DBOYtz1sDdhmm9Hg
+rX2Po6EqaclZtybXO5g8B3L4XK7yjnwlVOUb+zDDLppkTZrtFK616oSJOmQ5mZkL
+pGf0H6w+XRw40mAHPCHoIbOlyUztvQesI3Q973YbsnSWAmdE9TXvyoDr2z+r4v4q
+dQHPXxRFtTsV78a0FMqFAIZHzpT+e0/EoXUtMkdsKnrrpCu/yd0M50onKKwmqOUp
+xT2KXS/PxJtiG5x3eN7dJ3OlRb3MeZ+c8d+gMadr3101ve98fGI=
+-----END CERTIFICATE-----
diff --git a/ssl/localhost.key b/ssl/localhost.key
new file mode 100644
index 0000000..12f897f
--- /dev/null
+++ b/ssl/localhost.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAnp8eE3V60QgD9LutsTWfjoqN0v417eh97SrSkrghgJcDji/j
+jIOqyqYC2SGGfpc0P0OMkaQsQRcj8tuBIYcgdIEP3LEUx9Wo+HT9m/rTHE9ufScW
+tXr3/9YVucUqFUWGSTKCCCVGXoS+lxRU/ymTBzo3fF+aFN8neS2ydUnskBgti0Bu
+KTz12ZUrJE/f+5kdEXkDV+3NK4Jet6qRZxzeXKK/tAnWWhizyvIoCYnnSQ7gnxzR
+BlpWuaZyFm0A9EqNeA9HVSkoPa1JZiSLkz2YG5db8gOkj7ZwwjInwFHqs9gR8uNW
+yySGuGynRYOKzKtVKwPgr8+K4AxgMitqiqkVgwIDAQABAoIBAB24wvHyeWjhj5wz
+7n/eBF+5Jon6iDBj9/SQqZREXEK0CT6DSqfxo/cE1FPLLGBcBLY1+gjwMjqgE2RW
+LQQTRcmOxWIc7D/lkRu9EChB/3y2hYV95Ytr1zxg6QE+KHyD4n2ksSjFk0HyraOx
+c5u8NoiMKAluAHkYt1TFc0L27xSwp5DH+xJ9aUkFnZbJMJmSqRt75gVv5581yi3c
+LUHrSK5hPJ1xZZ+K0lKSX3GOr/P3I9XUXvesBv5Hw0SdwwObPHk2IYM4/vfQwTOS
+TlEoUUKrZAdEbwiZKXbH07nIetqgJerCDkbLqGDp12T0ylEcrSCbTfPHqYqyeWr4
+PCw6QgECgYEAzOYub1IGBogH+TbCIdfLylC1WkQgQEZsJMF32qmtuNf/7XdHGXng
+OZa+Xy6YHzAcdpwbl/DObE9BA+zZpqDLSLtho9NQAQ2/vTAOnhukEFbVIGlhTphh
+KlVaKLBcNz7gtHGtWbQl/Vnx3Sbt6qU4B2TRH8c+eNZdmt8adOACk+MCgYEAxi5V
+9Z3VdZr0n+houz9AglKWmYoW/idZvc4KH1kGMNL6+6AIjX37ELCEy5vGjivPuqCa
+Y7HApP0vMjLkvzJYaIBAWBi6QQU9PrzEVcvZhYnKQ9Er9fcpiXhTBjM6e4W/e/bJ
+uty/2Kil+lezflerYIJ6fzfVq8FiorBCV83faeECgYEAmezdu1ECJ8vvOX+ybRwh
+AxaIdowxMjf1K9OPR1wqnm7d2zW82t2c3YZp8zUcoGlTKKNzczw6xlDvhZRbmXq3
+3CawXhLzyibbALPmd05KfN/Oce/YYuPEMro15dU/IV2CDuxLDtVvqJj2Qm3pU1nU
+8nEBTP8v5jUb0qmBxYU3SoMCgYB7A7gHxfkCDzVZLQIVeKWqP2mL1NOA3xwtXP+b
+hb75/3wbRLMKYPC+41MKr58IENnYlmg/Cc7ymtX46u5iX/XQqAtIo9C5G29wyet0
+9hwHcAhFIEmRW+JEmpOufY4HrnW1lPKTMwNCkSy1wEqCWhjexx8SaK4Q9vEq2w3T
+Qs8zAQKBgGXKx4Y1KoM+smq3akYMu9mZqnlgN9HMTBTJyX9Oyj4PWpWq8VJS4J/L
+aDKCIhVO7QAyVlh6u094wfTeWkrvG2/f4k+39TVFlMGy89UQPzRhFSuwe8qzwdN5
+NEUYYopETCDoIU11aqu4iFIS3bashPjjAc8O37t1hoy+4YElE2Gf
+-----END RSA PRIVATE KEY-----