From 18f9a81e0dc28eec394c04ea45900fbf89c28569 Mon Sep 17 00:00:00 2001 From: Oliver Facklam <oliver.facklam@polytechnique.edu> Date: Sat, 9 Feb 2019 13:48:47 +0100 Subject: [PATCH] Fix sabotage GRZ --- ldap_config.json | 3 +-- src/graphql/models/authorization.ts | 2 +- src/ldap/export/user.ts | 8 +++++++- src/ldap/internal/basics.ts | 7 ++++++- src/ldap/internal/config.ts | 4 ++-- src/ldap/internal/tools.ts | 21 +++++++++------------ 6 files changed, 26 insertions(+), 19 deletions(-) diff --git a/ldap_config.json b/ldap_config.json index 62d56af..93e8eb9 100644 --- a/ldap_config.json +++ b/ldap_config.json @@ -11,7 +11,6 @@ "group":"ou=groups,dc=frankiz,dc=net", "user": "ou=eleves,dc=frankiz,dc=net" }, - "key_id": "uid", "comment_3": "Placeholders et indications de contenu de certains champs du LDAP généré par frankiz pour les utilisateurs", "user": { @@ -35,7 +34,7 @@ }, "comment_4": "Placeholders et indications de contenu de certains champs du LDAP généré par frankiz pour les groupes", "group": { - "gid": "uid", + "gid": "cn", "name": "sn", "site": "website", "description": "description", diff --git a/src/graphql/models/authorization.ts b/src/graphql/models/authorization.ts index be0a395..a4dc65c 100644 --- a/src/graphql/models/authorization.ts +++ b/src/graphql/models/authorization.ts @@ -70,7 +70,7 @@ export class AuthorizationModel { console.log("calling UT.peek from ldap connector (User Tool)...") let data = await UT.peek(this.uid); console.log("UT.peek returned with data:"); - console.log(data); + //console.log(data); this.viewerOf = await Tools.viewerOf(data); this.memberOf = await Tools.memberOf(data); diff --git a/src/ldap/export/user.ts b/src/ldap/export/user.ts index 0924928..0d192ec 100644 --- a/src/ldap/export/user.ts +++ b/src/ldap/export/user.ts @@ -6,6 +6,7 @@ import {ldapConfig, userData, categories} from '../internal/config'; import {Basics} from '../internal/basics'; import {Tools} from '../internal/tools'; +import ldapEscape from 'ldap-escape'; //------------------------------------------------------------------------------------------------------------------------ // Classes à exporter TBT @@ -34,7 +35,12 @@ export class User { static async peek(uid: string) : Promise<userData> { try { let data : userData = await Tools.peek<userData>("user", uid, userData); - for (let cat in categories) { data[cat] = await Basics.searchSingle("group", ldapConfig.group.key_id, "*", ldapConfig.group[cat]+"="+uid); } + for (let cat of categories) { + let dn = ldapConfig.user.uid + "=" + ldapEscape.filter("${txt}", { txt: uid }) + "," + ldapConfig.dn.user; + console.log(ldapConfig.group[cat] + "=" + dn); + data[cat] = await Basics.searchSingle("group", ldapConfig.group.gid, null, ldapConfig.group[cat] + "=" + dn); + console.log(data[cat]); + } return data; } catch(err) { diff --git a/src/ldap/internal/basics.ts b/src/ldap/internal/basics.ts index 7097d58..942790d 100644 --- a/src/ldap/internal/basics.ts +++ b/src/ldap/internal/basics.ts @@ -101,7 +101,11 @@ export class Basics { static search(domain: 'group'|'user', attributes: string[], id: string, filter: string, handler : (entry: any) => void) : Promise<void> { Basics.adminBind(); let dn =""; - if (id != null) { dn+=ldapConfig.key_id+'='+ ldapEscape.dn("${txt}", { txt: id}) +','; } + if (id != null) { + if (domain == "group") { dn+=ldapConfig.group.gid; } + else { dn += ldapConfig.user.uid; } + dn += '=' + ldapEscape.dn("${txt}", { txt: id }) + ','; + } dn+=ldapConfig.dn[domain]; // Interrogation LDAP selon filter let promise = new Promise<void>(function(resolve, reject) { @@ -144,6 +148,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(entry.object) vals.push(entry.object[attribute]); }); return vals; diff --git a/src/ldap/internal/config.ts b/src/ldap/internal/config.ts index 4924c34..51e345f 100644 --- a/src/ldap/internal/config.ts +++ b/src/ldap/internal/config.ts @@ -10,10 +10,10 @@ import fs from 'fs'; import path from 'path'; import colors from 'colors'; import dotenv from 'dotenv'; -dotenv.config({ path: path.resolve("/"+__dirname, '..', '..', '..', './.env') }); +dotenv.config({ path: path.resolve(__dirname, '..', '..', '..', './.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()); diff --git a/src/ldap/internal/tools.ts b/src/ldap/internal/tools.ts index 507d909..1c5a6b2 100644 --- a/src/ldap/internal/tools.ts +++ b/src/ldap/internal/tools.ts @@ -34,20 +34,17 @@ export class Tools { * @async */ static async peek<T>(domain: 'user'|'group', id: string, type: new () => T) : Promise<T> { - var dirtyKeys = ldapConfig[domain]; - let cleanData : T = new type(); - let attr = Object.keys(dirtyKeys).map(key => dirtyKeys[key]); - //console.log(attr); - let dirtyData = (await Basics.searchMultiple(domain, attr, id))[0]; - console.log(dirtyData); - console.log(cleanData); + let map = ldapConfig[domain]; + let cleanKeys = Object.keys(map); + let dirtyKeys = cleanKeys.map(key => map[key]); + + let cleanData: T = new type(); + let dirtyData = (await Basics.searchMultiple(domain, dirtyKeys, id))[0]; // Rename output - for (let uncleanKey in dirtyData) { - for (let cleanKey of Object.keys(cleanData)) { - console.log(cleanKey); - if (uncleanKey==dirtyKeys[cleanKey]) { cleanData[cleanKey] = dirtyData[uncleanKey]; } - } + for(let cleanKey of cleanKeys) { + cleanData[cleanKey] = dirtyData[map[cleanKey]]; } + //console.log(cleanData); return cleanData; } -- GitLab