Skip to content

Instantly share code, notes, and snippets.

@liyuntao
Created June 29, 2017 15:14
Show Gist options
  • Save liyuntao/32ffc6fcea0e9c44a557ffafaa363e76 to your computer and use it in GitHub Desktop.
Save liyuntao/32ffc6fcea0e9c44a557ffafaa363e76 to your computer and use it in GitHub Desktop.
simple ldap-client in js
const ldap = require('ldapjs');
const Promise = require("bluebird");
class LDAPClient {
constructor(ldap_url, ldap_user, ldap_pwd, ldap_base_dn) {
this.ldap_url = ldap_url;
this.ldap_user = ldap_user;
this.ldap_base_dn = ldap_base_dn;
this.domain = this._getDomain(ldap_base_dn);
this.ldapClient = ldap.createClient({
url: ldap_url,
reconnect: {
initialDelay: 100,
maxDelay: 1000,
failAfter: 10
}
});
const client = this.ldapClient;
this.ldapClient.on('connect', function () {
client.bind(ldap_user, ldap_pwd, err => {
if (err) {
logger.error('error while ldap binding' + err);
}
});
});
}
buildDn(branch = undefined) {
const sufDN = this.ldap_base_dn;
let dn;
if (!branch) {
dn = sufDN;
} else {
const preDN = branch.split('.').map(x => `cn=${x}`).join(',');
dn = `${preDN},${sufDN}`;
}
return dn;
}
_getDomain(ldap_base_dn) {
return ldap_base_dn.split(',')
.filter(x => x.startsWith('dc='))
.map(x => x.substring(3)) // remove prefix
.join('.');
}
_getUsersByAttr(filter, timeoutInMs, dn = this.buildDn()) {
const opts_new = {
scope: 'sub',
attributes: ['uid', 'cn', 'mail', 'mobile'],
filter: filter
};
return new Promise((resolve, reject) => {
let results = {
status: 0,
message: 'OK',
data: [],
};
this.ldapClient.search(dn, opts_new, (err, res) => {
res.on('searchEntry', entry => {
const obj = entry.object;
if (obj.uid) {
const item = {};
item.email = obj.mail;
item.phone = obj.mobile;
results.data.push(item);
}
});
res.on('searchReference', reference => {
logger.error('ldap reference: ' + reference.uris.join());
});
res.on('error', err => {
logger.error('ldap error: ' + err.message);
results.status = 404;
results.message = err.message;
resolve(results);
});
res.on('end', result => {
logger.info('ldap status: ' + result.status);
results.status = result.status;
results.timestamp = Date.now();
resolve(results);
});
});
}).timeout(timeoutInMs);
}
}
module.exports = LDAPClient;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment