diff --git a/.gitignore b/.gitignore index cf76764..e1ab06c 100644 --- a/.gitignore +++ b/.gitignore @@ -75,6 +75,9 @@ typings/ # FuseBox cache .fusebox/ +# Forever +.foreverignore + # old Scripts _old/ diff --git a/TODO.md b/TODO.md index 26f3c1f..c271ecb 100644 --- a/TODO.md +++ b/TODO.md @@ -28,6 +28,7 @@ - Uhrzeit am Anfang irgendwo platzieren (nicht immer oben links) - Maus auf Alarmmonitor nach Zeit x ausblenden - Datenbank nach bestimmter Zeit aufräumen +- Client-IP bei Reverse-Proxy richtig ermitteln ## 3. Priorität (Neuerungen) diff --git a/package-lock.json b/package-lock.json index 6d41077..b64b662 100644 --- a/package-lock.json +++ b/package-lock.json @@ -265,6 +265,11 @@ "concat-map": "0.0.1" } }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -531,6 +536,14 @@ "safer-buffer": "^2.1.0" } }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1075,6 +1088,23 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + } + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -1095,6 +1125,25 @@ "promise": "^7.0.1" } }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -1113,6 +1162,41 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -4444,6 +4528,15 @@ } } }, + "passport-jwt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", + "integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==", + "requires": { + "jsonwebtoken": "^8.2.0", + "passport-strategy": "^1.0.0" + } + }, "passport-local": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", diff --git a/package.json b/package.json index c41285e..680a0ac 100644 --- a/package.json +++ b/package.json @@ -17,12 +17,14 @@ "npm": "^6.13.4", "passport": "^0.4.1", "passport-ip": "^0.1.2", + "passport-jwt": "^4.0.0", "passport-local": "^1.0.0", "passport.socketio": "^3.7.0", "pug": "^2.0.4", "req-flash": "0.0.3", "serve-favicon": "^2.5.0", "socket.io": "^2.3.0", + "socket.io-client": "^2.3.0", "sqlite3": "^4.1.1" }, "devDependencies": {}, diff --git a/public/js/waip.js b/public/js/waip_client.js similarity index 100% rename from public/js/waip.js rename to public/js/waip_client.js diff --git a/server.js b/server.js index aaefb4b..a381c78 100644 --- a/server.js +++ b/server.js @@ -29,9 +29,10 @@ app.use(bodyParser.urlencoded({ // Scripte einbinden var app_cfg = require('./server/app_cfg.js'); var sql_cfg = require('./server/sql_cfg')(fs, bcrypt, app_cfg); -var sql = require('./server/sql_qry')(sql_cfg, async, app_cfg) -var waip_io = require('./server/waip_io')(io, sql, async, app_cfg); -var udp = require('./server/udp')(app_cfg, waip_io, sql); +var sql = require('./server/sql_qry')(sql_cfg, async, app_cfg); +var waip = require('./server/waip')(io, sql, async, app_cfg); +var socket = require('./server/socket')(io, sql, app_cfg, waip); +var udp = require('./server/udp')(app_cfg, waip, sql); var auth = require('./server/auth')(app, app_cfg, sql_cfg, async, bcrypt, passport, io); var routes = require('./server/routing')(app, sql, app_cfg, passport, auth, udp); diff --git a/server/app_cfg.js b/server/app_cfg.js index 5807cfb..3b83278 100644 --- a/server/app_cfg.js +++ b/server/app_cfg.js @@ -4,6 +4,7 @@ app_cfg.global = { http_port: 3000, https_port: 3443, udpport: 60233, + remoteapi: "http://localhost:8078/api", database: './database.sqlite3', soundpath: '/public/media/', mediapath: '/media/', diff --git a/server/socket.js b/server/socket.js new file mode 100755 index 0000000..c1bf0d8 --- /dev/null +++ b/server/socket.js @@ -0,0 +1,81 @@ +module.exports = function(io, sql, app_cfg, waip) { + + // Module laden + //client.js + var io_api = require('socket.io-client'); + var socket_api = io_api.connect(app_cfg.global.remoteapi, {reconnect: true}); + +// Add a connect listener +socket_api.on('connect', function (socket_api) { + console.log('Connected!'); +}); +socket_api.emit('CH01', 'me', 'test msg'); + + + // Socket.IO Server + io.on('connection', function(socket) { + sql.db_log('WAIP', 'Anwendung von ' + socket.request.connection.remoteAddress + ' (' + socket.id + ') geoeffnet'); + io.sockets.to(socket.id).emit('io.version', app_cfg.global.app_id); + // disconnect + socket.on('disconnect', function() { + sql.db_log('WAIP', 'Alarmmonitor von ' + socket.request.connection.remoteAddress + ' (' + socket.id + ') geschlossen'); + sql.db_client_delete(socket.id); + }); + // Aufruf des Alarmmonitors einer bestimmten Wache verarbeiten + socket.on('wachen_id', function(wachen_id) { + sql.db_log('WAIP', 'Alarmmonitor Nr. ' + wachen_id + ' von ' + socket.request.connection.remoteAddress + ' (' + socket.id + ') aufgerufen'); + // prüfen ob Wachenummer in der Datenbank hinterlegt ist + sql.db_wache_vorhanden(wachen_id,function(result) { + // wenn die Wachennummer vorhanden/plausibel dann weiter + if (result) { + // Socket-Room beitreiten + socket.join(wachen_id, function() { + // Socket-ID und Client-IP in der Datenbank speichern + sql.db_client_save(socket.id, socket.request.connection.remoteAddress, wachen_id); + // prüfen ob für diese Wache ein Einsatz vorhanden ist + sql.db_einsatz_vorhanden(wachen_id, socket.request.user.id, function(result_einsatz) { + if (result_einsatz) { + console.log(result_einsatz[0].waip_einsaetze_ID); + sql.db_log('WAIP', 'Einsatz ' + result_einsatz[0].waip_einsaetze_ID + ' fuer Wache ' + wachen_id + ' vorhanden'); + //letzten Einsatz verteilen + waip.einsatz_verteilen(result_einsatz[0].waip_einsaetze_ID, socket.id, wachen_id); + sql.db_update_client_status(socket, result_einsatz[0].waip_einsaetze_ID); + //vorhanden Rückmeldungen verteilen + sql.db_get_response(result_einsatz[0].waip_einsaetze_ID, function(result){ + if (result) { + waip.reuckmeldung_verteilen(result_einsatz[0].waip_einsaetze_ID, result); + }; + }); + } else { + sql.db_log('WAIP', 'Kein Einsatz fuer Wache ' + wachen_id + ' vorhanden, Standby'); + //oder falls kein Einsatz vorhanden ist, dann + io.sockets.to(socket.id).emit('io.standby', null); + sql.db_update_client_status(socket, null); + }; + }); + }); + } else { + sql.db_log('Fehler-WAIP', 'Fehler: Wachnnummer ' + wachen_id + 'nicht vorhanden'); + io.sockets.to(socket.id).emit('io.error', 'Fehler: Wachnnummer \'' + wachen_id + '\' nicht vorhanden!'); + }; + }); + }); + socket.on('response', function(waip_id, ek, ma, fk, agt) { + var i_ek = ek ? 1 : 0; + var i_ma = ma ? 1 : 0; + var i_fk = fk ? 1 : 0; + var i_agt = agt ? 1 : 0; + sql.db_update_response(waip_id, i_ek, i_ma, i_fk, i_agt, function(result){ + waip.reuckmeldung_verteilen(waip_id, result); + }); + }); + // TODO: socket.on(Version) um Server-Version abzugleichen + }); + + + + + //return { + // send_message: send_message + //}; +}; diff --git a/server/udp.js b/server/udp.js index 57f7c02..8e95b6e 100644 --- a/server/udp.js +++ b/server/udp.js @@ -1,4 +1,4 @@ -module.exports = function(app_cfg, waip_io, sql) { +module.exports = function(app_cfg, waip, sql) { // Module laden var dgram = require('dgram'); @@ -25,7 +25,7 @@ module.exports = function(app_cfg, waip_io, sql) { udp_server.on('message', function(message, remote) { if (isValidJSON(message)) { sql.db_log('WAIP', 'Neuer Einsatz von ' + remote.address + ':' + remote.port + ': ' + message); - waip_io.einsatz_speichern(message); + waip.einsatz_speichern(message); } else { sql.db_log('Fehler-WAIP', 'Fehler: Einsatz von ' + remote.address + ':' + remote.port + ' Fehlerhaft: ' + message); } diff --git a/server/waip_io.js b/server/waip.js similarity index 79% rename from server/waip_io.js rename to server/waip.js index 4e74299..52d7b5f 100644 --- a/server/waip_io.js +++ b/server/waip.js @@ -1,65 +1,5 @@ module.exports = function(io, sql, async, app_cfg) { - // Socket.IO - io.on('connection', function(socket) { - sql.db_log('WAIP', 'Anwendung von ' + socket.request.connection.remoteAddress + ' (' + socket.id + ') geoeffnet'); - io.sockets.to(socket.id).emit('io.version', app_cfg.global.app_id); - // disconnect - socket.on('disconnect', function() { - sql.db_log('WAIP', 'Alarmmonitor von ' + socket.request.connection.remoteAddress + ' (' + socket.id + ') geschlossen'); - sql.db_client_delete(socket.id); - }); - // Aufruf des Alarmmonitors einer bestimmten Wache verarbeiten - socket.on('wachen_id', function(wachen_id) { - sql.db_log('WAIP', 'Alarmmonitor Nr. ' + wachen_id + ' von ' + socket.request.connection.remoteAddress + ' (' + socket.id + ') aufgerufen'); - // prüfen ob Wachenummer in der Datenbank hinterlegt ist - sql.db_wache_vorhanden(wachen_id,function(result) { - // wenn die Wachennummer vorhanden/plausibel dann weiter - if (result) { - // Socket-Room beitreiten - socket.join(wachen_id, function() { - // Socket-ID und Client-IP in der Datenbank speichern - sql.db_client_save(socket.id, socket.request.connection.remoteAddress, wachen_id); - // prüfen ob für diese Wache ein Einsatz vorhanden ist - sql.db_einsatz_vorhanden(wachen_id, socket.request.user.id, function(result_einsatz) { - if (result_einsatz) { - console.log(result_einsatz[0].waip_einsaetze_ID); - sql.db_log('WAIP', 'Einsatz ' + result_einsatz[0].waip_einsaetze_ID + ' fuer Wache ' + wachen_id + ' vorhanden'); - //letzten Einsatz verteilen - einsatz_verteilen(result_einsatz[0].waip_einsaetze_ID, socket.id, wachen_id); - sql.db_update_client_status(socket, result_einsatz[0].waip_einsaetze_ID); - //vorhanden Rückmeldungen verteilen - sql.db_get_response(result_einsatz[0].waip_einsaetze_ID, function(result){ - if (result) { - reuckmeldung_verteilen(result_einsatz[0].waip_einsaetze_ID, result); - }; - }); - } else { - sql.db_log('WAIP', 'Kein Einsatz fuer Wache ' + wachen_id + ' vorhanden, Standby'); - //oder falls kein Einsatz vorhanden ist, dann - io.sockets.to(socket.id).emit('io.standby', null); - sql.db_update_client_status(socket, null); - }; - }); - }); - } else { - sql.db_log('Fehler-WAIP', 'Fehler: Wachnnummer ' + wachen_id + 'nicht vorhanden'); - io.sockets.to(socket.id).emit('io.error', 'Fehler: Wachnnummer \'' + wachen_id + '\' nicht vorhanden!'); - }; - }); - }); - socket.on('response', function(waip_id, ek, ma, fk, agt) { - var i_ek = ek ? 1 : 0; - var i_ma = ma ? 1 : 0; - var i_fk = fk ? 1 : 0; - var i_agt = agt ? 1 : 0; - sql.db_update_response(waip_id, i_ek, i_ma, i_fk, i_agt, function(result){ - reuckmeldung_verteilen(waip_id, result); - }); - }); - // TODO: socket.on(Version) um Server-Version abzugleichen - }); - // Einsatzmeldung in Datenbank speichern function einsatz_speichern(message) { // Einsatzmeldung (JSON) speichern @@ -323,6 +263,8 @@ module.exports = function(io, sql, async, app_cfg) { // TODO: Funktion um Clients "neuzustarten" (Seite remote neu laden) return { - einsatz_speichern: einsatz_speichern + einsatz_speichern: einsatz_speichern, + einsatz_verteilen: einsatz_verteilen, + reuckmeldung_verteilen: reuckmeldung_verteilen }; }; diff --git a/views/test_clock.pug b/views/test_clock.pug index bd3bc48..3231422 100644 --- a/views/test_clock.pug +++ b/views/test_clock.pug @@ -8,5 +8,5 @@ block content include includes/clock script(src='/js/textFit.min.js') - script(src='/js/waip.js') + script(src='/js/waip_client.js') diff --git a/views/test_wachalarm.pug b/views/test_wachalarm.pug index 9e044b0..ffb99a1 100644 --- a/views/test_wachalarm.pug +++ b/views/test_wachalarm.pug @@ -11,5 +11,5 @@ block content include includes/wachalarm script(src='/js/leaflet.js') script(src='/js/textFit.min.js') - script(src='/js/waip.js') + script(src='/js/waip_client.js') diff --git a/views/waip.pug b/views/waip.pug index 25e4c86..b45aeb6 100644 --- a/views/waip.pug +++ b/views/waip.pug @@ -21,4 +21,4 @@ block content script. wachen_id="#{wachen_id}" waip_id=null - script(src='/js/waip.js') + script(src='/js/waip_client.js')