|
|
@@ -1,5 +1,6 @@
|
|
|
const ldapjs = require("ldapjs");
|
|
|
-import ConfigManager, { LDAPCategory } from "./ConfigLoader";
|
|
|
+import ConfigManager, { LDAPAttribute, LDAPCategory } from "./ConfigLoader";
|
|
|
+import { LDAPSchemaAttribute, LDAPSchemaObjectClass } from './LDAPSchema';
|
|
|
import LDAPEntry from "./LDAPEntry";
|
|
|
import LDAPTree from "./LDAPTree";
|
|
|
|
|
|
@@ -12,10 +13,12 @@ interface ILDAPManager {
|
|
|
*/
|
|
|
TryBind(dn: string, password: string): Promise<boolean>;
|
|
|
CheckLoginExists(user: string): Promise<string>;
|
|
|
- ListEntries(category: LDAPCategory): Promise<Array<LDAPEntry>>;
|
|
|
+ ListEntries(category: LDAPCategory): Promise<LDAPEntry[]>;
|
|
|
/** @return all dn */
|
|
|
GetTree(): Promise<LDAPTree>;
|
|
|
+ GetEntry(dn: string): Promise<Map<string, string[]>>;
|
|
|
Remove(dn: string): Promise<void>;
|
|
|
+ GetSchema(): Promise<Map<string, LDAPSchemaObjectClass>>;
|
|
|
}
|
|
|
|
|
|
class LDAPManager implements ILDAPManager {
|
|
|
@@ -66,7 +69,7 @@ class LDAPManager implements ILDAPManager {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- public Search(base: string, scope: string, filter: string|undefined, attributes: Array<string>): Promise<Map<string, Map<string, any>>> {
|
|
|
+ private Search(base: string, scope: string, filter: string|undefined =undefined, attributes: string[]|undefined =undefined): Promise<Map<string, Map<string, string[]>>> {
|
|
|
return new Promise((ok, ko) => {
|
|
|
this.cli.search(base, { scope: scope, filter: filter, attributes: attributes, paged: false }, (err: any, res: any) => {
|
|
|
if (err) {
|
|
|
@@ -79,9 +82,19 @@ class LDAPManager implements ILDAPManager {
|
|
|
|
|
|
res.on('searchEntry', (i: any) => {
|
|
|
if (error) return;
|
|
|
- let LDAPEntry = new Map<string, any>();
|
|
|
+ let LDAPEntry = new Map<string, string[]>();
|
|
|
for (let attr in i.object) {
|
|
|
let value = i.object[attr];
|
|
|
+ if (Array.isArray(value)) {
|
|
|
+ let arr = new Array();
|
|
|
+ for (let j of value)
|
|
|
+ arr.push(j);
|
|
|
+ value = arr;
|
|
|
+ } else {
|
|
|
+ let arr = new Array();
|
|
|
+ arr.push(value);
|
|
|
+ value = arr;
|
|
|
+ }
|
|
|
LDAPEntry.set(attr, value);
|
|
|
}
|
|
|
result.set(i.dn, LDAPEntry);
|
|
|
@@ -99,6 +112,19 @@ class LDAPManager implements ILDAPManager {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ public GetEntry(dn: string): Promise<Map<string, string[]>> {
|
|
|
+ return new Promise((ok, ko) => {
|
|
|
+ this.Search(dn, "sub").then(result => {
|
|
|
+ for (let [key, val] of result) {
|
|
|
+ ok(val);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }).catch(err => {
|
|
|
+ ko(err);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
public CheckLoginExists(user: string): Promise<string> {
|
|
|
return new Promise((ok, ko) => {
|
|
|
let config = ConfigManager.GetInstance();
|
|
|
@@ -117,13 +143,16 @@ class LDAPManager implements ILDAPManager {
|
|
|
const rootDn: string = ConfigManager.GetInstance().GetLDAPRoot();
|
|
|
this.Search(rootDn, "sub", undefined, ["dn", "ObjectClass"]).then(searchDns => {
|
|
|
let result = LDAPTree.CreateRoot();
|
|
|
- searchDns.forEach((val, dn) => result.push(dn, val.get("objectClass")));
|
|
|
+ searchDns.forEach((val, dn) => {
|
|
|
+ let classes = val.get("objectClass");
|
|
|
+ classes && result.push(dn, classes);
|
|
|
+ });
|
|
|
ok(result.Compress());
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- public ListEntries(category: LDAPCategory): Promise<Array<LDAPEntry>> {
|
|
|
+ public ListEntries(category: LDAPCategory): Promise<LDAPEntry[]> {
|
|
|
return new Promise((ok, ko) => {
|
|
|
this.Search(category.GetBaseDn(), category.GetScope(), category.GetFilter() || undefined, category.GetAttributes().map(i => i.mapped)).then(result => {
|
|
|
let userArray = new Array();
|
|
|
@@ -154,6 +183,49 @@ class LDAPManager implements ILDAPManager {
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
+
|
|
|
+ public GetSchema(): Promise<Map<string, LDAPSchemaObjectClass>> {
|
|
|
+ return new Promise((ok, ko) => {
|
|
|
+ const rootDn = ConfigManager.GetInstance().GetLDAPRoot();
|
|
|
+ let subschema: string;
|
|
|
+ this.Search(rootDn, "base", undefined, ["subschemaSubentry"]).then(result => {
|
|
|
+ const baseItem = result?.get(rootDn)?.get("subschemaSubentry");
|
|
|
+ const _subschema = baseItem && baseItem.length ? baseItem[0] : null;
|
|
|
+ if (!_subschema) {
|
|
|
+ console.error("Cannot find schema for base " + rootDn);
|
|
|
+ ko("Schema not found");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ subschema = _subschema;
|
|
|
+ return this.Search(subschema, "base", undefined, ["attributeTypes", "objectClasses"]);
|
|
|
+ }).then(result => {
|
|
|
+ const attributesArr = result?.get(subschema)?.get("attributeTypes");
|
|
|
+ const classesArr = result?.get(subschema)?.get("objectClasses");
|
|
|
+ if (!attributesArr || !classesArr) {
|
|
|
+ console.error("Cannot find schema definition for " + rootDn);
|
|
|
+ ko("Schema definition not found");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let attributes: Map<string, LDAPSchemaAttribute> = new Map();
|
|
|
+ let schemas: Map<string, LDAPSchemaObjectClass> = new Map();
|
|
|
+
|
|
|
+ for (let i of attributesArr) {
|
|
|
+ let attr = new LDAPSchemaAttribute(i);
|
|
|
+ attributes.set(attr.GetName(), attr);
|
|
|
+ }
|
|
|
+ for (let i of classesArr) {
|
|
|
+ let schema = new LDAPSchemaObjectClass(i, attributes);
|
|
|
+ schemas.set(schema.GetName(), schema);
|
|
|
+ }
|
|
|
+ for (let [_, schema] of schemas)
|
|
|
+ schema.Consolidate(schemas, attributes);
|
|
|
+ ok(schemas);
|
|
|
+ }).catch(err => {
|
|
|
+ console.error("Failed to retreive schema: ", err);
|
|
|
+ ko(err);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
export default class LDAPFactory {
|