1
0
mirror of https://github.com/KubaPro010/fm-dx-webserver.git synced 2026-02-26 22:13:53 +01:00

library cleanup / code cleanup + custom titles

This commit is contained in:
NoobishSVK
2024-01-21 23:14:56 +01:00
parent 830d79564f
commit 8a450f74da
7 changed files with 41 additions and 164 deletions

View File

@@ -4,23 +4,19 @@ const http = require('http');
const WebSocket = require('ws'); const WebSocket = require('ws');
const path = require('path'); const path = require('path');
const net = require('net'); const net = require('net');
const cors = require('cors');
const axios = require('axios');
const crypto = require('crypto'); const crypto = require('crypto');
let receivedSalt = '';
let receivedPassword = false;
let currentUsers = 0;
const infoMsg = "\x1b[32m[INFO]\x1b[0m";
const debugMsg = "\x1b[36m[DEBUG]\x1b[0m";
// Other JS files
const dataHandler = require('./datahandler'); const dataHandler = require('./datahandler');
const config = require('./userconfig'); const config = require('./userconfig');
/* Server settings */ /* Server settings */
const { webServerHost, webServerPort, xdrdServerHost, xdrdServerPort, xdrdPassword, qthLatitude, qthLongitude } = config; const { webServerHost, webServerPort, webServerName, xdrdServerHost, xdrdServerPort, xdrdPassword, qthLatitude, qthLongitude } = config;
const infoMsg = "\x1b[32m[INFO]\x1b[0m";
const debugMsg = "\x1b[36m[DEBUG]\x1b[0m";
let receivedSalt = '';
let receivedPassword = false;
let currentUsers = 0;
const wss = new WebSocket.Server({ noServer: true }); const wss = new WebSocket.Server({ noServer: true });
@@ -34,7 +30,7 @@ wss.on('connection', (ws, request) => {
const clientIp = request.connection.remoteAddress; const clientIp = request.connection.remoteAddress;
currentUsers++; currentUsers++;
dataHandler.showOnlineUsers(currentUsers); dataHandler.showOnlineUsers(currentUsers);
console.log(infoMsg, `WebSocket client \x1b[32mconnected\x1b[0m (${clientIp}) \x1b[90m[${currentUsers}]`); console.log(infoMsg, `Web client \x1b[32mconnected\x1b[0m (${clientIp}) \x1b[90m[${currentUsers}]`);
ws.on('message', (message) => { ws.on('message', (message) => {
if(config.verboseMode === true) { if(config.verboseMode === true) {
@@ -47,7 +43,7 @@ wss.on('connection', (ws, request) => {
ws.on('close', (code, reason) => { ws.on('close', (code, reason) => {
currentUsers--; currentUsers--;
dataHandler.showOnlineUsers(currentUsers); dataHandler.showOnlineUsers(currentUsers);
console.log(infoMsg, `WebSocket client \x1b[31mdisconnected\x1b[0m (${clientIp}) \x1b[90m[${currentUsers}]`); console.log(infoMsg, `Web client \x1b[31mdisconnected\x1b[0m (${clientIp}) \x1b[90m[${currentUsers}]`);
}); });
ws.on('error', console.error); ws.on('error', console.error);
@@ -60,16 +56,11 @@ app.use(express.static(path.join(__dirname, 'web')));
// Function to authenticate with the xdrd server // Function to authenticate with the xdrd server
function authenticateWithXdrd(client, salt, password) { function authenticateWithXdrd(client, salt, password) {
const sha1 = crypto.createHash('sha1'); const sha1 = crypto.createHash('sha1');
// Convert salt and password to buffers
const saltBuffer = Buffer.from(salt, 'utf-8'); const saltBuffer = Buffer.from(salt, 'utf-8');
const passwordBuffer = Buffer.from(password, 'utf-8'); const passwordBuffer = Buffer.from(password, 'utf-8');
// Update the hash context with salt and password
sha1.update(saltBuffer); sha1.update(saltBuffer);
sha1.update(passwordBuffer); sha1.update(passwordBuffer);
// Finalize the hash and get the hashed password
const hashedPassword = sha1.digest('hex'); const hashedPassword = sha1.digest('hex');
client.write(hashedPassword + '\n'); client.write(hashedPassword + '\n');
client.write('x\n'); client.write('x\n');
@@ -83,7 +74,7 @@ client.connect(xdrdServerPort, xdrdServerHost, () => {
const receivedData = data.toString(); const receivedData = data.toString();
const lines = receivedData.split('\n'); const lines = receivedData.split('\n');
// Assuming that the first message contains the salt // Salt reading, so we can authenticate
if (lines.length > 0 && !receivedPassword) { if (lines.length > 0 && !receivedPassword) {
receivedSalt = lines[0].trim(); receivedSalt = lines[0].trim();
authenticateWithXdrd(client, receivedSalt, xdrdPassword); authenticateWithXdrd(client, receivedSalt, xdrdPassword);
@@ -120,32 +111,6 @@ httpServer.listen(webServerPort, webServerHost, () => {
}); });
app.get('/coordinates', (req, res) => { app.get('/static_data', (req, res) => {
// Sending the coordinates to the client res.json({ qthLatitude, qthLongitude, webServerName });
res.json({ qthLatitude, qthLongitude });
}); });
/* Audio */
app.get('/audio-proxy', (req, res) => {
const audioStreamUrl = 'http://fmdx.pl:8000/noobish.opus';
axios.get(audioStreamUrl, {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
},
responseType: 'stream', // Specify the response type as a stream
})
.then((response) => {
const contentType = response.headers['content-type'] || 'audio/ogg';
res.setHeader('Content-Type', contentType);
res.setHeader('Access-Control-Allow-Origin', '*');
console.log(contentType);
response.data.pipe(res);
})
.catch((error) => {
console.error('Error in audio proxy request:', error);
res.status(500).send('Error in audio proxy request');
});
});
app.use('/audio-proxy', cors());

111
package-lock.json generated
View File

@@ -9,15 +9,13 @@
"version": "1.0.0", "version": "1.0.0",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"axios": "^1.6.0", "express": "4.18.2",
"cors": "^2.8.5",
"express": "^4.18.2",
"http": "^0.0.1-security", "http": "^0.0.1-security",
"https": "^1.0.0", "https": "1.0.0",
"koffi": "^2.6.6", "koffi": "2.7.2",
"net": "^1.0.2", "net": "1.0.2",
"websocket": "^1.0.34", "websocket": "1.0.34",
"ws": "^8.14.2" "ws": "8.14.2"
} }
}, },
"node_modules/accepts": { "node_modules/accepts": {
@@ -37,34 +35,6 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
}, },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/axios": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz",
"integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==",
"dependencies": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/axios/node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/body-parser": { "node_modules/body-parser": {
"version": "1.20.1", "version": "1.20.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
@@ -121,17 +91,6 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/content-disposition": { "node_modules/content-disposition": {
"version": "0.5.4", "version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
@@ -164,18 +123,6 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
}, },
"node_modules/cors": {
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
"dependencies": {
"object-assign": "^4",
"vary": "^1"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/d": { "node_modules/d": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
@@ -206,14 +153,6 @@
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/depd": { "node_modules/depd": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -361,25 +300,6 @@
"node": ">= 0.8" "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/forwarded": { "node_modules/forwarded": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -528,9 +448,9 @@
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
}, },
"node_modules/koffi": { "node_modules/koffi": {
"version": "2.6.6", "version": "2.7.2",
"resolved": "https://registry.npmjs.org/koffi/-/koffi-2.6.6.tgz", "resolved": "https://registry.npmjs.org/koffi/-/koffi-2.7.2.tgz",
"integrity": "sha512-+iFkVdkZYsqlgJLU4cm7AbhsCCxlmR62IfWLvpQGZ7FCkit5aECE0nAXn5hjowhxCUwFzfvhmlUaWEngeZlnTQ==", "integrity": "sha512-AWcsEKETQuELxK0Wq/aXDkDiNFFY41TxZQSrKm2Nd6HO/KTHeohPOOIlh2OfQnBXJbRjx5etpWt8cbqMUZo2sg==",
"hasInstallScript": true "hasInstallScript": true
}, },
"node_modules/media-typer": { "node_modules/media-typer": {
@@ -617,14 +537,6 @@
"node-gyp-build-test": "build-test.js" "node-gyp-build-test": "build-test.js"
} }
}, },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/object-inspect": { "node_modules/object-inspect": {
"version": "1.13.1", "version": "1.13.1",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
@@ -669,11 +581,6 @@
"node": ">= 0.10" "node": ">= 0.10"
} }
}, },
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"node_modules/qs": { "node_modules/qs": {
"version": "6.11.0", "version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",

View File

@@ -4,19 +4,18 @@
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1" "debug": "node index.js",
"start": "node index.js"
}, },
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"axios": "^1.6.0", "express": "4.18.2",
"cors": "^2.8.5",
"express": "^4.18.2",
"http": "^0.0.1-security", "http": "^0.0.1-security",
"https": "^1.0.0", "https": "1.0.0",
"koffi": "^2.6.6", "koffi": "2.7.2",
"net": "^1.0.2", "net": "1.0.2",
"websocket": "^1.0.34", "websocket": "1.0.34",
"ws": "^8.14.2" "ws": "8.14.2"
} }
} }

