diff --git a/src/externalldap.js b/src/externalldap.js index f6ac36bb8..11c6120e9 100644 --- a/src/externalldap.js +++ b/src/externalldap.js @@ -376,7 +376,7 @@ function syncUsers(externalLdapConfig, progressCallback, callback) { assert.strictEqual(typeof progressCallback, 'function'); assert.strictEqual(typeof callback, 'function'); - ldapUserSearch(externalLdapConfig, {}, function (error, ldapUsers) { + ldapUserSearch(externalLdapConfig, {}, async function (error, ldapUsers) { if (error) return callback(error); debug(`Found ${ldapUsers.length} users`); @@ -385,44 +385,38 @@ function syncUsers(externalLdapConfig, progressCallback, callback) { let step = 30/(ldapUsers.length+1); // ensure no divide by 0 // we ignore all errors here and just log them for now - async.eachSeries(ldapUsers, function (user, iteratorCallback) { - user = translateUser(externalLdapConfig, user); - - if (!validUserRequirements(user)) return iteratorCallback(); + for (let i = 0; i < ldapUsers.length; i++) { + let ldapUser = translateUser(externalLdapConfig, ldapUsers[i]); + if (!validUserRequirements(ldapUser)) continue; percent += step; - progressCallback({ percent, message: `Syncing... ${user.username}` }); + progressCallback({ percent, message: `Syncing... ${ldapUser.username}` }); - users.getByUsername(user.username, function (error, result) { - if (error && error.reason !== BoxError.NOT_FOUND) return iteratorCallback(error); + const [userGetError, user] = await safe(users.getByUsername(ldapUser.username)); + if (userGetError) { + debug('syncUsers: Failed to get user by username', ldapUser, userGetError); + break; + } - if (!result) { - debug(`[adding user] username=${user.username} email=${user.email} displayName=${user.displayName}`); + if (!user) { + debug(`[adding user] username=${ldapUser.username} email=${ldapUser.email} displayName=${ldapUser.displayName}`); - users.create(user.username, null /* password */, user.email, user.displayName, { source: 'ldap' }, auditSource.EXTERNAL_LDAP_TASK, function (error) { - if (error) debug('syncUsers: Failed to create user', user, error.message); - iteratorCallback(); - }); - } else if (result.source !== 'ldap') { - debug(`[conflicting user] username=${user.username} email=${user.email} displayName=${user.displayName}`); + const [userAddError] = await safe(users.add(ldapUser.email, { username: ldapUser.username, password: null, displayName: ldapUser.displayName, source: 'ldap' }, auditSource.EXTERNAL_LDAP_TASK)); + if (userAddError) debug('syncUsers: Failed to create user', ldapUser, userAddError.message); + } else if (user.source !== 'ldap') { + debug(`[conflicting user] username=${ldapUser.username} email=${ldapUser.email} displayName=${ldapUser.displayName}`); + } else if (user.email !== ldapUser.email || user.displayName !== ldapUser.displayName) { + debug(`[updating user] username=${ldapUser.username} email=${ldapUser.email} displayName=${ldapUser.displayName}`); - iteratorCallback(); - } else if (result.email !== user.email || result.displayName !== user.displayName) { - debug(`[updating user] username=${user.username} email=${user.email} displayName=${user.displayName}`); + const [userUpdateError] = await safe(users.update(user, { email: ldapUser.email, fallbackEmail: ldapUser.email, displayName: ldapUser.displayName }, auditSource.EXTERNAL_LDAP_TASK)); + if (userUpdateError) debug('Failed to update user', ldapUser, userUpdateError); + } else { + // user known and up-to-date + debug(`[up-to-date user] username=${ldapUser.username} email=${ldapUser.email} displayName=${ldapUser.displayName}`); + } + } - users.update(result, { email: user.email, fallbackEmail: user.email, displayName: user.displayName }, auditSource.EXTERNAL_LDAP_TASK, function (error) { - if (error) debug('Failed to update user', user, error); - - iteratorCallback(); - }); - } else { - // user known and up-to-date - debug(`[up-to-date user] username=${user.username} email=${user.email} displayName=${user.displayName}`); - - iteratorCallback(); - } - }); - }, callback); + callback(); }); }