From eb963b2eb489ac15be4fccffddf1b0aeeecb5e4d Mon Sep 17 00:00:00 2001 From: Johannes Zellner Date: Fri, 30 Aug 2019 19:11:27 +0200 Subject: [PATCH] Add externalldap pagination --- src/externalldap.js | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/externalldap.js b/src/externalldap.js index 0eead2dc3..4c47fae28 100644 --- a/src/externalldap.js +++ b/src/externalldap.js @@ -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(); + }); }); }); });