ldap-rest 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +48 -0
  3. package/bin/cleanup-external-users.mjs +219 -0
  4. package/bin/index.mjs +54 -0
  5. package/bin/sync-james.mjs +190 -0
  6. package/dist/abstract/ldapFlat.js +1 -0
  7. package/dist/abstract/plugin.js +1 -0
  8. package/dist/abstract/twakePlugin.js +1 -0
  9. package/dist/bin/index.js +1 -0
  10. package/dist/config/args.js +1 -0
  11. package/dist/lib/auth/base.js +1 -0
  12. package/dist/lib/authz/base.js +1 -0
  13. package/dist/lib/expressFormatedResponses.js +1 -0
  14. package/dist/lib/ldapActions.js +1 -0
  15. package/dist/lib/parseConfig.js +1 -0
  16. package/dist/lib/utils.js +1 -0
  17. package/dist/logger/winston.js +1 -0
  18. package/dist/plugins/auth/authzLinid1.js +1 -0
  19. package/dist/plugins/auth/authzPerBranch.js +1 -0
  20. package/dist/plugins/auth/crowdsec.js +1 -0
  21. package/dist/plugins/auth/llng.js +1 -0
  22. package/dist/plugins/auth/openidconnect.js +1 -0
  23. package/dist/plugins/auth/rateLimit.js +1 -0
  24. package/dist/plugins/auth/token.js +1 -0
  25. package/dist/plugins/configApi.js +1 -0
  26. package/dist/plugins/demo/helloworld.js +1 -0
  27. package/dist/plugins/ldap/bulkImport.js +1 -0
  28. package/dist/plugins/ldap/departmentSync.js +1 -0
  29. package/dist/plugins/ldap/externalUsersInGroups.js +1 -0
  30. package/dist/plugins/ldap/flatGeneric.js +1 -0
  31. package/dist/plugins/ldap/groups.js +1 -0
  32. package/dist/plugins/ldap/onChange.js +1 -0
  33. package/dist/plugins/ldap/organization.js +1 -0
  34. package/dist/plugins/ldap/trash.js +1 -0
  35. package/dist/plugins/priority.json.js +1 -0
  36. package/dist/plugins/static.js +1 -0
  37. package/dist/plugins/twake/calendarResources.js +1 -0
  38. package/dist/plugins/twake/james.js +1 -0
  39. package/dist/plugins/weblogs.js +1 -0
  40. package/dist/src/abstract/ldapFlat.d.ts +94 -0
  41. package/dist/src/abstract/plugin.d.ts +43 -0
  42. package/dist/src/abstract/twakePlugin.d.ts +90 -0
  43. package/dist/src/bin/index.d.ts +43 -0
  44. package/dist/src/browser/ldap-group-editor/LdapGroupEditor.d.ts +31 -0
  45. package/dist/src/browser/ldap-group-editor/api/GroupApiClient.d.ts +23 -0
  46. package/dist/src/browser/ldap-group-editor/components/CreateGroupModal.d.ts +19 -0
  47. package/dist/src/browser/ldap-group-editor/components/GroupPropertyEditor.d.ts +30 -0
  48. package/dist/src/browser/ldap-group-editor/components/GroupTree.d.ts +17 -0
  49. package/dist/src/browser/ldap-group-editor/components/MoveGroupModal.d.ts +20 -0
  50. package/dist/src/browser/ldap-group-editor/index.d.ts +6 -0
  51. package/dist/src/browser/ldap-group-editor/types.d.ts +58 -0
  52. package/dist/src/browser/ldap-resource-editor/api/ResourceApiClient.d.ts +53 -0
  53. package/dist/src/browser/ldap-resource-editor/cache/CacheManager.d.ts +65 -0
  54. package/dist/src/browser/ldap-resource-editor/index.d.ts +6 -0
  55. package/dist/src/browser/ldap-resource-editor/types.d.ts +78 -0
  56. package/dist/src/browser/ldap-tree-viewer/LdapTreeViewer.d.ts +26 -0
  57. package/dist/src/browser/ldap-tree-viewer/api/LdapApiClient.d.ts +30 -0
  58. package/dist/src/browser/ldap-tree-viewer/components/TreeNode.d.ts +17 -0
  59. package/dist/src/browser/ldap-tree-viewer/components/TreeRoot.d.ts +14 -0
  60. package/dist/src/browser/ldap-tree-viewer/index.d.ts +7 -0
  61. package/dist/src/browser/ldap-tree-viewer/store/Store.d.ts +18 -0
  62. package/dist/src/browser/ldap-tree-viewer/store/actions.d.ts +28 -0
  63. package/dist/src/browser/ldap-tree-viewer/store/reducers.d.ts +7 -0
  64. package/dist/src/browser/ldap-tree-viewer/types.d.ts +34 -0
  65. package/dist/src/browser/ldap-unit-editor/LdapUnitEditor.d.ts +27 -0
  66. package/dist/src/browser/ldap-unit-editor/api/UnitApiClient.d.ts +24 -0
  67. package/dist/src/browser/ldap-unit-editor/components/MoveUnitModal.d.ts +28 -0
  68. package/dist/src/browser/ldap-unit-editor/components/UnitPropertyEditor.d.ts +28 -0
  69. package/dist/src/browser/ldap-unit-editor/components/UnitTree.d.ts +18 -0
  70. package/dist/src/browser/ldap-unit-editor/index.d.ts +6 -0
  71. package/dist/src/browser/ldap-unit-editor/types.d.ts +55 -0
  72. package/dist/src/browser/ldap-user-editor/LdapUserEditor.d.ts +32 -0
  73. package/dist/src/browser/ldap-user-editor/api/UserApiClient.d.ts +55 -0
  74. package/dist/src/browser/ldap-user-editor/cache/CacheManager.d.ts +65 -0
  75. package/dist/src/browser/ldap-user-editor/components/MoveUserModal.d.ts +28 -0
  76. package/dist/src/browser/ldap-user-editor/components/PointerField.d.ts +22 -0
  77. package/dist/src/browser/ldap-user-editor/components/UserEditor.d.ts +46 -0
  78. package/dist/src/browser/ldap-user-editor/components/UserList.d.ts +24 -0
  79. package/dist/src/browser/ldap-user-editor/components/UserTree.d.ts +24 -0
  80. package/dist/src/browser/ldap-user-editor/index.d.ts +7 -0
  81. package/dist/src/browser/ldap-user-editor/types.d.ts +67 -0
  82. package/dist/src/browser/shared/components/Modal.d.ts +38 -0
  83. package/dist/src/browser/shared/components/StatusMessage.d.ts +48 -0
  84. package/dist/src/browser/shared/index.d.ts +10 -0
  85. package/dist/src/browser/shared/types/index.d.ts +65 -0
  86. package/dist/src/browser/shared/utils/dom.d.ts +33 -0
  87. package/dist/src/browser/shared/utils/form.d.ts +28 -0
  88. package/dist/src/browser/shared/utils/schema.d.ts +29 -0
  89. package/dist/src/config/args.d.ts +128 -0
  90. package/dist/src/config/schema.d.ts +18 -0
  91. package/dist/src/hooks.d.ts +76 -0
  92. package/dist/src/lib/auth/base.d.ts +9 -0
  93. package/dist/src/lib/authz/base.d.ts +63 -0
  94. package/dist/src/lib/expressFormatedResponses.d.ts +26 -0
  95. package/dist/src/lib/ldapActions.d.ts +91 -0
  96. package/dist/src/lib/parseConfig.d.ts +23 -0
  97. package/dist/src/lib/utils.d.ts +73 -0
  98. package/dist/src/logger/winston.d.ts +3 -0
  99. package/dist/src/plugins/auth/authzLinid1.d.ts +46 -0
  100. package/dist/src/plugins/auth/authzPerBranch.d.ts +59 -0
  101. package/dist/src/plugins/auth/crowdsec.d.ts +29 -0
  102. package/dist/src/plugins/auth/llng.d.ts +8 -0
  103. package/dist/src/plugins/auth/openidconnect.d.ts +11 -0
  104. package/dist/src/plugins/auth/rateLimit.d.ts +24 -0
  105. package/dist/src/plugins/auth/token.d.ts +17 -0
  106. package/dist/src/plugins/configApi.d.ts +24 -0
  107. package/dist/src/plugins/demo/helloworld.d.ts +12 -0
  108. package/dist/src/plugins/ldap/bulkImport.d.ts +48 -0
  109. package/dist/src/plugins/ldap/departmentSync.d.ts +35 -0
  110. package/dist/src/plugins/ldap/externalUsersInGroups.d.ts +21 -0
  111. package/dist/src/plugins/ldap/flatGeneric.d.ts +31 -0
  112. package/dist/src/plugins/ldap/groups.d.ts +95 -0
  113. package/dist/src/plugins/ldap/onChange.d.ts +32 -0
  114. package/dist/src/plugins/ldap/organization.d.ts +65 -0
  115. package/dist/src/plugins/ldap/trash.d.ts +52 -0
  116. package/dist/src/plugins/static.d.ts +7 -0
  117. package/dist/src/plugins/twake/calendarResources.d.ts +31 -0
  118. package/dist/src/plugins/twake/james.d.ts +83 -0
  119. package/dist/src/plugins/weblogs.d.ts +8 -0
  120. package/docs/DEVELOPER_GUIDE.md +298 -0
  121. package/docs/OPENAPI.md +440 -0
  122. package/docs/PLUGIN_DEPENDENCIES.md +612 -0
  123. package/docs/README.md +466 -0
  124. package/docs/api/REFERENCE.md +983 -0
  125. package/docs/api/REST_API.md +1237 -0
  126. package/docs/authentication.md +469 -0
  127. package/docs/authzLinid1.md +521 -0
  128. package/docs/authzPerBranch.md +596 -0
  129. package/docs/browser/LIBRARIES.md +1196 -0
  130. package/docs/examples/EXAMPLES.md +1659 -0
  131. package/docs/examples/twake-mailbox-type-nomenclature.ldif +37 -0
  132. package/docs/examples/twake-mailbox-type-schema-amendment.ldif +30 -0
  133. package/docs/jamesTeamMailboxes.md +343 -0
  134. package/docs/ldapBulkImport.md +722 -0
  135. package/docs/ldapExternalUsersInGroups.md +325 -0
  136. package/docs/ldapFlatGeneric.md +444 -0
  137. package/docs/ldapGroups.md +589 -0
  138. package/docs/ldapOrganizations.md +659 -0
  139. package/docs/ldapTrash.md +260 -0
  140. package/docs/linagora.png +0 -0
  141. package/docs/onChange.md +318 -0
  142. package/docs/plugins/DEVELOPMENT.md +1219 -0
  143. package/docs/presenterm-fr.md +721 -0
  144. package/docs/presenterm.md +721 -0
  145. package/docs/schemas/SCHEMAS.md +1212 -0
  146. package/docs/static.md +410 -0
  147. package/docs/twakeCalendarResources.md +148 -0
  148. package/docs/twakeJames.md +661 -0
  149. package/docs/weblogs.md +399 -0
  150. package/examples/web/ldap-group-editor.html +113 -0
  151. package/examples/web/ldap-tree-viewer.html +368 -0
  152. package/examples/web/ldap-unit-editor.html +108 -0
  153. package/examples/web/ldap-user-editor.html +412 -0
  154. package/package.json +458 -0
  155. package/static/browser/common-demo.css +450 -0
  156. package/static/browser/ldap-group-editor/LdapGroupEditor.js +207 -0
  157. package/static/browser/ldap-group-editor/LdapGroupEditor.js.map +1 -0
  158. package/static/browser/ldap-group-editor/api/GroupApiClient.js +112 -0
  159. package/static/browser/ldap-group-editor/api/GroupApiClient.js.map +1 -0
  160. package/static/browser/ldap-group-editor/components/CreateGroupModal.js +212 -0
  161. package/static/browser/ldap-group-editor/components/CreateGroupModal.js.map +1 -0
  162. package/static/browser/ldap-group-editor/components/GroupPropertyEditor.js +497 -0
  163. package/static/browser/ldap-group-editor/components/GroupPropertyEditor.js.map +1 -0
  164. package/static/browser/ldap-group-editor/components/GroupTree.js +153 -0
  165. package/static/browser/ldap-group-editor/components/GroupTree.js.map +1 -0
  166. package/static/browser/ldap-group-editor/components/MoveGroupModal.js +235 -0
  167. package/static/browser/ldap-group-editor/components/MoveGroupModal.js.map +1 -0
  168. package/static/browser/ldap-group-editor/index.js +2 -0
  169. package/static/browser/ldap-group-editor/index.js.map +1 -0
  170. package/static/browser/ldap-group-editor/types.js +2 -0
  171. package/static/browser/ldap-group-editor/types.js.map +1 -0
  172. package/static/browser/ldap-group-editor.esm.js +1399 -0
  173. package/static/browser/ldap-group-editor.esm.js.map +1 -0
  174. package/static/browser/ldap-group-editor.js +1407 -0
  175. package/static/browser/ldap-group-editor.js.map +1 -0
  176. package/static/browser/ldap-group-editor.min.js +2 -0
  177. package/static/browser/ldap-group-editor.min.js.map +1 -0
  178. package/static/browser/ldap-resource-editor/api/ResourceApiClient.js +226 -0
  179. package/static/browser/ldap-resource-editor/api/ResourceApiClient.js.map +1 -0
  180. package/static/browser/ldap-resource-editor/cache/CacheManager.js +123 -0
  181. package/static/browser/ldap-resource-editor/cache/CacheManager.js.map +1 -0
  182. package/static/browser/ldap-resource-editor/index.js +2 -0
  183. package/static/browser/ldap-resource-editor/index.js.map +1 -0
  184. package/static/browser/ldap-resource-editor/types.js +2 -0
  185. package/static/browser/ldap-resource-editor/types.js.map +1 -0
  186. package/static/browser/ldap-tree-viewer/LdapTreeViewer.js +187 -0
  187. package/static/browser/ldap-tree-viewer/LdapTreeViewer.js.map +1 -0
  188. package/static/browser/ldap-tree-viewer/api/LdapApiClient.js +50 -0
  189. package/static/browser/ldap-tree-viewer/api/LdapApiClient.js.map +1 -0
  190. package/static/browser/ldap-tree-viewer/components/TreeNode.js +140 -0
  191. package/static/browser/ldap-tree-viewer/components/TreeNode.js.map +1 -0
  192. package/static/browser/ldap-tree-viewer/components/TreeRoot.js +98 -0
  193. package/static/browser/ldap-tree-viewer/components/TreeRoot.js.map +1 -0
  194. package/static/browser/ldap-tree-viewer/index.js +2 -0
  195. package/static/browser/ldap-tree-viewer/index.js.map +1 -0
  196. package/static/browser/ldap-tree-viewer/store/Store.js +29 -0
  197. package/static/browser/ldap-tree-viewer/store/Store.js.map +1 -0
  198. package/static/browser/ldap-tree-viewer/store/actions.js +53 -0
  199. package/static/browser/ldap-tree-viewer/store/actions.js.map +1 -0
  200. package/static/browser/ldap-tree-viewer/store/reducers.js +79 -0
  201. package/static/browser/ldap-tree-viewer/store/reducers.js.map +1 -0
  202. package/static/browser/ldap-tree-viewer/types.js +2 -0
  203. package/static/browser/ldap-tree-viewer/types.js.map +1 -0
  204. package/static/browser/ldap-tree-viewer.css +2 -0
  205. package/static/browser/ldap-tree-viewer.css.map +1 -0
  206. package/static/browser/ldap-tree-viewer.esm.js +606 -0
  207. package/static/browser/ldap-tree-viewer.esm.js.map +1 -0
  208. package/static/browser/ldap-tree-viewer.js +614 -0
  209. package/static/browser/ldap-tree-viewer.js.map +1 -0
  210. package/static/browser/ldap-tree-viewer.min.js +2 -0
  211. package/static/browser/ldap-tree-viewer.min.js.map +1 -0
  212. package/static/browser/ldap-unit-editor/LdapUnitEditor.js +119 -0
  213. package/static/browser/ldap-unit-editor/LdapUnitEditor.js.map +1 -0
  214. package/static/browser/ldap-unit-editor/api/UnitApiClient.js +95 -0
  215. package/static/browser/ldap-unit-editor/api/UnitApiClient.js.map +1 -0
  216. package/static/browser/ldap-unit-editor/components/MoveUnitModal.js +295 -0
  217. package/static/browser/ldap-unit-editor/components/MoveUnitModal.js.map +1 -0
  218. package/static/browser/ldap-unit-editor/components/UnitPropertyEditor.js +321 -0
  219. package/static/browser/ldap-unit-editor/components/UnitPropertyEditor.js.map +1 -0
  220. package/static/browser/ldap-unit-editor/components/UnitTree.js +197 -0
  221. package/static/browser/ldap-unit-editor/components/UnitTree.js.map +1 -0
  222. package/static/browser/ldap-unit-editor/index.js +2 -0
  223. package/static/browser/ldap-unit-editor/index.js.map +1 -0
  224. package/static/browser/ldap-unit-editor/types.js +2 -0
  225. package/static/browser/ldap-unit-editor/types.js.map +1 -0
  226. package/static/browser/ldap-unit-editor.esm.js +1013 -0
  227. package/static/browser/ldap-unit-editor.esm.js.map +1 -0
  228. package/static/browser/ldap-unit-editor.js +1021 -0
  229. package/static/browser/ldap-unit-editor.js.map +1 -0
  230. package/static/browser/ldap-unit-editor.min.js +2 -0
  231. package/static/browser/ldap-unit-editor.min.js.map +1 -0
  232. package/static/browser/ldap-user-editor/LdapUserEditor.js +184 -0
  233. package/static/browser/ldap-user-editor/LdapUserEditor.js.map +1 -0
  234. package/static/browser/ldap-user-editor/api/UserApiClient.js +209 -0
  235. package/static/browser/ldap-user-editor/api/UserApiClient.js.map +1 -0
  236. package/static/browser/ldap-user-editor/cache/CacheManager.js +123 -0
  237. package/static/browser/ldap-user-editor/cache/CacheManager.js.map +1 -0
  238. package/static/browser/ldap-user-editor/components/MoveUserModal.js +302 -0
  239. package/static/browser/ldap-user-editor/components/MoveUserModal.js.map +1 -0
  240. package/static/browser/ldap-user-editor/components/PointerField.js +152 -0
  241. package/static/browser/ldap-user-editor/components/PointerField.js.map +1 -0
  242. package/static/browser/ldap-user-editor/components/UserEditor.js +608 -0
  243. package/static/browser/ldap-user-editor/components/UserEditor.js.map +1 -0
  244. package/static/browser/ldap-user-editor/components/UserList.js +181 -0
  245. package/static/browser/ldap-user-editor/components/UserList.js.map +1 -0
  246. package/static/browser/ldap-user-editor/components/UserTree.js +164 -0
  247. package/static/browser/ldap-user-editor/components/UserTree.js.map +1 -0
  248. package/static/browser/ldap-user-editor/index.js +2 -0
  249. package/static/browser/ldap-user-editor/index.js.map +1 -0
  250. package/static/browser/ldap-user-editor/types.js +2 -0
  251. package/static/browser/ldap-user-editor/types.js.map +1 -0
  252. package/static/browser/ldap-user-editor.css +2 -0
  253. package/static/browser/ldap-user-editor.css.map +1 -0
  254. package/static/browser/ldap-user-editor.esm.js +1897 -0
  255. package/static/browser/ldap-user-editor.esm.js.map +1 -0
  256. package/static/browser/ldap-user-editor.js +1905 -0
  257. package/static/browser/ldap-user-editor.js.map +1 -0
  258. package/static/browser/ldap-user-editor.min.js +2 -0
  259. package/static/browser/ldap-user-editor.min.js.map +1 -0
  260. package/static/browser/shared/components/Modal.js +121 -0
  261. package/static/browser/shared/components/Modal.js.map +1 -0
  262. package/static/browser/shared/components/StatusMessage.js +119 -0
  263. package/static/browser/shared/components/StatusMessage.js.map +1 -0
  264. package/static/browser/shared/index.js +7 -0
  265. package/static/browser/shared/index.js.map +1 -0
  266. package/static/browser/shared/types/index.js +37 -0
  267. package/static/browser/shared/types/index.js.map +1 -0
  268. package/static/browser/shared/utils/dom.js +78 -0
  269. package/static/browser/shared/utils/dom.js.map +1 -0
  270. package/static/browser/shared/utils/form.js +234 -0
  271. package/static/browser/shared/utils/form.js.map +1 -0
  272. package/static/browser/shared/utils/schema.js +121 -0
  273. package/static/browser/shared/utils/schema.js.map +1 -0
  274. package/static/browser/shared.esm.js +694 -0
  275. package/static/browser/shared.esm.js.map +1 -0
  276. package/static/browser/shared.js +723 -0
  277. package/static/browser/shared.js.map +1 -0
  278. package/static/browser/shared.min.js +2 -0
  279. package/static/browser/shared.min.js.map +1 -0
  280. package/static/schemas/ad/computers.json +92 -0
  281. package/static/schemas/ad/groups.json +55 -0
  282. package/static/schemas/ad/organizations.json +66 -0
  283. package/static/schemas/ad/users.json +116 -0
  284. package/static/schemas/standard/devices.json +72 -0
  285. package/static/schemas/standard/groups.json +54 -0
  286. package/static/schemas/standard/organizations.json +49 -0
  287. package/static/schemas/standard/users.json +86 -0
  288. package/static/schemas/twake/groups.json +75 -0
  289. package/static/schemas/twake/nomenclature/twakeAccountStatus.json +31 -0
  290. package/static/schemas/twake/nomenclature/twakeDeliveryMode.json +31 -0
  291. package/static/schemas/twake/nomenclature/twakeListType.json +31 -0
  292. package/static/schemas/twake/nomenclature/twakeMailboxType.json +31 -0
  293. package/static/schemas/twake/nomenclature/twakeTitle.json +31 -0
  294. package/static/schemas/twake/organizations.json +52 -0
  295. package/static/schemas/twake/positions.json +32 -0
  296. package/static/schemas/twake/users.json +112 -0
