diff --git a/src/graphql/connectors/authentifiers.js b/src/graphql/connectors/authentifiers.js index 481346f2c55d4306bdc22adc9f3293a09e0973ef..68346c6eae02f2242b2fe05af8d0212dffd7f6dd 100644 --- a/src/graphql/connectors/authentifiers.js +++ b/src/graphql/connectors/authentifiers.js @@ -9,14 +9,14 @@ import * as selectors from './selectors'; import * as list_selectors from './list_selectors'; import { utilisateurAnonyme, utilisateurConnecte, administrateurConnecte, superAdministrateurConnecte - } from '../../ldap/ldap_data'; +} from '../../ldap/ldap_data'; function user_object(user, ldap_access){ this.anonymous = Boolean(user.anonymous), this.uid = user.uid, this.password = user.password, - this.ldap_access = ldap_access + this.ldap_access = ldap_access; } /** @@ -93,7 +93,7 @@ export async function admin(user, groupUID){ */ export async function superviser(user, groupUID){ let supervised_groups = await list_selectors.supervisedGroups(user); - let i = supervised_groups.indexOf(args.groupUID) + let i = supervised_groups.indexOf(groupUID); if(i < 0) return false; return supervised_groups.justification(i) || true; diff --git a/src/graphql/connectors/connectors.js b/src/graphql/connectors/connectors.js index 9a3c6e52673473ff2946f2e694f2b509ab7a5974..c6648e6add637c3a53d2de86a4ad994ce2f1b3ab 100644 --- a/src/graphql/connectors/connectors.js +++ b/src/graphql/connectors/connectors.js @@ -8,13 +8,12 @@ import * as selectors from './selectors'; import * as list_selectors from './list_selectors'; /* - Le tag @rights et la gestion des authorisations + Le tag @rights est la gestion des autorisations. Le système GraphQL est pensé comme l'interface par laquelle les utilisateurs intéragissent avec sigma, les graphismes en moins. - Pour cette raison, et pour des questions de sécurité, il faut partir du principe que - l'utilisateir peut rédiger n'importe quelle requête, et que c'est au niveau des resolvers - que la sécurité ce déroule. C'est dans cette optique que j'utilise le tag @rights + Le client peut envoyer tout type de requête. C'est au niveau des resolvers + que les permissions sont gérées. D'où le @rights Commençons par un rappel sur le fonctionnement des droits. Chaque utilisateur a un certain niveau de droit sur chaque groupe. Ce niveau de droit indique @@ -527,7 +526,7 @@ export async function getGroupMemberUsers(user, GroupUID){ switch( type ){ case "SimpleGroup": return user.ldap_access.listerMembres(GroupUID); - return ["anatole.romon"]; + // return ["anatole.romon"]; case "MetaGroup": return getMetaGroupMemberUsers(user, GroupUID); default: diff --git a/src/ldap/ldap_data.js b/src/ldap/ldap_data.js index ba87a91531892949207b81cea4bc3ab9bfbe72f4..90997a4c455995f7a1dad1907f11eafd6d6d29e5 100644 --- a/src/ldap/ldap_data.js +++ b/src/ldap/ldap_data.js @@ -275,12 +275,12 @@ function repliquerTOL(data) { * @param {string} gid - Identification du groupe à tester * @returns {Promise(boolean)} True si l'utilisateur est membre */ -function etreMembreGroupe(uid, gid) { +function etreMembreGroupe(uid, gid, utilisateur) { return new Promise((resolve, reject) => { - listerGroupes(uid).then(lg => { - listerMembres(gid).then(lm => { + utilisateur.listerGroupes(uid).then(lg => { + utilisateur.listerMembres(gid).then(lm => { if (lg.includes(gid) | lm.includes(uid)) { - resolve(true); + resolve(true); } }); }); @@ -294,9 +294,9 @@ function etreMembreGroupe(uid, gid) { * @param {string} gid - Identification du groupe à tester * @returns {Promise(boolean)} True si l'utilisateur est administrateur */ -function etreAdministrateurGroupe(uid, gid) { +function etreAdministrateurGroupe(uid, gid, utilisateur) { return new Promise((resolve, reject) => { - listerAdministrateurs(gid).then(la => { + utilisateur.listerAdministrateurs(gid).then(la => { if (la.includes(uid)) { resolve(true); } @@ -430,7 +430,7 @@ class utilisateurAnonyme { */ listerAdministrateurs(gid) { return new Promise((resolve, reject) => { - rechercherLDAP(dapEscape.filter(config.key_id+"=${id},"+config.dn_users, {id : gid}), config.group.admin).then(res => resolve(res[0])); + rechercherLDAP(ldapEscape.filter(config.key_id+"=${id},"+config.dn_users, {id : gid}), config.group.admin).then(res => resolve(res[0])); }); } @@ -443,7 +443,7 @@ class utilisateurAnonyme { */ renseignerSurUtilisateur(uid) { return new Promise((resolve, reject) => { - rechercherLDAP(dapEscape.filter(config.key_id+"=${id},"+config.dn_users, {id : uid}), config.user.profil).then(res => resolve(res)); + rechercherLDAP(ldapEscape.filter(config.key_id+"=${id},"+config.dn_users, {id : uid}), config.user.profil).then(res => resolve(res)); }); } @@ -456,7 +456,7 @@ class utilisateurAnonyme { */ renseignerSurGroupe(gid) { return new Promise((resolve, reject) => { - rechercherLDAP(dapEscape.filter(config.key_id+"=${id},"+config.dn_groups, {id : gid}), config.group.profil).then(res => resolve(res)); + rechercherLDAP(ldapEscape.filter(config.key_id+"=${id},"+config.dn_groups, {id : gid}), config.group.profil).then(res => resolve(res)); }); } @@ -471,7 +471,7 @@ class utilisateurAnonyme { * @arg {string} type - String aux valeurs prédéfinies dans ldap_config. * @return {Promise(string[])} Liste des uid de groupes dont le nom ressemble à l'input */ - trouverGroupesParTypes(input, type) { + 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 => { @@ -508,6 +508,7 @@ class utilisateurAnonyme { */ class utilisateurConnecte extends utilisateurAnonyme { constructor(user) { + super(user); connecterLDAP(user); } @@ -582,8 +583,8 @@ class utilisateurConnecte extends utilisateurAnonyme { }); // Utilisation des fonctions adaptées pour assurer la cohérence de l'ensemble - data['members'].forEach(uid => { ajouterMembreGroupe(user, uid, vals[config.key_att]); }); - data['admins'].forEach(uid => { ajouterAdministrateurGroupe(user, uid, vals[config.key_att]); }); + data['members'].forEach(uid => { this.ajouterMembreGroupe(user, uid, vals[config.key_att]); }); + data['admins'].forEach(uid => { this.ajouterAdministrateurGroupe(user, uid, vals[config.key_att]); }); resolve(true); }); @@ -609,7 +610,7 @@ class utilisateurConnecte extends utilisateurAnonyme { editerUtilisateur(user, uid, data) { return new Promise((resolve, reject) => { // Récupération des anciennes données - renseignerSurUtilisateur(user, uid).then(profil => { + this.renseignerSurUtilisateur(user, uid).then(profil => { // Reecriture de profil avec les bons champs Object.keys(profil).forEach(keyLDAP => { Object.keys(config.user).forEach(keyAlias => { @@ -618,7 +619,7 @@ class utilisateurConnecte extends utilisateurAnonyme { }); }); // Régénération du champ manquant dans profil - listerGroupes(user, uid).then(lg => { + this.listerGroupes(user, uid).then(lg => { profil['groupsIsAdmin']=[]; lg.forEach(gid =>{ etreAdministrateurGroupe(user, uid, gid).then(res =>{ @@ -629,8 +630,8 @@ class utilisateurConnecte extends utilisateurAnonyme { profil[key]=data[key]; }); // Modification propre - supprimerUtilisateur(user, uid).then(r => { - creerUtilisateur(user, profil).then(res => { if (!res) {reject(false); }}); + this.supprimerUtilisateur(user, uid).then(r => { + this.creerUtilisateur(user, profil).then(res => { if (!res) {reject(false); }}); }).then (res => { resolve(true); }); }); }); @@ -671,7 +672,7 @@ class administrateurConnecte extends utilisateurConnecte { ajouterMembreGroupe(user, uid, gid) { return new Promise((resolve, reject) => { // Vérifie que l'utilisateur est pas déjà membre pour groupes - listerMembres(user,gid).then(lm => { + this.listerMembres(user,gid).then(lm => { if (!lm.includes(uid)) { let vals = {}; vals[config.groups.member] = uid; @@ -681,7 +682,7 @@ class administrateurConnecte extends utilisateurConnecte { }); } // Vérifie que l'utilisateur est pas déjà membre pour users - }).then(res => listerGroupes(user,uid)).then( lg => { + }).then(res => this.listerGroupes(user,uid)).then( lg => { if (!lg.includes(gid)) { let vals2 = {}; vals2[config.users.groups] = gid; @@ -706,24 +707,24 @@ class administrateurConnecte extends utilisateurConnecte { supprimerMembreGroupe(user, uid, gid) { return new Promise((resolve, reject) => { // Vérifie que l'utilisateur est pas déjà viré pour groupes - listerMembres(user,gid).then(lm => { + this.listerMembres(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 => { // Les rajoute un par un, sauf pour le supprimé lm.forEach(id => { - if (id!=uid) { ajouterMembreGroupe(user,id, gid); } + if (id!=uid) { this.ajouterMembreGroupe(user,id, gid); } }); }); } - }).then(res => listerGroupes(user,uid)).then(lg => { + }).then(res => this.listerGroupes(user,uid)).then(lg => { // 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 => { // Les rajoute un par un, sauf pour le supprimé lg.forEach(id => { - if (id!=gid) { ajouterMembreGroupe(user,uid, id); } + if (id!=gid) { this.ajouterMembreGroupe(user,uid, id); } }); }); } @@ -744,8 +745,8 @@ class administrateurConnecte extends utilisateurConnecte { ajouterAdministrateurGroupe(user, uid, gid){ return new Promise((resolve, reject) => { // ajouter - ajouterMembreGroupe(user,uid,gid).then(res => { - listerAdministrateurs(user,gid).includes(uid).then(la => { + this.ajouterMembreGroupe(user,uid,gid).then(res => { + this.listerAdministrateurs(user,gid).includes(uid).then(la => { if (!la.includes(uid)) { // Finalement modification, uniquement dans groups let vals = {}; @@ -772,15 +773,15 @@ class administrateurConnecte extends utilisateurConnecte { supprimerAdministrateurGroupe(user, uid, gid) { return new Promise((resolve, reject) => { // Peut paraître absurde mais permet de s'assurer que le membre est bien présent et que ses champs sont comme il faut - supprimerMembreGroupe(user, uid, gid).then( res => { ajouterMembreGroupe(user,uid,gid); }); + this.supprimerMembreGroupe(user, uid, gid).then( res => { this.ajouterMembreGroupe(user,uid,gid); }); // Vérifie que l'utilisateur est bien admins (comme dans supprimerMembreGroupe) - listerAdministrateurs(user,gid).then(la => { + this.listerAdministrateurs(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 => { // Les rajoute un par un, sauf pour le supprimé la.forEach(id => { - if (id!=uid) { ajouterAdministrateurGroupe(user, id, gid); } + if (id!=uid) { this.ajouterAdministrateurGroupe(user, id, gid); } }); }); } @@ -803,7 +804,7 @@ class administrateurConnecte extends utilisateurConnecte { editerGroupe(user, gid, data) { return new Promise((resolve, reject) => { // Récupération des anciennes données - renseignerSurGroupe(user, gid).then(profil => { + this.renseignerSurGroupe(user, gid).then(profil => { // Reecriture de profil avec les bons champs Object.keys(profil).forEach(keyLDAP => { Object.keys(config.group).forEach(keyAlias => { @@ -816,8 +817,8 @@ class administrateurConnecte extends utilisateurConnecte { profil[key]=data[key]; }); // Modification propre - supprimerGroupe(user, gid).then(r => { - creerGroupe(user, profil).then(res => { if (!res) { reject(false); }}); + this.supprimerGroupe(user, gid).then(r => { + this.creerGroupe(user, profil).then(res => { if (!res) { reject(false); }}); }).then(res => { resolve(true); }); }); }); @@ -838,10 +839,10 @@ class administrateurConnecte extends utilisateurConnecte { supprimerGroupe(user, gid) { return new Promise(function(resolve, reject) { // Gestion des membres et administrateurs d'abord - renseignerSurGroupe(user, gid).then(profil => { + this.renseignerSurGroupe(user, gid).then(profil => { // Ordre important - profil[config.group['admin']].forEach(id => { supprimerAdministrateurGroupe(user, id, gid); }); - profil[config.group['member']].forEach(id => { supprimerMembreGroupe(user, id, gid); }); + profil[config.group['admin']].forEach(id => { this.supprimerAdministrateurGroupe(user, id, gid); }); + profil[config.group['member']].forEach(id => { this.supprimerMembreGroupe(user, id, gid); }); // Elimination }).then(res => { supprimerLDAP(user, config.key_id+"="+gid+","+config.dn_groups); @@ -958,8 +959,8 @@ class superAdministrateurConnecte extends administrateurConnecte { }); // Utilisation des fonctions adaptées pour assurer la cohérence de l'ensemble - data['groupsIsMember'].forEach(gid => { ajouterMembreGroupe(user, vals[config.key_id], gid); }); - data['groupsIsAdmin'].forEach(gid => { ajouterAdministrateurGroupe(user, vals[config.key_id], gid); }); + data['groupsIsMember'].forEach(gid => { this.ajouterMembreGroupe(user, vals[config.key_id], gid); }); + data['groupsIsAdmin'].forEach(gid => { this.ajouterAdministrateurGroupe(user, vals[config.key_id], gid); }); resolve(true); }); @@ -982,11 +983,11 @@ class superAdministrateurConnecte extends administrateurConnecte { supprimerUtilisateur(user, uid) { return new Promise((resolve, reject) => { // Gestion des groupes d'abord - renseignerSurUtilisateur(user, uid).then(profil => { + this.renseignerSurUtilisateur(user, uid).then(profil => { profil[config.user['groups']].forEach(gid => { etreAdministrateurGroupe(user, gid).then(res => { - if (la.includes(res)) { supprimerAdministrateurGroupe(user, uid, gid); } - }).then(res => { supprimerMembreGroupe(user, uid, gid); }); + if (this.la.includes(res)) { this.supprimerAdministrateurGroupe(user, uid, gid); } + }).then(res => { this.supprimerMembreGroupe(user, uid, gid); }); }); // Elimination }).then(res => { supprimerLDAP(user, config.key_id+"="+uid+","+config.dn_users); });