Forked from an inaccessible project.
-
Quentin CHEVALIER authoredQuentin CHEVALIER authored
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.