From 36ebebc404ddcdba7cb020bcd31d0366b2ad36f0 Mon Sep 17 00:00:00 2001
From: Quentin CHEVALIER <quentin.chevalier@polytechnique.edu>
Date: Wed, 28 Feb 2018 16:44:44 +0100
Subject: [PATCH] LDAP data - TOL in progress

---
 config.json           |  9 +++++--
 src/ldap/ldap_data.js | 61 +++++++++++++++++++++++++++++++++++++------
 2 files changed, 60 insertions(+), 10 deletions(-)

diff --git a/config.json b/config.json
index 788fdac..9e1277e 100644
--- a/config.json
+++ b/config.json
@@ -9,8 +9,13 @@
 		"searchFilter":"(restrictedMemberUid=${id})"
 	},
 	"ldap_data_ml": {
-		"searchBase": "ou=groups,dc=frankiz,dc=net",
-		"searchFilter": "(uid=${id})"
+		"searchBase": "ou=eleves,dc=frankiz,dc=net",
+		"searchFilter": "(brMemberOf=${id})"
+	},
+	"ldap_data_tol": {
+		"searchBase": "ou=eleves,dc=frankiz,dc=net",
+		"searchFilter": "(&(&(&(|(givenName=*${app_fn})(|(givenName=*${app_fn}*)(givenName=${app_fn}*)))(|(sn=*${app_ln})(|(sn=*${app_ln}*)(sn=${app_ln}*))))(brPromo=${app_yr}))(brMemberOf=*${app_na}))",
+		"searchAttributes": ["jpegPhoto","givenName", "sn", "brBirthdate", "brPromo","telephoneNumber","mail","brRoom","brIP"]
 	},
 	"sessionSecret":"change this"
 }
\ No newline at end of file
diff --git a/src/ldap/ldap_data.js b/src/ldap/ldap_data.js
index fd92921..9d7b3f3 100644
--- a/src/ldap/ldap_data.js
+++ b/src/ldap/ldap_data.js
@@ -13,9 +13,9 @@ let config = JSON.parse(fs.readFileSync('../../config.json', 'utf8'));
 var client = ldap.createClient({ url: config.ldap.server, timeout: 10000, idleTimeout: 10000});
 
 /**
- * @summary Fonction qui retrouve les groupes du LDAP dont un individu est membre (pas de bind nécessaire)
+ * @summary Fonction qui retrouve les groupes du LDAP dont un individu est membre (pas de bind nécessaire).
  * @arg {int} uid - Identifiant de l'individu à interroger
- * @return {string} Liste des uid de groupes (noms flat des groupes) où l'id fourni
+ * @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) {
@@ -33,11 +33,11 @@ function listGroups(uid) {
 }
  
 /**
- * @summary Fonction qui retrouve la liste des membres d'un binet sur le LDAP
+ * @summary Fonction qui retrouve la liste des membres d'un binet sur le LDAP.
  * @arg {int} gid - Identifiant du groupe à interroger
- * @return {string} Liste des uid de groupes où l'id fournie est membre (noms flat des groupes)
+ * @return {string} Liste des uid des membres où l'id fournie est membre (noms flat des groupes)
  */
-function listMembers(gid) {    
+function listMembers(gid) {
     return new Promise(function(resolve, reject) {
         var membersList=[];
         
@@ -45,13 +45,58 @@ function listMembers(gid) {
             if (err) {
                 reject(err);
             } else {
-                res.on('searchEntry', function(entry) { membersList.push(entry.object.restrictedMemberUid); });
+                res.on('searchEntry', function(entry) { membersList.push(entry.object.uid); });
                 res.on('end', function(res) { resolve(membersList); });
             }
         });
     });
 }
+ 
+/**
+ * @summary Fonction qui retrouve les paxs validant les critères de recherche. Accepte des champs incomplets mais pas approximatifs et ne gère pas l'auto-complete.
+ * @arg {string} fn - Prénom
+ * @arg {string} ln - Nom
+ * @arg {string} nk - Surnom
+ * @arg {string} na - Nationalité
+ * @arg {string} sc - Ecole ou université d'origine
+ * @arg {int} yr - Promotion
+ * @arg {string} gr - Groupe
+ * @arg {string} co - Cours
+ * @arg {string} sp - Sport pratiqué
+ * @arg {int} nb - Numéro de téléphone
+ * @arg {string} ma - Adresse courriel
+ * @arg {string} ad - Adresse physique
+ * @arg {string} ip - Adresse ip
+ * @return {string[]} Informations recueillies ; plusieurs fois une liste sur le format ci-dessus pour tous les résultats correspondants plus une photo et date de naissance !
+ */
+function TOL(fn, ln, nk, na, sc, yr, gr, co, sp, nb, ma, ad, ip) {
+    return new Promise(function(resolve, reject) {
+        var candidatesList=[];
+        ["jpegPhoto","givenName", "sn", "brBirthdate", "brPromo","telephoneNumber","mail","brRoom","brIP"]
+        var filter="";
+        
+        config.ldap_data_tol.searchAttributes.forEach(element => { filter="(&("+filter+")";
+            
+        });
+        
+        client.search(config.ldap_data_tol.searchBase, {scope: "sub", attributes: config.ldap_data_tol.searchAttributes, filter: ldapEscape.filter(config.ldap_data_tol.searchFilter, { app_fn: fn, app_ln: ln, app_nk: nk, app_na: na, app_sc: sc, app_yr: yr, app_gr: gr, app_co: co, app_sp: sp, app_nb: nb, app_ma: ma, app_ad: ad, app_ip: ip})}, 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.chevalier").then((grList) => { console.log(grList); });
-listMembers("faerix").then((meList) => { console.log(meList); });
\ No newline at end of file
+//listGroups("quentin.louis").then((meList) => { console.log(meList); });
+TOL("Quentin","u","","","",2016,"","","","","","").then((meList) => { console.log(meList); });
+
+export { listGroups, listMembers, TOL };
\ No newline at end of file
-- 
GitLab