/* * This file is part of the authRXBN single sign-on package. * * (c) Ruben Meyer */ module.exports = { 'command': 'user [data...]', '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, pass: null, mail: null, group: 0 }; // add a new user if(action === 'add') { 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]; // 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); } 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: "); rep.forEach((el, i) => { el["passhash"] = undefined; // not needed rep[i] = el; }); 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 } else if(action === 'get' || action === 'ls') { // wildcard catch-all if(profile.user === '*') { global['modules'].database.getUsers((err, rep) => { if(rep) { rep.forEach((el, i) => { el["passhash"] = undefined; // not needed rep[i] = el; }); global['logs'].log(rep); } if(err) { global['logs'].error('$ user get *'); global['logs'].error(err); } }); } else { // query users by first input global['modules'].database.getUser(profile.user, (err, rep) => { // user exists if(rep && rep.length == 1) { global['logs'].log("User exists: "); rep.forEach((el, i) => { el["passhash"] = undefined; // not needed rep[i] = el; }); global['logs'].log(rep); } else { // 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."); } } // query error if(err) { global['logs'].error('$ user get '+profile.user); global['logs'].error(err); } }); } // update users, just one property } else if(action === 'update') { if(args.data.length < 2) global['logs'].error("No data supplied."); else { let property = args.data[0]; let param = args.data[1]; 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."); } // 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); } }); } // remove users } else if(action === 'remove' || action === 'delete') { // haystack let haystack = profile.user; if(typeof profile.mail !== 'undefined' && profile.mail !== null) haystack = [profile.user, profile.mail]; // query user global['modules'].database.getUser(haystack, (err, rep) => { if(rep) { vorpal.log("user exists. deleting him."); global['logs'].debug(rep); // remove user global['modules'].database.delUser(rep[0].email, (errDel, repDel) => { if(repDel) { vorpal.log("deleted user."); global['logs'].debug(repDel); } else { vorpal.log("ERR: while deleting user."); global['logs'].debug(errDel); } }); } }); } else if(action === 'help') { if(args.nick === 'add') { vorpal.log("user add [group]"); vorpal.log(": user nickname"); vorpal.log(": will be hashed ASAP"); vorpal.log(": format: user@example.tld"); vorpal.log("[group]: not needed; only Numbers; group id"); vorpal.log("---"); vorpal.log("returns 0 or 1 and printing errors"); } else if(args.nick === 'get') { vorpal.log("user get "); vorpal.log(": searching both in both; format: foobar OR user@example.tld"); vorpal.log("---"); vorpal.log("user get * - to get all users"); vorpal.log("prints JSON-object of user data"); } else if(args.nick === 'update') { vorpal.log("user update "); vorpal.log(": user nickname"); vorpal.log(": string"); vorpal.log(": mixed data; will be converted to Boolean, Number or String"); vorpal.log("---"); vorpal.log("returns 0 or 1 and printing errors"); vorpal.log("prints JSON-object of updated user data"); } else if(args.nick === 'remove' || args.nick === 'delete') { vorpal.log("user remove|delete "); vorpal.log(": user nickname or mail"); vorpal.log("---"); vorpal.log("returns 0 or 1 and printing errors"); } } cb(); } else { vorpal.exec('user --help'); cb(); } } } };