entity.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /*
  2. * GET users listing.
  3. */
  4. import express = require('express');
  5. const router = express.Router();
  6. import Security from '../src/Security';
  7. import RouterUtils from '../src/RouterUtils';
  8. import { ILDAPManager } from '../src/ldapInterface';
  9. import { LDAPSchemaObjectClass, ClassType } from '../src/LDAPSchema';
  10. function LDAPEntryToAttributes(entry: Map<string, Array<string>>): any {
  11. let result: any = [];
  12. for (let [key, val] of entry)
  13. val.forEach(v => result.push({ key: key, val: v }));
  14. return result;
  15. }
  16. function getType(schema: Map<string, LDAPSchemaObjectClass>, klass: string): string {
  17. switch (schema.get(klass)?.GetType()) {
  18. case ClassType.eAbstract:
  19. return "abstract";
  20. case ClassType.eAuxiliary:
  21. return "auxiliary";
  22. case ClassType.eStructural:
  23. return "structural";
  24. }
  25. return "Unknown";
  26. }
  27. function StructifySchema(schema: Map<string, LDAPSchemaObjectClass>): any {
  28. let result: any = {};
  29. for (let [key, oc] of schema) {
  30. if (oc.GetType() === ClassType.eAbstract)
  31. continue;
  32. let obj = {
  33. may: oc.ListMayAttributes().filter(i => i.toLowerCase() !== 'objectclass'),
  34. must: oc.ListMustAttributes().filter(i => i.toLowerCase() !== 'objectclass'),
  35. structural: oc.GetType() === ClassType.eStructural,
  36. auxiliary: oc.GetType() === ClassType.eAuxiliary,
  37. type: getType(schema, key)
  38. };
  39. result[key] = obj;
  40. }
  41. return result;
  42. }
  43. class AttributesByClasses {
  44. public constructor(entry: Map<string, string[]>, classes: Map<string, LDAPSchemaObjectClass>) {
  45. for (let eClass of entry.get("objectClass") || []) {
  46. this.fEntries.set(eClass, new Map());
  47. let cl = classes.get(eClass);
  48. cl && this.fObjectClasses.push(cl);
  49. }
  50. for (let [i, j] of entry) {
  51. if (i.toLowerCase() == 'objectclass')
  52. continue;
  53. let found = false;
  54. for (let oc of this.fObjectClasses) {
  55. if (oc.HasAttribute(i)) {
  56. this.fEntries.get(oc.GetName())?.set(i, j);
  57. found = true;
  58. }
  59. }
  60. if (!found)
  61. this.fUnmapped.set(i, j);
  62. }
  63. for (let klass of this.fObjectClasses) {
  64. let className = klass.GetName();
  65. let classContent = this.fEntries.get(className);
  66. if (!classContent) {
  67. classContent = new Map<string, string[]>();
  68. this.fEntries.set(className, classContent);
  69. }
  70. for (let attr of klass.ListAttributes())
  71. !classContent.has(attr) && !entry.has(attr) && classContent.set(attr, new Array());
  72. this.fEntries.set(className, classContent);
  73. }
  74. }
  75. public IsMandatoryAttr(attr: string): boolean {
  76. for (let klass of this.fObjectClasses)
  77. if (klass.HasMust(attr))
  78. return true;
  79. return false;
  80. }
  81. public ToMap(): any {
  82. let result: any = {};
  83. for (let [ocKey, vals] of this.fEntries) {
  84. let classContent: any = {};
  85. for (let [i, j] of vals)
  86. classContent[i] = j.length ? j : [""];
  87. result[ocKey] = classContent;
  88. }
  89. return result;
  90. }
  91. public GetObjectClasses(): any {
  92. let result: any = [];
  93. for (let [ocKey, _] of this.fEntries)
  94. result.push(ocKey);
  95. result.sort();
  96. return result;
  97. }
  98. public ClassExists(className: string): boolean {
  99. return this.fEntries.has(className);
  100. }
  101. private fObjectClasses: LDAPSchemaObjectClass[] = new Array();
  102. private fEntries: Map<string, Map<string, string[]>> = new Map();
  103. private fUnmapped: Map<string, string[]> = new Map();
  104. }
  105. router.get('/:dn', (req: express.Request, res: express.Response) => {
  106. if (!req.isUserLogged)
  107. return RouterUtils.Redirect(res, "/login");
  108. let ldapManager: ILDAPManager;
  109. let entry: Map<string, string[]>;
  110. req.ldapManager.GetInstance()
  111. .then(_ldapManager => { ldapManager = _ldapManager; return ldapManager.GetEntry(req.params.dn); })
  112. .then(_entry => { entry = _entry; return ldapManager.GetSchema() }).then(schema => {
  113. let classes: AttributesByClasses = new AttributesByClasses(entry, schema);
  114. let dn = (entry.get("dn") || [])[0];
  115. res.render('entity', {
  116. dn: dn || req.params.dn,
  117. attributes: classes.ToMap(),
  118. classes: classes.GetObjectClasses(),
  119. getType: (klass: string) => getType(schema, klass),
  120. isMandatory: (attr: string): boolean => classes.IsMandatoryAttr(attr),
  121. schema: StructifySchema(schema),
  122. getUnusedClass: (): string[] => {
  123. let result = [];
  124. for (let [key, klass] of schema) {
  125. if (!classes.ClassExists(key) && klass.GetType() !== ClassType.eAbstract)
  126. result.push({ key: key, klass: klass });
  127. }
  128. return result.sort((a, b) => {
  129. if (a.klass.GetType() === ClassType.eStructural && b.klass.GetType() === ClassType.eAuxiliary)
  130. return -1;
  131. if (a.klass.GetType() === ClassType.eAuxiliary && b.klass.GetType() === ClassType.eStructural)
  132. return 1;
  133. return a.key.localeCompare(b.key);
  134. }).map(a => a.key);
  135. }
  136. });
  137. });
  138. });
  139. router.delete('/', (req: express.Request, res: express.Response) => {
  140. const session = Security.GetSession(req);
  141. if (!req.query["csrf"] || !req.query["dn"] || Array.isArray(req.query["csrf"]) || Array.isArray(req.query["dn"])) {
  142. res.sendStatus(400);
  143. return;
  144. }
  145. if (!session || !req.query["csrf"] || req.query["csrf"] !== session.GetCSRFToken()) {
  146. res.sendStatus(403);
  147. return;
  148. }
  149. req.ldapManager.GetInstance().then((ldap: ILDAPManager): void => {
  150. ldap.Remove(req.query["dn"]?.toString() || "")
  151. .then(() => {
  152. res.sendStatus(203);
  153. })
  154. .catch(err => {
  155. res.statusCode = 500;
  156. res.statusMessage = err;
  157. res.send();
  158. });
  159. });
  160. });
  161. export default router;