From 1b6e303fceb6332a48380cdaf7f23a429100395c Mon Sep 17 00:00:00 2001 From: Oliver Facklam <oliver.facklam@polytechnique.edu> Date: Tue, 26 Feb 2019 10:48:48 +0100 Subject: [PATCH] Modifs LDAP --- src/ldap/export/group.ts | 4 ++++ src/ldap/export/user.ts | 4 +++- src/ldap/internal/basics.ts | 5 ++++- src/ldap/internal/config.ts | 16 +++++++--------- src/ldap/internal/tools.ts | 10 ++++++++-- 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/ldap/export/group.ts b/src/ldap/export/group.ts index a587b5d..7f1fb58 100644 --- a/src/ldap/export/group.ts +++ b/src/ldap/export/group.ts @@ -12,6 +12,8 @@ import ldapEscape from 'ldap-escape'; // Classes à exporter TBT //------------------------------------------------------------------------------------------------------------------------ +export {groupData}; + export class Group { /** * @memberof LDAP @@ -35,6 +37,8 @@ export class Group { let data = await Tools.peek<groupData>("group", gid, groupData); // Extraction des uid de membres for (let cat of categories) data[cat] = data[cat].map(dirtyUid => dirtyUid.split(',')[0].split('=')[1]); + data.parents = data.parents.map(dirtyGid => dirtyGid.split(',')[0].split('=')[1]) + //console.log("Found " + data.gid); return data; } catch(err) { diff --git a/src/ldap/export/user.ts b/src/ldap/export/user.ts index c7b3f4b..cefd376 100644 --- a/src/ldap/export/user.ts +++ b/src/ldap/export/user.ts @@ -40,7 +40,9 @@ export class User { let dn = ldapConfig.user.uid + "=" + ldapEscape.filter("${txt}", { txt: uid }) + "," + ldapConfig.dn.user; let tmp = await Basics.searchSingle("group", ldapConfig.group.gid, null, ldapConfig.group[cat] + "=" + dn); // Filtrage du DN LDAP - data[cat] = tmp.map(dirtyUid => dirtyUid.split(',')[0].split('=')[1]); + //data[cat] = tmp.map(dirtyUid => dirtyUid.split(',')[0].split('=')[1]); + // C'est déja propre car on ne demande que le CN + data[cat] = tmp; } return data; } diff --git a/src/ldap/internal/basics.ts b/src/ldap/internal/basics.ts index 568947c..05dff1f 100644 --- a/src/ldap/internal/basics.ts +++ b/src/ldap/internal/basics.ts @@ -17,7 +17,7 @@ var client = ldap.createClient({ url: ldapConfig.server}); // Interface pratique pour que Typescript comprenne ce qu'est un dictionnaire simple interface dic { - [Key: string]: string; + [Key: string]: string | string[]; } //------------------------------------------------------------------------------------------------------------------------ @@ -107,6 +107,7 @@ export class Basics { dn += '=' + ldapEscape.dn("${txt}", { txt: id }) + ','; } dn+=ldapConfig.dn[domain]; + console.log("Searching dn= " + dn + ", filter : " + filter); // Interrogation LDAP selon filter let promise = new Promise<void>(function(resolve, reject) { client.search(dn, { // Must be escaped in case of a malignious false id @@ -148,6 +149,7 @@ export class Basics { let vals=[]; await Basics.search(domain, [attribute], id, filter, entry => { // Cas un seul attribut où le résultat est une liste directement + console.log("searchSingle found " + entry.object[(domain == 'group' ? ldapConfig['group']['gid'] : ldapConfig['user']['uid'])]); vals.push(entry.object[attribute]); }); return vals; @@ -172,6 +174,7 @@ export class Basics { await Basics.search(domain, attributes, id, filter, entry => { // Cas plusieurs attributs donc résultat dictionnaire vals.push({}); + console.log("searchMultiple found " + entry.object[(domain == 'group' ? ldapConfig['group']['gid'] : ldapConfig['user']['uid'])]); attributes.forEach(attribute => { vals.slice(-1)[0][attribute]=entry.object[attribute]; }); diff --git a/src/ldap/internal/config.ts b/src/ldap/internal/config.ts index 39ba4f6..1c1a903 100644 --- a/src/ldap/internal/config.ts +++ b/src/ldap/internal/config.ts @@ -17,7 +17,7 @@ console.log(colors.red("Loading .env config file from "+path_env)); dotenv.config({ path: path_env }); // Point central ; tous les champs de la BDD sont 'cachés' dans config.json et pas visibles directement -let path_config = path.resolve(__dirname, '..', '..', '..', '..', './ldap_config.json'); +let path_config = path.resolve(__dirname, '..', '..', '..', './ldap_config.json'); console.log(colors.cyan("Loading LDAP config file from "+path_config)); export const ldapConfig = JSON.parse(fs.readFileSync(path_config).toString()); @@ -85,8 +85,7 @@ export class userData { * @var {string} description - Description du groupe (script Markdown) * @var {string} site - Site web du groupe (URL) * @var {string} category - Statut du groupe ; binet, section sportive... (actuellement juste 'binet' ou 'free') - * @var {string[]} childs - Liste des groupes enfants de première génération de celui-ci - * @var {string[]} parents - Liste des groupes directement parents de celui-ci ; symétrique du précédent + * @var {string[]} parents - Liste des groupes directement parents de celui-ci * @var {string[]} admins - Liste des admins du groupe * @var {string[]} speakers - Liste des porte-parole du groupe * @var {string[]} members - Liste des membres du groupe @@ -101,10 +100,9 @@ export class groupData { description?: string; site?: string; category: string; - childs: string[]; - parents: string[]; - admins: string[]; - speakers: string[]; - members: string[]; - followers: string[]; + parents: string[] = []; + admins: string[] = []; + speakers: string[] = []; + members: string[] = []; + followers: string[] = []; } \ No newline at end of file diff --git a/src/ldap/internal/tools.ts b/src/ldap/internal/tools.ts index bc7057d..8ed411e 100644 --- a/src/ldap/internal/tools.ts +++ b/src/ldap/internal/tools.ts @@ -43,7 +43,13 @@ export class Tools { let cleanData: T = new type(); let dirtyData = (await Basics.searchMultiple(domain, dirtyKeys, id))[0]; // Renommage des clés - for(let cleanKey of cleanKeys) cleanData[cleanKey] = dirtyData[map[cleanKey]]; + for(let cleanKey of cleanKeys) { + let val = dirtyData[map[cleanKey]]; + if (val !== undefined) { + if (Array.isArray(cleanData[cleanKey]) && !Array.isArray(val)) val = [val]; + cleanData[cleanKey] = val; + } + } return cleanData; } @@ -65,7 +71,7 @@ export class Tools { static async search(domain: "user"|"group", data: userData|groupData) : Promise<string[]> { let filter=""; // Iteration pour chaque champ, alourdissement du filtre selon des trucs prédéfinis dans ldapConfig encore - for (var key of ldapConfig[domain]) { + for (var key in ldapConfig[domain]) { if ((data[key]!= undefined) && (data[key] != '')) { // Si il y a qque chose à chercher pour ce filtre if (!Array.isArray(data[key])) data[key]=[data[key]]; // Génération systématique d'une liste de valeurs à rechercher // Iteration pour chaque valeur fournie par l'utilisateur -- GitLab