chore(deps): update compression dependencys and vendor the radius dependency (#6168)

Co-authored-by: Frank Elsinga <frank@elsinga.de>
This commit is contained in:
matts 2025-10-09 14:05:39 -07:00 committed by GitHub
parent 43506c1b1d
commit 2303302eef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 183 additions and 75 deletions

View File

@ -17,7 +17,7 @@ Uptime Kuma is an easy-to-use self-hosted monitoring tool.
Try it! Try it!
Demo Server (Location: Frankfurt - Germany): https://demo.kuma.pet/start-demo Demo Server (Location: Frankfurt - Germany): <https://demo.kuma.pet/start-demo>
It is a temporary live demo, all data will be deleted after 10 minutes. Sponsored by [Uptime Kuma Sponsors](https://github.com/louislam/uptime-kuma#%EF%B8%8F-sponsors). It is a temporary live demo, all data will be deleted after 10 minutes. Sponsored by [Uptime Kuma Sponsors](https://github.com/louislam/uptime-kuma#%EF%B8%8F-sponsors).
@ -50,7 +50,7 @@ Uptime Kuma is now running on <http://0.0.0.0:3001>.
> [!NOTE] > [!NOTE]
> If you want to limit exposure to localhost (without exposing port for other users or to use a [reverse proxy](https://github.com/louislam/uptime-kuma/wiki/Reverse-Proxy)), you can expose the port like this: > If you want to limit exposure to localhost (without exposing port for other users or to use a [reverse proxy](https://github.com/louislam/uptime-kuma/wiki/Reverse-Proxy)), you can expose the port like this:
> >
> ```bash > ```bash
> docker run -d --restart=always -p 127.0.0.1:3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1 > docker run -d --restart=always -p 127.0.0.1:3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1
> ``` > ```
@ -85,7 +85,7 @@ npm install pm2 -g && pm2 install pm2-logrotate
pm2 start server/server.js --name uptime-kuma pm2 start server/server.js --name uptime-kuma
``` ```
Uptime Kuma is now running on http://localhost:3001 Uptime Kuma is now running on <http://localhost:3001>
More useful PM2 Commands More useful PM2 Commands
@ -101,19 +101,19 @@ pm2 save && pm2 startup
If you need more options or need to browse via a reverse proxy, please read: If you need more options or need to browse via a reverse proxy, please read:
https://github.com/louislam/uptime-kuma/wiki/%F0%9F%94%A7-How-to-Install <https://github.com/louislam/uptime-kuma/wiki/%F0%9F%94%A7-How-to-Install>
## 🆙 How to Update ## 🆙 How to Update
Please read: Please read:
https://github.com/louislam/uptime-kuma/wiki/%F0%9F%86%99-How-to-Update <https://github.com/louislam/uptime-kuma/wiki/%F0%9F%86%99-How-to-Update>
## 🆕 What's Next? ## 🆕 What's Next?
I will assign requests/issues to the next milestone. I will assign requests/issues to the next milestone.
https://github.com/louislam/uptime-kuma/milestones <https://github.com/louislam/uptime-kuma/milestones>
## ❤️ Sponsors ## ❤️ Sponsors
@ -174,11 +174,11 @@ We DO NOT accept all types of pull requests and do not want to waste your time.
There are a lot of pull requests right now, but I don't have time to test them all. There are a lot of pull requests right now, but I don't have time to test them all.
If you want to help, you can check this: If you want to help, you can check this:
https://github.com/louislam/uptime-kuma/wiki/Test-Pull-Requests <https://github.com/louislam/uptime-kuma/wiki/Test-Pull-Requests>
### Test Beta Version ### Test Beta Version
Check out the latest beta release here: https://github.com/louislam/uptime-kuma/releases Check out the latest beta release here: <https://github.com/louislam/uptime-kuma/releases>
### Bug Reports / Feature Requests ### Bug Reports / Feature Requests
@ -192,5 +192,3 @@ If you want to translate Uptime Kuma into your language, please visit [Weblate R
Feel free to correct the grammar in the documentation or code. Feel free to correct the grammar in the documentation or code.
My mother language is not English and my grammar is not that great. My mother language is not English and my grammar is not that great.

71
package-lock.json generated
View File

@ -23,7 +23,7 @@
"chroma-js": "~2.4.2", "chroma-js": "~2.4.2",
"command-exists": "~1.2.9", "command-exists": "~1.2.9",
"compare-versions": "~3.6.0", "compare-versions": "~3.6.0",
"compression": "~1.7.4", "compression": "~1.8.1",
"country-flag-emoji-polyfill": "^0.1.8", "country-flag-emoji-polyfill": "^0.1.8",
"croner": "~8.1.0", "croner": "~8.1.0",
"dayjs": "~1.11.5", "dayjs": "~1.11.5",
@ -60,7 +60,7 @@
"nanoid": "~3.3.4", "nanoid": "~3.3.4",
"net-snmp": "^3.11.2", "net-snmp": "^3.11.2",
"node-cloudflared-tunnel": "~1.0.9", "node-cloudflared-tunnel": "~1.0.9",
"node-radius-client": "~1.0.0", "node-radius-utils": "~1.2.0",
"nodemailer": "~6.9.13", "nodemailer": "~6.9.13",
"nostr-tools": "^2.10.4", "nostr-tools": "^2.10.4",
"notp": "~2.0.3", "notp": "~2.0.3",
@ -74,6 +74,7 @@
"promisify-child-process": "~4.1.2", "promisify-child-process": "~4.1.2",
"protobufjs": "~7.2.4", "protobufjs": "~7.2.4",
"qs": "~6.10.4", "qs": "~6.10.4",
"radius": "~1.1.4",
"redbean-node": "~0.3.0", "redbean-node": "~0.3.0",
"redis": "~4.5.1", "redis": "~4.5.1",
"semver": "~7.5.4", "semver": "~7.5.4",
@ -7065,16 +7066,16 @@
} }
}, },
"node_modules/compression": { "node_modules/compression": {
"version": "1.7.5", "version": "1.8.1",
"resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz",
"integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"bytes": "3.1.2", "bytes": "3.1.2",
"compressible": "~2.0.18", "compressible": "~2.0.18",
"debug": "2.6.9", "debug": "2.6.9",
"negotiator": "~0.6.4", "negotiator": "~0.6.4",
"on-headers": "~1.0.2", "on-headers": "~1.1.0",
"safe-buffer": "5.2.1", "safe-buffer": "5.2.1",
"vary": "~1.1.2" "vary": "~1.1.2"
}, },
@ -10302,13 +10303,6 @@
"readable-stream": "^3.6.0" "readable-stream": "^3.6.0"
} }
}, },
"node_modules/hoek": {
"version": "6.1.3",
"resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz",
"integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==",
"deprecated": "This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.",
"license": "BSD-3-Clause"
},
"node_modules/hookable": { "node_modules/hookable": {
"version": "5.5.3", "version": "5.5.3",
"resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
@ -11251,18 +11245,6 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/isemail": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz",
"integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==",
"license": "BSD-3-Clause",
"dependencies": {
"punycode": "2.x.x"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/isexe": { "node_modules/isexe": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@ -11293,18 +11275,6 @@
"@pkgjs/parseargs": "^0.11.0" "@pkgjs/parseargs": "^0.11.0"
} }
}, },
"node_modules/joi": {
"version": "14.3.1",
"resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz",
"integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==",
"deprecated": "This module has moved and is now available at @hapi/joi. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.",
"license": "BSD-3-Clause",
"dependencies": {
"hoek": "6.x.x",
"isemail": "3.x.x",
"topo": "3.x.x"
}
},
"node_modules/jose": { "node_modules/jose": {
"version": "4.15.9", "version": "4.15.9",
"resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz",
@ -12784,17 +12754,6 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0" "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
} }
}, },
"node_modules/node-radius-client": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-radius-client/-/node-radius-client-1.0.0.tgz",
"integrity": "sha512-FkR9cMV5hNoX+kKDUTzuagvEixlLiaEJQ1/ywOdhahsihKrGDhVZmnCvmrCStA589MT3yuC/J2eKc6z68IGdBw==",
"license": "MIT",
"dependencies": {
"joi": "^14.3.1",
"node-radius-utils": "^1.2.0",
"radius": "^1.1.4"
}
},
"node_modules/node-radius-utils": { "node_modules/node-radius-utils": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/node-radius-utils/-/node-radius-utils-1.2.0.tgz", "resolved": "https://registry.npmjs.org/node-radius-utils/-/node-radius-utils-1.2.0.tgz",
@ -13074,9 +13033,9 @@
} }
}, },
"node_modules/on-headers": { "node_modules/on-headers": {
"version": "1.0.2", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">= 0.8" "node": ">= 0.8"
@ -16675,16 +16634,6 @@
"node": ">=0.6" "node": ">=0.6"
} }
}, },
"node_modules/topo": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz",
"integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==",
"deprecated": "This module has moved and is now available at @hapi/topo. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.",
"license": "BSD-3-Clause",
"dependencies": {
"hoek": "6.x.x"
}
},
"node_modules/totalist": { "node_modules/totalist": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",

View File

@ -82,7 +82,7 @@
"chroma-js": "~2.4.2", "chroma-js": "~2.4.2",
"command-exists": "~1.2.9", "command-exists": "~1.2.9",
"compare-versions": "~3.6.0", "compare-versions": "~3.6.0",
"compression": "~1.7.4", "compression": "~1.8.1",
"country-flag-emoji-polyfill": "^0.1.8", "country-flag-emoji-polyfill": "^0.1.8",
"croner": "~8.1.0", "croner": "~8.1.0",
"dayjs": "~1.11.5", "dayjs": "~1.11.5",
@ -119,7 +119,6 @@
"nanoid": "~3.3.4", "nanoid": "~3.3.4",
"net-snmp": "^3.11.2", "net-snmp": "^3.11.2",
"node-cloudflared-tunnel": "~1.0.9", "node-cloudflared-tunnel": "~1.0.9",
"node-radius-client": "~1.0.0",
"nodemailer": "~6.9.13", "nodemailer": "~6.9.13",
"nostr-tools": "^2.10.4", "nostr-tools": "^2.10.4",
"notp": "~2.0.3", "notp": "~2.0.3",
@ -133,6 +132,8 @@
"promisify-child-process": "~4.1.2", "promisify-child-process": "~4.1.2",
"protobufjs": "~7.2.4", "protobufjs": "~7.2.4",
"qs": "~6.10.4", "qs": "~6.10.4",
"radius": "~1.1.4",
"node-radius-utils": "~1.2.0",
"redbean-node": "~0.3.0", "redbean-node": "~0.3.0",
"redis": "~4.5.1", "redis": "~4.5.1",
"semver": "~7.5.4", "semver": "~7.5.4",

160
server/radius-client.js Normal file
View File

@ -0,0 +1,160 @@
/**
* Custom RADIUS Client Implementation
*
* This is a lightweight RADIUS client implementation using the base `radius` package
* Due to lack of maintenance in node-radius-client this was forked
*
* Implements RADIUS Access-Request functionality compatible with the original
* node-radius-client API used in Uptime Kuma.
*/
const dgram = require("dgram");
const radius = require("radius");
/**
* RADIUS Client class
*/
class RadiusClient {
/**
* @param {object} options Client configuration
* @param {string} options.host RADIUS server hostname
* @param {number} options.hostPort RADIUS server port (default: 1812)
* @param {number} options.timeout Request timeout in milliseconds (default: 2500)
* @param {number} options.retries Number of retry attempts (default: 1)
* @param {Array} options.dictionaries RADIUS dictionaries for attribute encoding
*/
constructor(options) {
this.host = options.host;
this.port = options.hostPort || 1812;
this.timeout = options.timeout || 2500;
this.retries = options.retries || 1;
this.dictionaries = options.dictionaries || [];
}
/**
* Send RADIUS Access-Request
* @param {object} params Request parameters
* @param {string} params.secret RADIUS shared secret
* @param {Array} params.attributes Array of [attribute, value] pairs
* @returns {Promise<object>} RADIUS response
*/
accessRequest(params) {
return new Promise((resolve, reject) => {
const { secret, attributes } = params;
// Build RADIUS packet
const packet = {
code: "Access-Request",
secret: secret,
attributes: {}
};
// Convert attributes array to object
attributes.forEach(([ attr, value ]) => {
packet.attributes[attr] = value;
});
// Encode packet
let encodedPacket;
try {
encodedPacket = radius.encode(packet);
} catch (error) {
return reject(new Error(`RADIUS packet encoding failed: ${error.message}`));
}
// Create UDP socket
const socket = dgram.createSocket("udp4");
let attempts = 0;
let responseReceived = false;
let timeoutHandle;
/**
* Send RADIUS request with retry logic
* @returns {void}
*/
const sendRequest = () => {
attempts++;
socket.send(encodedPacket, 0, encodedPacket.length, this.port, this.host, (err) => {
if (err) {
socket.close();
return reject(new Error(`Failed to send RADIUS request: ${err.message}`));
}
// Set timeout for this attempt
timeoutHandle = setTimeout(() => {
if (responseReceived) {
return;
}
if (attempts < this.retries + 1) {
// Retry
sendRequest();
} else {
// All retries exhausted
socket.close();
reject(new Error(`RADIUS request timeout after ${attempts} attempts`));
}
}, this.timeout);
});
};
// Handle response
socket.on("message", (msg) => {
if (responseReceived) {
return;
}
responseReceived = true;
clearTimeout(timeoutHandle);
let response;
try {
response = radius.decode({ packet: msg,
secret: secret });
} catch (error) {
socket.close();
return reject(new Error(`RADIUS response decoding failed: ${error.message}`));
}
socket.close();
// Map response code to match node-radius-client format
const responseCode = response.code;
if (responseCode === "Access-Accept") {
resolve({ code: "Access-Accept",
...response });
} else if (responseCode === "Access-Reject") {
// Reject as error to match original behavior
const error = new Error("Access-Reject");
error.response = { code: "Access-Reject" };
reject(error);
} else if (responseCode === "Access-Challenge") {
// Challenge response
const error = new Error("Access-Challenge");
error.response = { code: "Access-Challenge" };
reject(error);
} else {
resolve({ code: responseCode,
...response });
}
});
// Handle socket errors
socket.on("error", (err) => {
if (!responseReceived) {
responseReceived = true;
clearTimeout(timeoutHandle);
socket.close();
reject(new Error(`RADIUS socket error: ${err.message}`));
}
});
// Start first request
sendRequest();
});
}
}
module.exports = RadiusClient;

View File

@ -19,7 +19,7 @@ const { NtlmClient } = require("./modules/axios-ntlm/lib/ntlmClient.js");
const { Settings } = require("./settings"); const { Settings } = require("./settings");
const grpc = require("@grpc/grpc-js"); const grpc = require("@grpc/grpc-js");
const protojs = require("protobufjs"); const protojs = require("protobufjs");
const radiusClient = require("node-radius-client"); const RadiusClient = require("./radius-client");
const redis = require("redis"); const redis = require("redis");
const oidc = require("openid-client"); const oidc = require("openid-client");
const tls = require("tls"); const tls = require("tls");
@ -498,7 +498,7 @@ exports.radius = function (
port = 1812, port = 1812,
timeout = 2500, timeout = 2500,
) { ) {
const client = new radiusClient({ const client = new RadiusClient({
host: hostname, host: hostname,
hostPort: port, hostPort: port,
timeout: timeout, timeout: timeout,