Checks a login: finds the user with the service account (exactly one
match), then binds as that user with password. A refused login is
{ ok: false, reason }; an unreachable directory throws LdapError.
An empty password is refused without asking the server.
The users (or, with filter, other objects) changed since mark,
and the mark of the next call. In AD prefer a USN (uSNChanged),
which is per domain controller: read changes from one url. A date
compares whenChanged (AD) or modifyTimestamp (OpenLDAP) with the
app's clock. Deleted objects are not returned.
The user with this login (as authenticate finds it), or null when there is none or more than one.
A check for web-kit's HealthCheckFeature (checks: { ldap: ldap.healthCheck() }):
ok with the latency, error with what failed (not the credentials).
Connects, binds as the service account and reads the root DSE: what a health check needs.
Every entry a search finds, all pages.
A search page by page, on one connection, closed when the iteration ends.
An LDAP directory, Active Directory by default: logins, users, their groups (nested included) and what changed. Every call opens a connection, binds as the service account and closes it when done.