Skip to content
Snippets Groups Projects
Forked from an inaccessible project.
basics.ts 12.69 KiB
/**
 * @file Ce fichier regroupe les fonctions fondamentales aux interactions avec le LDAP.
 * C'est ici que tout le filtrage est opéré, au plus bas niveau.
 * Toutes les fonctions écrites ici sont asynchrones et renvoient des Promises ce qui nécessite de les appeler avec la synthaxe
 * un peu particulière `f(args).then(res => ...)` pour exploiter leur résultat.
 * Le découpage par fichier est arbitraire mais permet de regrouper certaines classes proches.
 * @author hawkspar
 */

import ldap from 'ldapjs';
// Toutes les entrées utilisateur sont escapées par sécurité
import ldapEscape from 'ldap-escape';
// Fichier de ldapConfig du ldap
import {ldapConfig, credentialsLdapConfig} from './config';

// Important ; permet de vérifier que l'utilisateur reste connecté.
//var ensureLoggedin =  require('connect-ensure-login').ensureLoggedIn; //hawkspar->manifold : est-ce encore utile ? je ne crois pas

// Connection au serveur LDAP avec des temps de timeout arbitraires
var client = ldap.createClient({ url: ldapConfig.server});

interface dic {
    [Key: string]: string;
}

//------------------------------------------------------------------------------------------------------------------------
// Fonctions de base agissant sur le LDAP
//------------------------------------------------------------------------------------------------------------------------

export class LDAP {
    /**
     * @class Cette classe est la brique de base du fichier tout entier puisqu'elle contient les functions qui agissent directement sur le LDAP.
     * @summary Constructeur vide.
    */
    constructor() {}

    /**
     * @summary Fonction qui sert à s'identifier sur le LDAP.
     * @desc Assez important en terme de sécurité, de gestion de conflit, et de droit d'accès. Méthode ldapjs 
     * (voir [`Client API`](http://ldapjs.org/client.html) méthode bind).
     * @arg {string} dn - Nom de domaine ; identifiant de l'utilisateur cherchant à se connecter
     * @arg {string} password - Mot de passe de l'utilisateur cherchant à se connecter
     * @returns {Promise(boolean)} `true` si l'opération s'est bien déroulée, `false` sinon.
     * @static
     * @async
     */
    static async bind(dn: string, password: string) : Promise<boolean> {
        // Escape DN as everywhere in this file, but password is taken as is
        client.bind(dn, password, res => {
            // Gestion erreur
            try { res; }
            catch(err) {
                throw "Erreur lors de la connection au LDAP.";
            }
        });
        // End with a boolean
        return true;
    }

    /**
     * @summary Fonction qui sert à s'identifier sur le LDAP avec plein pouvoirs.
     * @desc Appelle {@link bind} avec un utilisateur tout puissant.
     * @returns {Promise(boolean)} `true` si l'opération s'est bien déroulée, `false` sinon.
     * @static
     * @async
     */
    static async adminBind() : Promise<boolean> { return LDAP.bind(credentialsLdapConfig.dn, credentialsLdapConfig.password); }

    /**
     * @summary Fonction qui sert à se déconnecter du LDAP.