/**
* @file Ce fichier gère les requêtes LDAP de type données ; liste des groupe d'un individu="", liste des membres d'un groupe... A ne pas confondre avec ldap_auth qui lui gère l'authentification.
* @author hawkspar
*/
/* Ne pas hésiter à repasser en synthaxe ES5... Plus simple pour tester en solo avec node directement
import ldap from 'ldapjs';
import fs from 'fs';
import ldapEscape from 'ldap-escape'; */
var ldap = require('ldapjs');
var fs = require('fs');
var ldapEscape = require('ldap-escape');
// Important ; permet de vérifier que l'utilisateur reste connecté.
var ensureLoggedin = require('connect-ensure-login').ensureLoggedIn;
// Point central ; tous les champs de la BDD sont 'cachés' dans config.json et pas visibles directement
let config = JSON.parse(fs.readFileSync('../../config.json', 'utf8'));
// Connection au serveur LDAP avec des temps de timeout arbitraires
var client = ldap.createClient({ url: config.ldap.server, timeout: 10000, idleTimeout: 10000});
/**
* @summary Fonction qui interroge le LDAP et retrouve les groupes dont un individu est membre.
* @desc Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma listGroups(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end).
* @arg {int} uid - Identifiant de l'individu à interroger
* @return {string} Liste des uid de groupes (noms flat des groupes) où l'id fourni est membre
*/
function listGroups(uid) {
return new Promise(function(resolve, reject) {
var groupsList=[];
client.search(config.ldap_data_gl.searchBase, {scope: "sub", attributes: "uid", filter: ldapEscape.filter(config.ldap_data_gl.searchFilter, {id: uid})}, function(err, res) {
if (err) {
reject(err);
} else {
res.on('searchEntry', function(entry) { groupsList.push(entry.object.uid); });
res.on('end', function(res) { resolve(groupsList); });
}
});
});
}
/**
* @summary Fonction qui interroge le LDAP et retrouve la liste des membres d'un groupe.
* @desc Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma listMembers(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end).
* @arg {int} gid - Identifiant du groupe à interroger
* @return {string} Liste des uid des membres où l'id fournie est membre (noms flat des groupes)
*/
function listMembers(gid) {
return new Promise(function(resolve, reject) {
var membersList=[];
client.search(config.ldap_data_ml.searchBase="", {scope: "sub", attributes: "uid", filter: ldapEscape.filter(config.ldap_data_ml.searchFilter, {id: gid})}, function(err, res) {
if (err) {
reject(err);
} else {
res.on('searchEntry', function(entry) { membersList.push(entry.object.uid); });
res.on('end', function(res) { resolve(membersList); });
}
});
});
}
/**
* @summary Fonction qui interroge le LDAP et retrouve les paxs validant les critères de recherche.
* @desc Accepte des champs incomplets mais pas approximatifs et ne gère pas l'auto-complete. Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma TOL(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma généré à la volée à partir de config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end).
* @arg {string} c0 - Prénom
* @arg {string} c1 - Nom
* @arg {string} c2 - Surnom
* @arg {string} c3 - Nationalité
* @arg {string} c4 - Ecole ou université d'origine
* @arg {int} c5 - Promotion
* @arg {string} c6 - Groupe
* @arg {string} c7 - Cours
* @arg {string} c8 - Sport pratiqué
* @arg {int} c9 - Numéro de téléphone
* @arg {string} c10 - Adresse courriel
* @arg {string} c11 - Adresse physique
* @arg {string} c12 - Adresse ip
* @return {string[]} Informations recueillies ; plusieurs fois une liste sur le format ci-dessus pour tous les résultats correspondants plus une photo en byttestring et date de naissance.
*/
function TOL(c0="", c1="", c2="", c3="", c4="", c5="", c6="", c7="", c8="", c9="", c10="", c11="", c12="") {
return new Promise(function(resolve, reject) {
var candidatesList=[];
var filter="";
var dic={};
config.ldap_data_tol.searchFilterAttributes.forEach((element, index, list) => {
if (eval("c"+index.toString()) != '') {
filter="(&"+filter+"(|("+element+"=*${app_"+element+index+"})"+
"(|("+element+"=${app_"+element+index+"})"+
"(|("+element+"=*${app_"+element+index+"}*)"+
"("+element+"=${app_"+element+index+"}*)))))";
dic["app_"+element+index]=eval("c"+index.toString());
}
});
client.search(config.ldap_data_tol.searchBase, {scope: "sub", attributes: config.ldap_data_tol.searchAttributes, filter: ldapEscape.filter(filter, dic)}, function(err, res) {
if (err) {
reject(err);
} else {
res.on('searchEntry', function(entry) {
for (var i=0; i<config.ldap_data_tol.searchAttributes.length; i++) {
// Complicated, but hides searchAttributes
eval("candidatesList.push(entry.object."+config.ldap_data_tol.searchAttributes[i]+")");
}
});
res.on('end', function(res) { resolve(candidatesList); });
}
});
});
}
// Synthaxe d'utilisation
//listGroups("quentin.louis").then((meList) => { console.log(meList); });
TOL("","","","","","","faerix","","","","","","").then((meList) => { console.log(meList); });
/* Partage pour le reste du monde ; même remarque synthaxe
export { listGroups, listMembers, TOL }; */
module.exports ={ listGroups, listMembers, TOL };