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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | const _ = require('underscore'); const parseDistinguishedName = require('../internal/service.parseDistinguishedName'); const joinAttributes = require('../internal/service.joinAttributes'); const getRequiredLdapAttributesForUser = require('../internal/service.getRequiredLdapAttributesForUser'); const search = require('../internal/service.search'); const pickAttributes = require('../internal/service.pickAttributes'); const User = require('../../models/user'); const limitpromises = require('limitpromises'); const maxPromiseConfig = require('../../configs/config.maxPromiseGroup'); const chunkItem = function(members, opts, self) { // We're going to build up a bulk LDAP query so we can reduce // the number of round trips to the server. We need to get // additional details about each 'member' to determine if // it is a group or another user. If it's a group, we need // to recursively retrieve the members of that group. let users = []; return new Promise((resolve, reject) => { var filter = _.reduce(members || [], function (memo, member, index) { return (memo + '(distinguishedName=' + parseDistinguishedName(member) + ')'); }, ''); filter = '(&(|(objectCategory=User)(objectCategory=Group))(|' + filter + '))'; var localOpts = { filter: filter, scope: 'sub', attributes: joinAttributes((opts || {}).attributes || defaultAttributes.user || [], getRequiredLdapAttributesForUser(opts), ['groupType']) }; // We need to limit the Searches. Too many of them will cause timeouts. the more calls the more performant // but the more risk you'll get timeout errors let searchResults = limitpromises(() => { return new Promise((resolve, reject) => { search.call(self, localOpts, function onSearch(err, members){ if(err){ return reject(err) } return resolve(members) }); }) }, [members], maxPromiseConfig.chunksItems, "members", { Reject : { rejectBehaviour : "retry", retryAttempts : 15 }, // Timeout : { // timeoutBehaviour : "retry", // timeoutMillis : 300, // retryAttempts : 10 // }, // Reject : { // rejectBehaviour : "none" // } }); Promise.all(searchResults.map(res => {return res.result})).then(async Members =>{ Members = Members[0]; let nestedUsersArr = []; for(let i in Members){ let member = Members[i]; if(member){ if(!member.groupType){ let user = new User(pickAttributes(member, (opts || {}).attributes || defaultAttributes.user)); self.emit(user); users.push(user); } else { let nestedUsers = self.getUsersForGroup(opts, member.cn); nestedUsersArr.push(nestedUsers); } } } Promise.all(nestedUsersArr).then(AllNestedUsers => { for(let i in AllNestedUsers){ users = [].concat(users, AllNestedUsers[i]); } return resolve(users); }, err => { return reject(err) }); }, err => { return reject(err); }); }); } module.exports = chunkItem; |