From 459b03ae291c83ac79881046f2a2969fde7f9655 Mon Sep 17 00:00:00 2001
From: ManifoldFR <wilson.jallet@gmail.com>
Date: Thu, 30 Aug 2018 16:28:45 +0200
Subject: [PATCH] refactor remaining ldap config imports

---
 src/config_passport.js |   8 +-
 src/ldap/config.js     |  12 ++-
 src/ldap/ldap_data.js  | 170 ++++++++++++++++++++---------------------
 src/server.ts          |   9 +--
 4 files changed, 101 insertions(+), 98 deletions(-)

diff --git a/src/config_passport.js b/src/config_passport.js
index f07fa2f..07bc463 100644
--- a/src/config_passport.js
+++ b/src/config_passport.js
@@ -19,16 +19,16 @@ import passport from 'passport';
 import LdapStrategy from 'passport-ldapauth';
 import fs from 'fs';
 import path from 'path';
-import { config } from './ldap/config';
+import { ldapConfig } from './ldap/config';
 
 // specifies options for 'ldapauth' strategy, to customize the behaviour of subsequent passport.authenticate('ldapauth') calls
 passport.use(new LdapStrategy({
     server: {
-        url: config.ldap.server,
+        url: ldapConfig.ldap.server,
         //bindDn: '.............',
         //bindCredentials: '..........',
-        searchBase: config.ldap.searchBase,
-        searchFilter: config.ldap.searchFilter,
+        searchBase: ldapConfig.ldap.searchBase,
+        searchFilter: ldapConfig.ldap.searchFilter,
         //searchAttributes: ['givenName', 'sn'],
         //tlsOptions: '..........',
     },
diff --git a/src/ldap/config.js b/src/ldap/config.js
index 1c4793a..d482f1d 100644
--- a/src/ldap/config.js
+++ b/src/ldap/config.js
@@ -6,14 +6,18 @@ var fs = require('fs');
 var path = require('path');
 
 // Point central ; tous les champs de la BDD sont 'cachés' dans config.json et pas visibles directement
-var configPath = path.resolve('./', 'ldap_config.json');
-const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
+const configPath = path.resolve('./', 'ldap_config.json');
+const ldapConfig = JSON.parse(fs.readFileSync(configPath, 'utf8'));
+
+const credentialsPath = path.resolve('./', 'ldap_connexion_config.json');
+const credentialsConfig = JSON.parse(fs.readFileSync(credentialsPath));
 
 // Override config server from environment
 if (process.env.LDAP_URI != null) {
-    config.ldap.server = process.env.LDAP_URI;
+    ldapConfig.ldap.server = process.env.LDAP_URI;
 }
 
 module.exports = {
-    config
+    "ldapConfig": ldapConfig,
+    "credentialsConfig": credentialsConfig
 };
diff --git a/src/ldap/ldap_data.js b/src/ldap/ldap_data.js
index c7c298a..24407ef 100644
--- a/src/ldap/ldap_data.js
+++ b/src/ldap/ldap_data.js
@@ -22,10 +22,10 @@ var path = require('path');
 // Important ; permet de vérifier que l'utilisateur reste connecté.
 var ensureLoggedin =  require('connect-ensure-login').ensureLoggedIn;
 
-const config = require('./config').config;
+const { ldapConfig, credentialsConfig } = require('./config');
 // Connection au serveur LDAP avec des temps de timeout arbitraires
-var client = ldap.createClient({url: config.ldap.server});
-console.log(`Connecting to LDAP at ${config.ldap.server}.`);
+var client = ldap.createClient({url: ldapConfig.ldap.server});
+console.log(`Connecting to LDAP at ${ldapConfig.ldap.server}.`);
 
 //------------------------------------------------------------------------------------------------------------------------
 // Fonctions de base
@@ -138,7 +138,7 @@ function ajouterLDAP(user, dn, vals) {
     return new Promise((resolve, reject) => {
         connecterLDAP(user);
         // Ajout LDAP selon la configuration en argument
-        client.add(config.key_id+"="+vals[config.key_id]+","+dn, vals, function(err) {
+        client.add(ldapConfig.key_id+"="+vals[ldapConfig.key_id]+","+dn, vals, function(err) {
             reject(err);
         });
         client.bind("", "", (err, res) => {});
@@ -192,13 +192,13 @@ function trouverGroupesModulable(input, return_attributes) {
         let str=ldapEscape.filter("${txt}", { txt: input});
 
         // Construction du filtre custom
-        let filter= "(|("+config.key_id+"="+str+")"+      // On cherche la valeur exacte
-                    "(|("+config.key_id+"=*"+str+")"+     // La valeur finale avec des trucs avant ; wildcard *
-                    "(|("+config.key_id+"=*"+str+"*)"+    // La valeur du milieu avec des trucs avant et après
-                    "("+config.key_id+"="+str+"*))))";   // La valeur du début avec des trucs après
+        let filter= "(|("+ldapConfig.key_id+"="+str+")"+      // On cherche la valeur exacte
+                    "(|("+ldapConfig.key_id+"=*"+str+")"+     // La valeur finale avec des trucs avant ; wildcard *
+                    "(|("+ldapConfig.key_id+"=*"+str+"*)"+    // La valeur du milieu avec des trucs avant et après
+                    "("+ldapConfig.key_id+"="+str+"*))))";   // La valeur du début avec des trucs après
 
         // Appel rechercheLDAP avec filtre de l'espace 
-        rechercherLDAP(config.dn_groups, return_attributes, filter).then(res => resolve(res));
+        rechercherLDAP(ldapConfig.dn_groups, return_attributes, filter).then(res => resolve(res));
     });
 }
 
@@ -237,7 +237,7 @@ function repliquerTOLModulable(data, return_attributes) {
                     // Escape de l'input utilisateur
                     let str=ldapEscape.filter("${input}", { input: val});
                     // Traduction en language LDAP
-                    let attribute = config.user[key];
+                    let attribute = ldapConfig.user[key];
                     // Creation du filtre étape par étape
                     filter="(&"+filter+ "(|("+attribute+"="+str+")"+      // On cherche la valeur exacte
                                         "(|("+attribute+"=*"+str+")"+     // La valeur finale avec des trucs avant ; wildcard * (MEF la wildcart ne marche pas pour tous les attributs)
@@ -247,7 +247,7 @@ function repliquerTOLModulable(data, return_attributes) {
             }
         }
         // Appel rechercheLDAP avec filtre de l'espace 
-        rechercherLDAP(config.dn_users, return_attributes, filter).then(res => resolve(res));
+        rechercherLDAP(ldapConfig.dn_users, return_attributes, filter).then(res => resolve(res));
     });
 }
 
@@ -260,7 +260,7 @@ function repliquerTOLModulable(data, return_attributes) {
  * @return {Promise(Object[])} Liste de dictionnaires de profils en cohérence avec l'input avec pour clés tous les attributs disponibles ou presque (voir config).
  */
 function repliquerTOL(data) {
-    return repliquerTOLModulable(data, config.user.profil);
+    return repliquerTOLModulable(data, ldapConfig.user.profil);
 }
 
 /**
@@ -279,7 +279,7 @@ function repliquerTOL(data) {
 function assurerUnicite(valeur, attribut, dn, evoluerValeur, n=0) {
     return new Promise((resolve, reject) => { 
         // Recherche d'autres occurences de l'id
-        rechercherLDAP(dn, config.key_id, "("+attribut+"="+valeur+")").then(matches => {
+        rechercherLDAP(dn, ldapConfig.key_id, "("+attribut+"="+valeur+")").then(matches => {
             // On renvoit la valeur si elle est bien unique
             if (matches.length==0) { resolve(valeur); }
             // Sinon, on tente de nouveau notre chance avec la valeur suivante
@@ -299,7 +299,7 @@ function assurerUnicite(valeur, attribut, dn, evoluerValeur, n=0) {
 function genererUid(givenName, lastName, promotion) {
     // Le filtrage évite l'injection de code dans le LDAP, le normalize et lowerCase standardisent le format
     return new Promise((resolve, reject) => {
-        assurerUnicite(ldapEscape.filter("${uid}",{uid: givenName+'.'+lastName}).toLowerCase().normalize('UFD'), config.key_id, config.dn_users, (id,n) => {
+        assurerUnicite(ldapEscape.filter("${uid}",{uid: givenName+'.'+lastName}).toLowerCase().normalize('UFD'), ldapConfig.key_id, ldapConfig.dn_users, (id,n) => {
             if (n==1) { id+='.'+ldapEscape.filter("${pr}",{pr: 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...
@@ -317,7 +317,7 @@ function genererUid(givenName, lastName, promotion) {
 function genererGid(name) {
     // Le filtrage évite l'injection de code dans le LDAP, le normalize et lowerCase standardisent le format
     return new Promise((resolve, reject) => {
-        assurerUnicite(ldapEscape.filter("${id}",{id: name}).toLowerCase().normalize('UFD'), config.key_id, config.dn_groups, (id,n) => {
+        assurerUnicite(ldapEscape.filter("${id}",{id: name}).toLowerCase().normalize('UFD'), ldapConfig.key_id, ldapConfig.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;
@@ -395,9 +395,9 @@ class UtilisateurAnonyme {
      * @return {Promise(string[])} Liste des uid de groupes (noms flat des groupes) où l'id fourni est membre
      */
     listGroups(uid) {
-        let filtered_request = ldapEscape.filter(config.key_id + "=${id}," + config.dn_users, { id: uid });
+        let filtered_request = ldapEscape.filter(ldapConfig.key_id + "=${id}," + ldapConfig.dn_users, { id: uid });
         // console.log(filtered_request);
-        return rechercherLDAP(filtered_request, config.user.groups)
+        return rechercherLDAP(filtered_request, ldapConfig.user.groups)
             .then(res => res[0]);
     }
     
@@ -408,9 +408,9 @@ class UtilisateurAnonyme {
      * @return {Promise(String[])} Liste des uid des membres où l'id fournie est membre (noms flat des groupes)
      */
     listMembers(uid) {
-        let filtered_request = ldapEscape.filter(config.key_id + "=${id}," + config.dn_groups, { id: uid });
+        let filtered_request = ldapEscape.filter(ldapConfig.key_id + "=${id}," + ldapConfig.dn_groups, { id: uid });
         // console.log(filtered_request);
-        return rechercherLDAP(filtered_request, config.group.member)
+        return rechercherLDAP(filtered_request, ldapConfig.group.member)
             .then(res => res);
     }
     
@@ -423,7 +423,7 @@ class UtilisateurAnonyme {
     listAdmins(gid) {
         return new Promise((resolve, reject) => {
             rechercherLDAP(ldapEscape.filter(
-                config.key_id+"=${id},"+config.dn_users, {id : gid}), config.group.admin).then(res => resolve(res[0])
+                ldapConfig.key_id+"=${id},"+ldapConfig.dn_users, {id : gid}), ldapConfig.group.admin).then(res => resolve(res[0])
             );
         });
     }
@@ -436,7 +436,7 @@ class UtilisateurAnonyme {
      * voir `ldap_config.json`(..\..\ldap_config.json) pour les clés exactes.
      */
     getUser(uid) {
-        return rechercherLDAP(ldapEscape.filter(config.key_id+"=${id},"+config.dn_users, {id : uid}), config.user.profil);
+        return rechercherLDAP(ldapEscape.filter(ldapConfig.key_id+"=${id},"+ldapConfig.dn_users, {id : uid}), ldapConfig.user.profil);
     }
      
     /**
@@ -447,9 +447,9 @@ class UtilisateurAnonyme {
      * voir `ldap_config.json`(../../ldap_config.json) pour les clés exactes.
      */
     getGroup(gid) {
-        let filtered_request = ldapEscape.filter(config.key_id + "=${id}," + config.dn_groups, { id: gid });
+        let filtered_request = ldapEscape.filter(ldapConfig.key_id + "=${id}," + ldapConfig.dn_groups, { id: gid });
         // console.log(filtered_request);
-        return rechercherLDAP(filtered_request, config.group.profil);
+        return rechercherLDAP(filtered_request, ldapConfig.group.profil);
     }
 
     //------------------------------------------------------------------------------------------------------------------------
@@ -466,11 +466,11 @@ class UtilisateurAnonyme {
     trouverGroupesParTypes(input, type) {
         return new Promise((resolve, reject) => {
             // Simple appel à la fonction précédente
-            trouverGroupesModulable(input, [config.key_id, config.group.type]).then(gList => {
+            trouverGroupesModulable(input, [ldapConfig.key_id, ldapConfig.group.type]).then(gList => {
                 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]); }
+                    if (g[ldapConfig.group.type]==type) { gidtyList.push(g[ldapConfig.key_id]); }
                 });
                 resolve(gidtyList);
             });
@@ -486,7 +486,7 @@ class UtilisateurAnonyme {
      */
     repliquerTOLdesIds(data) {
         return new Promise((resolve, reject) => {
-            repliquerTOLModulable(data, config.key_id).then(res => {
+            repliquerTOLModulable(data, ldapConfig.key_id).then(res => {
                 resolve(res);
             });
         });
@@ -529,56 +529,56 @@ class UtilisateurConnecte extends UtilisateurAnonyme {
             let vals = {};
     
             // uid de base généré à partir du nom standardisé
-            genererGid(user, data['name']).then(id => { vals[config.group['name']]=id; });
+            genererGid(user, data['name']).then(id => { vals[ldapConfig.group['name']]=id; });
     
             // 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]);
+            ldapConfig.group.direct_input.forEach(key_att => vals[ldapConfig.group[key_att]]=data[key_att]);
     
             // Appel à la fonction de base
-            ajouterLDAP(user, config.key_id+"="+vals[config.group['name']]+","+config.dn_groups, vals).then( res => {
+            ajouterLDAP(user, ldapConfig.key_id+"="+vals[ldapConfig.group['name']]+","+ldapConfig.dn_groups, vals).then( res => {
                 // Certains champs nécessitent de petits calculs
                 let vals2={};
     
                 // Sauvegarde du nom (pour le cas où gid != data['name'])
-                vals2[config.group["name"]]=data['name'];
+                vals2[ldapConfig.group["name"]]=data['name'];
     
                 // ?!
-                vals2[config.user['password']] =  '';
+                vals2[ldapConfig.user['password']] =  '';
     
                 // Génération id aléatoire et test contre le LDAP
-                genererIdNum(user, config.groups["idNumber"], config.dn_groups).then(id => { vals2[config.group['idNumber']]=id; });
+                genererIdNum(user, ldapConfig.groups["idNumber"], ldapConfig.dn_groups).then(id => { vals2[ldapConfig.group['idNumber']]=id; });
                 // FOIREUX : Hypothèse sur la structure du reste des données mais évite un assurerUnicite à deux variables
-                vals2[config.group['idNumber2']]=vals2[config.group['idNumber']];
+                vals2[ldapConfig.group['idNumber2']]=vals2[ldapConfig.group['idNumber']];
                 
                 // Stockage machine ; dépend du prénom
-                vals2[config.group['directory']] = '/hosting/groups/'+vals[config.key_id];
+                vals2[ldapConfig.group['directory']] = '/hosting/groups/'+vals[ldapConfig.key_id];
     
                 // Code root
-                vals2[config.group['cleanFullName']]=data['name'].replace(':', ';').toLowerCase().normalize('UFD');
+                vals2[ldapConfig.group['cleanFullName']]=data['name'].replace(':', ';').toLowerCase().normalize('UFD');
                 
                 // Adressage root
-                vals2[config.group['login']] = "/sbin/nologin";
+                vals2[ldapConfig.group['login']] = "/sbin/nologin";
                 
                 // Permissions BR
-                vals2[config.group['readPerm']] = '!*';
-                vals2[config.group['writePerm']] = '!*';
+                vals2[ldapConfig.group['readPerm']] = '!*';
+                vals2[ldapConfig.group['writePerm']] = '!*';
     
                 // Inscription des valeurs calculées
-                modifierLDAP(user, config.key_id+"="+vals[config.key_id]+","+config.dn_groups, "add", vals2).then(res => {
+                modifierLDAP(user, ldapConfig.key_id+"="+vals[ldapConfig.key_id]+","+ldapConfig.dn_groups, "add", vals2).then(res => {
                     if (!res) { reject(false); }
                 });
     
                 ["posixAccount", "posixGroup", "brAccount"].forEach(cst => {
                     let vals3={};
-                    vals3[config.group['class']]=cst;
-                    modifierLDAP(user, config.key_id+"="+vals[config.key_id]+","+config.dn_groups, "add", vals3).then(res => {
+                    vals3[ldapConfig.group['class']]=cst;
+                    modifierLDAP(user, ldapConfig.key_id+"="+vals[ldapConfig.key_id]+","+ldapConfig.dn_groups, "add", vals3).then(res => {
                         if (!res) { reject(false); }
                     });
                 });
     
                 // Utilisation des fonctions adaptées pour assurer la cohérence de l'ensemble
-                data['members'].forEach(uid => { this.ajouterMembreGroupe(user, uid, vals[config.key_att]); });
-                data['admins'].forEach(uid => { this.ajouterAdministrateurGroupe(user, uid, vals[config.key_att]); });
+                data['members'].forEach(uid => { this.ajouterMembreGroupe(user, uid, vals[ldapConfig.key_att]); });
+                data['admins'].forEach(uid => { this.ajouterAdministrateurGroupe(user, uid, vals[ldapConfig.key_att]); });
     
                 resolve(true);
             });
@@ -607,8 +607,8 @@ class UtilisateurConnecte extends UtilisateurAnonyme {
             this.getUser(user, uid).then(profil => {
                 // Reecriture de profil avec les bons champs
                 Object.keys(profil).forEach(keyLDAP => {
-                    Object.keys(config.user).forEach(keyAlias => {
-                        config.user[keyAlias]=keyLDAP;
+                    Object.keys(ldapConfig.user).forEach(keyAlias => {
+                        ldapConfig.user[keyAlias]=keyLDAP;
                         profil[keyAlias]=profil[keyLDAP];
                     });
                 });
@@ -669,8 +669,8 @@ class AdministrateurConnecte extends UtilisateurConnecte {
             this.listMembers(user,gid).then(lm => {
                 if (!lm.includes(uid)) {
                     let vals = {};
-                    vals[config.groups.member] = uid;
-                    modifierLDAP(user, ldapEscape(config.key_id+"=${id},"+config.dn_groups, { id: gid }), "add", vals).then(res => {
+                    vals[ldapConfig.groups.member] = uid;
+                    modifierLDAP(user, ldapEscape(ldapConfig.key_id+"=${id},"+ldapConfig.dn_groups, { id: gid }), "add", vals).then(res => {
                         // Erreur si pb lors de la modification
                         if (!res) { reject(false); }
                     });
@@ -679,8 +679,8 @@ class AdministrateurConnecte extends UtilisateurConnecte {
             }).then(res => this.listGroups(user,uid)).then( lg => {
                 if (!lg.includes(gid)) {
                     let vals2 = {};
-                    vals2[config.users.groups] = gid;
-                    modifierLDAP(user, ldapEscape(config.key_id+"=${id},"+config.dn_users, { id: uid }), "add", vals2).then(res => {
+                    vals2[ldapConfig.users.groups] = gid;
+                    modifierLDAP(user, ldapEscape(ldapConfig.key_id+"=${id},"+ldapConfig.dn_users, { id: uid }), "add", vals2).then(res => {
                         // Erreur si pb lors de la modification
                         if (!res) { reject(false); }
                     });
@@ -704,7 +704,7 @@ class AdministrateurConnecte extends UtilisateurConnecte {
             this.listMembers(user,gid).then(lm => {
                 if (lm.includes(uid)) {
                     // Supprime tous les utilisateurs
-                    modifierLDAP(user, ldapEscape(config.key_id+"=${id},"+config.dn_groups, { id: gid }), "del", config.group.member).then(res => {
+                    modifierLDAP(user, ldapEscape(ldapConfig.key_id+"=${id},"+ldapConfig.dn_groups, { id: gid }), "del", ldapConfig.group.member).then(res => {
                         // Les rajoute un par un, sauf pour le supprimé
                         lm.forEach(id => {
                             if (id!=uid) { this.ajouterMembreGroupe(user,id, gid); }
@@ -715,7 +715,7 @@ class AdministrateurConnecte extends UtilisateurConnecte {
                 // Vérifie que l'utilisateur est pas déjà viré pour users
                 if (lg.includes(gid)) {
                     // Supprime tous les groupes
-                    modifierLDAP(user, ldapEscape(config.key_id+"=${id},"+config.dn_users, { id: uid }), "del", config.group.admin).then(res => {
+                    modifierLDAP(user, ldapEscape(ldapConfig.key_id+"=${id},"+ldapConfig.dn_users, { id: uid }), "del", ldapConfig.group.admin).then(res => {
                         // Les rajoute un par un, sauf pour le supprimé
                         lg.forEach(id => {
                             if (id!=gid) { this.ajouterMembreGroupe(user,uid, id); }
@@ -744,8 +744,8 @@ class AdministrateurConnecte extends UtilisateurConnecte {
                     if (!la.includes(uid)) {
                         // Finalement modification, uniquement dans groups
                         let vals = {};
-                        vals[config.groups.admin] = uid;
-                        modifierLDAP(user, ldapEscape(config.key_id+"=${id},"+config.dn_groups, { id: gid }), "add", vals).then(res => {
+                        vals[ldapConfig.groups.admin] = uid;
+                        modifierLDAP(user, ldapEscape(ldapConfig.key_id+"=${id},"+ldapConfig.dn_groups, { id: gid }), "add", vals).then(res => {
                             // Gestion d'erreur
                             if (!res) { reject(false); }
                         });
@@ -772,7 +772,7 @@ class AdministrateurConnecte extends UtilisateurConnecte {
             this.listAdmins(user,gid).then(la => {
                 if (la.includes(uid)) {
                     // Supprime tous les administrateurs
-                    modifierLDAP(user, ldapEscape(config.key_id+"=${id},"+config.dn_groups, { id: gid }), "del", config.group.admin).then(res => {
+                    modifierLDAP(user, ldapEscape(ldapConfig.key_id+"=${id},"+ldapConfig.dn_groups, { id: gid }), "del", ldapConfig.group.admin).then(res => {
                         // Les rajoute un par un, sauf pour le supprimé
                         la.forEach(id => {
                             if (id!=uid) { this.ajouterAdministrateurGroupe(user, id, gid); }
@@ -801,8 +801,8 @@ class AdministrateurConnecte extends UtilisateurConnecte {
             this.getGroup(user, gid).then(profil => {
                 // Reecriture de profil avec les bons champs
                 Object.keys(profil).forEach(keyLDAP => {
-                    Object.keys(config.group).forEach(keyAlias => {
-                        config.group[keyAlias]=keyLDAP;
+                    Object.keys(ldapConfig.group).forEach(keyAlias => {
+                        ldapConfig.group[keyAlias]=keyLDAP;
                         profil[keyAlias]=profil[keyLDAP];
                     });
                 });
@@ -835,11 +835,11 @@ class AdministrateurConnecte extends UtilisateurConnecte {
             // Gestion des membres et administrateurs d'abord
             this.getGroup(user, gid).then(profil => {
                 // Ordre important
-                profil[config.group['admin']].forEach(id => { this.removeGroupAdmin(user, id, gid); });
-                profil[config.group['member']].forEach(id => { this.removeGroupMember(user, id, gid); });
+                profil[ldapConfig.group['admin']].forEach(id => { this.removeGroupAdmin(user, id, gid); });
+                profil[ldapConfig.group['member']].forEach(id => { this.removeGroupMember(user, id, gid); });
             // Elimination
             }).then(res => {
-                supprimerLDAP(user, config.key_id+"="+gid+","+config.dn_groups);
+                supprimerLDAP(user, ldapConfig.key_id+"="+gid+","+ldapConfig.dn_groups);
             }).then(res => { if (res) {resolve(true); }});
         });
     }
@@ -886,21 +886,21 @@ class SuperAdministrateurConnecte extends AdministrateurConnecte {
     
             // 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
-            genererUid(user, data['givenName'],data['lastName'],data['promotion']).then(id => { vals[config.key_id]=id; } );
+            genererUid(user, data['givenName'],data['lastName'],data['promotion']).then(id => { vals[ldapConfig.key_id]=id; } );
     
             // 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
-            config.user.direct_input.forEach(key_att => vals[config.user[key_att]]=data[key_att]);
+            ldapConfig.user.direct_input.forEach(key_att => vals[ldapConfig.user[key_att]]=data[key_att]);
     
             // Appel à la fonction de base
-            ajouterLDAP(user, config.key_id+"="+vals[config.key_id]+","+config.dn_users, vals).then( res => {
+            ajouterLDAP(user, ldapConfig.key_id+"="+vals[ldapConfig.key_id]+","+ldapConfig.dn_users, vals).then( res => {
                 // Modifications multiples pour avoir plusieurs champs de même type ; boucle sur les attributs multiples (d'où mul)
-                config.user.muliple_input.forEach(key_att => {
+                ldapConfig.user.muliple_input.forEach(key_att => {
                     // On rajoute chaque valeur en entrée
                     data[key_att].forEach(val => {
                         let vals2 = {};
-                        vals2[config.user[key_att]]=val;
-                        modifierLDAP(user, config.key_id+"="+vals[config.key_id]+","+config.dn_users, "add", vals2).then(res => {
+                        vals2[ldapConfig.user[key_att]]=val;
+                        modifierLDAP(user, ldapConfig.key_id+"="+vals[ldapConfig.key_id]+","+ldapConfig.dn_users, "add", vals2).then(res => {
                             if (!res) { reject(false); }
                         });
                     });
@@ -910,51 +910,51 @@ class SuperAdministrateurConnecte extends AdministrateurConnecte {
                 let vals3={};
     
                 // Création d'un nom complet lisible
-                vals3[config.user['fullName']]=data['givenName']+' '+data['lastName'].toUpperCase();
+                vals3[ldapConfig.user['fullName']]=data['givenName']+' '+data['lastName'].toUpperCase();
                 // ?!
-                vals3[config.user['password']] =  '{CRYPT}' + data['password'];
+                vals3[ldapConfig.user['password']] =  '{CRYPT}' + data['password'];
                 // Ecriture d'un surnom s'il y a lieu
                 if ((data['nickname']!=undefined)&(data['nickname']!='')) {
-                    vals3[config.user['nickname']]=data['nickname'];
+                    vals3[ldapConfig.user['nickname']]=data['nickname'];
                 }
                 // Génération id aléatoire unique
-                genererIdNum(user, config.user['id'], config.dn_users).then(id => { vals3[config.user['id']]=id; });
+                genererIdNum(user, ldapConfig.user['id'], ldapConfig.dn_users).then(id => { vals3[ldapConfig.user['id']]=id; });
                 
                 // Stockage machine ; dépend du prénom
-                vals3[config.user['directory']] = '/hosting/users/' + data['givenName'][0];
+                vals3[ldapConfig.user['directory']] = '/hosting/users/' + data['givenName'][0];
     
                 // Code root
-                vals3[config.user['cleanFullName']]=data['fullName'].replace(':', ';').toLowerCase().normalize('UFD');
+                vals3[ldapConfig.user['cleanFullName']]=data['fullName'].replace(':', ';').toLowerCase().normalize('UFD');
                 
                 // Adressage root
-                if (data['groups'].includes("on_platal")) { vals3[config.user['login']] = "/bin/bash"; }
-                else  { vals3[config.user['login']] = "/sbin/nologin"; }
+                if (data['groups'].includes("on_platal")) { vals3[ldapConfig.user['login']] = "/bin/bash"; }
+                else  { vals3[ldapConfig.user['login']] = "/sbin/nologin"; }
                 
                 // Permissions BR
-                vals3[config.user['readPerm']] = 'br.*,public.*';
-                if (data['readPerm'].length>0) { vals3[config.user['readPerm']] += ',' + data['readPerm']; }
-                vals3[config.user['writePerm']] = 'br.*,!br.blague-du-jour,public.*,!br.campagnekes';
-                if (data['writePerm'].length>0) { vals3[config.user['readPerm']] += ',' + data['writePerm']; }
+                vals3[ldapConfig.user['readPerm']] = 'br.*,public.*';
+                if (data['readPerm'].length>0) { vals3[ldapConfig.user['readPerm']] += ',' + data['readPerm']; }
+                vals3[ldapConfig.user['writePerm']] = 'br.*,!br.blague-du-jour,public.*,!br.campagnekes';
+                if (data['writePerm'].length>0) { vals3[ldapConfig.user['readPerm']] += ',' + data['writePerm']; }
     
                 // Valeur nécessaire mais inutile
-                vals3[config.user['idNum']] ='5000';
+                vals3[ldapConfig.user['idNum']] ='5000';
     
                 // Inscription des valeurs calculées
-                modifierLDAP(user, config.key_id+"="+vals[config.user['hruid']]+","+config.dn_users, "add", vals3).then(res => {
+                modifierLDAP(user, ldapConfig.key_id+"="+vals[ldapConfig.user['hruid']]+","+ldapConfig.dn_users, "add", vals3).then(res => {
                     if (!res) { reject(false); }
                 });
     
                 ["posixAccount", "shadowAccount", "inetOrgPerson", "brAccount"].forEach(cst => {
                     let val3={};
-                    vals3[config.user['class']]=cst;
-                    modifierLDAP(user, config.key_id+"="+vals[config.user['hruid']]+","+config.dn_users, "add", vals3).then(res => {
+                    vals3[ldapConfig.user['class']]=cst;
+                    modifierLDAP(user, ldapConfig.key_id+"="+vals[ldapConfig.user['hruid']]+","+ldapConfig.dn_users, "add", vals3).then(res => {
                         if (!res) { reject(false); }
                     });
                 });
     
                 // Utilisation des fonctions adaptées pour assurer la cohérence de l'ensemble
-                data['groupsIsMember'].forEach(gid => { this.ajouterMembreGroupe(user, vals[config.key_id], gid); });
-                data['groupsIsAdmin'].forEach(gid => { this.ajouterAdministrateurGroupe(user, vals[config.key_id], gid); });
+                data['groupsIsMember'].forEach(gid => { this.ajouterMembreGroupe(user, vals[ldapConfig.key_id], gid); });
+                data['groupsIsAdmin'].forEach(gid => { this.ajouterAdministrateurGroupe(user, vals[ldapConfig.key_id], gid); });
     
                 resolve(true);
             });
@@ -978,13 +978,13 @@ class SuperAdministrateurConnecte extends AdministrateurConnecte {
         return new Promise((resolve, reject) => {
             // Gestion des groupes d'abord
             this.getUser(user, uid).then(profil => {
-                profil[config.user['groups']].forEach(gid => {
+                profil[ldapConfig.user['groups']].forEach(gid => {
                     this.isGroupAdmin(user, uid, gid).then(res => {
                         if (this.la.includes(res)) { this.supprimerAdministrateurGroupe(user, uid, gid); }
                     }).then(res => { this.removeGroupMember(user, uid, gid); });
                 });
             // Elimination
-            }).then(res => { supprimerLDAP(user, config.key_id+"="+uid+","+config.dn_users); });
+            }).then(res => { supprimerLDAP(user, ldapConfig.key_id+"="+uid+","+ldapConfig.dn_users); });
         });
     }
 }
diff --git a/src/server.ts b/src/server.ts
index 842bec3..42dc86a 100644
--- a/src/server.ts
+++ b/src/server.ts
@@ -32,6 +32,9 @@ import morgan from 'morgan';
 import path from 'path';
 import fs from 'fs';
 
+import { ldapConfig, credentialsConfig } from './ldap/config';
+
+const { dn, passwd } = credentialsConfig;
 
 const app = express(); // "The app object conventionally denotes the Express application" (https://expressjs.com/en/4x/api.html#app)
 
@@ -74,15 +77,13 @@ app.use('/assets', express.static(path.resolve('./', 'assets')));
  * Remarque: introduit aussi les middlewares session et passport, qui sont aussi utiles pour l'authentification dans les autres cas.
  */
 
-const configPath = path.resolve('./', 'ldap_config.json');
-const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
 // WTF??? why is sessionSecret in ldap_config.json? it has nothing to do with ldap. TODO
 
 // defines parameters for *session store*. (adds field req.session and do some magic stuff)
 // basically, searches for a session matching the received cookie and, if found, adds field req.blasomethingbla containing serialized object representing user (i.e. similar to what passport.serializeUser() could produce)
 // TODO: it is important to configure this right!!! please check out https://www.npmjs.com/package/express-session and make sure you understand the way session is stored. (en vrai c'est vraiment important...)
 app.use(session({
-    secret: config.sessionSecret,
+    secret: ldapConfig.sessionSecret,
     resave: true,
     saveUninitialized: false,
     //store: // TODO: change this. express-session doc warns that default value is ok to use for development only
@@ -203,8 +204,6 @@ app.post('/login',
 /**
  * @desc API GRAPHQL
  */
-
-import { dn, passwd } from "../ldap_connexion_config.json"; // default bind user
 const environment = process.env.NODE_ENV || 'development';
 
 app.use('/graphql', 
-- 
GitLab