Source: src/ldap_data.js

var ensureLoggedin =  require('connect-ensure-login').ensureLoggedIn;
var ldapescape = require("ldap-escape");
//var Fuse = require("fuse.js");

var ldap = require('ldapjs');

var client = ldap.createClient({ url: "ldap://frankiz", timeout: 10000, idleTimeout: 10000});

/**
 * @summary Fonction qui retrouve les groupes où une personne est membre
 * @arg {int} person_id
 * @return {string} Liste des groupes où l'id fournie est membre 
 */
function groupsUserIsMember(person_id) {
    return client.search("ou=groups,dc=frankiz,dc=net", {
        attributes: "uid",
        filter: ldapescape.filter("(|(memberUid=${id})(restrictedMemberUid=${id}))", {id: person_id}) },
    function(err, res){
        if (err) {
            return err;
        } else {
            console.log(res);
            res.on('searchEntry', function(entry) {
                console.log('entry: ' + JSON.stringify(entry.object));
            });
            res.on('searchReference', function(referral) {
                console.log('referral: ' + referral.uris.join());
            });
            res.on('error', function(err) {
                console.error('error: ' + err.message);
            });
            res.on('end', function(result) {
                console.log('status: ' + result.status);
            });
        }});
}
/**    console.log(client.search("ou=groups,dc=frankiz,dc=net", function(err, res) { return err; } ));
    return client.search("ou=groups,dc=frankiz,dc=net", {
        scope: "one",
        filter: ldapescape.filter("(|(memberUid=${id})(restrictedMemberUid={$id}))",{id: person_id}),
        attributes: "uid",
    },
    function(err, res) { return err;
        if (err) {
            reject("LDAP ");
        }
        assert.ifError(err);

        res.on('searchEntry', function(entry) {
            console.log('entry: ' + JSON.stringify(entry.object));
        });
        res.on('searchReference', function(referral) {
            console.log('referral: ' + referral.uris.join());
        });
        res.on('error', function(err) {
            console.error('error: ' + err.message);
        });
        res.on('end', function(result) {
            console.log('status: ' + result.status);});
    });
}*/


function checkGroupAdmin(uid, from){
    return new Promise(function(resolve, reject) {
        client.search("dc=frankiz,dc=net", {scope: "sub", attributes: ["cn", "uid", "mail", "memberUid", "objectClass"], filter: ldapescape.filter("(uid=${uid})", {uid: from})}, function(err, resldap){
            if (err) {
                reject("LDAP search error");
            } else {
                resldap.on('searchEntry', function(entry) {
                    if (entry.object.objectClass.indexOf("inetOrgPerson") > -1) {
                        if (entry.object.uid == uid) {
                            console.log("Feu1");
                            resolve(entry.object.cn + " <" + entry.object.mail + ">");
                        } else {
                            reject("Cannot send as user which is not you");
                        }
                    } else {
                        if (entry.object.memberUid.indexOf(uid) > -1) {
                            console.log("Feu2");
                            resolve(entry.object.cn + " <" + from + "@eleves.polytechnique.fr>")
                        } else {
                            reject("You are not admin of this group");
                        }
                    }
                });
            }
        });
    });
}

function checkGroup(person_id){
    return new Promise(function(resolve, reject) {
        client.search("dc=frankiz,dc=net", {scope: "sub", attributes: "uid", filter: ldapescape.filter("(|(memberUid=${id})(restrictedMemberUid=${id}))", {id: person_id})}, function(err, resldap){
            if (err) {
                reject("LDAP search error");
            } else {
                resldap.on('searchEntry', function(entry) {
                    if (entry.object.objectClass.indexOf("inetOrgPerson") > -1) {
                        if (entry.object.uid == person_id) {
                            resolve("Binet Member");
                        } else {
                            reject("Fraud !");
                        }
                    } else {
                        if (entry.object.memberUid.indexOf(person_id) > -1) {
                            resolve("Binet member 2");
                        } else {
                            reject("Fraud");
                        }
                    }
                });
            }
        });
    });
}


console.log(checkGroupAdmin("quentin.chevalier","faerix"));

console.log(checkGroup("quentin.chevalier","faerix"));

console.log(groupsUserIsMember("anatole.romon"));