View File

@@ -1,5 +1,6 @@
const webServerHost = '192.168.1.14'; // IP of the web server const webServerHost = '192.168.1.14'; // IP of the web server
const webServerPort = 8080; // web server port const webServerPort = 8080; // web server port
const webServerName = "Noobish's Server" // web server name (will be displayed in title, bookmarks...)
const xdrdServerHost = '192.168.1.15'; // xdrd server iP const xdrdServerHost = '192.168.1.15'; // xdrd server iP
const xdrdServerPort = 7373; // xdrd server port const xdrdServerPort = 7373; // xdrd server port
@@ -10,6 +11,7 @@ const qthLongitude = '15.924395'; // your longitude, useful for maps.fmdx.pl int
const verboseMode = false; // if true, console will display extra messages const verboseMode = false; // if true, console will display extra messages
// DO NOT MODIFY ANYTHING BELOW THIS LINE
module.exports = { module.exports = {
webServerHost, webServerPort, xdrdServerHost, xdrdServerPort, xdrdPassword, qthLatitude, qthLongitude, verboseMode webServerHost, webServerPort, webServerName, xdrdServerHost, xdrdServerPort, xdrdPassword, qthLatitude, qthLongitude, verboseMode
}; };

View File

@@ -170,7 +170,8 @@ h3 {
padding: 0; padding: 0;
list-style-type: none; list-style-type: none;
height: 425px; height: 425px;
overflow: scroll; overflow-y: scroll;
overflow-x: hidden;
margin-bottom: 0; margin-bottom: 0;
} }