@@ -0,0 +1,78 @@
1
+ /**
2
+ * DOM utility functions
3
+ * @module browser/shared/utils/dom
4
+ */
5
+ /**
6
+ * Escape HTML special characters to prevent XSS attacks
7
+ * Reference: https://cheatsheetseries.owasp.org/cheatsheets/DOM_based_XSS_Prevention_Cheat_Sheet.html
8
+ */
9
+ function escapeHtml(text) {
10
+ if (text == null)
11
+ return '';
12
+ const map = {
13
+ '&': '&',
14
+ '<': '&lt;',
15
+ '>': '&gt;',
16
+ '"': '&quot;',
17
+ "'": '&#x27;',
18
+ '/': '&#x2F;',
19
+ };
20
+ return String(text).replace(/[&<>"'/]/g, m => map[m]);
21
+ }
22
+ /**
23
+ * Convert camelCase or snake_case to Title Case
24
+ */
25
+ function toTitleCase(text) {
26
+ const label = text.replace(/([A-Z])/g, ' $1').replace(/_/g, ' ');
27
+ return label.charAt(0).toUpperCase() + label.slice(1);
28
+ }
29
+ /**
30
+ * Create an HTML element with attributes and children
31
+ */
32
+ function createElement(tag, attributes = {}, children = []) {
33
+ const element = document.createElement(tag);
34
+ for (const [key, value] of Object.entries(attributes)) {
35
+ if (key === 'className') {
36
+ element.className = value;
37
+ }
38
+ else {
39
+ element.setAttribute(key, value);
40
+ }
41
+ }
42
+ for (const child of children) {
43
+ if (typeof child === 'string') {
44
+ element.appendChild(document.createTextNode(child));
45
+ }
46
+ else {
47
+ element.appendChild(child);
48
+ }
49
+ }
50
+ return element;
51
+ }
52
+ /**
53
+ * Set innerHTML safely (assumes content has been properly escaped)
54
+ */
55
+ function setInnerHTML(element, html) {
56
+ element.innerHTML = html;
57
+ }
58
+ /**
59
+ * Get element by ID with type safety
60
+ */
61
+ function getElementByIdSafe(id) {
62
+ return document.getElementById(id);
63
+ }
64
+ /**
65
+ * Query selector with type safety
66
+ */
67
+ function querySelectorSafe(selector, parent = document) {
68
+ return parent.querySelector(selector);
69
+ }
70
+ /**
71
+ * Query selector all with type safety
72
+ */
73
+ function querySelectorAllSafe(selector, parent = document) {
74
+ return parent.querySelectorAll(selector);
75
+ }
76
+
77
+ export { createElement, escapeHtml, getElementByIdSafe, querySelectorAllSafe, querySelectorSafe, setInnerHTML, toTitleCase };
78
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.js","sources":["../../../../../src/browser/shared/utils/dom.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;AAGG;AAEH;;;AAGG;AACG,SAAU,UAAU,CAAC,IAA+B,EAAA;IACxD,IAAI,IAAI,IAAI,IAAI;AAAE,QAAA,OAAO,EAAE;AAC3B,IAAA,MAAM,GAAG,GAA2B;AAClC,QAAA,GAAG,EAAE,OAAO;AACZ,QAAA,GAAG,EAAE,MAAM;AACX,QAAA,GAAG,EAAE,MAAM;AACX,QAAA,GAAG,EAAE,QAAQ;AACb,QAAA,GAAG,EAAE,QAAQ;AACb,QAAA,GAAG,EAAE,QAAQ;KACd;AACD,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;AACvD;AAEA;;AAEG;AACG,SAAU,WAAW,CAAC,IAAY,EAAA;AACtC,IAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAChE,IAAA,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACvD;AAEA;;AAEG;AACG,SAAU,aAAa,CAC3B,GAAW,EACX,UAAA,GAAqC,EAAE,EACvC,QAAA,GAAqC,EAAE,EAAA;IAEvC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AAE3C,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;AACrD,QAAA,IAAI,GAAG,KAAK,WAAW,EAAE;AACvB,YAAA,OAAO,CAAC,SAAS,GAAG,KAAK;QAC3B;aAAO;AACL,YAAA,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC;QAClC;IACF;AAEA,IAAA,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AAC5B,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACrD;aAAO;AACL,YAAA,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC;QAC5B;IACF;AAEA,IAAA,OAAO,OAAO;AAChB;AAEA;;AAEG;AACG,SAAU,YAAY,CAAC,OAAoB,EAAE,IAAY,EAAA;AAC7D,IAAA,OAAO,CAAC,SAAS,GAAG,IAAI;AAC1B;AAEA;;AAEG;AACG,SAAU,kBAAkB,CAChC,EAAU,EAAA;AAEV,IAAA,OAAO,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAa;AAChD;AAEA;;AAEG;SACa,iBAAiB,CAC/B,QAAgB,EAChB,SAAiC,QAAQ,EAAA;AAEzC,IAAA,OAAO,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAa;AACnD;AAEA;;AAEG;SACa,oBAAoB,CAClC,QAAgB,EAChB,SAAiC,QAAQ,EAAA;AAEzC,IAAA,OAAO,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAkB;AAC3D;;;;"}
@@ -0,0 +1,234 @@
1
+ import { toTitleCase, escapeHtml } from './dom.js';
2
+
3
+ /**
4
+ * Form utility functions
5
+ * @module browser/shared/utils/form
6
+ */
7
+ /**
8
+ * Get user-friendly field label from field name
9
+ */
10
+ function getFieldLabel(fieldName, attribute, customLabels) {
11
+ // Check custom labels first
12
+ if (customLabels && customLabels[fieldName]) {
13
+ return customLabels[fieldName];
14
+ }
15
+ // Common label mappings
16
+ const labelMap = {
17
+ ou: 'Unit Name',
18
+ l: 'Location',
19
+ telephoneNumber: 'Phone Number',
20
+ facsimileTelephoneNumber: 'Fax Number',
21
+ postalAddress: 'Postal Address',
22
+ twakeDepartmentPath: 'Department Path',
23
+ twakeLocalAdminLink: 'Local Administrators',
24
+ twakeMailboxType: 'Mailbox Type',
25
+ };
26
+ if (labelMap[fieldName]) {
27
+ return labelMap[fieldName];
28
+ }
29
+ // Convert to title case
30
+ return toTitleCase(fieldName);
31
+ }
32
+ /**
33
+ * Generate HTML for a form field based on schema attribute
34
+ */
35
+ async function generateFormField(fieldName, attribute, options) {
36
+ const label = getFieldLabel(fieldName, attribute, options?.customLabels);
37
+ const required = attribute.required ? 'required' : '';
38
+ const labelClass = attribute.required ? 'required' : '';
39
+ let fieldHtml = '';
40
+ if (attribute.type === 'pointer') {
41
+ // Pointer field - load options and display select
42
+ const branch = attribute.branch?.[0];
43
+ if (branch && options?.pointerOptionsLoader) {
44
+ const pointerOptions = await options.pointerOptionsLoader(branch);
45
+ fieldHtml = `
46
+ <div class="form-group">
47
+ <label for="${escapeHtml(fieldName)}" class="${escapeHtml(labelClass)}">${escapeHtml(label)}</label>
48
+ <select id="${escapeHtml(fieldName)}" name="${escapeHtml(fieldName)}" class="form-select" ${required}>
49
+ <option value="">Select...</option>
50
+ ${pointerOptions
51
+ .map(opt => `
52
+ <option value="${escapeHtml(opt.dn)}">${escapeHtml(opt.label)}</option>
53
+ `)
54
+ .join('')}
55
+ </select>
56
+ ${fieldName === 'twakeMailboxType' ? '<div class="help-text">Select "mailingList" or "teamMailbox" to enable mail functionality</div>' : ''}
57
+ </div>
58
+ `;
59
+ }
60
+ else {
61
+ // Fallback if no branch defined
62
+ fieldHtml = `
63
+ <div class="form-group">
64
+ <label for="${escapeHtml(fieldName)}" class="${escapeHtml(labelClass)}">${escapeHtml(label)}</label>
65
+ <input type="text" id="${escapeHtml(fieldName)}" name="${escapeHtml(fieldName)}" ${required} />
66
+ <div class="help-text">Enter DN (Distinguished Name)</div>
67
+ </div>
68
+ `;
69
+ }
70
+ }
71
+ else if (attribute.type === 'array' &&
72
+ attribute.items?.type === 'pointer') {
73
+ // Array of pointers - will be handled dynamically
74
+ const branch = attribute.items.branch?.[0];
75
+ if (branch) {
76
+ fieldHtml = `
77
+ <div class="form-group">
78
+ <label class="${escapeHtml(labelClass)}">${escapeHtml(label)}</label>
79
+ <div class="array-field pointer-array-field" data-field="${escapeHtml(fieldName)}" data-branch="${escapeHtml(branch)}">
80
+ <button type="button" class="btn btn-secondary add-pointer-item" data-field="${escapeHtml(fieldName)}">
81
+ <span class="material-icons">add</span>
82
+ Add ${escapeHtml(label)}
83
+ </button>
84
+ </div>
85
+ <input type="hidden" name="${escapeHtml(fieldName)}" id="${escapeHtml(fieldName)}-hidden" value="" />
86
+ </div>
87
+ `;
88
+ }
89
+ else {
90
+ // Fallback
91
+ fieldHtml = `
92
+ <div class="form-group">
93
+ <label for="${escapeHtml(fieldName)}" class="${escapeHtml(labelClass)}">${escapeHtml(label)}</label>
94
+ <textarea id="${escapeHtml(fieldName)}" name="${escapeHtml(fieldName)}" ${required}></textarea>
95
+ <div class="help-text">Enter one DN per line</div>
96
+ </div>
97
+ `;
98
+ }
99
+ }
100
+ else if (attribute.type === 'array' && attribute.items?.type === 'string') {
101
+ // Array field - use textarea
102
+ fieldHtml = `
103
+ <div class="form-group">
104
+ <label for="${escapeHtml(fieldName)}" class="${escapeHtml(labelClass)}">${escapeHtml(label)}</label>
105
+ <textarea id="${escapeHtml(fieldName)}" name="${escapeHtml(fieldName)}" ${required}></textarea>
106
+ <div class="help-text">Enter one value per line</div>
107
+ </div>
108
+ `;
109
+ }
110
+ else if (attribute.type === 'number' || attribute.type === 'integer') {
111
+ // Number field
112
+ fieldHtml = `
113
+ <div class="form-group">
114
+ <label for="${escapeHtml(fieldName)}" class="${escapeHtml(labelClass)}">${escapeHtml(label)}</label>
115
+ <input type="number" id="${escapeHtml(fieldName)}" name="${escapeHtml(fieldName)}" ${required} />
116
+ </div>
117
+ `;
118
+ }
119
+ else if (attribute.type === 'string') {
120
+ // String field - use input with appropriate type
121
+ const type = fieldName.toLowerCase().includes('password') ||
122
+ fieldName.toLowerCase().includes('pwd')
123
+ ? 'password'
124
+ : fieldName.toLowerCase().includes('mail')
125
+ ? 'email'
126
+ : fieldName.toLowerCase().includes('phone') ||
127
+ fieldName.toLowerCase().includes('telephone')
128
+ ? 'tel'
129
+ : 'text';
130
+ fieldHtml = `
131
+ <div class="form-group">
132
+ <label for="${escapeHtml(fieldName)}" class="${escapeHtml(labelClass)}">${escapeHtml(label)}</label>
133
+ <input type="${escapeHtml(type)}" id="${escapeHtml(fieldName)}" name="${escapeHtml(fieldName)}" ${required} />
134
+ </div>
135
+ `;
136
+ }
137
+ return fieldHtml;
138
+ }
139
+ /**
140
+ * Process form data and convert types based on schema
141
+ */
142
+ function processFormData(formData, schema) {
143
+ const data = {};
144
+ // Collect form data
145
+ for (const [key, value] of formData) {
146
+ if (data[key]) {
147
+ // Multiple values for the same key - convert to array
148
+ if (!Array.isArray(data[key])) {
149
+ data[key] = [data[key]];
150
+ }
151
+ data[key].push(value);
152
+ }
153
+ else {
154
+ data[key] = value;
155
+ }
156
+ }
157
+ // Process special field types based on schema
158
+ for (const [fieldName, attribute] of Object.entries(schema)) {
159
+ if (!data[fieldName])
160
+ continue;
161
+ if (attribute.type === 'array' && typeof data[fieldName] === 'string') {
162
+ // Split by newlines and filter empty lines
163
+ data[fieldName] = data[fieldName]
164
+ .split('\n')
165
+ .map(line => line.trim())
166
+ .filter(line => line.length > 0);
167
+ }
168
+ else if ((attribute.type === 'number' || attribute.type === 'integer') &&
169
+ typeof data[fieldName] === 'string') {
170
+ // Convert to number
171
+ data[fieldName] =
172
+ attribute.type === 'integer'
173
+ ? parseInt(data[fieldName], 10)
174
+ : parseFloat(data[fieldName]);
175
+ }
176
+ }
177
+ // Clean up: remove empty strings, null values, and empty arrays
178
+ const cleanedData = {};
179
+ for (const [key, value] of Object.entries(data)) {
180
+ if (value === '' || value === null || value === undefined) {
181
+ continue;
182
+ }
183
+ if (Array.isArray(value) && value.length === 0) {
184
+ continue;
185
+ }
186
+ cleanedData[key] = value;
187
+ }
188
+ return cleanedData;
189
+ }
190
+ /**
191
+ * Collect values from pointer array fields
192
+ */
193
+ function collectPointerArrayValues(container) {
194
+ const values = {};
195
+ const pointerArrayFields = container.querySelectorAll('.pointer-array-field');
196
+ pointerArrayFields.forEach(field => {
197
+ const fieldName = field.getAttribute('data-field');
198
+ if (!fieldName)
199
+ return;
200
+ const selects = field.querySelectorAll('.pointer-array-select');
201
+ const fieldValues = Array.from(selects)
202
+ .map(select => select.value)
203
+ .filter(val => val); // Remove empty values
204
+ if (fieldValues.length > 0) {
205
+ values[fieldName] = fieldValues;
206
+ }
207
+ });
208
+ return values;
209
+ }
210
+ /**
211
+ * Group schema fields by category
212
+ */
213
+ function groupSchemaFields(schema, categorizer) {
214
+ const groups = new Map();
215
+ for (const [fieldName, attribute] of Object.entries(schema)) {
216
+ if (attribute.fixed)
217
+ continue;
218
+ if (fieldName === 'objectClass')
219
+ continue;
220
+ const category = categorizer
221
+ ? categorizer(fieldName, attribute)
222
+ : attribute.group || 'default';
223
+ if (category === null)
224
+ continue; // Skip this field
225
+ if (!groups.has(category)) {
226
+ groups.set(category, []);
227
+ }
228
+ groups.get(category).push([fieldName, attribute]);
229
+ }
230
+ return groups;
231
+ }
232
+
233
+ export { collectPointerArrayValues, generateFormField, getFieldLabel, groupSchemaFields, processFormData };
234
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","sources":["../../../../../src/browser/shared/utils/form.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Schema utility functions
3
+ * @module browser/shared/utils/schema
4
+ */
5
+ /**
6
+ * Cache for pointer options to avoid repeated API calls
7
+ */
8
+ const pointerOptionsCache = new Map();
9
+ /**
10
+ * Load pointer options from API
11
+ */
12
+ async function loadPointerOptions(branch, apiLoader, useCache = true) {
13
+ if (useCache && pointerOptionsCache.has(branch)) {
14
+ return pointerOptionsCache.get(branch);
15
+ }
16
+ try {
17
+ const options = await apiLoader(branch);
18
+ if (useCache) {
19
+ pointerOptionsCache.set(branch, options);
20
+ }
21
+ return options;
22
+ }
23
+ catch (error) {
24
+ console.error('Failed to load pointer options for branch:', branch, error);
25
+ return [];
26
+ }
27
+ }
28
+ /**
29
+ * Clear pointer options cache
30
+ */
31
+ function clearPointerOptionsCache() {
32
+ pointerOptionsCache.clear();
33
+ }
34
+ /**
35
+ * Replace placeholders in schema branches
36
+ */
37
+ function replacePlaceholders(value, replacements) {
38
+ const replace = (str) => {
39
+ let result = str;
40
+ for (const [key, val] of Object.entries(replacements)) {
41
+ result = result.replace(new RegExp(key, 'g'), val);
42
+ }
43
+ return result;
44
+ };
45
+ if (Array.isArray(value)) {
46
+ return value.map(replace);
47
+ }
48
+ return replace(value);
49
+ }
50
+ /**
51
+ * Replace placeholders in schema attributes
52
+ */
53
+ function replaceSchemaPlaceholders(schema, replacements) {
54
+ const processValue = (value) => {
55
+ if (typeof value === 'string') {
56
+ return replacePlaceholders(value, replacements);
57
+ }
58
+ if (Array.isArray(value)) {
59
+ return value.map(processValue);
60
+ }
61
+ if (value && typeof value === 'object') {
62
+ return processObject(value);
63
+ }
64
+ return value;
65
+ };
66
+ const processObject = (obj) => {
67
+ const result = {};
68
+ for (const [key, value] of Object.entries(obj)) {
69
+ result[key] = processValue(value);
70
+ }
71
+ return result;
72
+ };
73
+ return processObject(schema);
74
+ }
75
+ /**
76
+ * Fetch organization path from API
77
+ */
78
+ async function getOrganizationPath(orgDn, apiBaseUrl) {
79
+ try {
80
+ const response = await fetch(`${apiBaseUrl}/api/v1/ldap/organizations/${encodeURIComponent(orgDn)}`);
81
+ if (!response.ok) {
82
+ console.error('Failed to fetch organization:', response.status);
83
+ return orgDn;
84
+ }
85
+ const org = await response.json();
86
+ // Use twakeDepartmentPath if available (Twake schema)
87
+ if (org.twakeDepartmentPath) {
88
+ const pathValue = Array.isArray(org.twakeDepartmentPath)
89
+ ? org.twakeDepartmentPath[0]
90
+ : org.twakeDepartmentPath;
91
+ return pathValue;
92
+ }
93
+ // Fallback to ou name for non-Twake schemas
94
+ if (org.ou) {
95
+ const ouValue = Array.isArray(org.ou) ? org.ou[0] : org.ou;
96
+ return ouValue;
97
+ }
98
+ // Last resort: use DN
99
+ return orgDn;
100
+ }
101
+ catch (error) {
102
+ console.error('Failed to get organization info:', error);
103
+ return orgDn;
104
+ }
105
+ }
106
+ /**
107
+ * Load schema from URL or object
108
+ */
109
+ async function loadSchema(schemaSource) {
110
+ if (typeof schemaSource === 'string') {
111
+ const response = await fetch(schemaSource);
112
+ if (!response.ok) {
113
+ throw new Error(`Failed to load schema from ${schemaSource}`);
114
+ }
115
+ return (await response.json());
116
+ }
117
+ return schemaSource;
118
+ }
119
+
120
+ export { clearPointerOptionsCache, getOrganizationPath, loadPointerOptions, loadSchema, replacePlaceholders, replaceSchemaPlaceholders };
121
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sources":["../../../../../src/browser/shared/utils/schema.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}