1
0
Fork 0
auth.rxbn.de/bin/cli/cmds/user_management.js

239 lines
7.4 KiB
JavaScript
Raw Normal View History

2019-06-17 00:28:44 +00:00
/*
* This file is part of the authRXBN single sign-on package.
*
* (c) Ruben Meyer <contact@rxbn.de>
*/
module.exports = {
2019-09-01 19:29:36 +00:00
'command': 'user <action> <nick> [data...]',
2019-06-17 00:28:44 +00:00
'description': 'add, get, update or remove an user',
'actionDependencies': ['vorpal'],
'action': (actionDependencies) => {
let vorpal = actionDependencies.vorpal;
return (args, cb) => {
if(typeof args.action !== 'undefined') {
let action = args.action.toLowerCase();
let profile = {
user: args.nick,
2019-09-01 19:29:36 +00:00
pass: null,
2019-06-17 00:28:44 +00:00
mail: null,
group: 0
};
2019-09-01 19:29:36 +00:00
// add a new user
2019-06-17 00:28:44 +00:00
if(action === 'add') {
2019-09-01 19:29:36 +00:00
if(Array.isArray(args.data) && args.data.length >= 1) {
// set data
profile.pass = global['modules'].auth.generateHash(args.data[0]);
if(args.data.length >= 2) profile.mail = args.data[1];
if(args.data.length >= 3) profile.group = args.data[2];
2019-06-17 00:28:44 +00:00
2019-09-01 19:29:36 +00:00
// haystack verifying
let haystack = profile.user;
if(typeof profile.mail !== 'undefined' && profile.mail !== null) haystack = [profile.user, profile.mail];
// query user by haystack
global['modules'].database.getUser(haystack, (err, rep) => {
if(err) {
global['logs'].error("ERR: While finding user");
global['logs'].error(err);
2019-06-17 00:28:44 +00:00
}
2019-09-01 19:29:36 +00:00
else {
// no users exist, add user
if (!rep) {
global['modules'].database.addUser(profile.user, (profile.mail || ''), profile.pass, profile.group, (errAdd, repAdd) => {
if(errAdd) {
global['logs'].error("ERR: While adding user");
global['logs'].error(errAdd);
}
else vorpal.log("Reply: "+repAdd);
});
// user already exists
} else {
vorpal.log("User exists: ");
2019-09-02 22:22:25 +00:00
rep.forEach((el, i) => {
el["passhash"] = undefined; // not needed
rep[i] = el;
});
2019-09-01 19:29:36 +00:00
vorpal.log(rep);
}
}
});
// missing data
} else {
global['logs'].log("No data is present or is missing. Please see:");
global['logs'].log("$ user help add");
cb();
}
// query users
2019-11-23 23:42:13 +00:00
} else if(action === 'get' || action === 'ls') {
2019-09-01 19:29:36 +00:00
// wildcard catch-all
if(profile.user === '*') {
global['modules'].database.getUsers((err, rep) => {
if(rep) {
2019-09-02 22:22:25 +00:00
rep.forEach((el, i) => {
el["passhash"] = undefined; // not needed
rep[i] = el;
});
2019-09-01 19:29:36 +00:00
global['logs'].log(rep);
}
if(err) {
global['logs'].error('$ user get *');
global['logs'].error(err);
}
});
} else {
// query users by first input <nickname>
global['modules'].database.getUser(profile.user, (err, rep) => {
2019-09-02 22:22:25 +00:00
// user exists
if(rep && rep.length == 1) {
2019-09-01 19:29:36 +00:00
global['logs'].log("User exists: ");
2019-09-02 22:22:25 +00:00
rep.forEach((el, i) => {
el["passhash"] = undefined; // not needed
rep[i] = el;
});
2019-09-01 19:29:36 +00:00
global['logs'].log(rep);
} else {
2019-09-02 22:22:25 +00:00
// found more than one user
if(rep && rep.length >= 2) {
global['logs'].warn("multiple users found for "+profile.user+".");
rep.forEach((el) => {
global['logs'].warn("found user with id: "+el._id);
});
// user does not exist
} else {
global['logs'].warn("User "+profile.user+" doesn't exist.");
}
2019-09-01 19:29:36 +00:00
}
2019-09-02 22:22:25 +00:00
// query error
2019-09-01 19:29:36 +00:00
if(err) {
global['logs'].error('$ user get '+profile.user);
global['logs'].error(err);
}
});
}
2019-09-02 22:22:25 +00:00
// update users, just one property
2019-06-17 00:28:44 +00:00
} else if(action === 'update') {
2019-09-02 22:22:25 +00:00
if(args.data.length < 2) global['logs'].error("No data supplied.");
2019-06-17 00:28:44 +00:00
else {
2019-09-02 22:22:25 +00:00
let property = args.data[0];
2019-06-17 00:28:44 +00:00
let param = args.data[1];
2019-09-02 22:22:25 +00:00
global['logs'].debug("Prop: "+property+"; Param: "+param);
// query user
global['modules'].database.getUser(profile.user, (err, rep) => {
// user exists
if(rep && rep.length == 1) {
let obj = {};
obj[property] = param;
global['modules'].database.updateUser(String(rep[0]._id), obj, (errUpd, repUpd) => {
// updated user
if(repUpd) {
global['logs'].log("User with id "+String(rep[0]._id)+" was updated.");
// user not updated
} else {
global['logs'].warn("User with id "+String(rep[0]._id)+" doesn't exist.");
}
2019-11-23 23:42:13 +00:00
2019-09-02 22:22:25 +00:00
// query error
if(errUpd) {
global['logs'].error('$ user update '+profile.user+' '+property+' '+param+' [on update]');
global['logs'].error(errUpd);
}
});
} else {
// found more than one user
if(rep && rep.length >= 2) {
global['logs'].warn("multiple users found for "+profile.user+". bad state. can't update.");
rep.forEach((el) => {
global['logs'].warn("found user with id: "+el._id);
});
// user does not exist
} else {
global['logs'].warn("User "+profile.user+" doesn't exist.");
}
}
// query error
if(err) {
global['logs'].error('$ user update '+profile.user+' '+field+' '+param+' [on query]');
global['logs'].error(err);
}
});
2019-06-17 00:28:44 +00:00
}
2019-09-02 22:22:25 +00:00
// remove users
2019-06-17 00:28:44 +00:00
} else if(action === 'remove' || action === 'delete') {
2019-09-01 19:29:36 +00:00
// haystack
let haystack = profile.user;
if(typeof profile.mail !== 'undefined' && profile.mail !== null) haystack = [profile.user, profile.mail];
2019-09-02 22:22:25 +00:00
// query user
2019-09-01 19:29:36 +00:00
global['modules'].database.getUser(haystack, (err, rep) => {
2019-06-17 00:28:44 +00:00
if(rep) {
2019-09-02 22:22:25 +00:00
vorpal.log("user exists. deleting him.");
2019-09-01 19:29:36 +00:00
global['logs'].debug(rep);
2019-09-02 22:22:25 +00:00
// remove user
2019-09-01 19:29:36 +00:00
global['modules'].database.delUser(rep[0].email, (errDel, repDel) => {
if(repDel) {
2019-09-02 22:22:25 +00:00
vorpal.log("deleted user.");
2019-09-01 19:29:36 +00:00
global['logs'].debug(repDel);
}
else {
2019-09-02 22:22:25 +00:00
vorpal.log("ERR: while deleting user.");
2019-09-01 19:29:36 +00:00
global['logs'].debug(errDel);
}
2019-06-17 00:28:44 +00:00
});
}
});
2019-09-01 19:29:36 +00:00
} else if(action === 'help') {
if(args.nick === 'add') {
vorpal.log("user add <nickname> <raw password> <mail> [group]");
vorpal.log("<nickname>: user nickname");
vorpal.log("<raw password>: will be hashed ASAP");
vorpal.log("<mail>: format: user@example.tld");
vorpal.log("[group]: not needed; only Numbers; group id");
vorpal.log("---");
2019-09-02 22:22:25 +00:00
vorpal.log("returns 0 or 1 and printing errors");
2019-09-01 19:29:36 +00:00
} else if(args.nick === 'get') {
vorpal.log("user get <nickname or email>");
vorpal.log("<nickname or email>: searching both in both; format: foobar OR user@example.tld");
vorpal.log("---");
vorpal.log("user get * - to get all users");
2019-09-02 22:22:25 +00:00
vorpal.log("prints JSON-object of user data");
2019-09-01 19:29:36 +00:00
} else if(args.nick === 'update') {
vorpal.log("user update <nickname> <field> <parameter>");
vorpal.log("<nickname>: user nickname");
vorpal.log("<field>: string");
vorpal.log("<parameter>: mixed data; will be converted to Boolean, Number or String");
vorpal.log("---");
2019-09-02 22:22:25 +00:00
vorpal.log("returns 0 or 1 and printing errors");
vorpal.log("prints JSON-object of updated user data");
2019-09-01 19:29:36 +00:00
} else if(args.nick === 'remove' || args.nick === 'delete') {
vorpal.log("user remove|delete <nickname>");
2019-09-02 22:22:25 +00:00
vorpal.log("<nickname>: user nickname or mail");
2019-09-01 19:29:36 +00:00
vorpal.log("---");
2019-09-02 22:22:25 +00:00
vorpal.log("returns 0 or 1 and printing errors");
2019-09-01 19:29:36 +00:00
}
2019-06-17 00:28:44 +00:00
}
cb();
} else {
vorpal.exec('user --help');
cb();
}
}
}
};