Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | 1x 1x 1x 1x 1x 1x 1x | const limitpromises = require('limitpromises');
const Url = require('url');
const removeReferral = require('./service.search.removeReferral');
const pendingReferrals = require('./service.search.pendingReferrals');
const isAllowedReferral = require('../service.isAllowedReferral');
const createClient = require('../service.createClient');
/**
* Occurs when a search reference / referral is received. Follows the referral chase if
* enabled.
* @param {Object} self The ActiveDirectory Object
* @param {Object} ref The referral.
* @param {Function} resolve Resolve the Search
* @param {Function} reject Reject the search
*/
function onReferralChase(self, client, baseDN, ref, opts, controls, results, resolve, reject) {
var index = 0;
var referralUrl;
// Loop over the referrals received.
while (referralUrl = (ref.uris || [])[index++]) {
if (isAllowedReferral(referralUrl)) {
log.debug('Following LDAP referral chase at %s', referralUrl);
var referralClient = createClient.call(self, referralUrl, opts);
pendingReferrals.push(referralClient);
var referral = Url.parse(referralUrl);
var referralBaseDn = (referral.pathname || '/').substring(1);
let refCliSearch = limitpromises(Input => {
return new Promise((resolve, reject) => {
referralClient.search(referralBaseDn, getLdapOpts(opts), controls, (err, res) => {
// If the referral chase / search failed, fail silently.
if (err) {
onReferralError(err);
return;
}
return resolve(res);
});
})
}, [true], self.opts.maxSearchesAtOnce || maxPromiseConfig.maxSearchesAtOnce, "searches", maxPromiseConfig.searchTimeoutAndReject)
Promise.all(refCliSearch.map(r => {return r.result})).then(results => {
let res = results[0];
res.on('searchEntry', entry => {
onSearchEntry(entry, client, baseDN, self, opts, isDone, results, resolve, reject);
});
res.on('searchReference', ref => {
onReferralChase(self, client, baseDN, ref, opts, controls, results, resolve, reject);
});
res.on('error', onReferralError);
res.on('end', function (result) {
removeReferral(referralClient);
});
});
}
}
}
/**
* Occurs when a error is encountered with the referral client.
* @param {Object} err The error object or string.
* @param {}
*/
function onReferralError(err, referralBaseDn, opts, referralClient) {
log.error(err, '[%s] An error occurred chasing the LDAP referral on %s (%j)',
(err || {}).errno, referralBaseDn, opts);
removeReferral(referralClient);
}
module.exports = onReferralChase; |