entity.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. class AttributesByClasses {
  17. public constructor(entry: Map<string, string[]>, classes: Map<string, LDAPSchemaObjectClass>) {
  18. for (let eClass of entry.get("objectClass") || []) {
  19. this.fEntries.set(eClass, new Map());
  20. let cl = classes.get(eClass);
  21. cl && this.fObjectClasses.push(cl);
  22. }
  23. for (let [i, j] of entry) {
  24. let found = false;
  25. for (let oc of this.fObjectClasses) {
  26. if (oc.HasAttribute(i)) {
  27. this.fEntries.get(oc.GetName())?.set(i, j);
  28. found = true;
  29. break;
  30. }
  31. }
  32. if (!found)
  33. this.fUnmapped.set(i, j);
  34. }
  35. for (let klass of this.fObjectClasses) {
  36. let className = klass.GetName();
  37. let classContent = this.fEntries.get(className);
  38. if (!classContent) {
  39. classContent = new Map<string, string[]>();
  40. this.fEntries.set(className, classContent);
  41. }
  42. for (let attr of klass.ListAttributes())
  43. !classContent.has(attr) && !entry.has(attr) && classContent.set(attr, new Array());
  44. this.fEntries.set(className, classContent);
  45. }
  46. }
  47. public IsMandatoryAttr(attr: string): boolean {
  48. for (let klass of this.fObjectClasses)
  49. if (klass.HasMust(attr))
  50. return true;
  51. return false;
  52. }
  53. public ToMap(): any {
  54. let result: any = {};
  55. for (let [ocKey, vals] of this.fEntries) {
  56. let classContent: any = {};
  57. for (let [i, j] of vals) {
  58. classContent[i] = j.length ? j : [""];
  59. }
  60. result[ocKey] = classContent;
  61. }
  62. return result;
  63. }
  64. public GetObjectClasses(): any {
  65. let result: any = [];
  66. for (let [ocKey, val] of this.fEntries)
  67. result.push(ocKey);
  68. result.sort();
  69. return result;
  70. }
  71. private fObjectClasses: LDAPSchemaObjectClass[] = new Array();
  72. private fEntries: Map<string, Map<string, string[]>> = new Map();
  73. private fUnmapped: Map<string, string[]> = new Map();
  74. }
  75. router.get('/:dn', (req: express.Request, res: express.Response) => {
  76. if (!req.isUserLogged)
  77. return RouterUtils.Redirect(res, "/login");
  78. let ldapManager: ILDAPManager;
  79. let entry: Map<string, string[]>;
  80. req.ldapManager.GetInstance()
  81. .then(_ldapManager => { ldapManager = _ldapManager; return ldapManager.GetEntry(req.params.dn); })
  82. .then(_entry => { entry = _entry; return ldapManager.GetSchema() }).then(schema => {
  83. let classes: AttributesByClasses = new AttributesByClasses(entry, schema);
  84. let dn = (entry.get("dn") || [])[0];
  85. res.render('entity', {
  86. dn: dn || req.params.dn,
  87. attributes: classes.ToMap(),
  88. classes: classes.GetObjectClasses(),
  89. getType: (klass: string): string => {
  90. switch (schema.get(klass)?.GetType()) {
  91. case ClassType.eAbstract:
  92. return "abstract";
  93. case ClassType.eAuxiliary:
  94. return "auxiliary";
  95. case ClassType.eStructural:
  96. return "structural";
  97. }
  98. return "Unknown";
  99. },
  100. isMandatory: (attr: string): boolean => classes.IsMandatoryAttr(attr)
  101. });
  102. });
  103. });
  104. router.delete('/', (req: express.Request, res: express.Response) => {
  105. const session = Security.GetSession(req);
  106. if (!req.query["csrf"] || !req.query["dn"] || Array.isArray(req.query["csrf"]) || Array.isArray(req.query["dn"])) {
  107. res.sendStatus(400);
  108. return;
  109. }
  110. if (!session || !req.query["csrf"] || req.query["csrf"] !== session.GetCSRFToken()) {
  111. res.sendStatus(403);
  112. return;
  113. }
  114. req.ldapManager.GetInstance().then((ldap: ILDAPManager): void => {
  115. ldap.Remove(req.query["dn"]?.toString() || "")
  116. .then(() => {
  117. res.sendStatus(203);
  118. })
  119. .catch(err => {
  120. res.statusCode = 500;
  121. res.statusMessage = err;
  122. res.send();
  123. });
  124. });
  125. });
  126. export default router;