Add externalldap pagination

This commit is contained in:
Johannes Zellner
2019-08-30 19:11:27 +02:00
parent 7d299908c9
commit eb963b2eb4

View File

@@ -14,7 +14,7 @@ exports = module.exports = {
var assert = require('assert'),
async = require('async'),
auditsource = require('./auditsource.js'),
debug = require('debug')('box:ldapclient'),
debug = require('debug')('box:externalldap'),
ldap = require('ldapjs'),
settings = require('./settings.js'),
tasks = require('./tasks.js'),
@@ -150,6 +150,8 @@ function sync(progressCallback, callback) {
assert.strictEqual(typeof progressCallback, 'function');
assert.strictEqual(typeof callback, 'function');
debug('Start user syncing ...');
settings.getExternalLdapConfig(function (error, externalLdapConfig) {
if (error) return callback(new ExternalLdapError(ExternalLdapError.INTERNAL_ERROR, error));
if (!externalLdapConfig.enabled) return callback(new ExternalLdapError(ExternalLdapError.BAD_STATE, 'not enabled'));
@@ -158,11 +160,13 @@ function sync(progressCallback, callback) {
if (error) return callback(error);
var opts = {
paged: true,
filter: externalLdapConfig.filter,
scope: 'sub' // We may have to make this configurable
};
// TODO this needs pagination!
debug(`Listing users at ${externalLdapConfig.baseDn} with filter ${externalLdapConfig.filter}`);
client.search(externalLdapConfig.baseDn, opts, function (error, result) {
if (error) return callback(new ExternalLdapError(ExternalLdapError.EXTERNAL_ERROR, error));
@@ -177,7 +181,9 @@ function sync(progressCallback, callback) {
});
result.on('end', function (result) {
console.log('status: ' + result.status);
if (result.status !== 0) return callback(new ExternalLdapError(ExternalLdapError.EXTERNAL_ERROR, 'Server returned status ' + result.status));
debug(`Found ${ldapUsers.length} users`);
// we ignore all errors here and just log them for now
async.eachSeries(ldapUsers, function (user, callback) {
@@ -192,17 +198,18 @@ function sync(progressCallback, callback) {
}
if (error) {
debug('[adding user]', user.uid, user.mail, user.cn);
debug('[adding user] ', user.uid, user.mail, user.cn);
users.create(user.uid, null, user.mail, user.cn, { source: 'ldap' }, auditsource.EXTERNAL_LDAP_TASK, function (error) {
if (error) console.error('Failed to create user', user, error);
callback();
});
} else if (result.source !== 'ldap') {
// ignore syncing users not from this source
debug('[conflicting user]', user.uid, user.mail, user.cn);
callback();
} else if (result.email !== user.mail || result.displayName !== user.cn) {
debug('[updating user]', user.uid, user.mail, user.cn);
debug('[updating user] ', user.uid, user.mail, user.cn);
users.update(result.id, { email: user.mail, fallbackEmail: user.mail, displayName: user.cn }, auditsource.EXTERNAL_LDAP_TASK, function (error) {
if (error) console.error('Failed to update user', user, error);
@@ -213,7 +220,10 @@ function sync(progressCallback, callback) {
callback();
}
});
}, callback);
}, function () {
debug('User sync done.');
callback();
});
});
});
});