diff --git a/src/config_passport.js b/src/config_passport.js index 050b5e932fae24ff015f06de14786806c0ac855e..33a86aac56a7afc9dd535b33959f27e80600fade 100644 --- a/src/config_passport.js +++ b/src/config_passport.js @@ -32,7 +32,7 @@ */ import passport from 'passport'; import LdapStrategy from 'passport-ldapauth'; -import { ldapConfig } from './ldap/config'; +import { ldapConfig } from './ldap/internal/config'; // specifies options for 'ldapauth' strategy, to customize the behaviour of subsequent passport.authenticate('ldapauth') calls passport.use(new LdapStrategy({ diff --git a/src/graphql/connectors/authentifiers.ts b/src/graphql/connectors/authentifiers.ts deleted file mode 100644 index b453c639f0dfb280f9e50fbb833c093350ae57fe..0000000000000000000000000000000000000000 --- a/src/graphql/connectors/authentifiers.ts +++ /dev/null @@ -1,125 +0,0 @@ -/** - * @file Fonctions d'authentification - * @author akka vodol - */ - -import knex from '../../../db/knex_router.js'; -import * as connectors from './connectors.js'; -import * as selectors from './selectors.js'; -import * as list_selectors from './list_selectors.js'; - -/** - * @summary Place-holder permettant de concaténer utilisateur et permissions dans un seul objet - * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. - * @return {Object} Prototype de la fonction contenant la concaténation des deux arguments. - */ -// function OldUser(user, ldap_access){ //hawkspar->akka ; ceci pourrait avantageusement être une classe -// this.anonymous = Boolean(user.anonymous), -// this.uid = user.uid, -// this.password = user.password, -// this.ldap_access = ldap_access; -// } - -/** - * @summary un objet typé pour représenter la personne effectuant la requête. A ne pas confondre avec l'objet représentant un utilisateur - */ -class QUser{ - anonymous : boolean; - uid : string; - constructor(auth, uid){ - this.anonymous = !auth; - this.uid = uid; - } -} - -/** - * @summary Authentifie un utilisateur anonyme en appelant {@link User} et {@link LDAPOpen} - * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. - * * @return {Promise(Object)} Un objet user si l'utilisateur possède les droits indiqués, - * null sinon - * @rights user - */ -export function anonymous(user){ - return new QUser(true, null); -} - -/** - * @summary Authentifie un utilisateur comme authentifié - * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. - * * @return {Promise(Object)} Un objet user si l'utilisateur possède les droits indiqués, - * null sinon - * @rights user - */ -export function loggedIn(user){ //hawkspar: WTF ? Pq garder son groupUID ? - return new QUser(false, user.uid); -} - -/** - * @summary Authentifie un utilisateur comme viewer(groupUID) - * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. - * * @return {null} - * @rights user - */ -export function viewer(user, groupUID){ - return null; // Du coup useless non ? -} - -/** - * @summary Authentifie un utilisateur anonyme en appelant {@link User} et {@link LDAPUser} - * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. - * * @return {Promise(Object)} Un objet user si l'utilisateur possède les droits indiqués, - * null sinon - * @rights user - */ -export async function member(user, groupUID){ - let group_list = await selectors.groupsWithMember(user); - let test = await knex.with('group_list', group_list).select().from('group_list').where('uid', groupUID); - if(test[0]) - return new User(user, new LDAPUser(user)); - return await admin(user, groupUID); -} - -/** - * @summary Authentifie un utilisateur comme viewer(groupUID) en appelant {@link admin} - * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. - * * @return {Promise(Object)} Un objet user si l'utilisateur possède les droits indiqués, - * null sinon - * @rights user - */ -export async function speaker(user, groupUID){ - return await admin(user, groupUID); -} - -/** - * @summary Authentifie un utilisateur anonyme eneffectuant une requête knex {@link list_selectors.usersWithAdminRights} et en appelant {@link User} et {@link LDAPAdmin} - * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. - * * @return {Promise(Object)} Un objet user si l'utilisateur possède les droits indiqués, - * null sinon - * @rights user - */ -export async function admin(user, groupUID){ - let adminList = await list_selectors.usersWithAdminRights(user, groupUID); - if (typeof adminList != "undefined" && adminList.indexOf(user.uid) != -1) - return new User(user, new LDAPAdmin(user)); -} - -/** - * @summary Authentifie un utilisateur comme viewer(groupUID) à l'aide de {@link User} et {@link LDAPSupervisor} - * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. - * @return {Promise(uid)} L'utilisateur possède-t-il les droits de superviseur ? - * Si oui, renvoie la justification. Sinon, renvoie false. - * Attention : renvoie true si l'utilisateur a les droits mais sans justification. - * @rights user - */ -export async function superviser(user, groupUID){ - let supervised_groups = await list_selectors.supervisedGroups(user); - console.log(supervised_groups); - for(let i = 0; i < supervised_groups.length; i++){ - if(supervised_groups[i].uid == groupUID){ - let user_obj = new User(user, new LDAPSupervisor(user)); - user_obj.justification = (supervised_groups.justification && supervised_groups.justification[i]); - return user_obj; - } - } - return false; -} \ No newline at end of file diff --git a/src/graphql/connectors/connectors.ts b/src/graphql/connectors/connectors.ts deleted file mode 100644 index 2e2aaba74cd7b687581635cb7c36301f563a2676..0000000000000000000000000000000000000000 --- a/src/graphql/connectors/connectors.ts +++ /dev/null @@ -1,766 +0,0 @@ -/** - * @file Fonctions pour interagir avec la BDD sigma et le LDAP. - * @author akka vodol - */ -import knex from '../../../db/knex_router'; -import * as selectors from './selectors'; -import * as list_selectors from './list_selectors'; - -import {Group as groupLdap, groupData} from '../../ldap/export/group'; -import {User as userLdap, userData} from '../../ldap/export/user'; -import { isExportNamedDeclaration } from 'babel-types'; -import { admin } from './authentifiers'; - -class Group{ - gid : string; - type : string; // simple or meta - not to be confused with category - - name? : string; - category? : string; - members? : string[]; - admins? : string[]; - description? : string; - website?: string; - createdAt?: string; - UpdatedAt?: string; - - constructor(obj){ - this.gid = obj.uid; // until the database is mutated, the gid is called uid in the database - this.type = obj.type; - this.description = obj.description; - this.website = obj.website; - this.createdAt = obj.createdAt; - this.UpdatedAt = obj.updatedAt; - } - - /** - * @summary effectue une requête au ldap pour avoir les donnees du groupe. - */ - async fetchData() : Promise<void>{ - const data : groupData = await groupLdap.peek(this.gid); - this.name = data.name; - this.category = data.type; // this fields needs to be renamed in groupData - this.members = data.members; - this.admins = data.admins; - this.description = data.description || this.description; - } -} - -class User{ - uid : string; - - constructor(obj){ - this.uid = obj.uid; - } - - async fetchData() : Promise<void>{ - const data : userData = await userLdap.peek(this.uid); - for(const field in data){ - this[field] = data[field]; - } - } -} - -class QUser{ - uid: string; - password : string; -} - -/* - 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. - 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 - ce qu'il a le droit de savoir et de faire. Chaque niveau est inclus dans les niveaus supérieur. - Les différents niveaux sont : - none - aucun droit - viewer : l'utilisateur a visibilité sur le groupe. Il sait que le groupe existe, et a accès à un certain nombre d'infos. - member : l'utilisateur est membre du groupe - speaker : l'utilisateur peut parler au nom du groupe. Il a le droit de publier des annonces et d'organiser des évènements - admin : l'utilisateur a tous les droits sur le groupe - - Certaines fonctions de connectors effectuent des vérifications d'authorisations avant - de renvoyer une réponse, d'autres non. Pour être sur qu'on ne renvoie jamais de réponse - sans avoir au préalable éffectué les bonnes vérifications, chaque fonction possède dans sa - description un attribut droit, qui décrit les droits que fournit cette fonction. - - La valeur de @rights peut être : - super - la fonction n'effectue aucune véri-fication, et renvoie le resultat demandé - admin( groupUID ) - la fonction ne fait que ce qu'un admin du groupe indiqué aurait le droit de faire - speaker( groupUID ), member( groupUID ), veiwer( groupUID ) - même chose - user - la fonction ne fait que ce que l'utiliateur a le droit de faire (vérifications via l'argument user) - - La procédure a suivre est la suivante : quand une fonction possède un certain niveau de droit, - elle ne peut appeler une fonction possédant un niveau de droit plus large que si - 1 ) on a au préalable vérifié que l'utilisateur possédait effectivement ces droits. - ou - 2 ) on s'est assuré que l'opération effectuée par cet appel particulier de la fonction était dans les droits - de l'utilisateur - - Les resolvers de base de mutation et query ont des droits user. - - Les fonctions qui ne modifient pas la BDD et ne renvoient pas de données sur la BDD n'ont pas de rights. -*/ - -/** - * @summary Génère une promise. - * @function - * @desc Les fonctions ici sont toutes supposées renvoyer une promise. - * Si on veut renvoyer une valeur directement, cette fonction permet de construire - * une Promise qui renvoie cette valeur facilement. - * @arg {Object} val - La valeur qu'on veut renvoyer. - * @return {Promise(Object)} Une promise qui renvoi val - */ -const quickPromise = (val) => { //hawkspar->akka ; selon VSCode pas utilisé donc useless - return new Promise( (resolve, reject) => { - resolve(val); - }); -}; - -/** - * @summary Renvoie le nom de la table dans laquelle il faut chercher en fonction de ce qu'on veut - * @desc Ceci est obsolète, et devra être supprimé quand le code sera RAS - * @arg {String} wantedType - Un string indiquant le type de groupe qu'on veut. Peut être `"simple"`, `"meta"` ou `"all"`. - * @return {String} Le nom de la table dans laquelle la requète doit être effectuée. - */ -function getGroupTableName(wantedType){ - switch(wantedType){ - case "simple": - return "simple_groups"; - case "SimpleGroup": - return "simple_groups"; - case "meta": - return "meta_groups"; - case "MetaGroup": - return "meta_groups"; - case "all": - return "groups"; - default: - throw "invalid type request : " + wantedType + "is not a valid group type"; - } -} - -export function rasifyGID(uid){ //hawkspar->akka ; je plussoie le nom mais pas très lisible - return String(uid).replace(' ', '_').replace(/\W/g, '').toLowerCase(); -} - -/** - * @summary Renvoie un unique groupe, ssi ce groupe est visible par l'utilisateur - * @desc Pour l'instant, la fonction effectue la même requête que `getAllVisibleGroups` - * et restreint au groupe demandé. Cette fonction peut être implémentée de manière - * plus efficace et plus chiante. - * @arg {String} gid - Identifiant du groupe voulu. - * @arg {String} type - Type de groupe voulu. `"simple"`, `"meta"` ou `"all"`. - * @return {Promise(group)} Retour de requête knex. Le groupe demandé, si l'utilisateur a le droit de la voire. - * @rights user - */ -export async function getGroupIfVisible(quser : QUser, gid, type="all") : Promise<Group>{ - let group_table_name = getGroupTableName(type); - let visible_groups = await selectors.visibleGroups(quser); - const res = await knex.with('visible_groups', visible_groups).select() - .from(group_table_name).innerJoin('visible_groups', function (){ - this.on('visible_groups.uid', '=', group_table_name + '.uid'); - }).where(group_table_name + '.uid', gid); - return res[0]; -} - -export const getSimpleGroupIfVisible = (user, groupUID) => getGroupIfVisible(user, groupUID, "simple"); -export const getMetaGroupIfVisible = (user, groupUID) => getGroupIfVisible(user, groupUID, "meta"); - -/** - * @summary Renvoie tous les groupes simples visibles par l'utilisateur user - * @desc Cette fonction effectue une requête knex. - * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. - * @arg {String} wantedType - Type de groupe voulu : `"simple"`, `"meta"` ou `"all"`. - * @return {Promise} Retour de requête knex. Liste de tous les groupes que l'utilisateur a le droit de voire. - * @rights user - */ -export async function getAllVisibleSimpleGroups(quser : QUser) : Promise<Group[]>{ - let visible_groups = await selectors.visibleGroups(quser); - return getSimpleGroupsFromCallbacks(quser, visible_groups); -} - -/** - * @summary Renvoie tous les meta groupes visibles par l'utilisateur user - * @desc Cette fonction effectue une requête knex. - * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. - * @arg {String} wantedType - Type de groupe voulu : `"simple"`, `"meta"` ou `"all"`. - * @return {Promise} Retour de requête knex. Liste de tous les groupes que l'utilisateur a le droit de voire. - * @rights user - */ -export async function getAllVisibleMetaGroups(quser : QUser) : Promise<Group[]>{ - let visible_groups = await selectors.visibleGroups(quser); - return getMetaGroupsFromCallbacks(quser, visible_groups); -} - -/** - * @summary Renvoie tous les groupes visibles par l'utilisateur user - * @desc Cette fonction effectue une requête knex. Elle gère l'arête de parenté. - * @arg {String} wantedType - Type de groupe voulu : `"simple"`, `"meta"` ou `"all"`. - * @return {Promise} Retour de requête knex. Liste de tous les groupes que l'utilisateur a le droit de voire. - * @rights user - */ -export async function getAllVisibleGroups(quser : QUser) : Promise<Group[]>{ - let visible_groups = await selectors.visibleGroups(quser); - return getGroupsFromCallbacks(quser, visible_groups); -} - -/** - * @summary Teste si un utilisateur est membre d'un groupe - * @return {Promise(Boolean)} Boolean indiquant si l'utilisateur est membre du groupe. - * @rights user - */ -export async function isMember(quser : QUser, group : Group) : Promise<boolean>{ - let member_set = await getGroupMemberUsersSet(quser, group); - if( member_set && member_set.has(quser.uid) ){ - return true; - }else{ - return isSpeaker(quser, group); - } -} - -export async function isSpeaker(quser : QUser, group : Group) : Promise<boolean>{ - return isAdmin(quser, group); -} - -export async function isAdmin(quser : QUser, group : Group) : Promise<boolean>{ - let admin_set = await getGroupAdminUsersSet(quser, group); - if( admin_set && admin_set.has(quser.uid) ){ - return true; - }else{ - return isSupervisor(quser, group); - } -} - -export async function isSupervisor(quser : QUser, group : Group) : Promise<boolean>{ - // TODO : implement - return true; -} - -/** - * @summary Attribue un GID qui n'a pas encore été utilisé à un groupe - * @desc RASifie le string initialUID si necessaire (ramené à de l'ASCCI sans espace), puis si l'uid est deja pris rajoute un n a la fin et reteste - * @arg {String} uid - L'uid du groupe dont on veut les administrateurs. - * @return {Promise} Retour de requête knex. Promise qui renvera une liste de tous les utilisateurs ayant droit d'admin sur le groupe - * @rights user - * remarque : n'importe qui peut tester si un groupe existe en demandant a créer un groupe avec ce nom la et en regardant si - * son GID a été modifié. Je ne vois pas comment contourner ce problème, c'est donc une faille permanente (mineure) de sigma. - */ -export async function getAvailableGID(initialGID : string) : Promise<string>{ - let rasGID = rasifyGID(initialGID); - const res = knex.from('groups').where('uid', rasGID) - if (res.length == 0) { - return (rasGID); - } else { - return (getAvailableGID(rasGID + 'n')); - } -} - -/** - * @summary Créé un groupe si les arguments sont tous valides - * @desc Les arguments doivent être valides, sauf pour uid. Une clé uid valide sera générée dans tous les cas. - * Les authorisations de l'utilisateur ne sont pas vérifiées - * On teste si l'utilisateur qui envoie la requête a des droits d'admin sur le parent du groupe qui doit être créé, avec la fonction - * `getUsersWithAdminRights`. - * Si un argument est invalide ou si l'utilisateur n'a pas les droits, la fonction renvoie une erreur - * @arg {Object} user - L'utilisateur qui effectue la requête. - * @arg {Object} args - Les arguments envoyés à la mutation. Cf le schéma GraphQL - * @return {Promise} Retour de requête knex. Le groupe qui vient d'être créé. En cas d'echec, renvoie une erreur. - * @rights admin (args.parent_uid) - */ -export async function createSubgroup(quser : QUser, group : Group, args) : Promise<Group>{ - - // TODO : finish - - if (typeof args.parent_uid != 'string') - throw "Illegal argument : parent_uid must be a non null string"; - if (typeof args.name != 'string') - throw "Illegal argument : name must be a non null string"; - - let rasUID = await getAvailableGID(args.uid); - - // TODO : appeller une fonction de LDAPUser pour y créer un groupe. - await knex('simple_groups').insert({ - uid: rasUID, - parent_uid: args.parent_uid, - createdAt: knex.fn.now(), - updatedAt: this.createdAt, - name: args.name, - website: args.website, - description: args.description, - school: args.school, - type : "simple" - }); - - return getGroupIfVisible(quser, rasUID); -} - -/** - * @summary Créé un groupe si les arguments sont tous valides et l'utilisateur est authorisé - * @desc Les arguments doivent être valides, sauf pour uid. Une clé uid valide sera générée dans tous les cas. - * On teste si l'utilisateur qui envoie la requête a des droits d'admin sur le parent du groupe qui doit être créé, avec la fonction `getUsersWithAdminRights` - * Si un argument est invalide ou si l'utilisateur n'a pas les droits, la fonction renvoie une erreur - * @arg {Object} user - L'utilisateur qui effectue la requête. - * @arg {Object} args - Les arguments envoyés à la mutation. Cf le schéma GraphQL - * @return {Promise} Retour de requête knex. Le groupe qui vient d'être créé. En cas d'echec, renvoie une erreur. - * @rights user - */ -export async function createGroupIfLegal(quser : QUser, group : Group, args) : Promise<Group>{ - if( await isAdmin(quser, group) ){ - return createSubgroup(quser, group, args); - }else{ - throw "illegal request : you must have admin rights over a group to create a subgroup of that group"; - } -} - -/** - * @summary Renvoie toues les requêtes de type UserJoinGroup - * @desc Une requête UserJoinGroup est envoyée par un utilisateur à un groupe, - * pour demander à rejoindre ce groupe - * @arg {Object} user - L'utilisateur qui effectue la requête. - * @arg {String} args - L'identifiant du groupe qui reçoit la requête. - * @return {Promise(Object)} Retour de requête knex. Toutes les requêtes destinées au groupe. - * @rights admin(recipientUID) - */ -export async function getUserJoinGroupRequests(quser : QUser, recipient : Group) : Promise<Object>{ - let result = knex.select('id', 'useruid', 'message').from('user_join_group') - .where('recipient', recipient.gid); - return result.map( obj => { - obj.type = "UserJoinGroup"; - return obj; - }); -} - - -/** - * @summary Renvoie toues les requêtes de type GroupJoinEvent - * @desc Une requête UserJoinGroup est envoyée par un groupe à un évènement (donc aux administrateurs de l'évènement), - * pour demander à rejoindre cet évènement. - * Remarque : toutes les requêtes ont pour le moment un attribut recipient, - * mais ici il ne sera a terme pas utilisé. - * @arg {Object} user - L'utilisateur qui effectue la requête. - * @arg {String} args - L'identifiant du groupe qui reçoit la requête. - * @return {Promise(Object)} Retour de requête knex. Toutes les requêtes destinées au groupe. - * @rights speaker(recipientUID) - */ -export async function getGroupJoinEventRequests(quser : QUser, recipient : Group) : Promise<Object>{ - let result = await knex.select('id', 'senderuid', 'eventuid', 'message').from('group_join_event') - .where('recipient', recipient.gid); - return result.map( obj => { - obj.type = "GroupJoinEvent"; - return obj; - }); -} - - -/** - * @summary Renvoie toues les requêtes de type GroupHostEvent - * @desc Une requête UserJoinGroup est envoyée par un groupe à un évènement (donc aux administrateurs de l'évènement), - * pour demander à rejoindre cet évènement. - * Remarque : toutes les requêtes ont pour le moment un attribut recipient, - * mais ici il ne sera a terme pas utilisé. - * @arg {Object} user - L'utilisateur qui effectue la requête. - * @arg {String} args - L'identifiant du groupe qui reçoit la requête. - * @return {Promise(Object)} Retour de requête knex. Toutes les requêtes destinées au groupe. - * @rights speaker(recipientUID) - */ -export async function getYourGroupHostEventRequests(quser : QUser, recipient : Group) : Promise<Object>{ - let result = await knex.select('id', 'senderuid', 'eventuid', 'message').from('your_group_host_event') - .where('recipient', recipient.gid); - return result.map( obj => { - obj.type = "YourGroupHostEvent"; - return obj; - }); -} - - -// All these messages are returned if they are visible - -export async function getAnnouncement(user, messageID){ - let res = await knex.select().from('announcements').where('id', messageID) - .whereIn('id', await selectors.visibleAnnouncements(user)); - if(res[0]){ - res[0].type = 'Announcement'; - return res[0]; - } - res = await knex.select().from('events').where('id', messageID) - .whereIn('id', await selectors.visibleEvents(user)); - if(res[0]){ - res[0].type = 'Announcement'; - return res[0]; - } - return undefined; -} - -export async function getEvent(user, messageID){ - let res = await knex.select().from('events').where('id', messageID) - .whereIn('id', await selectors.visibleEvents(user)); - if(res[0]){ - res[0].type = 'Event'; - return res[0]; - } - return undefined; -} - -export async function getPrivatePost(user, messageID){ - let res = await knex.select().from('private_posts').where('id', messageID) - .whereIn('id', await selectors.visiblePrivatePosts(user)); - if(res[0]){ - res[0].type = 'PrivatePost'; - return res[0]; - } - return undefined; -} - -export async function getQuestion(user, messageID){ - let res = await knex.select().from('questions').where('id', messageID) - .whereIn('id', await selectors.visibleQuestions(user)); - if(res[0]){ - res[0].type = 'Question'; - return res[0]; - } - return undefined; -} - -export async function getAnswer(user, messageID){ - let res = await knex.select().from('answers').where('id', messageID) - .whereIn('id', await selectors.visibleAnswers(user)); - if(res[0]){ - res[0].type = 'Answer'; - return res[0]; - } - return undefined; -} - -/** - * @summary Renvoie un message en fonction de son identifiant. - * @param {*} user - Utilisateur effectuant la requête. - * @param {*} eventID - Identifiant unique de l'événement. - * @rights super - */ -export async function getMessage(user, messageID) : Promise<any>{ - return getEvent(user, messageID) | - getAnnouncement(user, messageID) | - getPrivatePost(user, messageID) | - getQuestion(user, messageID) | - getAnswer(user, messageID); -} - -export async function allVisibleEvents(user){ - let selection = await selectors.visibleEvents(user); - let result = await knex.select().from('events').whereIn('id', selection); - for(let r of result){ - r.type = 'Announcement'; - } - return result; -} - -export async function allVisibleAnnouncements(user){ - let selection = await selectors.visibleAnnouncements(user); - let result = await knex.select().from('announcements').whereIn('id', selection); - result = result.concat( - await knex.select().from('events').whereIn('id', selection) - ); - for(let r of result){ - r.type = 'Announcement'; - } - return result; -} - -export async function receivedPrivatePosts(user, groupUID){ - let received_messages = await selectors.recievedMessages(user, groupUID); - let result = await knex('private_posts').select().whereIn('id', received_messages); - for(let entry of result){ - entry.type = "PrivatePost"; - } - return result; -} - -export async function receivedQuestions(user, groupUID){ - let received_messages = await selectors.recievedMessages(user, groupUID); - let result = await knex('questions').select().whereIn('id', received_messages); - for(let entry of result){ - entry.type = "Question"; - } - return result; -} - -export async function receivedAnswers(user, groupUID){ - let received_messages = await selectors.recievedMessages(user, groupUID); - let result = await knex('answers').select().whereIn('id', received_messages); - for(let entry of result){ - entry.type = "Answer"; - } - return result; -} - - -export async function visibleMessages(user, messageID){ - -} - -export async function getMessageGroupAuthors(user, messageID){ - return getGroupsFromCallbacks(user, qb => { - return qb.select({uid: 'group'}).from('group_message_relationships') - .where('message', messageID).whereIn('status', ['host', 'publish']); - }); -} - -export async function getMessageGroupRecipients(user, messageID){ - return getGroupsFromCallbacks(user, qb => { - return qb.select({uid: 'group'}).from('group_message_relationships') - .where('message', messageID).where('status', 'recieve'); - }); -} - -/** - * @summary Renvoie simplement un groupe en fonction de son identifiant. - * @param {Object} user - Utilisateur effectuant la requête. - * @param {String} groupUID - Identifiant unique du groupe. - * @author manifold - * @rights super - */ -export const getGroup = (user, groupUID) => { - // Une sélection sur une table renvoie un tableau. - // Knex renvoie une promesse, qui se résout en le tableau sélectionné. - // On récupère son unique valeur, puisqu'on filtre sur l'identifiant unique. - return knex.select().from('groups').where('uid',groupUID).then(results => results [0]); -}; - -/** - * @summary Renvoie simplement un groupe simple en fonction de son identifiant. - * @param {Object} user - Utilisateur effectuant la requête. - * @param {String} groupUID - Identifiant unique du groupe. - * @author manifold - * @rights super - */ -export const getSimpleGroup = (user, groupUID) => { - return knex.select().from('simple_groups').where('uid',groupUID).then(results => results [0]); -}; - -/** - * @summary Renvoie simplement un meta groupe en fonction de son identifiant. - * @param {Object} user - Utilisateur effectuant la requête. - * @param {String} groupUID - Identifiant unique du groupe. - * @author manifold - * @rights super - */ -export const getMetaGroup = (user, groupUID) => { - return knex.select().from('meta_groups').where('uid',groupUID).then(results => results [0]); -}; - -/** - * @summary Refuse une requête d'un groupe voulant rejoindre un évènement - * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. - * @arg {Int} requestID - L'id de la requête à refuser. - * @return {Promise(Boolean)} Vrai si l'opération a réussie; - * @rights admin(request.recipient) - */ -export async function denyGroupJoinEventRequest(user, requestID){ - await knex('group_join_event').where('id', requestID).del(); - return true; -} - -/** - * @summary Refuse une requête d'un groupe voulant rejoindre un évènement - * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. - * @arg {Int} requestID - L'id de la requête à refuser. - * @return {Promise(Boolean)} Vrai si l'opération a réussie; - * @rights admin(request.recipient) - */ -export async function acceptGroupJoinEventRequest(user, requestID){ - let request = await knex('group_join_event').select().where('id', requestID); - if( !request) - return false; - await knex('group_join_event').where('id', requestID).del(); - let group = request[0].senderuid; - let event = request[0].eventuid; - await knex('group_participation').insert({ - group : group, - message : event, - status : "join" - }); - return; - -} - - -/** - * @summary Refuse une requête d'un groupe voulant rejoindre un évènement - * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. - * @arg {Int} requestID - L'id de la requête à refuser. - * @return {Promise(Boolean)} Vrai si l'opération a réussie; - * @rights admin(request.recipient) - */ -export async function denyYourGroupHostEventRequest(user, requestID){ - await knex('your_group_host_event').where('id', requestID).del(); - return true; -} - -/** - * @summary Refuse une requête d'un groupe voulant rejoindre un évènement - * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. - * @arg {Int} requestID - L'id de la requête à refuser. - * @return {Promise(Boolean)} Vrai si l'opération a réussie; - * @rights admin(request.recipient) - */ -export async function acceptYourGroupHostEventRequest(user, requestID){ - let request = await knex('your_group_host_event').select().where('id', requestID); - if( !request) - return false; - await knex('group_join_event').where('id', requestID).del(); - let group = request[0].recipient; - let event = request[0].eventuid; - await knex('group_message_relationships').insert({ - group : group, - message : event, - status : "host" - }); - return; - -} - -export function takeAdminRights(user, groupUID, justification){ - return knex('taken_rights').insert({ - user_uid : user.uid, - group_uid : groupUID, - justification : justification - }); -} - - -export function releaseAdminRights(user, groupUID){ - return knex('taken_rights').del().where('user_uid', user.uid).where('group_uid', groupUID); -} - -/** - * @summary Renvoie les membres d'un groupe quelquonque. - * @param {Object} user - Utilisateur effectuant la requête. - * @param {String} metaGroupUID - Identifiant unique du groupe. - * @return {Promise(List)} Une liste des uid de tous les membres du groupe - * @author akka vodol - * @rights member(metaGroupUID) - */ -export async function getGroupMemberUsers(quser : QUser, group : Group) : Promise<User[]>{ - const memberSet = await getGroupMemberUsersSet(quser, group); - return Array.from(memberSet.values()).map( uid => new User(uid) ); -} - -async function getGroupMemberUsersSet(quser : QUser, group : Group) : Promise<Set<string>>{ - switch( group.type ){ - case "simple": - if(!group.members){ - await group.fetchData(); - } - return new Set(group.members); - case "meta": - let member_group_list = await selectors.metaGroupMembers(quser, group).then(cb => cb(knex)); - let members = new Set; - for(const memberGroup of member_group_list){ - let res = await getGroupMemberUsers(quser, new Group(memberGroup)); - for(const member of res.values()){ - members.add(member); - } - } - return members; - default: - return undefined; - } -} - - -/** - * @summary Renvoie les membres d'un groupe quelquonque. - * @param {Object} user - Utilisateur effectuant la requête. - * @param {String} metaGroupUID - Identifiant unique du groupe. - * @return {Promise(List)} Une liste des uid de tous les membres du groupe - * @author akka vodol - * @rights member(metaGroupUID) - */ -export async function getGroupAdminUsers(quser : QUser, group : Group) : Promise<User[]>{ - const memberSet = await getGroupAdminUsersSet(quser, group); - return Array.from(memberSet.values()).map( uid => new User(uid) ); -} - -async function getGroupAdminUsersSet(quser : QUser, group : Group) : Promise<Set<string>>{ - switch( group.type ){ - case "simple": - if(!group.members){ - await group.fetchData(); - } - return new Set(group.admins); - case "meta": - // TODO : Meta group administration not yet implemented - return new Set([]); - default: - return undefined; - } -} - -async function getSimpleGroupsFromCallbacks (user, selection){ - return knex.with('selection', selection).select("simple_groups.*").from("simple_groups") - .innerJoin('selection', function (){ - this.on('selection.uid', '=', 'simple_groups.uid'); - }); -} - -async function getMetaGroupsFromCallbacks (user, selection){ - return knex.with('selection', selection).select().from("meta_groups") - .innerJoin('selection', function (){ - this.on('selection.uid', '=', 'meta_groups.uid'); - }); -} - -/** - * @summary Renvoie tous les groupes dans l'intersection définie par les callbacks - * @desc Cette fonction effectue une requête knex. Elle gère l'arête de parenté. - * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. - * @arg {String} wantedType - Type de groupe voulu : `"simple"`, `"meta"` ou `"all"`. - * @return {Promise} Retour de requête knex. Liste de tous les groupes que l'utilisateur a le droit de voire. - * @rights user - */ -async function getGroupsFromCallbacks(user, cbList){ - // console.log(cbList); - let all_simple_groups = await getSimpleGroupsFromCallbacks(user, cbList); - let all_meta_groups = await getMetaGroupsFromCallbacks(user, cbList); - return all_simple_groups.concat(all_meta_groups); -} - -/* - * réflexion sur une façon possible de gérer les utilisateurs sans en demander trop à LDAP - * Sans utilité pour le moment, ne faites pas attention - */ - -/* -function smartUserObject(user, uid){ - this.user = user; - this.uid = uid; - - this.resolution = {}; - let resolutionAlias = this.resolution; - - let attributeDictionnary = { - givenName : "givenName" - }; - - for(let attribute in attributeDictionnary){ - this[attribute] = function(){ - return new Promise((resolve, reject) => { - resolutionAlias[attributeDictionnary[attribute]] = resolve; - }); - }; - } - - this.resolve = async function(){ - let userObject = await renseignerSurUtilisateur(this.user, this.uid); - for(let attribute in this.resolution){ - this.resolution[attribute](userObject.attribute); - } - }; -} -*/ \ No newline at end of file diff --git a/src/graphql/connectors/list_selectors.js b/src/graphql/connectors/list_selectors.js deleted file mode 100644 index fdabecfe8823845c8d0233b13839021719575d32..0000000000000000000000000000000000000000 --- a/src/graphql/connectors/list_selectors.js +++ /dev/null @@ -1,87 +0,0 @@ -import knex from '../../../db/knex_router'; -import * as selectors from './selectors'; - -/** - * @summary Renvoie le type d'un groupe. - * @function - * @desc Parcours les BDD pour savoir dans laquelle se trouve le groupe ayant l'UID donné. - * Cette opération nécéssite un parcours de base de donnée, et il est préférable de ne pas - * sans servir si on a un autre moyend de connaitre le typed d'un groupe - * (Par exemple, si on dispose d'un retour de BDD pour ce groupe. Le champ 'type' indique alors son type.) - * @arg {Object} user - Objet contenant un attribut `uid` de type `string`. - * User représente l'utilisateur qui a effectué la requête. - * @arg {Object} groupUID - L'id du groupe dont on veut connaître le type. - * @return {Promise(String)} Un string représentant le type du groupe. - * Peut être "SimpleGroup" ou "MetaGroup". Renvoie `Undefined` si le groupe n'existe pas - * @rights super - */ -export const getGroupType = (user, groupUID) => { - return knex('simple_groups').select('uid').where('uid', groupUID).then( sg_res => { - if(sg_res) - return "SimpleGroup"; - return knex('meta_groups').select('uid').where('uid', groupUID).then(mg_res => { - if(mg_res) - return "MetaGroup"; - return undefined; - }); - }); -}; - -/** - * @summary renvoie tous les groupes sur lesquels un utilisateur a des droits de supervision - * @desc Cette fonction effectue des requêtes knex. Elle parcoure recursivement l'arbre de parenté, - * Et cela aurait été trop lourd de la faire renvoyer un callback définissant une requête. - * @arg {Object} user - Objet contenant un attribut `uid` de type `string`. - * User représente l'utilisateur qui a effectué la requête. - * @return {Promise(array)} Une liste des uid de tous les groupes que user supervise. - * @rights user - */ -export async function supervisedGroups(user){ - function difference(arr1, arr2){ - return arr1.filter( e => (arr2.indexOf(e) < 0)); - } - async function recursive_explorer(visited_groups, start_groups){ - let child_simple_groups = await knex.select('uid').distinct().from('simple_groups') - .whereIn('parent_uid', start_groups); - let child_meta_groups = await knex.select('union_uid').as('uid').distinct() - .from('meta_group_membership').where('status', 'admin') - .whereIn('member_uid', child_simple_groups); - let new_start_groups = difference(child_simple_groups.concat(child_meta_groups), visited_groups); - let new_visited_groups = visited_groups.concat(new_start_groups); - if(new_start_groups.length > 0) - return recursive_explorer(new_visited_groups, new_start_groups); - else - return new_visited_groups; - - } - let groups_with_admin = (await selectors.groupsWithAdmin(user))(knex); - return recursive_explorer([], groups_with_admin); -} - -/** - * @summary Renvoie tous les utilisateurs ayant des droits d'administrateur sur un groupe. - * @function - * @desc Les utilisateurs qui ont un droit d'administrateur sur un groupe simple sont ses administrateurs - * et les utilisateurs ayant droit d'admin sur son parent. - * Les utilisateurs ayant droit d'admin sur un meta-groupe sont les utilisateurs - * ayant droit d'admin sur un des groupes membres - * @arg {String} uid - L'uid du groupe dont on veut les administrateurs. - * @return {Promise} Retour de requête knex. Promise qui renvera une liste - * de tous les utilisateurs ayant droit d'admin sur le groupe - * rights member(groupUID) - */ -export async function usersWithAdminRights(user, groupUID){ - let group_type = await getGroupType(user, groupUID); - if(group_type == "SimpleGroup"){ - let added_admins = await knex.select('user_uid').from('taken_rights').where('group_uid', groupUID); - let admin_list = ["wilson.jallet", "louis.vanneau"]; // await listerAdministrateurs(user, groupUID); - return admin_list.concat( added_admins.map( o => o.user_uid) ); - }else{ - let mg_members = await selectors.metaGroupAdminMembers(user, groupUID)(knex); - let admin_users = []; - while(mg_members){ - admin_users = admin_users.concat(await usersWithAdminRights(mg_members.pop())); - } - return admin_users; - } -} diff --git a/src/graphql/connectors/selectors.js b/src/graphql/connectors/selectors.js deleted file mode 100644 index 3458d89d53517cd58e1390660e10681c2f278e1c..0000000000000000000000000000000000000000 --- a/src/graphql/connectors/selectors.js +++ /dev/null @@ -1,143 +0,0 @@ -/** - * @file Des callbacks qui sélectionnent un sous-ensemble de groupes. IN PROGRESS la doc aussi, ça se voit ^^ - * @author akka vodol - */ - -//hawkspar->akka grosses redondance avec le travail fait dans ldap/users.js, classe Open. -// Pas envisageable de redoubler le LDAP sur une BDD extérieure - -/** - * @summary Renvoie une liste des id de tous les groupes visibles par l'utilisateur - * @desc Cette fonction génère un callback qui créé une table contenant les uid de tous les groupes visibles - * @arg {Object} user - Objet contenant un attribut `uid` de type `string`. - * User représente l'utilisateur qui a effectué la requête. - * @return {Promise(Callback)} callback contruisant une requête knex pour une table de tous les id visibles. - * @rights user - */ -export async function visibleGroups(user){ - let group_ids = await user.ldap_access.listGroups(user.uid); - return function (global_query_builder){ - if (typeof group_ids == "undefined") - throw "invalid user"; - var membered_groups = qb => qb.select('uid').from('simple_groups').whereIn('uid', group_ids.concat(['kes'])); - var directly_visible_simple_groups = qb => qb.with('membered_groups', membered_groups) - .select('simple_groups.uid').from('simple_groups').distinct() - .innerJoin('membered_groups', - function () { - this.on('simple_groups.uid', '=', 'membered_groups.uid') - .orOn('simple_groups.parent_uid', '=', 'membered_groups.uid'); - } - ); - return directly_visible_simple_groups(global_query_builder); - }; -} - -export async function groupsWithMember(user){ - return null; -} - -export async function groupsWithSpeaker(user){ - return function (query_builder){ - return groupsWithAdmin(user); - }; -} - -export async function groupsWithAdmin(user){ - return function (query_builder){ - return ["kes"]; - }; -} - - -// Give a user, get the messages linked to that user - -export async function visibleAnnouncements(user){ - return query_builder => { - return query_builder; - }; -} - -export async function visibleEvents(user){ - return query_builder => { - return query_builder; - }; -} - -export async function messageHosts(user, messageID){ - return function(query_builder){ - return query_builder.select({uid : 'group'}).from('group_message_relationships') - .where('message', messageID).where('status', 'host'); - }; -} - -/** - * @summary Renvoie un callback qui génère tous les membres d'un meta-groupe. - * @param {Object} user - Utilisateur effectuant la requête. - * @param {String} metaGroupUID - Identifiant unique du groupe. - * @return {Promise(callback(groups))} a callback to build a query for the members of a group - * It doesn't need to be a promise, but I figure having all of my functions return promises is - * easier than keeping track of which functions do and do not return promises. - * @author akka vodol - * @rights member(metaGroupUID) - */ -export async function metaGroupMembers(user, metaGroupUID){ - return function(query_builder){ - return query_builder.distinct().select().from('groups') - .innerJoin('meta_group_membership', 'groups.uid', 'meta_group_membership.member_uid') - .where('meta_group_membership.union_uid', '=', metaGroupUID); - }; -} - -/** - * @summary Renvoie un callback qui génère tous les membres admin d'un meta-groupe. - * @param {Object} user - Utilisateur effectuant la requête. - * @param {String} metaGroupUID - Identifiant unique du groupe. - * @return {Promise(callback)} a callback to build a query for the admin members of a group - * @author akka vodol - * @rights member(metaGroupUID) - */ -export async function metaGroupAdminMembers(user, metaGroupUID){ - return function(query_builder){ - return query_builder.distinct().select().from('groups') - .innerJoin('meta_group_membership', 'groups.uid', 'meta_group_membership.member_uid') - .where('meta_group_membership.union_uid', '=', metaGroupUID) - .where('meta_group_membership.status', '=', 'admin'); - }; -} - -/** - * @summary Renvoie un callback de tous les messages reçus par le groupe - * @param {Object} user - Utilisateur effectuant la requête. - * @param {String} groupUID - Identifiant du groupe. - * @return {Promise(callback)} a callback to build a query for the admin members of a group - * @author akka vodol - * @rights admin(groupUID) - */ -export async function recievedMessages(user, groupUID){ - return function(qb){ - return qb.column({id : 'message'}).select().from('group_message_relationships').where('group', groupUID).where('status', 'receive'); - }; -} - -export async function callbackIntersection(callbackList){ - return function(query_builder){ - let cb = callbackList.pop(); - if(callbackList){ - let intersection = callbackIntersection(callbackList); - return function(query_builder){ - return query_builder.with('callback_set', cb) - .with('intersection', intersection) - .select('intersection.uid').from('intersection') - .innerJoin('callback_set', function(){ - this.on('callback_set.uid', '=', 'intersection.uid'); - }); - }; - }else{ - return cb; - } - }; -} - -export async function callbackUnion(callbackList){ - return null; -} \ No newline at end of file diff --git a/src/graphql/new_connectors/authorisation.ts b/src/graphql/new_connectors/authorisation.ts index c8b47227275ea5f0134f7c0565e59b407fc0480a..9eaccb163b954565f975ee21a9a263fd3f944e62 100644 --- a/src/graphql/new_connectors/authorisation.ts +++ b/src/graphql/new_connectors/authorisation.ts @@ -20,7 +20,7 @@ export type GroupSet = Set<string>; * Levels 0 and 5 are a bit special. For levels 1 - 4, the functions are as follows */ -// These functions return the list of all groups that the query user (quser) has corresponding priviledge for +// These functions return the list of all groups that the query user (quser) has corresponding privilege for export async function forViewer(quser : QUser) : Promise<GroupSet>{ throw new Error("Not implemented"); @@ -38,7 +38,7 @@ export async function forAdmin(quser : QUser) : Promise<GroupSet>{ throw new Error("Not implemented"); } -// These functions test if the quser has corresponding priviledges for the given group +// These functions test if the quser has corresponding privileges for the given group export async function isViewer(quser : QUser, gid : string) : Promise<boolean>{ let groupSet = await forViewer(quser); diff --git a/src/graphql/new_connectors/connection.ts b/src/graphql/new_connectors/connection.ts index ea207de1b2c27c68d7396de48c86508b72f015f6..f30eeb0da18d65c9e995ac7e2fd8ddc106f6af08 100644 --- a/src/graphql/new_connectors/connection.ts +++ b/src/graphql/new_connectors/connection.ts @@ -195,21 +195,19 @@ export async function getUser(uid : string){ return new User(uid); } -export async function searchUsers(args){ - const searchData = { +export async function searchUsers(args: searchTOLArgs): Promise<User[]>{ + const searchData: userData = { givenName: args.givenName, lastName: args.lastName, nickname: args.nickname, nationality: args.nationality, - school: args.school, promotion: args.promotion, groups: args.groups, - studies: args.studies, sport: args.sport, phone: args.phone, mail: args.mail, - adress: args.adress, - ip: args.ip + address: args.address, + ips: args.ip } const userList = await userLdap.search(searchData); return userList.map( (uid) => new User(uid) ); diff --git a/src/graphql/resolvers.ts b/src/graphql/resolvers.ts index 9256a5377aa7f9501ae4a5b2d1933612c1c0b9d9..0fe71e78fec4874817658e7be3c0b3cd6ef3448d 100644 --- a/src/graphql/resolvers.ts +++ b/src/graphql/resolvers.ts @@ -95,11 +95,11 @@ export const resolvers = { // user queries - user: async function(root, args, context){ + user: async function(root, args, context): Promise<conn.User> { return conn.getUser(args.uid); }, - searchTOL: (root, args, context) => { + searchTOL: (root, args, context): Promise<conn.User[]> => { // TODO : filter return conn.searchUsers(args); }, diff --git a/src/graphql/resolvers/groups.ts b/src/graphql/resolvers/groups.ts index c3795475507c8fc6011448878bad1412737f1519..ee23194d82393cb034fccfd9549d3d8a147be592 100644 --- a/src/graphql/resolvers/groups.ts +++ b/src/graphql/resolvers/groups.ts @@ -3,8 +3,8 @@ * @author ? */ -import * as connectors from '../connectors/connectors'; -import * as authentifiers from '../connectors/authentifiers'; +import * as conn from '../new_connectors/connection'; +import * as authentifiers from '../new_connectors/authorisation'; //hawkspar->akka ; doc ? const GroupResolvers = { // @rights viewer(obj.uid) @@ -35,22 +35,22 @@ const GroupResolvers = { }, async likers(obj, args, context) { - return connectors.utilisateur.listMembers(context.user, obj.uid); + return conn.utilisateur.listMembers(context.user, obj.uid); }, async privatePosts(obj, args, context) { let user = await authentifiers.member(context.user, obj.uid); - return user && connectors.receivedPrivatePosts(user, obj.uid); + return user && conn.receivedPrivatePosts(user, obj.uid); }, async questions(obj, args, context) { let user = await authentifiers.member(context.user, obj.uid); - return user && connectors.receivedQuestions(user, obj.uid); + return user && conn.receivedQuestions(user, obj.uid); }, async answers(obj, args, context) { let user = await authentifiers.member(context.user, obj.uid); - return user && connectors.receivedAnswers(user, obj.uid); + return user && conn.receivedAnswers(user, obj.uid); } }, @@ -61,17 +61,17 @@ const GroupResolvers = { async privatePosts(obj, args, context) { let user = await authentifiers.member(context.user, obj.uid); - return user && connectors.receivedPrivatePosts(user, obj.uid); + return user && conn.receivedPrivatePosts(user, obj.uid); }, async questions(obj, args, context) { let user = await authentifiers.member(context.user, obj.uid); - return user && connectors.receivedQuestions(user, obj.uid); + return user && conn.receivedQuestions(user, obj.uid); }, async answers(obj, args, context) { let user = await authentifiers.member(context.user, obj.uid); - return user && connectors.receivedAnswers(user, obj.uid); + return user && conn.receivedAnswers(user, obj.uid); } } }; diff --git a/src/graphql/typeDefs/actions.graphql b/src/graphql/typeDefs/actions.graphql index 136919d6fa02e1666af2e55bcd9b67a2bafa50fe..238677bb970b51016207d07d41091f9511d72c55 100644 --- a/src/graphql/typeDefs/actions.graphql +++ b/src/graphql/typeDefs/actions.graphql @@ -82,14 +82,13 @@ type Mutation { answerEventRequest(from : String, request: ID, accept : Boolean): Request - # Log user into the API + # Log user into the API, replies with a token. login(username: String!, password: String!): String! # Log user out of the API logout(username: String!): Boolean leave(from : String!) : Boolean # Viewer mutations - requestJoin(from : String!) : Boolean } diff --git a/src/graphql/typeDefs/actions_wish_list.graphql b/src/graphql/typeDefs/actions_wish_list.graphql index 4fc70a09f220bc25a1201df8d8e60ce49772039d..a4e77d792ae45eab6ee3382143762268b4a72147 100644 --- a/src/graphql/typeDefs/actions_wish_list.graphql +++ b/src/graphql/typeDefs/actions_wish_list.graphql @@ -53,13 +53,13 @@ type Query { nationality: String, school: String, promotion: String, - groups: String, + groups: [String], studies: String, sport: String, phone: String, mail: String, address: String, - ip: String + ip: [String] ): [User!] } @@ -263,4 +263,10 @@ type Mutation { censorEvent(eventToCensor: ID!): Boolean censorAnswer(answerToCensor: ID!): Boolean + # Log user into the API, replies with a token. + login(username: String!, password: String!): String! + # Log user out of the API + logout(username: String!): Boolean + leave(from : String!) : Boolean + } diff --git a/src/graphql/typeDefs/queries.d.ts b/src/graphql/typeDefs/queries.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..a66b57b88e349e0500ba9668821fe37f5e19d849 --- /dev/null +++ b/src/graphql/typeDefs/queries.d.ts @@ -0,0 +1,15 @@ +interface searchTOLArgs { + givenName: string, + lastName: string, + nickname: string, + nationality: string, + school: string, + promotion: string, + groups: string[], + studies: string, + sport: string, + phone: string, + mail: string, + address: string, + ip: string[] +} \ No newline at end of file diff --git a/src/ldap/export/user.ts b/src/ldap/export/user.ts index cac82805916a4a067dd7141aa3e593b6af625a83..5d9131a01d5d2c00addad8447f710c9c5cdbd19f 100644 --- a/src/ldap/export/user.ts +++ b/src/ldap/export/user.ts @@ -21,8 +21,8 @@ import {Group} from './group'; * TBA @var {string} nationality - Nationalité d'origine * @var {string} promotion - Année(s) de promo * @var {string} phone - Numéro(s) de téléphone - * @var {string[]} adresses - Adresse(s) - * @var {string[]} mails - Adresse(s) courriel + * @var {string[]} address - Adresse(s) + * @var {string[]} mail - Adresse(s) courriel * @var {string[]} groups - Un ou plusieurs groupes dont l'utilisateur est membre (inclus section sportive, binet, PA...) * @var {string} password - Mot de passe généré en amont * @var {string[]} ips - Adresse(s) ip @@ -35,26 +35,27 @@ import {Group} from './group'; * TBA @var {string[]} likes - Liste des gid dont l'utilisateur est sympathisant */ export interface userData { - "uid": string, - "groups": string[], - "groupsIsAdmin": string[], - "password"?: string, - "givenName"?: string, - "lastName"?: string, - "nickname"?: string, - "promotion"?: string, - "photo"?: string, - "birthdate"?: string, - //"nationality"?: string, - "phone"?: string, - "adress"?: string, - "mail"?: string, - "ips"?: string[], - "directory"?: string, - "login"?: string, - "readPerm"?: string, - "writePerm"?: string, - "forlifes"?: string[] + uid?: string, + groups?: string[], + groupsIsAdmin?: string[], + password?: string, + givenName?: string, + lastName?: string, + nickname?: string, + promotion?: string, + photo?: string, + birthdate?: string, + nationality?: string, + phone?: string, + address?: string, + mail?: string, + ips?: string[], + directory?: string, + login?: string, + readPerm?: string, + writePerm?: string, + forlifes?: string[], + sport?: string //"likes"?: string[] } diff --git a/src/ldap/internal/config.ts b/src/ldap/internal/config.ts index d1922ecca2eea3d5f4c8c3e4b92d4921908528dd..473abac4c305bf4b31612f0d56b7f6f4ce8b08cd 100644 --- a/src/ldap/internal/config.ts +++ b/src/ldap/internal/config.ts @@ -7,13 +7,13 @@ import fs from 'fs'; import path from 'path'; import colors from 'colors'; // 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()); -let path_credentials = path.resolve(__dirname,'..','ldap_credentials.json') +let path_credentials = path.resolve(__dirname,'..', '..','ldap_credentials.json') console.log(colors.cyan("Loading LDAP credentials from "+path_credentials)); export const credentialsLdapConfig = JSON.parse(fs.readFileSync(path_credentials).toString()); // Override config server from environment if (process.env.LDAP_URI != null) { - ldapConfig.ldap.server = process.env.LDAP_URI; + ldapConfig.server = process.env.LDAP_URI; } \ No newline at end of file