1
0
mirror of https://github.com/KubaPro010/fm-dx-webserver.git synced 2026-02-26 14:11:59 +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 path = require('path');
const net = require('net');
const cors = require('cors');
const axios = require('axios');
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 config = require('./userconfig');
/* 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 });
@@ -34,7 +30,7 @@ wss.on('connection', (ws, request) => {
const clientIp = request.connection.remoteAddress;
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) => {
if(config.verboseMode === true) {
@@ -47,7 +43,7 @@ wss.on('connection', (ws, request) => {
ws.on('close', (code, reason) => {
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);
@@ -60,16 +56,11 @@ app.use(express.static(path.join(__dirname, 'web')));
// Function to authenticate with the xdrd server
function authenticateWithXdrd(client, salt, password) {
const sha1 = crypto.createHash('sha1');
// Convert salt and password to buffers
const saltBuffer = Buffer.from(salt, 'utf-8');
const passwordBuffer = Buffer.from(password, 'utf-8');
// Update the hash context with salt and password
sha1.update(saltBuffer);
sha1.update(passwordBuffer);
// Finalize the hash and get the hashed password
const hashedPassword = sha1.digest('hex');
client.write(hashedPassword + '\n');
client.write('x\n');
@@ -83,7 +74,7 @@ client.connect(xdrdServerPort, xdrdServerHost, () => {
const receivedData = data.toString();
const lines = receivedData.split('\n');
// Assuming that the first message contains the salt
// Salt reading, so we can authenticate
if (lines.length > 0 && !receivedPassword) {
receivedSalt = lines[0].trim();
authenticateWithXdrd(client, receivedSalt, xdrdPassword);
@@ -120,32 +111,6 @@ httpServer.listen(webServerPort, webServerHost, () => {
});
app.get('/coordinates', (req, res) => {
// Sending the coordinates to the client
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());
app.get('/static_data', (req, res) => {
res.json({ qthLatitude, qthLongitude, webServerName });
});

111
package-lock.json generated
View File

@@ -9,15 +9,13 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"axios": "^1.6.0",
"cors": "^2.8.5",
"express": "^4.18.2",
"express": "4.18.2",
"http": "^0.0.1-security",
"https": "^1.0.0",
"koffi": "^2.6.6",
"net": "^1.0.2",
"websocket": "^1.0.34",
"ws": "^8.14.2"
"https": "1.0.0",
"koffi": "2.7.2",
"net": "1.0.2",
"websocket": "1.0.34",
"ws": "8.14.2"
}
},
"node_modules/accepts": {
@@ -37,34 +35,6 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"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": {
"version": "1.20.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
@@ -121,17 +91,6 @@
"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": {
"version": "0.5.4",
"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",
"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": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
@@ -206,14 +153,6 @@
"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": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -361,25 +300,6 @@
"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": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -528,9 +448,9 @@
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
},
"node_modules/koffi": {
"version": "2.6.6",
"resolved": "https://registry.npmjs.org/koffi/-/koffi-2.6.6.tgz",
"integrity": "sha512-+iFkVdkZYsqlgJLU4cm7AbhsCCxlmR62IfWLvpQGZ7FCkit5aECE0nAXn5hjowhxCUwFzfvhmlUaWEngeZlnTQ==",
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/koffi/-/koffi-2.7.2.tgz",
"integrity": "sha512-AWcsEKETQuELxK0Wq/aXDkDiNFFY41TxZQSrKm2Nd6HO/KTHeohPOOIlh2OfQnBXJbRjx5etpWt8cbqMUZo2sg==",
"hasInstallScript": true
},
"node_modules/media-typer": {
@@ -617,14 +537,6 @@
"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": {
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
@@ -669,11 +581,6 @@
"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": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",

View File

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

View File

@@ -1,5 +1,6 @@
const webServerHost = '192.168.1.14'; // IP of the web server
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 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
// DO NOT MODIFY ANYTHING BELOW THIS LINE
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;
list-style-type: none;
height: 425px;
overflow: scroll;
overflow-y: scroll;
overflow-x: hidden;
margin-bottom: 0;
}

View File

@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html>
<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/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">

View File

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