diff --git a/.gitignore b/.gitignore index 102611e4..45a81dc0 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,6 @@ client/public/javascripts/leaflet.nauticscale.js client/public/javascripts/L.Path.Drag.js /installer/archive/Scripts /installer/archive/Mods -/installer/installer/DCSOlympus*.exe \ No newline at end of file +/installer/installer/DCSOlympus*.exe +client/public/javascripts/L.Path.Drag.js +client/public/stylesheets/leaflet/leaflet-gesture-handling.css diff --git a/client/app.js b/client/app.js index b2915423..42c1367f 100644 --- a/client/app.js +++ b/client/app.js @@ -1,10 +1,12 @@ +/* Requires */ var express = require('express'); var path = require('path'); -var cookieParser = require('cookie-parser'); var logger = require('morgan'); var fs = require('fs'); var bodyParser = require('body-parser'); +const { createProxyMiddleware } = require('http-proxy-middleware'); +/* Default routers */ var atcRouter = require('./routes/api/atc'); var airbasesRouter = require('./routes/api/airbases'); var elevationRouter = require('./routes/api/elevation'); @@ -15,14 +17,19 @@ var usersRouter = require('./routes/users'); var resourcesRouter = require('./routes/resources'); var pluginsRouter = require('./routes/plugins'); +/* Load the config and create the express app */ +let rawdata = fs.readFileSync('../olympus.json'); +let config = JSON.parse(rawdata); var app = express(); +/* Define middleware */ app.use(logger('dev')); +app.use('/olympus', createProxyMiddleware({target: `http://${config["server"]["address"]}:${config["server"]["port"]}`, changeOrigin: true })); app.use(bodyParser.json({limit: '50mb'})); app.use(bodyParser.urlencoded({limit: '50mb', extended: true})); -app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); +/* Apply routers */ app.use('/', indexRouter); app.use('/api/atc', atcRouter); app.use('/api/airbases', airbasesRouter); @@ -35,15 +42,10 @@ app.use('/resources', resourcesRouter); app.set('view engine', 'ejs'); -let rawdata = fs.readFileSync('../olympus.json'); -let config = JSON.parse(rawdata); -if (config["server"] != undefined) - app.get('/config', (req, res) => res.send(config["server"])); - module.exports = app; -const DemoDataGenerator = require('./demo.js'); -var demoDataGenerator = new DemoDataGenerator(app, config); + + diff --git a/client/bin/demo b/client/bin/demo new file mode 100644 index 00000000..0cf314ab --- /dev/null +++ b/client/bin/demo @@ -0,0 +1,118 @@ +#!/usr/bin/env node + +console.log('\x1b[36m%s\x1b[0m', "*********************************************************************"); +console.log('\x1b[36m%s\x1b[0m', "* _____ _____ _____ ____ _ *"); +console.log('\x1b[36m%s\x1b[0m', "* | __ \\ / ____|/ ____| / __ \\| | *"); +console.log('\x1b[36m%s\x1b[0m', "* | | | | | | (___ | | | | |_ _ _ __ ___ _ __ _ _ ___ *"); +console.log('\x1b[36m%s\x1b[0m', "* | | | | | \\___ \\ | | | | | | | | '_ ` _ \\| '_ \\| | | / __| *"); +console.log('\x1b[36m%s\x1b[0m', "* | |__| | |____ ____) | | |__| | | |_| | | | | | | |_) | |_| \\__ \\ *"); +console.log('\x1b[36m%s\x1b[0m', "* |_____/ \\_____|_____/ \\____/|_|\\__, |_| |_| |_| .__/ \\__,_|___/ *"); +console.log('\x1b[36m%s\x1b[0m', "* __/ | | | *"); +console.log('\x1b[36m%s\x1b[0m', "* |___/ |_| *"); +console.log('\x1b[36m%s\x1b[0m', "*********************************************************************"); +console.log('\x1b[36m%s\x1b[0m', ""); +console.log("Please wait while DCS Olympus DEMO Backend Server starts up..."); + +var fs = require('fs'); +let rawdata = fs.readFileSync('../olympus.json'); +let config = JSON.parse(rawdata); + +/** + * Module dependencies. + */ + +var app = require('../demo'); +var debug = require('debug')('client:server'); +var http = require('http'); + +/** + * Get port from environment and store in Express. + */ + +var configPort = null; +if (config["server"] != undefined && config["server"]["port"] != undefined) { + configPort = config["server"]["port"]; +} + +var port = normalizePort(configPort || '3000'); +app.set('port', port); +console.log("Express server listening on port: " + port) + +/** + * Create HTTP server. + */ + +var server = http.createServer(app); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port); +server.on('error', onError); +server.on('listening', onListening); + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); +} + +console.log("DCS Olympus DEMO Backend Server {{OLYMPUS_VERSION_NUMBER}}.{{OLYMPUS_COMMIT_HASH}} started correctly!") +console.log("Waiting for connections...") + +process.title = `DCS Olympus DEMO Backend Server {{OLYMPUS_VERSION_NUMBER}} (${port})`; \ No newline at end of file diff --git a/client/debug.bat b/client/debug.bat deleted file mode 100644 index f57b8be0..00000000 --- a/client/debug.bat +++ /dev/null @@ -1,2 +0,0 @@ -start cmd /k "npm run start" -start cmd /k "watchify .\src\index.ts --debug -o .\public\javascripts\bundle.js -t [ babelify --global true --presets [ @babel/preset-env ] --extensions '.js'] -p [ tsify --noImplicitAny ] diff --git a/client/demo.bat b/client/demo.bat new file mode 100644 index 00000000..f76a472f --- /dev/null +++ b/client/demo.bat @@ -0,0 +1 @@ +node .\bin\demo \ No newline at end of file diff --git a/client/demo.js b/client/demo.js index 691846b2..36d7e0bf 100644 --- a/client/demo.js +++ b/client/demo.js @@ -1,7 +1,17 @@ -const { random } = require('@turf/turf'); var basicAuth = require('express-basic-auth') +var logger = require('morgan'); var enc = new TextEncoder(); +var express = require('express'); +var fs = require('fs'); + +let rawdata = fs.readFileSync('../olympus.json'); +let config = JSON.parse(rawdata); + +var app = express(); + +app.use(logger('dev')); + const aircraftDatabase = require('./public/databases/units/aircraftDatabase.json'); const helicopterDatabase = require('./public/databases/units/helicopterDatabase.json'); const groundUnitDatabase = require('./public/databases/units/groundUnitDatabase.json'); @@ -16,16 +26,16 @@ const DEMO_WEAPONS_DATA = { class DemoDataGenerator { constructor(app, config) { - app.get('/demo/units', (req, res) => this.units(req, res)); - app.get('/demo/weapons', (req, res) => this.weapons(req, res)); - app.get('/demo/logs', (req, res) => this.logs(req, res)); - app.get('/demo/bullseyes', (req, res) => this.bullseyes(req, res)); - app.get('/demo/airbases', (req, res) => this.airbases(req, res)); - app.get('/demo/mission', (req, res) => this.mission(req, res)); - app.get('/demo/commands', (req, res) => this.command(req, res)); - app.put('/demo', (req, res) => this.put(req, res)); + app.get('/olympus/units', (req, res) => this.units(req, res)); + app.get('/olympus/weapons', (req, res) => this.weapons(req, res)); + app.get('/olympus/logs', (req, res) => this.logs(req, res)); + app.get('/olympus/bullseyes', (req, res) => this.bullseyes(req, res)); + app.get('/olympus/airbases', (req, res) => this.airbases(req, res)); + app.get('/olympus/mission', (req, res) => this.mission(req, res)); + app.get('/olympus/commands', (req, res) => this.command(req, res)); + app.put('/olympus', (req, res) => this.put(req, res)); - app.use('/demo', basicAuth({ + app.use('/olympus', basicAuth({ users: { 'admin': config["authentication"]["gameMasterPassword"], 'blue': config["authentication"]["blueCommanderPassword"], @@ -511,4 +521,6 @@ class DemoDataGenerator { } -module.exports = DemoDataGenerator; \ No newline at end of file +var demoDataGenerator = new DemoDataGenerator(app, config); + +module.exports = app; diff --git a/client/install.bat b/client/install.bat index ae6c6450..f230b54a 100644 --- a/client/install.bat +++ b/client/install.bat @@ -1,2 +1 @@ call npm install --omit=dev -call npm install yargs prompt-sync sha256 tcp-ping-port \ No newline at end of file diff --git a/client/package-lock.json b/client/package-lock.json index 0e0f42dc..6b376112 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,12 +1,12 @@ { "name": "DCSOlympus", - "version": "v1.0.2", + "version": "v1.0.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "DCSOlympus", - "version": "v1.0.2", + "version": "v1.0.4", "dependencies": { "@turf/turf": "^6.5.0", "body-parser": "^1.20.2", @@ -15,12 +15,17 @@ "ejs": "^3.1.8", "express": "~4.16.1", "express-basic-auth": "^1.2.1", + "http-proxy-middleware": "^2.0.6", "js-sha256": "^0.10.1", "leaflet-gesture-handling": "^1.2.2", "morgan": "~1.9.1", + "prompt-sync": "^4.2.0", "save": "^2.9.0", + "sha256": "^0.2.0", "srtm-elevation": "^2.1.2", - "uuid": "^9.0.1" + "tcp-ping-port": "^1.0.1", + "uuid": "^9.0.1", + "yargs": "^17.7.2" }, "devDependencies": { "@babel/preset-env": "^7.21.4", @@ -3599,6 +3604,14 @@ "integrity": "sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ==", "dev": true }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/leaflet": { "version": "1.9.8", "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.8.tgz", @@ -3612,7 +3625,6 @@ "version": "18.19.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.3.tgz", "integrity": "sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==", - "dev": true, "dependencies": { "undici-types": "~5.26.4" } @@ -3691,7 +3703,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -4171,7 +4182,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -4642,7 +4652,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -4815,12 +4824,22 @@ "node": ">= 0.6" } }, + "node_modules/convert-hex": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/convert-hex/-/convert-hex-0.1.0.tgz", + "integrity": "sha512-w20BOb1PiR/sEJdS6wNrUjF5CSfscZFUp7R9NSlXH8h2wynzXVEPFPJECAnkNylZ+cvf3p7TyRUHggDmrwXT9A==" + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "node_modules/convert-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/convert-string/-/convert-string-0.1.0.tgz", + "integrity": "sha512-1KX9ESmtl8xpT2LN2tFnKSbV4NiarbVi8DVb39ZriijvtTklyrT+4dT1wsGMHKD3CJUjXgvJzstm9qL9ICojGA==" + }, "node_modules/cookie": { "version": "0.4.1", "license": "MIT", @@ -5137,6 +5156,17 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, + "node_modules/dns-fast-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dns-fast-resolver/-/dns-fast-resolver-1.0.1.tgz", + "integrity": "sha512-eei8mRXJX2B486lVUICtMwN//Ze2QlNt6ZGRlym9bIxypkw7a2nRweukbLXCJNTiZcAsX2fdbdP/MFT/J/4EZg==", + "dependencies": { + "lodash": "^4.17.20" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -5243,8 +5273,7 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/encodeurl": { "version": "1.0.2", @@ -5360,7 +5389,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -5433,6 +5461,14 @@ "node": ">=0.4.0" } }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "engines": { + "node": ">=6" + } + }, "node_modules/esmify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/esmify/-/esmify-2.1.1.tgz", @@ -5560,6 +5596,11 @@ "through": "^2.3.8" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -5764,7 +5805,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5788,6 +5828,25 @@ "node": ">= 0.8" } }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -5933,7 +5992,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -6195,6 +6253,42 @@ "node": ">= 0.6" } }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -6376,7 +6470,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -6385,7 +6478,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -6409,7 +6501,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -6421,11 +6512,21 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-regex": { "version": "1.1.4", "license": "MIT", @@ -6586,8 +6687,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.assign": { "version": "4.2.0", @@ -6635,6 +6735,14 @@ "sourcemap-codec": "^1.4.1" } }, + "node_modules/maketype": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/maketype/-/maketype-1.0.1.tgz", + "integrity": "sha512-0oGIyz3dzoUzcI7ZWD/XCJbVW8P95JLv2lWdA9t2ZGNSQJ3Pdhz6nJ82dfOLZSUKTaA8d8chg6sAJDMNxZwHMw==", + "dependencies": { + "esm": "^3.2.25" + } + }, "node_modules/map-stream": { "version": "0.0.7", "license": "MIT" @@ -6677,6 +6785,18 @@ "node": ">= 0.6" } }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -7342,7 +7462,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -7392,6 +7511,33 @@ "asap": "~2.0.6" } }, + "node_modules/prompt-sync": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz", + "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==", + "dependencies": { + "strip-ansi": "^5.0.0" + } + }, + "node_modules/prompt-sync/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompt-sync/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "license": "MIT", @@ -7678,7 +7824,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7696,6 +7841,11 @@ "node": ">=0.4.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -7844,6 +7994,15 @@ "sha.js": "bin.js" } }, + "node_modules/sha256": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sha256/-/sha256-0.2.0.tgz", + "integrity": "sha512-kTWMJUaez5iiT9CcMv8jSq6kMhw3ST0uRdcIWl3D77s6AsLXNXRp3heeqqfu5+Dyfu4hwpQnMzhqHh8iNQxw0w==", + "dependencies": { + "convert-hex": "~0.1.0", + "convert-string": "~0.1.0" + } + }, "node_modules/shasum-object": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", @@ -8142,7 +8301,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8156,7 +8314,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -8225,6 +8382,19 @@ "acorn-node": "^1.2.0" } }, + "node_modules/tcp-ping-port": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tcp-ping-port/-/tcp-ping-port-1.0.1.tgz", + "integrity": "sha512-YAlsmy6IMVIJpLF+/nXjcuzOfgKnqqsgwBhlHcakAjwE97VR4l21oviaobuhF+2Tcrfyr5VuNKRcz63d2Y14pw==", + "dependencies": { + "dns-fast-resolver": "^1.0.0", + "lodash": "^4.17.20", + "maketype": "^1.0.1" + }, + "engines": { + "node": ">=12.0" + } + }, "node_modules/terser": { "version": "3.16.1", "resolved": "https://registry.npmjs.org/terser/-/terser-3.16.1.tgz", @@ -8341,7 +8511,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -8634,8 +8803,7 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -8877,7 +9045,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8915,7 +9082,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -8930,7 +9096,6 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -8948,7 +9113,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, "engines": { "node": ">=12" } diff --git a/client/package.json b/client/package.json index 30f49fc0..69866012 100644 --- a/client/package.json +++ b/client/package.json @@ -2,7 +2,7 @@ "name": "DCSOlympus", "node-main": "./bin/www", "main": "http://localhost:3000", - "version": "{{OLYMPUS_VERSION_NUMBER}}", + "version": "v1.0.4", "private": true, "scripts": { "build": "browserify .\\src\\index.ts --debug -o .\\public\\javascripts\\bundle.js -t [ babelify --global true --presets [ @babel/preset-env ] --extensions '.js'] -p [ tsify --noImplicitAny ] && copy.bat", @@ -14,21 +14,25 @@ "watch": "watchify .\\src\\index.ts --debug -o .\\public\\javascripts\\bundle.js -t [ babelify --global true --presets [ @babel/preset-env ] --extensions '.js'] -p [ tsify --noImplicitAny ]" }, "dependencies": { - "@turf/turf": "^6.5.0", "body-parser": "^1.20.2", - "cookie-parser": "~1.4.4", "debug": "~2.6.9", "ejs": "^3.1.8", "express": "~4.16.1", "express-basic-auth": "^1.2.1", + "http-proxy-middleware": "^2.0.6", "js-sha256": "^0.10.1", - "leaflet-gesture-handling": "^1.2.2", "morgan": "~1.9.1", + "prompt-sync": "^4.2.0", "save": "^2.9.0", + "sha256": "^0.2.0", "srtm-elevation": "^2.1.2", - "uuid": "^9.0.1" + "tcp-ping-port": "^1.0.1", + "uuid": "^9.0.1", + "yargs": "^17.7.2" }, "devDependencies": { + "leaflet-gesture-handling": "^1.2.2", + "@turf/turf": "^6.5.0", "@babel/preset-env": "^7.21.4", "@tanem/svg-injector": "^10.1.68", "@types/formatcoords": "^1.1.0", @@ -57,11 +61,5 @@ "typescript": "^4.9.4", "usng.js": "^0.4.5", "watchify": "^4.0.0" - }, - "window": { - "width": 1000, - "height": 800, - "position": "center", - "icon": "public/images/icon.png" } } diff --git a/client/routes/resources.js b/client/routes/resources.js index 1aa2f537..f3fd6198 100644 --- a/client/routes/resources.js +++ b/client/routes/resources.js @@ -1,23 +1,8 @@ const express = require('express'); const router = express.Router(); -const { v4: uuidv4 } = require('uuid'); - -var themesMap = {}; router.get('/theme/*', function (req, res, next) { - /* If this is the first time this session makes a request, create a uuid and save it to the map. Default theme is the olympus theme */ - if (!req.cookies.id) { - const id = uuidv4(); - res.cookie('id', id, { httpOnly: true }); - themesMap[id] = "olympus"; - reqTheme = "olympus"; - } - else { - /* If it is present, recover the session theme from the map */ - if (!(req.cookies.id in themesMap)) - themesMap[req.cookies.id] = "olympus"; - reqTheme = themesMap[req.cookies.id]; - } + var reqTheme = "olympus"; /* Yes, this in an easter egg! :D Feel free to ignore it, or activate the parrot theme to check what it does. Why parrots? The story is a bit long, come to the Discord and ask :D */ if (reqTheme === "parrot" && !req.url.includes(".css")) @@ -27,15 +12,6 @@ router.get('/theme/*', function (req, res, next) { }); router.put('/theme/:newTheme', function (req, res, next) { - /* Add the theme to the map, if this session already has an id */ - const newTheme = req.params.newTheme; - if (req.cookies.id) { - themesMap[req.cookies.id] = newTheme; - console.log("Theme set to " + newTheme + " for session " + req.cookies.id); - } else { - console.log("Failed to set theme to " + newTheme + ", no session id"); - } - res.end("Ok"); }); diff --git a/client/src/interfaces.ts b/client/src/interfaces.ts index 1e8f8fb9..4461a17f 100644 --- a/client/src/interfaces.ts +++ b/client/src/interfaces.ts @@ -11,11 +11,6 @@ declare global { function getOlympusPlugin(): OlympusPlugin; } -export interface ConfigurationOptions { - port: number; - address: string; -} - export interface ContextMenuOption { tooltip: string; src: string; diff --git a/client/src/olympusapp.ts b/client/src/olympusapp.ts index dc45db8c..676cacf0 100644 --- a/client/src/olympusapp.ts +++ b/client/src/olympusapp.ts @@ -24,7 +24,6 @@ import { aircraftDatabase } from "./unit/databases/aircraftdatabase"; import { helicopterDatabase } from "./unit/databases/helicopterdatabase"; import { groundUnitDatabase } from "./unit/databases/groundunitdatabase"; import { navyUnitDatabase } from "./unit/databases/navyunitdatabase"; -import { ConfigurationOptions } from "./interfaces"; import { UnitListPanel } from "./panels/unitlistpanel"; import { ContextManager } from "./context/contextmanager"; import { Context } from "./context/context"; @@ -216,19 +215,8 @@ export class OlympusApp { this.#pluginsManager = new PluginsManager(); - /* Load the config file from the app server*/ - this.getServerManager().getConfig((config: ConfigurationOptions) => { - if (config && config.address != undefined && config.port != undefined) { - const address = config.address; - const port = config.port; - if (typeof address === 'string' && typeof port == 'number') { - this.getServerManager().setAddress(address == "*" ? window.location.hostname : address, port); - } - } - else { - throw new Error('Could not read configuration file'); - } - }); + /* Set the address of the server */ + this.getServerManager().setAddress(window.location.href.split('?')[0]); /* Setup all global events */ this.#setupEvents(); @@ -294,16 +282,7 @@ export class OlympusApp { }); const shortcutManager = this.getShortcutManager(); - shortcutManager.addKeyboardShortcut("toggleDemo", { - "altKey": false, - "callback": () => { - if (DEBUG === true) this.getServerManager().toggleDemoEnabled(); - }, - "code": "KeyT", - "context": "olympus", - "ctrlKey": false, - "shiftKey": false - }).addKeyboardShortcut("togglePause", { + shortcutManager.addKeyboardShortcut("togglePause", { "altKey": false, "callback": () => { this.getServerManager().setPaused(!this.getServerManager().getPaused()); diff --git a/client/src/server/servermanager.ts b/client/src/server/servermanager.ts index 10b9f59e..6555c3f1 100644 --- a/client/src/server/servermanager.ts +++ b/client/src/server/servermanager.ts @@ -11,13 +11,11 @@ import { zeroAppend } from '../other/utils'; export class ServerManager { #connected: boolean = false; #paused: boolean = false; - #REST_ADDRESS = "http://localhost:30000/olympus"; - #DEMO_ADDRESS = window.location.href.split('?')[0] + "demo"; /* Remove query parameters */ + #REST_ADDRESS = "http://localhost:3001/olympus"; #username = ""; #password = ""; #sessionHash: string | null = null; #lastUpdateTimes: { [key: string]: number } = {} - #demoEnabled = false; #previousMissionElapsedTime: number = 0; // Track if mission elapsed time is increasing (i.e. is the server paused) #serverIsPaused: boolean = false; #intervals: number[] = []; @@ -32,10 +30,6 @@ export class ServerManager { this.#lastUpdateTimes[MISSION_URI] = Date.now(); } - toggleDemoEnabled() { - this.#demoEnabled = !this.#demoEnabled; - } - setCredentials(newUsername: string, newPassword: string) { this.#username = newUsername; this.#password = newPassword; @@ -63,7 +57,7 @@ export class ServerManager { optionsString = `commandHash=${options.commandHash}`; /* On the connection */ - xmlHttp.open("GET", `${this.#demoEnabled ? this.#DEMO_ADDRESS : this.#REST_ADDRESS}/${uri}${optionsString ? `?${optionsString}` : ''}`, true); + xmlHttp.open("GET", `${this.#REST_ADDRESS}/${uri}${optionsString ? `?${optionsString}` : ''}`, true); /* If provided, set the credentials */ if (this.#username && this.#password) @@ -106,7 +100,7 @@ export class ServerManager { PUT(request: object, callback: CallableFunction) { var xmlHttp = new XMLHttpRequest(); - xmlHttp.open("PUT", this.#demoEnabled ? this.#DEMO_ADDRESS : this.#REST_ADDRESS); + xmlHttp.open("PUT", this.#REST_ADDRESS); xmlHttp.setRequestHeader("Content-Type", "application/json"); if (this.#username && this.#password) xmlHttp.setRequestHeader("Authorization", "Basic " + btoa(`${this.#username}:${this.#password}`)); @@ -130,8 +124,8 @@ export class ServerManager { xmlHttp.send(null); } - setAddress(address: string, port: number) { - this.#REST_ADDRESS = `http://${address}:${port}/olympus` + setAddress(address: string) { + this.#REST_ADDRESS = `${address}olympus` console.log(`Setting REST address to ${this.#REST_ADDRESS}`) } diff --git a/olympus.json b/olympus.json index 9cbce01c..1403f731 100644 --- a/olympus.json +++ b/olympus.json @@ -4,9 +4,9 @@ "port": 3001 }, "authentication": { - "gameMasterPassword": "688787d8ff144c502c7f5cffaafe2cc588d86079f9de88304c26b0cb99ce91c6", - "blueCommanderPassword": "688787d8ff144c502c7f5cffaafe2cc588d86079f9de88304c26b0cb99ce91c6", - "redCommanderPassword": "688787d8ff144c502c7f5cffaafe2cc588d86079f9de88304c26b0cb99ce91c6" + "gameMasterPassword": "4b8823ed9e5c2392ab4a791913bb8ce41956ea32e308b760eefb97536746dd33", + "blueCommanderPassword": "b0ea4230c1558c5313165eda1bdb7fced008ca7f2ca6b823fb4d26292f309098", + "redCommanderPassword": "302bcbaf2a3fdcf175b689bf102d6cdf9328f68a13d4096101bba806482bfed9" }, "client": { "port": 3000,