From e3299a373faf201925fbcd6039f93daf82399660 Mon Sep 17 00:00:00 2001
From: Quentin CHEVALIER <quentin.chevalier@polytechnique.edu>
Date: Mon, 9 Jul 2018 20:46:29 +0200
Subject: [PATCH] Ajout massif de try / catch

---
 src/graphql/connectors/selectors.js |   2 +-
 src/ldap/admins.js                  | 265 +++++++++++++++++-----------
 src/ldap/basics.js                  |   2 +-
 src/ldap/users.js                   | 156 +++++++++++-----
 src/ldap/utilities.js               |  82 ++++++---
 5 files changed, 329 insertions(+), 178 deletions(-)

diff --git a/src/graphql/connectors/selectors.js b/src/graphql/connectors/selectors.js
index 5e4720d..1a0cf1b 100644
--- a/src/graphql/connectors/selectors.js
+++ b/src/graphql/connectors/selectors.js
@@ -1,5 +1,5 @@
 /**
- * @file Des callbacks qui sélectionnent un sous-ensemble de groupes.
+ * @file Des callbacks qui sélectionnent un sous-ensemble de groupes. IN PROGRESS
  * @author akka vodol
  */
 
diff --git a/src/ldap/admins.js b/src/ldap/admins.js
index 2da5cd4..f3badd0 100644
--- a/src/ldap/admins.js
+++ b/src/ldap/admins.js
@@ -5,7 +5,7 @@
  */
 
 import LDAP from './basics';
-import {SmartSearch, Tests} from './utilities';
+import Tests from './utilities';
 import User from './users';
 // Essentiels pour le fichier de config
 import path from 'path';
