var fs = require('fs'); var async = require('async'); var Client = require('ssh2').Client; var creds = require('../../config/sshAuth'); var NodeCache = require("node-cache"); var cache = new NodeCache({ stdTTL: 24 * 60 * 60 }); var PolyUserServ = module.exports = { readPasswd: function (login, cb) { passwdF = 'config/passwd'; fs.readFile(passwdF, function (err, file) { if (err) { cb(err); } else { lines = file.toString('utf8').split('\n'); async.detect(lines, function (line, cba) { ex = line.split(':'); cba(ex[0] == login); }, function (res) { if (res) { ex = res.split(':'); cb(null, { 'username': ex[0], 'password': ex[1], 'UID': ex[2], 'GID': ex[3], 'GECOS': ex[4], 'home': ex[5], 'shell': ex[6] }); } else { cb(null, null); } }); } }); }, readGroup: function (gid, cb) { groupF = 'config/group'; fs.readFile(groupF, function (err, file) { if (err) { cb(err); } else { lines = file.toString('utf8').split('\n'); async.detect(lines, function (line, cba) { ex = line.split(':'); cba(ex[2] == gid); }, function (res) { if (res) { ex = res.split(':'); cb(null, { 'name': ex[0], 'password': ex[1], 'GID': ex[2], 'list': ex[3] }); } else { cb(null, null); } }); } }); }, grabInfos: function (login, cb) { async.waterfall([ function (cba) { PolyUserServ.readPasswd(login, cba); }, function (passwd, cba) { if (passwd && passwd.GID) { PolyUserServ.readGroup(passwd.GID, function (err, group) { cba(err, passwd, group); }); } else { cba(null, passwd, null); } } ], function (err, passwd, group) { if (err) { cb(err); } else { var nom = (passwd && passwd.GECOS) ? passwd.GECOS : login.toUpperCase(); var section = (group && group.name) ? group.name.toUpperCase() : ((passwd && passwd.GID) ? passwd.GID : 'Inconnu'); var ancien = !!section.match("[0-9]{4}"); var enseignant = !!section.match("ENS$"); var personnel = enseignant; var etudiant = !personnel; var enCours = etudiant && !ancien; cb(null, { login: login, nom: nom, prenom: nom.split(' ')[0], section: section, ancien: ancien, enseignant: enseignant, personnel: personnel, etudiant: etudiant, enCours: enCours }); } }); }, add: function (login, cb) { PolyUserServ.grabInfos(login, function (err, data) { if (err) { cb(err); } else { cb(null, data); cache.set(login, data); } }); }, get: function (login, cb) { cache.get(login, function (err, data) { if (err) { cb(err); } else { if (data) { cb(null, data); } else { PolyUserServ.add(login, cb); } } }); }, verify: function (login, pass, cb) { var conn = new Client(); conn.on('ready', function () { cb(null, true); }).on('error', function (err) { if (err.level === 'client-authentication') { cb(null, false); } else { cb(err); } }).connect({ host: creds.host, port: creds.port, username: login, password: pass }); } };