diff --git a/src/ldap/ldap_data.js b/src/ldap/ldap_data.js index 801a5652f912edf7ac0ba622722558e577aebda7..f34fba5f56a1ea0ce166f89df11264cfef9c745f 100644 --- a/src/ldap/ldap_data.js +++ b/src/ldap/ldap_data.js @@ -12,7 +12,7 @@ import path from 'path'; /*var ldap = require('ldapjs'); var fs = require('fs'); var ldapEscape = require('ldap-escape'); -var path = require('path');*/ +var path = require('path'); */ // Important ; permet de vérifier que l'utilisateur reste connecté. var ensureLoggedin = require('connect-ensure-login').ensureLoggedIn; @@ -25,7 +25,7 @@ var config = JSON.parse(fs.readFileSync(configPath, 'utf8')); var client = ldap.createClient({ url: config.ldap.server}); //------------------------------------------------------------------------------------------------------------------------ -// Fonctions de recherche +// Fonctions de base //------------------------------------------------------------------------------------------------------------------------ /** @@ -85,6 +85,67 @@ function rechercheLDAP(user, base, filter, filter_dic, attributes) { }); } +/** + * @summary Fonction qui permet de modifier un élément sur le LDAP. + * @desc Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande avec ldapjs (voir [`Client API`](http://ldapjs.org/client.html) méthode search). Il faut l'appeler suivant un schéma `modifierLDAP(...).then((res) => { truc avec res });`. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans `dic` et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end). + * @arg {Object} user - Utilisateur de la forme nécessaire au bind + * @arg {string} user[key] - uid et password + * @arg {Object} mod - Dictionnaire contenant les attributs à modifier et les modifications + * @return {boolean} `true` si la modification s'est bien déroulée, false sinon + */ +function modifierLDAP(user, name, op, mod) { + // Debug TBM + //console.log(base); + //console.log(operation); + //console.log(modification); + return new Promise(function(resolve, reject) { + // A TBM utiliser user connecte (permet de pas avoir trop de demandes trop rapides et problème de permission) + client.bind(config.connexion.dn, config.connexion.passwd, (err, res) => {}); + + // Modification LDAP selon configuration en argument (pourrait prendre une liste de Changes) + client.modify(name, new ldap.Change({ + operation: op, + modification: mod, + }), function(err) { + reject(err); + }); + resolve(true); + }); +} + +/** + * @summary Fonction qui permet de rajouter un élément sur le LDAP. + * @desc Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande avec ldapjs (voir [`Client API`](http://ldapjs.org/client.html) méthode search). Il faut l'appeler suivant un schéma `modifierLDAP(...).then((res) => { truc avec res });`. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans `dic` et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end). + * @arg {Object} user - Utilisateur de la forme nécessaire au bind + * @arg {string} user[key] - uid et password + * @arg {string} dn - Adresse du parent + * @arg {Object} vals - Dictionnaire contenant les valeurs à + * @return {boolean} `true` si la modification s'est bien déroulée, false sinon + */ +function addLDAP(user, name, op, mod) { + // Debug TBM + //console.log(base); + //console.log(operation); + //console.log(modification); + return new Promise(function(resolve, reject) { + // A TBM utiliser user connecte (permet de pas avoir trop de demandes trop rapides et problème de permission) + client.bind(config.connexion.dn, config.connexion.passwd, (err, res) => {}); + + // Modification LDAP selon configuration en argument (pourrait prendre une liste de Changes) + client.modify(name, new ldap.Change({ + operation: op, + modification: mod, + }), function(err) { + reject(err); + }); + resolve(true); + }); +} + +//------------------------------------------------------------------------------------------------------------------------ +// Fonctions de recherche +//------------------------------------------------------------------------------------------------------------------------ + /** * @summary Fonction qui interroge le LDAP et retrouve les groupes dont un individu est membre. * @desc Cette fonction utilise rechercheLDAP avec un dictionnaire prédéfini dans config.json. Il faut l'appeler selon un schéma `listGroups(...).then((res) => { truc avec res })`; @@ -95,7 +156,7 @@ function rechercheLDAP(user, base, filter, filter_dic, attributes) { */ function listGroups(user, uid) { return new Promise(function(resolve, reject) { - resolve(rechercheLDAP(user,config.dn_users, config.filter_id, { id : uid }, config.attributes_lg).then(res => res[0])); + rechercheLDAP(user,config.dn_users, config.filter_id, { id : uid }, config.attributes_lg).then(res => resolve(res[0])); }); } @@ -109,7 +170,7 @@ function listGroups(user, uid) { */ function listGroups2(user, uid) { return new Promise(function(resolve, reject) { - resolve(rechercheLDAP(user, config.dn_groups, config.filter_lg, { id : uid }, config.attributes_id)); + rechercheLDAP(user, config.dn_groups, config.filter_lg, { id : uid }, config.attributes_id).then(res => resolve(res)); }); } @@ -123,7 +184,7 @@ function listGroups2(user, uid) { */ function listMembers(user, gid) { return new Promise(function(resolve, reject) { - resolve(rechercheLDAP(user, config.key_id+"="+gid+","+config.dn_groups, config.filter_id, { id: gid }, config.attributes_lm).then(res => res[0])); + rechercheLDAP(user, config.key_id+"="+gid+","+config.dn_groups, config.filter_id, { id: gid }, config.attributes_lm).then(res => resolve(res[0])); }); } @@ -137,7 +198,7 @@ function listMembers(user, gid) { */ function listAdmins(user, gid) { return new Promise(function(resolve, reject) { - resolve(rechercheLDAP(user, config.key_id+"="+gid+","+config.dn_groups, config.filter_id, { id: gid }, config.attributes_al).then(res => res[0])); + rechercheLDAP(user, config.key_id+"="+gid+","+config.dn_groups, config.filter_id, { id: gid }, config.attributes_al).then(res => resolve(res[0])); }); } @@ -151,7 +212,7 @@ function listAdmins(user, gid) { */ function rens(user, uid) { return new Promise(function(resolve, reject) { - resolve(rechercheLDAP(user, config.dn_users, config.filter_id, { id: uid }, config.attributes_all)); + rechercheLDAP(user, config.dn_users, config.filter_id, { id: uid }, config.attributes_all).then(res => resolve(res)); }); } @@ -192,7 +253,7 @@ function idTOL(user, c0="", c1="", c2="", c3="", c4="", c5="", c6="", c7="", c8= }); // Appel rechercheLDAP avec filtre de l'espace - resolve(rechercheLDAP(user, config.dn_users, filter, filter_dic, config.attributes_id)); + rechercheLDAP(user, config.dn_users, filter, filter_dic, config.attributes_id).then(res => resolve(res)); }); } @@ -218,9 +279,6 @@ function idTOL(user, c0="", c1="", c2="", c3="", c4="", c5="", c6="", c7="", c8= */ function TOL(user, c0="", c1="", c2="", c3="", c4="", c5="", c6="", c7="", c8="", c9="", c10="", c11="", c12="") { return new Promise(function(resolve, reject) { - // Pas nécessaire mais bien - client.bind(config.connexion.dn, config.connexion.passwd, (err, res) => {}); - let filter=""; let dic={}; // Iteration pour chaque champ, alourdissement du filtre selon des trucs prédéfini dans config.json encore @@ -238,7 +296,7 @@ function TOL(user, c0="", c1="", c2="", c3="", c4="", c5="", c6="", c7="", c8="" //console.log(filter); //console.log(dic); - rechercheLDAP(user, config.dn_users, filter, dic, config.attributes_all); + rechercheLDAP(user, config.dn_users, filter, dic, config.attributes_all).then(res => resolve(res)); }); } @@ -246,53 +304,33 @@ function TOL(user, c0="", c1="", c2="", c3="", c4="", c5="", c6="", c7="", c8="" // Fonctions de modification //------------------------------------------------------------------------------------------------------------------------ -/** - * @summary Fonction qui permet de créer un groupe sur le LDAP. - * @desc Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande avec ldapjs (voir [`Client API`](http://ldapjs.org/client.html) méthode search). Il faut l'appeler suivant un schéma `modifierLDAP(...).then((res) => { truc avec res });`. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans `dic` et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end). - * @arg {Object} user - Utilisateur de la forme nécessaire au bind - * @arg {string} user[key] - uid et password - * @arg {Object} mod - Dictionnaire contenant les attributs à modifier et les modifications - * @return {boolean} `true` si la modification s'est bien déroulée, false sinon - */ -function modifierLDAP(user, name, op, mod) { - // Debug TBM - //console.log(base); - //console.log(operation); - //console.log(modification); - return new Promise(function(resolve, reject) { - // A TBM utiliser user connecte (permet de pas avoir trop de demandes trop rapides et problème de permission) - client.bind(config.connexion.dn, config.connexion.passwd, (err, res) => {}); - - // Modification LDAP selon configuration en argument - client.modify(name, new ldap.Change({ - operation: op, - modification: mod, - }), function(err) { - reject(err); - }); - resolve(true); - }); -} - /** * @summary Fonction qui va plonger dans le LDAP et modifier un certain jeu de valeur en argument. * @desc Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande avec ldapjs (voir [`Client API`](http://ldapjs.org/client.html) méthode search). Il faut l'appeler suivant un schéma `modifierLDAP(...).then((res) => { truc avec res });`. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans `dic` et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end). * @arg {Object} user - Utilisateur de la forme nécessaire au bind * @arg {string} user[key] - uid et password - * @arg {Object} param - Dictionnaire contenant les attributs à modifier et les modifications - * @arg {string} param[key] - Nouvelle valeur des attributs + * @arg {string} gid - Identifiant du group + * @arg {string} nom - Nom commun du group + * @arg {string} status - Statut du groupe (binet, autre ?) + * @arg {string[]} admins - Admins du groupe + * @arg {string[]} members - Nouvelle valeur des attributs * @return {boolean} `true` si la modification s'est bien déroulée, false sinon */ -function creerGroupe(param) { +function creerGroupe(user, gid, nom, status, admins, members) { return new Promise(function(resolve, reject) { + let data = {}; + data["uid"] = gid; + data["cn"] = nom; + data["brNS"] = status; + data[""]; reject(false); }); } -//modifierLDAP("uid=quentin.chevalier,ou=eleves,dc=frankiz,dc=net","replace", {"displayName": ["hawkspar"]}).then(res => console.log(res)); -//rechercheLDAP(user, "uid=quentin.chevalier,ou=eleves,dc=frankiz,dc=net","(displayName=${cn})",{ cn: "Sire hawkspar" }, ["jpegPhoto"]).then(res => console.log(res)); +//listGroups({},"anatole.romon").then(res => console.log(res)); +//TOL({},"","","","","","","absolutvodkes","","","","","","").then(res => console.log(res)); /* Partage pour le reste du monde ; même remarque synthaxe que pour l'import */ -export { rens, listAdmins, listGroups, listMembers, TOL }; +export { listGroups, listMembers, listAdmins, rens, idTOL, TOL }; /*module.exports ={ listGroups, listMembers, listAdmins, rens, idTOL, TOL }; */