diff --git a/src/ldap/export/group.ts b/src/ldap/export/group.ts index 4a2652c1971e72e551d132e6958fce7a711a505b..2fb7c682f40333cc45a09cbbab8a4ae776402798 100644 --- a/src/ldap/export/group.ts +++ b/src/ldap/export/group.ts @@ -198,7 +198,6 @@ export class Group { // Certains champs nécessitent de petits calculs let vals2={}; - // ?! vals2[ldapConfig.group['password']] = "{CRYPT}"+data['password']; @@ -211,17 +210,15 @@ export class Group { } // Inscription des valeurs calculées par effet de bord - if (!await Basics.change("group", gid, "add", vals2)) { - throw "Erreur lors de l'ajout des valeurs intelligentes du nouveau groupe."; - } + if (!await Basics.change("group", gid, "add", vals2)) throw "Erreur lors de l'ajout des valeurs intelligentes du nouveau groupe."; ["posixGroup", "brGroup"].forEach(cst => { let vals3={}; vals3[ldapConfig.group['classes']]=cst; Basics.change("group", gid, "add", vals3).then(res => { if (!res) throw "Erreur lors de l'ajout des valeurs constantes du nouveau groupe."; - }); }); - + }); + }); // Ajout groupes parents et fils for (let rel of ["childs","parents"]) { data[rel].forEach(gid => { @@ -231,7 +228,6 @@ export class Group { }); }); } - // Utilisation des fonctions adaptées pour assurer la cohérence de l'ensemble for (let cat of categories) { for (let uid of data[cat]) Tools.add(uid, gid, cat).then(res => { diff --git a/src/ldap/internal/config.ts b/src/ldap/internal/config.ts index 3b00495644370c4c05267190703c4a55afb2af8d..3ee7a9b97c7c0cf89b7efdba9548273dbe3badd2 100644 --- a/src/ldap/internal/config.ts +++ b/src/ldap/internal/config.ts @@ -98,7 +98,6 @@ export class userData extends partUserData { * @var {string?} site - Site web du groupe (URL) * @var {string} category - Statut du groupe ; binet, section sportive... (actuellement juste 'binet' ou 'free') * @var {string[]} parents - Liste des groupes directement parents de celui-ci - * @var {string[]} childs - Liste des groupes directement enfants 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 @@ -113,7 +112,6 @@ export class groupData { site?: string; category: string; parents: string[] = []; - //childs: string[] = []; admins: string[] = []; speakers: string[] = []; members: string[] = []; diff --git a/src/ldap/internal/tools.ts b/src/ldap/internal/tools.ts index 2500bbc88851f600fdc6f6f60ca6e7c5f1ac2bba..007aec83c5e49d6879bdcfaedf84d604d330ff07 100644 --- a/src/ldap/internal/tools.ts +++ b/src/ldap/internal/tools.ts @@ -85,7 +85,7 @@ export class Tools { // Escape user input val = ldapEscape.filter("${fil}", { fil: val }); // Gestion des dns - if (categories.concat(["parents", "child"]).includes(attribute)) { + if (categories.concat(["parents"]).includes(attribute)) { if (domain == "group") var id = ldapConfig.group.gid; else var id = ldapConfig.user.uid; val = id + '=' + val + ',' + ldapConfig[domain].dn; @@ -122,8 +122,7 @@ export class Tools { let dirtyData = {}; Object.keys(data).forEach(function(key: string) { // Some values edit can't change - if (![ 'admins','speakers','members','followers', - 'directory','classes','id','cleanFullName'].includes(key)) dirtyData[dirtyKeys.key]=data[key]; + if (!categories.concat(['directory','classes','id','cleanFullName']).includes(key)) dirtyData[dirtyKeys.key]=data[key]; }); return Basics.change(domain, id, "replace", dirtyData); } @@ -221,22 +220,26 @@ export class Tools { * @static */ static async addDFS(uid: string, gid: string, direction: boolean): Promise<boolean> { + // Classic DFS + var to_visit = [gid]; // Cas récursif ascendant (admins) - if (direction) { - var rol = "admins"; - var tov = ldapConfig.group.childs; - } + var rol = "admins"; + async function next_visit(cur_gid) { to_visit.concat(await Basics.searchSingle("group", ldapConfig.group.gid, null, "parents="+cur_gid)); } // Cas récursif descendant (membres) - else { + if (!direction) { var rol = "members"; - var tov = ldapConfig.group.parents; + async function next_visit(cur_gid) { + // Lecture du champ parents + let dns = await Basics.searchSingle("group", ldapConfig.group.parents, cur_gid); + // Reformattage DNs en gids de groupes + dns.map(dn => dn.split(',')[0].split('=')[1]); + to_visit.concat(dns); + } } - // Classic DFS - var to_visit = [gid]; while (to_visit.length > 0) { let cur_gid = to_visit.pop(); Tools.addIfAbsent(uid, "user", cur_gid, "group", rol); - to_visit.concat(await Basics.searchSingle("group", tov, cur_gid)); + await next_visit(cur_gid); } return true; } @@ -351,27 +354,31 @@ export class Tools { * @static */ static async remDFS(uid: string, gid: string, direction: boolean): Promise<boolean> { + // Classic DFS + var to_visit = [gid]; // Cas récursif ascendant (admins) - if (direction) { - var rol = "admins"; - var tov = ldapConfig.group.childs; - var checks = ["admins"]; - } - // Cas récursif descendant (members) - else { - var rol = "members"; - var tov = ldapConfig.group.parents; + var checks = ["admins"]; + // Recherche des groupes avec parents qui correspondent (efficace car index) + async function next_visit(cur_gid) { to_visit.concat(await Basics.searchSingle("group", ldapConfig.group.gid, null, "parents="+cur_gid)); } + // Cas récursif descendant (membres) + if (!direction) { var checks = ["admins","speakers","members"]; + async function next_visit(cur_gid) { + // Lecture du champ parents + let dns = await Basics.searchSingle("group", ldapConfig.group.parents, cur_gid); + // Reformattage des dns en gids + dns.map(dn => dn.split(',')[0].split('=')[1]); + to_visit.concat(dns); + } } - // Classic DFS - var to_visit = [gid]; + var rol = checks[checks.length-1]; while (to_visit.length > 0) { let cur_gid = to_visit.pop(); // Si le statut de uid dans cur_gid est un statut strict on arrête de boucler - for (let cat of checks) if ((await Tools.get(gid, "group", cat)).includes(uid)) continue; + for (let cat of checks) if ((await Tools.get(cur_gid, "group", cat)).includes(uid)) continue; // Sinon on le tue et on boucle Tools.remIfPresent(uid, "user", cur_gid, "group", rol); - to_visit.concat(await Basics.searchSingle("group", tov, cur_gid)); + await next_visit(cur_gid); } return true; }