Получить результат поиска ldap с помощью nodejs и ldapjs - PullRequest
0 голосов
/ 20 мая 2019

Я хочу найти и вернуть всех пользователей определенной группы, используя ldap и nodejs. Результат должен быть представлен на веб-странице, используя экспресс с расширением pug.

Вызов моей функции выглядит следующим образом:

app.get('/singleProjectSelection/:id', (req, res) => {
    var url = req.url.toString('utf-8');
    var prjName = url.replace('/singleProjectSelection/', '');


    ldap.getUserFromProject(prjName, users => {
        res.render('users', { users: getUsers() });
    });
});

Файл ldap.js, который выглядит следующим образом:

module.exports.getUserFromProject = function (searchDN, callback) {
    const firstClient = getFirstClient();

    firstClient .bind(USER, PW, (err) => {

        let users = [];
        firstClient .search(searchDN, getUserSearchQuery(), (err, res) => {
            res.on('searchEntry', function (entry) {

                const members = entry.attributes[1];
                for (var i = 0; i < members.buffers.length; i++) {
                    let json = JSON.stringify(members.buffers[i]);
                    let bufferOriginal = Buffer.from(JSON.parse(json).data);
                    let output = bufferOriginal.toString('utf8');


                    firstClient .search(`${output}`, opts, (err, res) => {
                        res.on('searchEntry', (entry) => {

                            const secondClient = getSecondClient();
                            secondClient .bind(SEC_USER, SEC_PW, (err) => {

                                const splitRes = output.split(",");
                                const foreignName = splitRes[0].replace("CN=", "");

                                const searchString = `(&(objectClass=user)(objectSid=${foreignName}))`;
                                var searchFilter = {
                                    filter: searchString,
                                    scope: 'one',
                                    attributes: ['sAMAccountName', 'givenName', 'sn', 'mail']
                                };

                                secondClient .search('ou=Usr,dc=company,dc=domain,dc=de', searchFilter, (err, res) => {
                                    res.on('searchEntry', (entry) => {
                                        try {
                                            users.push({ userID: entry.json.attributes[2].vals[0], first: entry.json.attributes[1].vals[0], last: entry.json.attributes[0].vals[0]});
                                        }
                                        catch (error) {
                                            console.log(error);
                                        }
                                    });
                                });
                            });
                        });
                    });
                }
            });
            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);
                return callback(users);
            });
        })

Я ожидаю, что выводом будет массив пользователей [{userID: '123', first: 'firstName, last:' lastName '}], но я получаю пустой массив, и на сайте не отображаются пользователи.

Как я могу "дождаться" результатов поиска ldap и отобразить веб-страницу с правильными данными?

Заранее спасибо.

...