mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-07-15 13:51:35 +00:00
124 lines
3.7 KiB
JavaScript
124 lines
3.7 KiB
JavaScript
|
|
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()
|