@@ -38,27 +38,37 @@ class Admin extends User {
      * @async
      */
     async addGroupMember(uid, gid) {
-        // Vérifie que l'utilisateur est pas déjà membre pour groupes
-        let lm = await this.getMembers(gid);
-        if (!lm.includes(uid)) {
-            let vals = {};
-            vals[config.groups.member] = uid;
-            // Erreur si pb lors de la modification
-            if (!await LDAP.change(config.key_id+gid+config.dn_groups, "add", vals)) {
-                throw "Erreur lors de la modification dans l'arbre des groupes";
+        try {
+            // Vérifie que l'utilisateur est pas déjà membre pour groupes
+            let lm = await this.getMembers(gid);
+            if (!lm.includes(uid)) {
+                let vals = {};
+                vals[config.groups.member] = uid;
+                // Erreur si pb lors de la modification
+                if (!await LDAP.change(config.key_id+gid+config.dn_groups, "add", vals)) {
+                    throw "Erreur lors de la modification dans l'arbre des groupes pour ajouter un membre.";
+                }
             }
         }
-        // Vérifie que l'utilisateur est pas déjà membre pour users
-        let lg = await this.getGroups(uid);
-        if (!lg.includes(gid)) {
-            let vals2 = {};
-            vals2[config.users.groups] = gid;
-            // Erreur si pb lors de la modification
-            if (!await LDAP.change(config.key_id+uid+config.dn_users, "add", vals2)) {
-                throw "Erreur lors de la modification dans l'arbre des utilisateurs";
+        catch {
+            throw "Erreur lors de la recherche de la liste des membres pour ajouter un membre.";
+        }
+        try {
+            // Vérifie que l'utilisateur est pas déjà membre pour users
+            let lg = await this.getGroups(uid);
+            if (!lg.includes(gid)) {
+                let vals2 = {};
+                vals2[config.users.groups] = gid;
+                // Erreur si pb lors de la modification
+                if (!await LDAP.change(config.key_id+uid+config.dn_users, "add", vals2)) {
+                    throw "Erreur lors de la modification dans l'arbre des utilisateurs pour ajouter un membre.";
+                }
             }
+            return true;
+        }
+        catch {
+            throw "Erreur lors de la recherche de la liste des membres pour ajouter un membre.";
         }
-        return true;
     }
 
     /**
@@ -70,39 +80,49 @@ class Admin extends User {
      * @async
      */
     async delGroupMember(uid, gid) {
-        // Vérifie que l'utilisateur est pas déjà viré pour groupes
-        let lm = await this.getMembers(gid);
-        if (lm.includes(uid)) {
-            // Supprime tous les utilisateurs
-            if (!await LDAP.change(config.key_id+gid+config.dn_groups, "del", config.group.member)) {
-                throw "Erreur lors de la suppression de tous les membres du groupe.";
-            }
-            // Les rajoute un par un, sauf pour le supprimé
-            lm.forEach(id => {
-                if (id!=uid) {
-                    this.addGroupMember(id, gid).then(res => {
-                        if (!res) { throw "Erreur lors du ré-ajout des autres membres"; }
-                    });
+        try {
+            // Vérifie que l'utilisateur est pas déjà viré pour groupes
+            let lm = await this.getMembers(gid);
+            if (lm.includes(uid)) {
+                // Supprime tous les utilisateurs
+                if (!await LDAP.change(config.key_id+gid+config.dn_groups, "del", config.group.member)) {
+                    throw "Erreur lors de la suppression de tous les membres du groupe.";
                 }
-            });
-        }
-        let lg = await this.getGroups(uid);
-        // Vérifie que l'utilisateur est pas déjà viré pour users
-        if (lg.includes(gid)) {
-            // Supprime tous les groupes
-            if (!await LDAP.change(config.key_id+uid+config.dn_users, "del", config.member.groups)) {
-                throw "Erreur lors de la suppression de tous les groupes du membre.";
+                // Les rajoute un par un, sauf pour le supprimé
+                lm.forEach(id => {
+                    if (id!=uid) {
+                        this.addGroupMember(id, gid).then(res => {
+                            if (!res) { throw "Erreur lors du ré-ajout des autres membres"; }
+                        });
+                    }
+                });
             }
-            // Les rajoute un par un, sauf pour le supprimé
-            lg.forEach(id => {
-                if (id!=gid) {
-                    this.addGroupMember(uid, id).then(res => {
-                        if (!res) { throw "Erreur lors du ré-ajout des autres groupes"; }
-                    });
+        }
+        catch {
+            throw "Erreur pour obtenir une liste de membres d'un groupe pour supprimer un membre du groupe.";
+        }
+        try {
+            let lg = await this.getGroups(uid);
+            // Vérifie que l'utilisateur est pas déjà viré pour users
+            if (lg.includes(gid)) {
+                // Supprime tous les groupes
+                if (!await LDAP.change(config.key_id+uid+config.dn_users, "del", config.member.groups)) {
+                    throw "Erreur lors de la suppression de tous les groupes du membre.";
                 }
-            });
+                // Les rajoute un par un, sauf pour le supprimé
+                lg.forEach(id => {
+                    if (id!=gid) {
+                        this.addGroupMember(uid, id).then(res => {
+                            if (!res) { throw "Erreur lors du ré-ajout des autres groupes"; }
+                        });
+                    }
+                });
+            }
+            return true;
+        }
+        catch {
+            throw "Erreur pour obtenir une liste de groupes d'un membres pour le supprimer du groupe.";
         }
-        return true;
     }
 
     /**
@@ -117,16 +137,21 @@ class Admin extends User {
     async addGroupAdmin(uid, gid){
         // Ajoute le membre au groupe avant d'en faire un admin
         if (!await this.addGroupMember(uid,gid)) { throw "Erreur lors de l'ajout du futur admin en tant que membre."; }
-        let la = await this.getAdmins(gid);
-        if (!la.includes(uid)) {
-            // Finalement modification, uniquement dans groups
-            let vals = {};
-            vals[config.groups.admin] = uid;
-            if (!await LDAP.change(config.key_id+gid+config.dn_groups, "add", vals)) {
-                throw "Erreur lors de l'ajout de l'admin dans l'arbre des groupes";
+        try {
+            let la = await this.getAdmins(gid);
+            if (!la.includes(uid)) {
+                // Finalement modification, uniquement dans groups
+                let vals = {};
+                vals[config.groups.admin] = uid;
+                if (!await LDAP.change(config.key_id+gid+config.dn_groups, "add", vals)) {
+                    throw "Erreur lors de l'ajout de l'admin dans l'arbre des groupes.";
+                }
             }
+            return true;
+        }
+        catch {
+            throw "Erreur lors de l'obtention de la liste des administrateurs d'un groupe.";
         }
-        return true;
     }
 
     /**
@@ -140,19 +165,24 @@ class Admin extends User {
     async delGroupAdmin(uid, gid) {
         // Peut paraître absurde mais permet de s'assurer que le membre est bien présent et que ses champs sont comme il faut
         if (!(await this.delGroupMember(uid, gid)&&this.addGroupMember(uid,gid))) { throw "Erreur dans l'éjection/réadmission du futur admin."; }
-        // Vérifie que l'utilisateur est bien admin (comme dans delGroupMember)
-        let la = await this.getAdmins(gid);
-        if (la.includes(uid)) {
-            // Supprime tous les administrateurs
-            if (!await LDAP.change(config.key_id+gid+config.dn_groups, "del", config.group.admin)) { throw "Erreur dans la suppression de tous les admins."; }
-            // Les rajoute un par un, sauf pour le supprimé
-            la.forEach(id => {
-                if (id!=uid) { this.addGroupAdmin(id, gid).then(res => {
-                    if (!res) { throw "Erreur dans le réajout d'un des autres admins."; }
-                }); }
-            });
+        try {
+            // Vérifie que l'utilisateur est bien admin (comme dans delGroupMember)
+            let la = await this.getAdmins(gid);
+            if (la.includes(uid)) {
+                // Supprime tous les administrateurs
+                if (!await LDAP.change(config.key_id+gid+config.dn_groups, "del", config.group.admin)) { throw "Erreur dans la suppression de tous les admins pour en supprimer un."; }
+                // Les rajoute un par un, sauf pour le supprimé
+                la.forEach(id => {
+                    if (id!=uid) { this.addGroupAdmin(id, gid).then(res => {
+                        if (!res) { throw "Erreur dans le réajout d'un des autres admins."; }
+                    }); }
+                });
+            }
+            return true;
+        }
+        catch {
+            throw "Erreur lors de l'obtention de la liste des administrateurs d'un groupe.";
         }
-        return true;
     }
     
     //------------------------------------------------------------------------------------------------------------------------
@@ -168,22 +198,27 @@ class Admin extends User {
      * @async
      */
     async editGroup(gid, data) {
-        // Récupération des anciennes données
-        let profil = await this.peekGroup(gid);
-        // Reecriture de profil avec les bons champs
-        Object.keys(profil).forEach(keyLDAP => {
-            Object.keys(config.group).forEach(keyAlias => {
-                config.group[keyAlias]=keyLDAP;
-                profil[keyAlias]=profil[keyLDAP];
+        try {
+            // Récupération des anciennes données
+            let profil = await this.peekGroup(gid);
+            // Reecriture de profil avec les bons champs
+            Object.keys(profil).forEach(keyLDAP => {
+                Object.keys(config.group).forEach(keyAlias => {
+                    config.group[keyAlias]=keyLDAP;
+                    profil[keyAlias]=profil[keyLDAP];
+                });
             });
-        });
-        // Surcharge des champs à modifier selon data
-        Object.keys(data).forEach(key => {
-            profil[key]=data[key];
-        });
-        // Modification propre
-        if (!await this.delGroup(gid)&&await this.addGroup(profil)) { throw "Erreur de la destruction/recréation du groupe."; }
-        return true;
+            // Surcharge des champs à modifier selon data
+            Object.keys(data).forEach(key => {
+                profil[key]=data[key];
+            });
+            // Modification propre
+            if (!await this.delGroup(gid)&&await this.addGroup(profil)) { throw "Erreur de la destruction/recréation du groupe pour le modifier."; }
+            return true;
+        }
+        catch {
+            throw "Erreur lors de l'obtention du profil d'un groupe pour le modifier.";
+        }
     }
     
     //------------------------------------------------------------------------------------------------------------------------
@@ -199,18 +234,23 @@ class Admin extends User {
      * @async
      */
     async delGroup(gid) {
-        // Gestion des membres et administrateurs d'abord
-        let profil = await this.constructor.peekGroup(gid);
-        // Ordre important
-        profil[config.group['admin']].forEach( id => {
-            this.delGroupAdmin( id, gid).then(res => { if (!res) { throw "Erreur lors de la suppression d'un admin."; } });
-        });
-        profil[config.group['member']].forEach(id => {
-            this.delGroupMember(id, gid).then(res => { if (!res) { throw "Erreur lors de la suppression d'un membre."; } });
-        });
-        // Elimination
-        if (!await LDAP.clear(config.key_id+"="+gid+","+config.dn_groups)) { throw "Erreur lors de la suppression de la feuille dans l'arbre des groupes."; }
-        return true;
+        try {
+            // Gestion des membres et administrateurs d'abord
+            let profil = await this.constructor.peekGroup(gid);
+            // Ordre important
+            profil[config.group['admin']].forEach( id => {
+                this.delGroupAdmin( id, gid).then(res => { if (!res) { throw "Erreur lors de la suppression d'un admin d'un groupe en cours de suppression."; } });
+            });
+            profil[config.group['member']].forEach(id => {
+                this.delGroupMember(id, gid).then(res => { if (!res) { throw "Erreur lors de la suppression d'un membre."; } });
+            });
+            // Elimination
+            if (!await LDAP.clear(config.key_id+"="+gid+","+config.dn_groups)) { throw "Erreur lors de la suppression de la feuille dans l'arbre des groupes."; }
+            return true;
+        }
+        catch {
+            throw "Erreur lors de l'obtention du profil d'un groupe pour le supprimer.";
+        }
     }
 }
 
@@ -256,7 +296,12 @@ class SuperAdmin extends Admin {
 
         // uid de base généré à partir de nom et prénom, plus potentiellement promo et un offset
         // MEF mélange de Promise et de fonction standard
-        Tests.generateUid(data['givenName'],data['lastName'],data['promotion']).then(id => { vals[config.key_id]=id; } );
+        try {
+            Tests.generateUid(data['givenName'],data['lastName'],data['promotion']).then(id => { vals[config.key_id]=id; } );
+        }
+        catch {
+            throw "Erreur lors de la génération d'un hruid pour un nouvel utilisateur.";
+        }
 
         // Ecriture de toutes les valeurs directement inscrites dans le LDAP (in pour input)
         // Génère une erreur si un champ n'est pas rempli
@@ -292,8 +337,13 @@ class SuperAdmin extends Admin {
         if ((data['nickname']!=undefined)&&(data['nickname']!='')) {
             vals3[config.user['nickname']]=data['nickname'];
         }
-        // Génération id aléatoire unique
-        vals3[config.user['id']]= await Tests.generateId(config.user['id'], config.dn_users);
+        try {
+            // Génération id aléatoire unique
+            vals3[config.user['id']]= await Tests.generateId(config.user['id'], config.dn_users);
+        }
+        catch {
+            throw "Erreur lors de la génération d'un id numérique pour un nouvel utilisateur.";
+        }
         
         // Stockage machine ; dépend du prénom
         vals3[config.user['directory']] = '/hosting/users/' + data['givenName'][0];
@@ -355,14 +405,19 @@ class SuperAdmin extends Admin {
      * @async
      */
     async delUser(uid) {
-        // Gestion des groupes d'abord
-        let profil = await this.peekUser(uid);
-        profil[config.user['groups']].forEach(gid => {
-            if (this.isGroupAdmin(gid)) {
-                if (!this.delGroupAdmin(uid, gid)) { throw "Erreur lors de la suppression des droits d'admin de l'utilisateur."; }
-            }
-            if (!this.delGroupMember(uid, gid)) { throw "Erreur lors de la suppression de l'appartenace à un groupe de l'utilisateur."; }
-        });
+        try {
+            // Gestion des groupes d'abord
+            let profil = await this.peekUser(uid);
+            profil[config.user['groups']].forEach(gid => {
+                if (this.isGroupAdmin(gid)) {
+                    if (!this.delGroupAdmin(uid, gid)) { throw "Erreur lors de la suppression des droits d'admin de l'utilisateur."; }
+                }
+                if (!this.delGroupMember(uid, gid)) { throw "Erreur lors de la suppression de l'appartenace à un groupe de l'utilisateur."; }
+            });
+        }
+        catch {
+            throw "Erreur lors de l'obtention des informations de l'utilisateur à supprimer.";
+        }
         // Elimination
         if (!this.LDAP.clear(config.key_id+"="+uid+","+config.dn_users)) { throw "Erreur lors de la suppression de l'utilisateur."; }
     }
diff --git a/src/ldap/basics.js b/src/ldap/basics.js
index 5ec3415..35c7cd0 100644
--- a/src/ldap/basics.js
+++ b/src/ldap/basics.js
@@ -91,7 +91,7 @@ class LDAP {
                 "filter": ldapEscape.filter("${txt}", { txt: filter}),
                 "attributes": attributes
             }, (err, res) => {
-                // Gestion erreur
+                // Gestion erreur ; pb car pas simple true / autre en sortie
                 if (err) {
                     reject(err);
                     throw "Erreur lors de la recherche sur le LDAP.";
diff --git a/src/ldap/users.js b/src/ldap/users.js
index 8fd2f2e..bc17727 100644
--- a/src/ldap/users.js
+++ b/src/ldap/users.js
@@ -24,7 +24,7 @@ class Open {
      * @class Cette classe est la classe exportable de base permettant à un utilisateur non connecté de faire des petites recherches simples.
      * @summary Constructeur vide.
     */
-    constructor(config) {}
+    constructor() {}
 
     //------------------------------------------------------------------------------------------------------------------------
     // Fonctions de lecture
@@ -37,7 +37,12 @@ class Open {
      * @static @async
      */
     static async getGroups(uid) {
-        return LDAP.search(config.key_id+uid+config.dn_users, config.user.groups)[0];
+        try {
+            return LDAP.search(config.key_id+uid+config.dn_users, config.user.groups)[0];
+        }
+        catch {
+            throw "Erreur lors de la recherche des groupes d'un individu.";
+        }
     }
     
     /**
@@ -48,7 +53,12 @@ class Open {
      * @static @async
      */
     static async getMembers(gid) {
-        return LDAP.search(config.key_id+gid+config.dn_users, config.group.member)[0];
+        try {
+            return LDAP.search(config.key_id+gid+config.dn_users, config.group.member)[0];
+        }
+        catch {
+            throw "Erreur lors de la recherche des membres d'un groupe.";
+        }
     }
     
     /**
@@ -59,7 +69,12 @@ class Open {
      * @static @async
      */
     static async getAdmins(gid) {
-        return LDAP.search(config.key_id+gid+config.dn_users, config.group.admin)[0];
+        try {
+            return LDAP.search(config.key_id+gid+config.dn_users, config.group.admin)[0];
+        }
+        catch {
+            throw "Erreur lors de la recherche des admins d'un groupe.";
+        }
     }
 
     /**
@@ -71,13 +86,15 @@ class Open {
      * @static @async
      */
     static async isGroupMember(uid, gid) {
-        let lg = await this.getGroups(uid);
-        let lm = await this.getMembers(gid);
-        if (lg.includes(gid) && lm.includes(uid)) {
-            return true;
+        try {
+            let lg = await this.getGroups(uid);
+            let lm = await this.getMembers(gid);
+            if (lg.includes(gid) && lm.includes(uid)) {
+                return true;
+            }
         }
-        else {
-            return false;
+        catch  {
+            throw "Erreur lors du test d'appartenance à un groupe.";
         }
     }
 
@@ -90,12 +107,14 @@ class Open {
      * @static @async
      */
     static async isGroupAdmin(uid, gid) {
-        let la = await this.getAdmins(gid);
-        if (la.includes(uid)) {
-            return true;
+        try {
+            let la = await this.getAdmins(gid);
+            if (la.includes(uid)) {
+                return true;
+            }
         }
-        else {
-            return false;
+        catch  {
+            throw "Erreur lors du test d'appartenance au bureau d'administration un groupe.";
         }
     }
      
@@ -108,7 +127,12 @@ class Open {
      * @static
      */
     static peekUser(uid) {
-        return LDAP.search(config.key_id+uid+config.dn_users, config.user.profil);
+        try {
+            return LDAP.search(config.key_id+uid+config.dn_users, config.user.profil);
+        }
+        catch  {
+            throw "Erreur lors d'une recherche d'informations sur un individu.";
+        }
     }
      
     /**
@@ -120,7 +144,12 @@ class Open {
      * @static
      */
     static peekGroup(gid) {
-        return LDAP.search(config.key_id+gid+config.dn_groups, config.group.profil);
+        try {
+            return LDAP.search(config.key_id+gid+config.dn_groups, config.group.profil);
+        }
+        catch  {
+            throw "Erreur lors d'une recherche d'informations sur un groupe.";
+        }
     }
 
     //------------------------------------------------------------------------------------------------------------------------
@@ -131,19 +160,25 @@ class Open {
      * @summary Fonction qui retrouve le groupe qui ressemblent à l'input et qui correspond au type fourni. Etape 0 vers un vrai TOL (Trombino On Line).
      * @desc Cette fonction utilise {@link SmartSearch.groups}.
      * @arg {string} input - String entré par l'utilisateur qui ressemble au nom du groupe.
-     * @arg {string} type - String aux valeurs prédéfinies dans ldap_config.
      * @return {Promise(string[])} Liste des gid dont le nom ressemble à l'input.
      * @static @async
     */
-    static async findGroups(input, type) {
-        // Trucs intelligents faits dans ./utilities
-        let gList = await SmartSearch.groups(input, [config.key_id, config.group.type]);
+    static async findGroups(input) {
+        try {
+            // Trucs intelligents faits dans ./utilities
+            return SmartSearch.groups(input, [config.key_id, config.group.type]);
+        }
+        catch {
+            throw "Erreur lors de la recherche approximative d'un groupe.";
+        }
+        /**
         let gidtyList = [];
         gList.forEach(g => {
             // Si le groupe est du bon type on rajoute son gid
             if (g[config.group.type]==type) { gidtyList.push(g[config.key_id]); }
         });
         return gidtyList;
+        */
     }
 
     /**
@@ -155,7 +190,12 @@ class Open {
      * @static @async
      */
     static async findUsers(data) {
-        return SmartSearch.users(data, config.key_id);
+        try {
+            return SmartSearch.users(data, config.key_id);
+        }
+        catch {
+            throw "Erreur lors de la recherche approximative d'un utilisateur.";
+        }
     }
 }
 
@@ -170,7 +210,12 @@ class User extends Open {
     */
     constructor(user) {
         super();
-        LDAP.bind(user);
+        try {
+            LDAP.bind(user);
+        }
+        catch {
+            throw "Erreur lors de la connexion à un compte utilisateur.";
+        }
     }
 
     //------------------------------------------------------------------------------------------------------------------------
@@ -195,7 +240,12 @@ class User extends Open {
         let vals = {};
 
         // uid de base généré à partir du nom standardisé
-        Tests.generateReadableId(data['name']).then(id => { vals[config.group['name']]=id; });
+        try {
+            Tests.generateReadableId(data['name']).then(id => { vals[config.group['name']]=id; });
+        }
+        catch {
+            throw "Erreur lors de la génération d'un hruid pour créer un nouveau groupe.";
+        }
 
         // Ecriture de toutes les valeurs directement inscrites dans le LDAP (in pour input)
         config.group.direct_input.forEach(key_att => vals[config.group[key_att]]=data[key_att]);
@@ -214,7 +264,12 @@ class User extends Open {
         vals2[config.user['password']] =  '';
 
         // Génération id aléatoire et test contre le LDAP
-        Tests.generateId(config.groups["idNumber"], config.dn_groups).then(id => { vals2[config.group['idNumber']]=id; });
+        try {
+            Tests.generateId(config.groups["idNumber"], config.dn_groups).then(id => { vals2[config.group['idNumber']]=id; });
+        }
+        catch {
+            throw "Erreur lors de la génération d'un id numérique pour créer un nouveau groupe.";
+        }
         // FOIREUX : Hypothèse sur la structure du reste des données mais évite un test.assurerUnicite à deux variables
         vals2[config.group['idNumber2']]=vals2[config.group['idNumber']];
         
@@ -245,8 +300,16 @@ class User extends Open {
         });
 
         // Utilisation des fonctions adaptées pour assurer la cohérence de l'ensemble
-        data['members'].forEach(uid => { Admin.addGroupMember(uid, vals[config.key_att]); });
-        data['admins'].forEach(uid => {  Admin.addGroupAdmin( uid, vals[config.key_att]); });
+        data['members'].forEach(uid => {
+            Admin.addGroupMember(uid, vals[config.key_att]).then(res => {
+                if (!res) { throw "Erreur de l'ajout d'un membre au groupe."; }
+            });
+        });
+        data['admins'].forEach(uid => {
+            Admin.addGroupAdmin( uid, vals[config.key_att]).then(res => {
+                if (!res) { throw "Erreur de l'ajout d'un admin au groupe."; }
+            });
+        });
 
         return true;
     }
@@ -277,24 +340,29 @@ class User extends Open {
             });
         });
         // Régénération du champ manquant dans profil
-        let lg = await this.getGroups(uid);
-        profil['groupsIsAdmin']=[];
-        lg.forEach(gid => {
-            this.isGroupAdmin(uid, gid).then(res => {
-                if (res) { profil['groupsIsAdmin'].push(gid); }
+        try {
+            let lg = await this.getGroups(uid);
+            profil['groupsIsAdmin']=[];
+            lg.forEach(gid => {
+                this.isGroupAdmin(uid, gid).then(res => {
+                    if (res) { profil['groupsIsAdmin'].push(gid); }
+                });
             });
-        });
-        // Surcharge des champs à modifier selon data
-        Object.keys(data).forEach(key => {
-            profil[key]=data[key];
-        });
-        // Passage en godmode
-        var god = SuperAdmin({"uid":"", "password":""});
-        // Modification propre par effet de bord
-        if (!(await god.delUser(uid)&&await god.createUser(profil))) {
-            throw "Erreur dans la destruction/création du compte.";
-        } else {
-            return true;
+            // Surcharge des champs à modifier selon data
+            Object.keys(data).forEach(key => {
+                profil[key]=data[key];
+            });
+            // Passage en godmode
+            var god = SuperAdmin({"uid":"", "password":""});
+            // Modification propre par effet de bord
+            if (!(await god.delUser(uid) && await god.createUser(profil))) {
+                throw "Erreur dans la destruction/création du compte.";
+            } else {
+                return true;
+            }
+        }
+        catch {
+            throw "Erreur lors de la modification des groupes où un utilisateur est admin.";
         }
     }
     
diff --git a/src/ldap/utilities.js b/src/ldap/utilities.js
index 2a18ceb..61d23c0 100644
--- a/src/ldap/utilities.js
+++ b/src/ldap/utilities.js
@@ -46,7 +46,12 @@ class SmartSearch {
                     "("+  config.key_id+"="+ input+"*))))"; // La valeur du début avec des trucs après
 
         // Appel rechercheLDAP avec filtre de l'espace 
-        return LDAP.search(config.dn_groups, return_attributes, filter);
+        try {
+            return LDAP.search(config.dn_groups, return_attributes, filter);
+        }
+        catch {
+            throw "Erreur lors de la recherche intelligente d'un groupe.";
+        }
     }
 
     /**
@@ -84,15 +89,20 @@ class SmartSearch {
                     // Traduction en language LDAP
                     let attribute = config.user[key];
                     // Creation du filtre étape par étape
-                    filter="(&"+filter+ "(|("+attribute+"="+val+")"+      // On cherche la valeur exacte
+                    filter="(&"+filter+ "(|("+attribute+"="+ val+")"+      // On cherche la valeur exacte
                                         "(|("+attribute+"=*"+val+")"+     // La valeur finale avec des trucs avant ; wildcard * (MEF la wildcart ne marche pas pour tous les attributs)
                                         "(|("+attribute+"=*"+val+"*)"+    // La valeur du milieu avec des trucs avant et après
-                                        "("+attribute+"="+val+"*)))))";   // La valeur du début avec des trucs après
+                                        "("+  attribute+"="+ val+"*)))))";   // La valeur du début avec des trucs après
                 });
             }
         }
         // Appel rechercheLDAP avec filtre de l'espace 
-        return LDAP.search(config.dn_users, return_attributes, filter);
+        try {
+            return LDAP.search(config.dn_users, return_attributes, filter);
+        }
+        catch {
+            throw "Erreur lors de la recherche intelligente d'un utilisateur.";
+        }
     }
 }
 
@@ -115,17 +125,20 @@ class Tests {
      * @return {Promise(string)} Valeur unique dans le domaine spécifié de l'attribut spécifié
      * @static @async
      */
-    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    // TBM PB DE THROW ; PB ABSENCE TOTAL DE DEBUG
-    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     static async ensureUnique(value, attribute, dn, changeValue, n=0) {
         // Recherche d'autres occurences de l'id
-        return LDAP.search(dn, config.key_id, "("+attribute+"="+value+")").then(matches => {
-            // On renvoit la valeur si elle est bien unique
-            if (matches.length==0) { return value; }
-            // Sinon, on tente de nouveau notre chance avec la valeur suivante
-            else { return this.ensureUnique(changeValue(value, n+1), dn, changeValue, n+1); }
-        });
+        try {
+            return LDAP.search(dn, config.key_id, "("+attribute+"="+value+")").then(matches => {
+                if (!matches) { throw ""; }
+                // On renvoit la valeur si elle est bien unique
+                else if (matches.length==0) { return value; }
+                // Sinon, on tente de nouveau notre chance avec la valeur suivante
+                else { return this.ensureUnique(changeValue(value, n+1), dn, changeValue, n+1); }
+            });
+        }
+        catch {
+            throw "Erreur lors de la recherche d'une valeur pour assurer son unicité.";
+        }
     }
 
     /**
@@ -138,13 +151,18 @@ class Tests {
      * @static @async
      */
     static async generateUid(givenName, lastName, promotion) {
-        // normalize et lowerCase standardisent le format
-        return this.ensureUnique((givenName+'.'+lastName).toLowerCase().normalize('UFD'), config.key_id, config.dn_users, (id,n) => {
-            if (n==1) { id+='.'+promotion; }    // Si prénom.nom existe déjà, on rajoute la promo
-            else if (n==2) { id+='.'+n-1; }     // Puis si prénom.nom.promo existe déjà on passe à nom.prenom.promo .1
-            else if (n>2) { id+=n; }           // Ensuite on continue .23, .234, etc...
-            return id;
-        });
+        try {
+            // normalize et lowerCase standardisent le format
+            return this.ensureUnique((givenName+'.'+lastName).toLowerCase().normalize('UFD'), config.key_id, config.dn_users, (id,n) => {
+                if (n==1) { id+='.'+promotion; }    // Si prénom.nom existe déjà, on rajoute la promo
+                else if (n==2) { id+='.'+n-1; }     // Puis si prénom.nom.promo existe déjà on passe à nom.prenom.promo .1
+                else if (n>2) { id+=n; }           // Ensuite on continue .123, .1234, etc...
+                return id;
+            });
+        }
+        catch {
+            throw "Erreur lors de l'assurance de l'unicité d'un human readable unique identifier (hruid).";
+        }
     }
 
     /**
@@ -155,12 +173,17 @@ class Tests {
      * @static @async
      */
     static async generateReadableId(name) {
-        // normalize et lowerCase standardisent le format
-        return this.ensureUnique(name.toLowerCase().normalize('UFD'), config.key_id, config.dn_groups, (id,n) => {
-            if (n==1) { id+='.'+n; }    // Si nom existe déjà, on essaie nom.1
-            else if (n>1) { id+=+n; }   // Ensuite on continue .12, .123, etc...
-            return id;
-        });
+        try {
+            // normalize et lowerCase standardisent le format
+            return this.ensureUnique(name.toLowerCase().normalize('UFD'), config.key_id, config.dn_groups, (id,n) => {
+                if (n==1) { id+='.'+n; }    // Si nom existe déjà, on essaie nom.1
+                else if (n>1) { id+=n; }   // Ensuite on continue .12, .123, etc...
+                return id;
+            });
+        }
+        catch {
+            throw "Erreur lors de l'assurance de l'unicité d'un human readable unique identifier (hruid).";
+        }
     }
 
     /**
@@ -172,7 +195,12 @@ class Tests {
      * @static @async
      */
     static async generateId(attribut, dn) {
-        return this.ensureUnique("0", attribut, dn, (id,n) => { Math.floor((Math.random() * 100000) + 1).toString(); });
+        try {
+            return this.ensureUnique("0", attribut, dn, (id,n) => { Math.floor((Math.random() * 100000) + 1).toString(); });
+        }
+        catch {
+            throw "Erreur lors de l'assurance de l'unicité d'un unique identifier numérique.";
+        }
     }
 }
 
-- 
GitLab