57 lines
1.6 KiB
JavaScript
57 lines
1.6 KiB
JavaScript
import express from 'express';
|
|
import morgan from 'morgan';
|
|
|
|
const app = express();
|
|
app.use(express.json());
|
|
app.use(morgan('dev'));
|
|
|
|
const VLAN_ID = process.env.VLAN_ID || '2';
|
|
const MAX_UP = process.env.MAX_UP || '10000000'; // bits per second
|
|
const MAX_DOWN = process.env.MAX_DOWN || '10000000'; // bits per second
|
|
|
|
// Helper: standard Accept with VLAN + bandwidth
|
|
function buildAcceptPayload(extra = {}) {
|
|
return {
|
|
control: {
|
|
'Auth-Type': 'Accept',
|
|
...extra.control,
|
|
},
|
|
reply: {
|
|
'Tunnel-Type': 'VLAN',
|
|
'Tunnel-Medium-Type': 'IEEE-802',
|
|
'Tunnel-Private-Group-Id': String(VLAN_ID),
|
|
'WISPr-Bandwidth-Max-Down': String(MAX_DOWN),
|
|
'WISPr-Bandwidth-Max-Up': String(MAX_UP),
|
|
...extra.reply,
|
|
},
|
|
};
|
|
}
|
|
|
|
// Authorize endpoint: FreeRADIUS rlm_rest calls this in authorize {}
|
|
app.post('/authorize', (req, res) => {
|
|
console.log('--- RADIUS Authorize Request ---');
|
|
console.log(JSON.stringify(req.body, null, 2));
|
|
|
|
// Por ahora aprobamos todas las solicitudes válidas (si traen User-Name)
|
|
const attrs = (req.body && (req.body.attributes || req.body.request)) || {};
|
|
if (!attrs['User-Name'] && !attrs['User-Name*0']) {
|
|
// Responder vacío -> no cambia nada; o devolver 204
|
|
return res.status(200).json({});
|
|
}
|
|
|
|
return res.status(200).json(buildAcceptPayload());
|
|
});
|
|
|
|
// Accounting endpoint (opcional)
|
|
app.post('/accounting', (req, res) => {
|
|
console.log('--- RADIUS Accounting ---');
|
|
console.log(JSON.stringify(req.body, null, 2));
|
|
return res.status(200).json({});
|
|
});
|
|
|
|
const port = process.env.PORT || 3000;
|
|
app.listen(port, () => {
|
|
console.log(`Node RADIUS REST API listening on :${port}`);
|
|
});
|
|
|