mirror of
https://github.com/louislam/uptime-kuma.git
synced 2026-08-19 01:14:48 -05:00
77 lines
2.8 KiB
JavaScript
77 lines
2.8 KiB
JavaScript
const { describe, test } = require("node:test");
|
|
const assert = require("node:assert/strict");
|
|
const dgram = require("dgram");
|
|
const radius = require("radius");
|
|
const { radius: radiusCheck } = require("../../server/util-server");
|
|
|
|
/**
|
|
* Start a UDP RADIUS server that replies to every Access-Request with the given response code.
|
|
* @param {string} secret RADIUS shared secret
|
|
* @param {string} responseCode RADIUS response code to send back
|
|
* @returns {Promise<{socket: import("dgram").Socket, port: number, address: string}>} The bound UDP socket and its address
|
|
*/
|
|
function startRadiusServer(secret, responseCode) {
|
|
const socket = dgram.createSocket("udp4");
|
|
|
|
socket.on("message", (msg, rinfo) => {
|
|
try {
|
|
const request = radius.decode({ packet: msg, secret });
|
|
const response = radius.encode_response({
|
|
packet: request,
|
|
code: responseCode,
|
|
secret,
|
|
});
|
|
socket.send(response, 0, response.length, rinfo.port, rinfo.address, () => {});
|
|
} catch (error) {
|
|
// Ignore decode errors, the client will time out
|
|
}
|
|
});
|
|
|
|
return new Promise((resolve) => {
|
|
socket.on("listening", () => {
|
|
const { address, port } = socket.address();
|
|
resolve({ socket, port, address });
|
|
});
|
|
socket.bind(0, "127.0.0.1");
|
|
});
|
|
}
|
|
|
|
describe("RadiusMonitorType", () => {
|
|
const secret = "testing123";
|
|
|
|
test("radius() resolves with code Access-Challenge when server responds with Access-Challenge", async () => {
|
|
const { socket, port } = await startRadiusServer(secret, "Access-Challenge");
|
|
|
|
try {
|
|
const resp = await radiusCheck("127.0.0.1", "bob", "testpw", "called", "calling", secret, port, 2000);
|
|
assert.strictEqual(resp.code, "Access-Challenge");
|
|
} finally {
|
|
socket.close();
|
|
}
|
|
});
|
|
|
|
test("radius() rejects when server responds with Access-Reject", async () => {
|
|
const { socket, port } = await startRadiusServer(secret, "Access-Reject");
|
|
|
|
try {
|
|
await assert.rejects(
|
|
radiusCheck("127.0.0.1", "bob", "testpw", "called", "calling", secret, port, 2000),
|
|
/RADIUS Access-Reject from 127\.0\.0\.1:/
|
|
);
|
|
} finally {
|
|
socket.close();
|
|
}
|
|
});
|
|
|
|
test("radius() resolves with code Access-Accept when server responds with Access-Accept", async () => {
|
|
const { socket, port } = await startRadiusServer(secret, "Access-Accept");
|
|
|
|
try {
|
|
const resp = await radiusCheck("127.0.0.1", "bob", "testpw", "called", "calling", secret, port, 2000);
|
|
assert.strictEqual(resp.code, "Access-Accept");
|
|
} finally {
|
|
socket.close();
|
|
}
|
|
});
|
|
});
|