From 77823b9a4d405e59f1b7908a3275d9ef447f67b6 Mon Sep 17 00:00:00 2001
From: hawkspar <quentin.chevalier@polytechnique.edu>
Date: Thu, 13 Sep 2018 22:51:59 +0200
Subject: [PATCH] POO

---
 src/ldap/admins.js    | 20 +++++++++++++-------
 src/ldap/users.js     | 14 +++++++++-----
 src/ldap/utilities.js | 10 +++++-----
 3 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/src/ldap/admins.js b/src/ldap/admins.js
index f3badd0..7120ec1 100644
--- a/src/ldap/admins.js
+++ b/src/ldap/admins.js
@@ -9,6 +9,7 @@ import Tests from './utilities';
 import User from './users';
 // Essentiels pour le fichier de config
 import path from 'path';
+import bcrypt from 'bcrypt';
 import fs from 'fs';
 
 // Point central ; tous les champs de la BDD sont 'cachés' dans config.json et pas visibles directement
@@ -276,7 +277,7 @@ class SuperAdmin extends Admin {
      * @arg {string} data[nickname] [] - Surnom
      * @arg {string} data[birthdate] - Date d'anniversaire au format annee-mois-jour
      * @arg {string} data[password] - Mot de passe
-     * @arg {string} data[promotion] - Simple année d'entrée école (pas d'X17)
+     * @arg {string} data[promotion] - Simple année d'entrée école (pas d'X)
      * @arg {string} data[mail] - Courriel supposé valide
      * @arg {string} data[phone] - String du numéro de portable
      * @arg {string} data[photo] - Photo jpeg directement en bytestring
@@ -328,13 +329,18 @@ class SuperAdmin extends Admin {
         // Création d'un nom complet lisible
         vals3[config.user['fullName']]=data['givenName']+' '+data['lastName'].toUpperCase();
 
-        // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        // TBM CA MARCHERA PB PAS
-        // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        vals3[config.user['password']] =  '{CRYPT}' + data['password'];
+        try {
+            // Génération d'un hash péchu avec 10 itérations de salt
+            bcrypt.hash(data['password'], 10, (err, hash) => {
+                vals3[config.user['password']] = "{CRYPT}"+hash;
+            });
+        }
+        catch {
+            throw "Erreur lors de la génération d'un mot de passe aléatoire pour le nouvel utilisateur.";
+        }
         
         // Ecriture d'un surnom s'il y a lieu
-        if ((data['nickname']!=undefined)&&(data['nickname']!='')) {
+        if ((data['nickname']!=undefined) && (data['nickname']!='')) {
             vals3[config.user['nickname']]=data['nickname'];
         }
         try {
@@ -361,7 +367,7 @@ class SuperAdmin extends Admin {
         vals3[config.user['writePerm']] = 'br.*,!br.blague-du-jour,public.*,!br.campagnekes';
         if (data['writePerm'].length>0) { vals3[config.user['readPerm']] += ',' + data['writePerm']; }
 
-        // Valeur nécessaire mais inutile
+        // Valeur nécessaire ASKIP mais inutile
         vals3[config.user['idNum']] ='5000';
 
         // Inscription des valeurs calculées
diff --git a/src/ldap/users.js b/src/ldap/users.js
index bc17727..33484de 100644
--- a/src/ldap/users.js
+++ b/src/ldap/users.js
@@ -261,7 +261,7 @@ class User extends Open {
         vals2[config.group["name"]]=data['name'];
 
         // ?!
-        vals2[config.user['password']] =  '';
+        vals2[config.user['password']] = '';
 
         // Génération id aléatoire et test contre le LDAP
         try {
@@ -321,11 +321,11 @@ class User extends Open {
     /**
      * @summary Fonction qui édite un utilisateur existant dans le LDAP. Très similaire à {@link creerUtilisateur}
      * @desc Appelle simplement {@link creerUtilisateur} et {@link supprimerUtilisateur} en godmode, plus {@link renseignerSurUtilisateur} pour les champs non fournis.
-     * Ce choix a pour conséquence que l'ordre du dictionnaire de correspondance dans ldap_config est important. A modifier car donne trop de pouvoir à l'utilisateur.
+     * Ce choix a pour conséquence que l'ordre du dictionnaire de correspondance dans ldap_config est important. Une version "nerfée" de cette fonction est envisageable ; elle donne bcp de pouvoir à l'utilisateur.
      * @arg {string} uid - Utilisateur à modifier (le plus souvent le même, mais root possible)
      * @arg {Object} data - Dictionnaire des informations utilisateurs au même format que pour {@link creerUtilisateur} avec tous les champs optionnels ;
-     * MEF ces valeurs vont écraser les précédentes.
-     * attention toutes les clés de cette entrée seront modifiées dans le LDAP
+     * Attention toutes les clés de cette entrée seront modifiées dans le LDAP ; les nouveaux résultats écrasant les précédents, sauf 'readPerm','writePerm','forlifes','ips','groups' et 'groupsIsAdmin'
+     * qui sont censurés pour cette fonction)
      * @return {Promise(boolean)} `true` si la modification s'est bien déroulée, false sinon
      * @async
      */
@@ -350,8 +350,12 @@ class User extends Open {
             });
             // Surcharge des champs à modifier selon data
             Object.keys(data).forEach(key => {
-                profil[key]=data[key];
+                // Some fields the user cannot change (groups and groupsIsAdmin must be changed through addGroupMember and addGroupAdmin in Admin)
+                if (!['readPerm','writePerm','forlifes','ips','groups','groupsIsAdmin'].includes(key)) { profil[key]=data[key]; }
             });
+            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+            // TBM : rajouter god passwd. Moche mais bonne façon de faire
+            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
             // Passage en godmode
             var god = SuperAdmin({"uid":"", "password":""});
             // Modification propre par effet de bord
diff --git a/src/ldap/utilities.js b/src/ldap/utilities.js
index 61d23c0..f5ab794 100644
--- a/src/ldap/utilities.js
+++ b/src/ldap/utilities.js
@@ -88,11 +88,11 @@ class SmartSearch {
                 data[key].forEach(val => {
                     // Traduction en language LDAP
                     let attribute = config.user[key];
-                    // Creation du filtre étape par étape
+                    // Creation incrémentale du filtre
                     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 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
                 });
             }
         }
@@ -196,7 +196,7 @@ class Tests {
      */
     static async generateId(attribut, dn) {
         try {
-            return this.ensureUnique("0", attribut, dn, (id,n) => { Math.floor((Math.random() * 100000) + 1).toString(); });
+            return this.ensureUnique("0", attribut, dn, (id,n) => { return Math.floor((Math.random() * 100000) + 1).toString(); });
         }
         catch {
             throw "Erreur lors de l'assurance de l'unicité d'un unique identifier numérique.";
-- 
GitLab