16d15 < const AuthenticationController = require('../Authentication/AuthenticationController') 20c19 < const logger = require('logger-sharelatex') --- > const logger = require('@overleaf/logger') 22d20 < const { Client } = require('ldapts'); 26d23 < // const user_id = AuthenticationController.getLoggedInUserId(req) 48,78c45,55 < // UserGetter.getUsers may not preserve order so put them back in order < const positions = {} < for (let i = 0; i < contact_ids.length; i++) { < const contact_id = contact_ids[i] < positions[contact_id] = i < } < < contacts.sort( < (a, b) => < positions[a._id != null ? a._id.toString() : undefined] - < positions[b._id != null ? b._id.toString() : undefined] < ) < < // Don't count holding accounts to discourage users from repeating mistakes (mistyped or wrong emails, etc) < contacts = contacts.filter(c => !c.holdingAccount) < ContactsController.getLdapContacts(contacts).then((ldapcontacts) => { < contacts.push(ldapcontacts) < contacts = contacts.map(ContactsController._formatContact) < return Modules.hooks.fire('getContacts', user_id, contacts, function( < error, < additional_contacts < ) { < if (error != null) { < return next(error) < } < contacts = contacts.concat(...Array.from(additional_contacts || [])) < return res.send({ < contacts < }) < }) < }).catch(e => console.log("Error appending ldap contacts" + e)) --- > // UserGetter.getUsers may not preserve order so put them back in order > const positions = {} > for (let i = 0; i < contact_ids.length; i++) { > const contact_id = contact_ids[i] > positions[contact_id] = i > } > contacts.sort( > (a, b) => > positions[a._id != null ? a._id.toString() : undefined] - > positions[b._id != null ? b._id.toString() : undefined] > ) 80,99c57,60 < } < ) < }) < }, < async getLdapContacts(contacts) { < if (process.env.LDAP_CONTACTS === undefined || !(process.env.LDAP_CONTACTS.toLowerCase() === 'true')) { < return contacts < } < const client = new Client({ < url: process.env.LDAP_SERVER, < }); < < // if we need a ldap user try to bind < if (process.env.LDAP_BIND_USER) { < try { < await client.bind(process.env.LDAP_BIND_USER, process.env.LDAP_BIND_PW); < } catch (ex) { < console.log("Could not bind LDAP reader user: " + String(ex) ) < } < } --- > // Don't count holding accounts to discourage users from repeating mistakes (mistyped or wrong emails, etc) > contacts = contacts.filter(c => !c.holdingAccount) > > contacts = contacts.map(ContactsController._formatContact) 101,118c62,79 < const ldap_base = process.env.LDAP_BASE < // get user data < try { < // if you need an client.bind do it here. < const {searchEntries,searchReferences,} = await client.search(ldap_base, {scope: 'sub',filter: process.env.LDAP_CONTACT_FILTER ,}); < await searchEntries; < for (var i = 0; i < searchEntries.length; i++) { < var entry = new Map() < var obj = searchEntries[i]; < entry['_id'] = undefined < entry['email'] = obj['mail'] < entry['first_name'] = obj['givenName'] < entry['last_name'] = obj['sn'] < entry['type'] = "user" < // Only add to contacts if entry is not there. < if(contacts.indexOf(entry) === -1) { < contacts.push(entry); < } --- > return Modules.hooks.fire( > 'getContacts', > user_id, > contacts, > function (error, additional_contacts) { > if (error != null) { > return next(error) > } > contacts = contacts.concat( > ...Array.from(additional_contacts || []) > ) > return res.json({ > contacts, > }) > } > ) > } > ) 120,129c81 < } catch (ex) { < console.log(String(ex)) < } < //console.log(JSON.stringify(contacts)) < finally { < // even if we did not use bind - the constructor of < // new Client() opens a socket to the ldap server < client.unbind() < return contacts < } --- > ) 130a83 >