View File

@@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>FM-DX Webserver [Noobish's Server]</title> <title>FM-DX Webserver</title>
<link href="css/styles.css" type="text/css" rel="stylesheet"> <link href="css/styles.css" type="text/css" rel="stylesheet">
<link href="css/flags.min.css" type="text/css" rel="stylesheet"> <link href="css/flags.min.css" type="text/css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css" type="text/css" rel="stylesheet"> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css" type="text/css" rel="stylesheet">

View File

@@ -39,12 +39,15 @@ function zoomOut() {
} }
function getInitialSettings() { function getInitialSettings() {
fetch('/coordinates') fetch('/static_data')
.then(response => response.json()) .then(response => response.json())
.then(data => { .then(data => {
// Use the received data (data.qthLatitude, data.qthLongitude) as needed // Use the received data (data.qthLatitude, data.qthLongitude) as needed
localStorage.setItem('qthLatitude', data.qthLatitude); localStorage.setItem('qthLatitude', data.qthLatitude);
localStorage.setItem('qthLongitude', data.qthLongitude); localStorage.setItem('qthLongitude', data.qthLongitude);
localStorage.setItem('webServerName', data.webServerName);
document.title = 'FM-DX Webserver [' + data.webServerName + ']';
}) })
.catch(error => console.error('Error:', error)); .catch(error => console.error('Error:', error));
} }