audiobookshelf/server/authProviders/ldap.js

124 lines
3.7 KiB
JavaScript
Raw Normal View History

2022-12-21 12:12:51 -05:00
const ldap = require('ldapjs');
const Logger = require('../Logger');
const { res } = require('../libs/dateAndTime');
const { integer } = require('../libs/requestIp/isJs');
class LdapAuth {
constructor() {}
async getClient() {
return await new Promise((resolve, reject) => {
Logger.debug('Connecting...')
const client = ldap.createClient({
url: global.ldapUrl,
bindDN: global.ldapBindUser,
bindCredentials: global.ldapBindPass
});
let onError, onConnect, onTimeout;
onError = err => {
Logger.error('Error Connecting.')
client.removeListener('connect', onConnect);
reject(err);
};
onConnect = () => {
Logger.debug('Connected.')
Logger.debug('Binding...')
client.removeListener('error', onError);
client.bind(global.ldapBindUser, global.ldapBindPass, err => {
if (err) {
Logger.error('Error Binding.')
reject(err);
}
else {
Logger.debug('Bound.')
resolve(client);
}
// client.search
})
};
onTimeout = () => {
Logger.error('Timeout Connecting.')
reject(new Error('LDAP connection timeout'));
}
client.once('connect', onConnect)
client.once('error', onError)
client.once('connectTimeout', onTimeout)
})
}
async findAllUsers() {
const client = await this.getClient();
return await new Promise((resolve, reject) => {
Logger.info('Searching...')
Logger.debug(`global.ldapBaseDn: ${global.ldapBaseDn}`)
Logger.debug(`global.ldapSearchFilter: ${global.ldapSearchFilter}`)
client.search(global.ldapBaseDn, {
scope: 'sub',
filter: global.ldapSearchFilter
}, (err, res) => {
Logger.info('Search returned.')
const items = []
Logger.debug('Attaching to entry events...')
res.on('searchEntry', entry => {
Logger.debug('adding entry...')
items.push(entry.object)
})
Logger.debug('Attaching to error events...')
res.on('end', result => {
Logger.debug('end of entries.')
Logger.info(`Search complete, returning ${items.length} items.`)
resolve(items);
})
})
})
}
authenticateUser(username, password) {
Logger.info('Authenticating LDAP User...');
return new Promise((resolve, reject) => {
const tempClient = ldap.createClient({
url: global.ldapUrl,
bindDN: username,
bindCredentials: password
})
let onError, onConnect, onTimeout;
onError = err => {
Logger.error('Error Connecting.')
tempClient.removeListener('connect', onConnect);
resolve(false);
};
onConnect = () => {
Logger.debug('Connected.')
Logger.debug('Binding...')
tempClient.removeListener('error', onError);
tempClient.bind(username, password, err => {
if (err) {
Logger.error('Error Binding.')
resolve(false);
}
else {
Logger.debug('Bound.')
tempClient.unbind(err => {
if (err) {
Logger.error('Error Unbinding.')
resolve(false);
} else {
Logger.info('User Authenticated.')
resolve(true);
}
})
}
// client.search
})
};
onTimeout = () => {
Logger.error('Timeout Connecting.')
resolve(false);
}
tempClient.once('connect', onConnect)
tempClient.once('error', onError)
tempClient.once('connectTimeout', onTimeout)
});
}
}
module.exports = new LdapAuth()