Initial push 0.2.0

This commit is contained in:
Alex Rennie-Lis
2024-04-05 22:57:26 +01:00
parent 93472ae250
commit 1d8bd0c989
55 changed files with 3515 additions and 0 deletions

81
code/lib/data.js Normal file
View File

@@ -0,0 +1,81 @@
const fs = require ('fs');
try {
var data = JSON.parse (fs.readFileSync ('./data.json').toString ());
log.write ('Opened data file');
}
catch (error) {
var data = {
users: []
};
fs.writeFileSync ('./data.json', JSON.stringify (data, null, 2));
}
const persistData = () => {
var content = {
users: []
};
Object.keys (users).forEach ((user) => {
content.users.push ({
username: user,
password: users[user].password,
vlan: users[user].vlan
});
});
fs.writeFileSync ('./data.json', JSON.stringify (content, null, 2));
}
users = {};
data.users.forEach ((e) => {
users[e.username] = {
password: e.password,
vlan: e.vlan
}
});
module.exports = {
authUser: (username, password) => {
if (users[username] && users[username].password == password) {
return {
vlan: users[username].vlan
};
}
else {
return false;
}
},
createUser: (payload, callback) => {
try {
payload = JSON.parse (payload);
var username = payload.username;
var password = payload.password;
var vlan = payload.vlan;
users[username] = {
password: password,
vlan: vlan
};
persistData ();
callback ("OK\n\n", null);
}
catch (error) {
callback (null, "Error\n\n");
}
},
updateUser: (payload, callback) => {
payload = JSON.parse (payload);
callback ("OK\n\n", null);
},
deleteUser: (username, callback) => {
try {
delete users[username];
persistData ();
callback ("OK\n\n", null);
}
catch (error) {
callback (null, "Error\n\n");
}
}
}

63
code/lib/handlers.js Normal file
View File

@@ -0,0 +1,63 @@
const radius = require ('radius');
const data = require ('./data.js');
module.exports = {
radius: {
authentication: (msg, info, callback) => {
try {
var decoded = radius.decode ({
packet: msg,
secret: config.client_secret
});
if (decoded.code == 'Access-Request') {
var username = decoded.attributes['User-Name'];
var password = decoded.attributes['User-Password'];
var user = data.authUser (username, password);
var vlan = false;
if (user) {
log.write (username + " access granted to VLAN " + user.vlan);
code = 'Access-Accept';
vlan = user.vlan;
}
else {
if (config.default_vlan_enabled && config.default_vlan_id) {
// Permit into default vlan if enabled
log.write (username + " unknown. Placing into default VLAN.");
code = 'Access-Accept';
vlan = config.default_vlan_id;
}
else {
log.write (username + " access denied.");
code = 'Access-Reject';
}
}
var response = radius.encode_response ({
packet: decoded,
code: code,
secret: config.client_secret,
attributes: {
"Tunnel-Medium-Type": 6,
"Tunnel-Type": 13,
"Tunnel-Private-Group-Id": vlan
}
});
callback (response, null);
}
}
catch (error) {
log.write ('Cannot read RADIUS packet');
log.write (error);
callback (null, "Error. Cannot read RADIUS packet.");
}
},
accounting: (msg, info, callback) => {
log.write ('Unsupported RADIUS packet');
callback (null, "Error. Unsupported RADIUS packet.");
}
},
user: {
create: data.createUser,
update: data.updateUser,
delete: data.deleteUser
}
}

6
code/lib/logger.js Normal file
View File

@@ -0,0 +1,6 @@
module.exports = {
write: (message) => {
let now = new Date ();
console.log (now.toISOString () + ' ' + message);
}
}