entity.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /*
  2. * GET users listing.
  3. */
  4. import express = require('express');
  5. const router = express.Router();
  6. import Security from '../src/Security';
  7. import { ILDAPManager } from '../src/ldapInterface';
  8. import { LDAPSchemaObjectClass } from '../src/LDAPSchema';
  9. function LDAPEntryToAttributes(entry: Map<string, Array<string>>): any {
  10. let result: any = [];
  11. for (let [key, val] of entry)
  12. val.forEach(v => result.push({ key: key, val: v }));
  13. return result;
  14. }
  15. class AttributesByClasses {
  16. public constructor(entry: Map<string, string[]>, classes: Map<string, LDAPSchemaObjectClass>) {
  17. let oClasses: LDAPSchemaObjectClass[] = new Array();
  18. for (let eClass of entry.get("objectClass") || []) {
  19. this.fEntries.set(eClass, new Map());
  20. let cl = classes.get(eClass);
  21. cl && oClasses.push(cl);
  22. }
  23. for (let [i, j] of entry) {
  24. let found = false;
  25. for (let oc of oClasses) {
  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 oClasses) {
  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) && classContent.set(attr, new Array());
  44. this.fEntries.set(className, classContent);
  45. }
  46. }
  47. public ToMap(): any {
  48. let result: any = {};
  49. for (let [ocKey, vals] of this.fEntries) {
  50. let classContent: any = {};
  51. for (let [i, j] of vals) {
  52. classContent[i] = j.length ? j : [""];
  53. }
  54. result[ocKey] = classContent;
  55. }
  56. return result;
  57. }
  58. public GetObjectClasses(): any {
  59. let result: any = [];
  60. for (let [ocKey, val] of this.fEntries)
  61. result.push(ocKey);
  62. result.sort();
  63. return result;
  64. }
  65. private fEntries: Map<string, Map<string, string[]>> = new Map();
  66. private fUnmapped: Map<string, string[]> = new Map();
  67. }
  68. router.get('/:dn', (req: express.Request, res: express.Response) => {
  69. if (!Security.requireLoggedUser(req, res))
  70. return;
  71. let ldapManager: ILDAPManager;
  72. let entry: Map<string, string[]>;
  73. req.ldapManager.GetInstance()
  74. .then(_ldapManager => { ldapManager = _ldapManager; return ldapManager.GetEntry(req.params.dn) })
  75. .then(_entry => { entry = _entry; return ldapManager.GetSchema() }).then(schema => {
  76. let classes: AttributesByClasses = new AttributesByClasses(entry, schema);
  77. let dn = (entry.get("dn") || [])[0];
  78. res.render('entity', {
  79. dn: dn || req.params.dn,
  80. attributes: classes.ToMap(),
  81. classes: classes.GetObjectClasses()
  82. });
  83. });
  84. });
  85. router.delete('/', (req: express.Request, res: express.Response) => {
  86. const session = Security.GetSession(req);
  87. if (!req.query["csrf"] || !req.query["dn"] || Array.isArray(req.query["csrf"]) || Array.isArray(req.query["dn"])) {
  88. res.sendStatus(400);
  89. return;
  90. }
  91. if (!session || !req.query["csrf"] || req.query["csrf"] !== session.GetCSRFToken()) {
  92. res.sendStatus(403);
  93. return;
  94. }
  95. req.ldapManager.GetInstance().then((ldap: ILDAPManager): void => {
  96. ldap.Remove(req.query["dn"]?.toString() || "")
  97. .then(() => {
  98. res.sendStatus(203);
  99. })
  100. .catch(err => {
  101. res.statusCode = 500;
  102. res.statusMessage = err;
  103. res.send();
  104. });
  105. });
  106. });
  107. export default router;