Files
uptime-kuma/test/backend-test/test-radius.js
T

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();
}
});
});