ldap-directory-manager

schema-aware, type-safe LDAP manager, written in typescript to create hight-level functionalities.

Usage no npm install needed!

<script type="module">
  import ldapDirectoryManager from 'https://cdn.skypack.dev/ldap-directory-manager';
</script>

README

LDAP Directory Manager

schema-aware, type-safe LDAP manager, written in typescript to create hight-level functionalities.

How to ues

import { Client, IClientConfig } from "ldap-directory-manager";
const baseDN = "DC=Domain,DC=Com";

const config: IClientConfig = {
  ldapServerUrl: process.env.AD_URI ?? "",
  user: process.env.AD_USER ?? "",
  pass: process.env.AD_Pass ?? "",
};
const client = new Client(config);

const user = await userGetOne("username*", {
  attributes: ["displayName", "userPrincipalName"],
  client,
});
console.log(user);

Api Documentations

Full API documentation

Advance Uses

generate typescript interfaces from ldap schema. (this is recommended just for first time and after each ldap schema modification)

const config = {
  ldapServerUrl: process.env.AD_URI ?? "",
  user: process.env.AD_USER ?? "",
  pass: process.env.AD_Pass ?? "",
};
const interfaceDirPath = await initial({
  generateInterfaces: true,
  useCachedInterfaces: false,
  ...config,
});

auto complete and type check, base on ldap schema interfaces that generated at first time.

Example 1

import { Client } from "ldap-directory-manager";
import { User } from "./generated/interfaces";

const baseDN = "DC=Domain,DC=Com";
const config: IClientConfig = {
  ldapServerUrl: process.env.AD_URI ?? "",
  user: process.env.AD_USER ?? "",
  pass: process.env.AD_Pass ?? "",
};
const client = new Client(config);

const user = await userGetOne<User>("username*", {
  attributes: [
    "displayName",
    "userPrincipalName",
    "adminDisplayName",
    "assistant",
    "manager",
  ],
  client,
});
console.log(user);

Example 2 (using ldap-query-generator which will be install with package):

import { QueryGenerator } from "ldap-query-generator";
import { Client } from "ldap-directory-manager";
import { User } from "./generated/interfaces";

const baseDN = "DC=Domain,DC=Com";
const config: IClientConfig = {
  ldapServerUrl: process.env.AD_URI ?? "",
  user: process.env.AD_USER ?? "",
  pass: process.env.AD_Pass ?? "",
};
const client = new Client(config);

const qGen = new QueryGenerator<User>({
  logger,
  scope: "sub",
});

const { query } = qGen
  .where({ field: "userPrincipalName", action: "substrings", criteria })
  .whereAnd({ field: "objectClass", action: "equal", criteria: "user" })
  .whereOr({ field: "objectClass", action: "equal", criteria: "person" })
  .whereNot({
    field: "objectClass",
    action: "equal",
    criteria: "computer",
  })
  .whereNot({ field: "objectClass", action: "equal", criteria: "group" })
  .select(["displayName", "userPrincipalName"]);

const data = await client.queryAttributes<User>({
  base: baseDN,
  attributes: query.attributes,
  options: {
    filter: query.toString(),
    scope: query.scope,
    paged: true,
  },
});

Motivations:

Dealing with LDAP servers to get information is hard!

the goal of this package is to:

  • Provide High level functions to interact with LDAP servers
  • Taking advantage of typescript type safety and auto code competition