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,32 @@
1
+ /**
2
+ * LDAP User Editor - Main class
3
+ * @author Xavier Guimard
4
+ */
5
+ import type { EditorOptions, Config, LdapUser } from './types';
6
+ import { UserApiClient } from './api/UserApiClient';
7
+ export declare class LdapUserEditor {
8
+ private options;
9
+ private api;
10
+ private container;
11
+ private userTree;
12
+ private userEditor;
13
+ private userList;
14
+ private currentUserDn;
15
+ private currentOrgDn;
16
+ private config;
17
+ constructor(options: EditorOptions);
18
+ init(): Promise<void>;
19
+ private render;
20
+ private initComponents;
21
+ private onOrganizationSelected;
22
+ private onUserSelected;
23
+ private handleError;
24
+ refresh(): Promise<void>;
25
+ destroy(): void;
26
+ createUser(userData: Partial<LdapUser>): Promise<LdapUser>;
27
+ deleteUser(dn: string): Promise<void>;
28
+ getConfig(): Config | null;
29
+ getApi(): UserApiClient;
30
+ getCurrentOrgDn(): string | null;
31
+ getCurrentUserDn(): string | null;
32
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * LDAP User Editor - API Client
3
+ */
4
+ import type { Config, LdapUser, PointerOption, Schema } from '../types';
5
+ import { CacheManager } from '../cache/CacheManager';
6
+ export declare class UserApiClient {
7
+ private baseUrl;
8
+ private cache;
9
+ constructor(baseUrl?: string, cacheOptions?: {
10
+ ttl?: number;
11
+ maxEntries?: number;
12
+ });
13
+ private getApiBase;
14
+ private getFirstValue;
15
+ /**
16
+ * Fetch with cache support for GET requests
17
+ */
18
+ private cachedFetch;
19
+ getConfig(): Promise<Config>;
20
+ getSchema(schemaUrl: string): Promise<Schema>;
21
+ getUsers(search?: string): Promise<LdapUser[]>;
22
+ getUser(dn: string): Promise<LdapUser>;
23
+ updateUser(dn: string, data: Partial<LdapUser>): Promise<LdapUser>;
24
+ createUser(data: Partial<LdapUser>): Promise<LdapUser>;
25
+ deleteUser(dn: string): Promise<void>;
26
+ moveUser(dn: string, targetOrgDn: string): Promise<{
27
+ success: boolean;
28
+ newDn?: string;
29
+ }>;
30
+ getPointerOptions(branch: string): Promise<PointerOption[]>;
31
+ /**
32
+ * Cache management methods
33
+ */
34
+ /**
35
+ * Clear all cache
36
+ */
37
+ clearCache(): void;
38
+ /**
39
+ * Invalidate cache for a specific URL pattern
40
+ */
41
+ invalidateCache(pattern: string): void;
42
+ /**
43
+ * Get cache statistics
44
+ */
45
+ getCacheStats(): {
46
+ size: number;
47
+ maxSize: number;
48
+ ttl: number;
49
+ keys: string[];
50
+ };
51
+ /**
52
+ * Get cache instance (for advanced usage)
53
+ */
54
+ getCache(): CacheManager;
55
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Simple in-memory cache manager with LRU eviction
3
+ * Prevents excessive API calls when navigating the organization tree
4
+ */
5
+ export interface CacheOptions {
6
+ /**
7
+ * Time to live in milliseconds (default: 5 minutes)
8
+ */
9
+ ttl?: number;
10
+ /**
11
+ * Maximum number of entries (default: 200)
12
+ */
13
+ maxEntries?: number;
14
+ }
15
+ export declare class CacheManager {
16
+ private cache;
17
+ private ttl;
18
+ private maxEntries;
19
+ constructor(options?: CacheOptions);
20
+ /**
21
+ * Get an item from cache
22
+ * Returns null if not found or expired
23
+ */
24
+ get<T>(key: string): T | null;
25
+ /**
26
+ * Set an item in cache
27
+ * Evicts least recently used items if cache is full
28
+ */
29
+ set<T>(key: string, data: T): void;
30
+ /**
31
+ * Check if key exists and is not expired
32
+ */
33
+ has(key: string): boolean;
34
+ /**
35
+ * Invalidate a specific key
36
+ */
37
+ invalidate(key: string): void;
38
+ /**
39
+ * Invalidate all keys matching a pattern
40
+ * Pattern can contain wildcards (*)
41
+ */
42
+ invalidatePattern(pattern: string): void;
43
+ /**
44
+ * Clear all cache
45
+ */
46
+ clear(): void;
47
+ /**
48
+ * Get cache statistics
49
+ */
50
+ getStats(): {
51
+ size: number;
52
+ maxSize: number;
53
+ ttl: number;
54
+ keys: string[];
55
+ };
56
+ /**
57
+ * Evict least recently used entry
58
+ */
59
+ private evictLRU;
60
+ /**
61
+ * Clean expired entries
62
+ * Should be called periodically
63
+ */
64
+ cleanExpired(): number;
65
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * LDAP User Editor - Move User Modal Component
3
+ * Modal dialog for selecting target organization when moving a user
4
+ */
5
+ import type { UserApiClient } from '../api/UserApiClient';
6
+ export declare class MoveUserModal {
7
+ private modal;
8
+ private api;
9
+ private currentOrgDn;
10
+ private selectedOrgDn;
11
+ private onMove;
12
+ private expandedNodes;
13
+ private rootDn;
14
+ constructor(api: UserApiClient, currentOrgDn: string, onMove: (targetOrgDn: string) => void);
15
+ /**
16
+ * Escape HTML special characters to prevent XSS attacks
17
+ */
18
+ private static escapeHtml;
19
+ show(): Promise<void>;
20
+ private attachHandlers;
21
+ private loadOrganizationTree;
22
+ private renderTree;
23
+ private renderNode;
24
+ private attachTreeHandlers;
25
+ private selectOrganization;
26
+ private handleMove;
27
+ close(): void;
28
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * LDAP User Editor - Pointer Field Component
3
+ */
4
+ import type { SchemaAttribute } from '../types';
5
+ import type { UserApiClient } from '../api/UserApiClient';
6
+ export declare class PointerField {
7
+ private api;
8
+ private attribute;
9
+ private fieldName;
10
+ private value;
11
+ private onChange;
12
+ private options;
13
+ constructor(api: UserApiClient, fieldName: string, attribute: SchemaAttribute, value: string | string[], onChange: (value: string | string[]) => void);
14
+ init(): Promise<void>;
15
+ private loadOptions;
16
+ render(): string;
17
+ private renderSingle;
18
+ private renderArray;
19
+ attachHandlers(container: HTMLElement): void;
20
+ private attachSingleHandlers;
21
+ private attachArrayHandlers;
22
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * LDAP User Editor - User Editor Component
3
+ */
4
+ import type { UserApiClient } from '../api/UserApiClient';
5
+ export declare class UserEditor {
6
+ private container;
7
+ private api;
8
+ private userDn;
9
+ private user;
10
+ private schema;
11
+ private formData;
12
+ private pointerFields;
13
+ private onSaved?;
14
+ private onDeleted?;
15
+ private ldapBase;
16
+ /**
17
+ * Escape HTML special characters to prevent XSS attacks
18
+ * Reference: https://cheatsheetseries.owasp.org/cheatsheets/DOM_based_XSS_Prevention_Cheat_Sheet.html
19
+ */
20
+ private static escapeHtml;
21
+ constructor(container: HTMLElement, api: UserApiClient, userDn: string, onSaved?: () => void, onDeleted?: () => void);
22
+ init(): Promise<void>;
23
+ private showLoading;
24
+ private showError;
25
+ private loadUserAndSchema;
26
+ private replacePlaceholders;
27
+ private getFirstValue;
28
+ private getFieldByRole;
29
+ private render;
30
+ private renderFormSections;
31
+ private renderField;
32
+ private renderIdentifierField;
33
+ private renderStringField;
34
+ private renderNumberField;
35
+ private renderArrayField;
36
+ private initPointerFields;
37
+ private rerenderPointerField;
38
+ private attachHandlers;
39
+ private attachArrayFieldHandlers;
40
+ private rerenderArrayField;
41
+ private handleSubmit;
42
+ private handleMove;
43
+ private performMove;
44
+ private handleDelete;
45
+ refresh(): Promise<void>;
46
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * LDAP User Editor - User List Component
3
+ * Shows users in a selected organization
4
+ */
5
+ import type { UserApiClient } from '../api/UserApiClient';
6
+ export declare class UserList {
7
+ private container;
8
+ private api;
9
+ private users;
10
+ private orgDn;
11
+ private searchQuery;
12
+ private onSelectUser;
13
+ private schema;
14
+ private config;
15
+ constructor(container: HTMLElement, api: UserApiClient, orgDn: string, onSelectUser: (dn: string) => void);
16
+ init(): Promise<void>;
17
+ private render;
18
+ private loadUsers;
19
+ private getFirstValue;
20
+ private getFieldNameByRole;
21
+ private getFieldValueByRole;
22
+ private renderUserList;
23
+ refresh(): Promise<void>;
24
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * LDAP User Editor - Organization Tree Component
3
+ * Shows only LDAP organization tree (filters out users/groups)
4
+ */
5
+ export declare class UserTree {
6
+ private container;
7
+ private baseUrl;
8
+ private onSelectOrg;
9
+ private expandedNodes;
10
+ private selectedDn;
11
+ private rootDn;
12
+ private cache;
13
+ constructor(container: HTMLElement, baseUrl: string, onSelectOrg: (dn: string) => void);
14
+ /**
15
+ * Fetch with cache support
16
+ */
17
+ private cachedFetch;
18
+ init(): Promise<void>;
19
+ private renderTree;
20
+ private renderNode;
21
+ private attachEventListeners;
22
+ refresh(): Promise<void>;
23
+ destroy(): void;
24
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * LDAP User Editor - Browser library
3
+ * @author Xavier Guimard
4
+ */
5
+ import './styles.css';
6
+ export { LdapUserEditor } from './LdapUserEditor';
7
+ export type { EditorOptions, LdapUser, Schema, SchemaAttribute, PointerOption, Config, } from './types';
@@ -0,0 +1,67 @@
1
+ /**
2
+ * LDAP User Editor - Type definitions
3
+ */
4
+ export interface EditorOptions {
5
+ containerId: string;
6
+ apiBaseUrl?: string;
7
+ onUserSaved?: (userDn: string) => void;
8
+ onError?: (error: Error) => void;
9
+ }
10
+ export interface LdapUser {
11
+ dn: string;
12
+ [key: string]: unknown;
13
+ }
14
+ export interface SchemaAttribute {
15
+ type: string;
16
+ required?: boolean;
17
+ fixed?: boolean;
18
+ role?: string;
19
+ test?: string;
20
+ branch?: string[];
21
+ items?: SchemaAttribute;
22
+ default?: unknown;
23
+ ui?: 'select' | 'search';
24
+ group?: string;
25
+ }
26
+ export interface Schema {
27
+ entity: {
28
+ name: string;
29
+ mainAttribute: string;
30
+ objectClass: string[];
31
+ singularName: string;
32
+ pluralName: string;
33
+ base: string;
34
+ };
35
+ strict: boolean;
36
+ attributes: Record<string, SchemaAttribute>;
37
+ }
38
+ export interface PointerOption {
39
+ dn: string;
40
+ label: string;
41
+ }
42
+ export interface FlatResourceConfig {
43
+ name: string;
44
+ singularName: string;
45
+ pluralName: string;
46
+ mainAttribute: string;
47
+ objectClass: string[];
48
+ base: string;
49
+ schema?: Schema;
50
+ schemaUrl?: string;
51
+ endpoints: {
52
+ list: string;
53
+ get: string;
54
+ create: string;
55
+ update: string;
56
+ delete: string;
57
+ };
58
+ }
59
+ export interface Config {
60
+ apiPrefix: string;
61
+ ldapBase: string;
62
+ features?: {
63
+ ldapFlatGeneric?: {
64
+ flatResources?: FlatResourceConfig[];
65
+ };
66
+ };
67
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Reusable Modal component
3
+ * @module browser/shared/components/Modal
4
+ */
5
+ export interface ModalOptions {
6
+ id: string;
7
+ title: string;
8
+ onClose?: () => void;
9
+ }
10
+ export declare class Modal {
11
+ private overlay;
12
+ private options;
13
+ constructor(options: ModalOptions);
14
+ private attachEventListeners;
15
+ open(): void;
16
+ close(): void;
17
+ isOpen(): boolean;
18
+ getFormElement(): HTMLFormElement | null;
19
+ resetForm(): void;
20
+ setContent(html: string): void;
21
+ setTitle(title: string): void;
22
+ /**
23
+ * Create modal HTML structure
24
+ */
25
+ static createModalHTML(options: {
26
+ id: string;
27
+ title: string;
28
+ formId?: string;
29
+ submitLabel?: string;
30
+ }): string;
31
+ /**
32
+ * Create and inject modal into DOM
33
+ */
34
+ static create(options: ModalOptions & {
35
+ formId?: string;
36
+ submitLabel?: string;
37
+ }): Modal;
38
+ }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Status message component for displaying notifications
3
+ * @module browser/shared/components/StatusMessage
4
+ */
5
+ export type StatusType = 'error' | 'success' | 'info' | 'warning';
6
+ export interface StatusMessageOptions {
7
+ containerId: string;
8
+ duration?: number;
9
+ dismissible?: boolean;
10
+ }
11
+ export declare class StatusMessage {
12
+ private container;
13
+ private options;
14
+ private timeoutId;
15
+ constructor(options: StatusMessageOptions);
16
+ /**
17
+ * Show a status message
18
+ */
19
+ show(message: string, type?: StatusType): void;
20
+ /**
21
+ * Show error message
22
+ */
23
+ error(message: string): void;
24
+ /**
25
+ * Show success message
26
+ */
27
+ success(message: string): void;
28
+ /**
29
+ * Show info message
30
+ */
31
+ info(message: string): void;
32
+ /**
33
+ * Show warning message
34
+ */
35
+ warning(message: string): void;
36
+ /**
37
+ * Hide the status message
38
+ */
39
+ hide(): void;
40
+ /**
41
+ * Get the container element
42
+ */
43
+ getContainer(): HTMLElement | null;
44
+ }
45
+ /**
46
+ * Simple functional API for showing status messages
47
+ */
48
+ export declare function showStatus(containerId: string, message: string, type?: StatusType, duration?: number): void;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Main export file for shared browser utilities and components
3
+ * @module browser/shared
4
+ */
5
+ export * from './utils/dom';
6
+ export * from './utils/form';
7
+ export * from './utils/schema';
8
+ export { Modal, type ModalOptions } from './components/Modal';
9
+ export { StatusMessage, showStatus, type StatusMessageOptions, } from './components/StatusMessage';
10
+ export * from './types';
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Shared TypeScript types for browser components
3
+ * @module browser/shared/types
4
+ */
5
+ export interface EditorConfig {
6
+ ldapBase?: string;
7
+ features?: {
8
+ flatResources?: ResourceConfig[];
9
+ };
10
+ [key: string]: unknown;
11
+ }
12
+ export interface ResourceConfig {
13
+ name: string;
14
+ pluralName?: string;
15
+ schemaUrl?: string;
16
+ schema?: SchemaDefinition;
17
+ base?: string;
18
+ }
19
+ export interface SchemaDefinition {
20
+ entity: {
21
+ objectClass?: string[];
22
+ base?: string;
23
+ };
24
+ attributes: Record<string, SchemaAttribute>;
25
+ }
26
+ export interface SchemaAttribute {
27
+ type: 'string' | 'number' | 'integer' | 'array' | 'pointer';
28
+ required?: boolean;
29
+ fixed?: boolean;
30
+ default?: unknown;
31
+ branch?: string[];
32
+ items?: {
33
+ type: string;
34
+ branch?: string[];
35
+ };
36
+ group?: string;
37
+ }
38
+ export interface PointerOption {
39
+ dn: string;
40
+ label: string;
41
+ }
42
+ export interface EditorAPI {
43
+ getPointerOptions(branch: string): Promise<PointerOption[]>;
44
+ createEntry(dn: string, data: Record<string, unknown>): Promise<void>;
45
+ deleteEntry(dn: string): Promise<void>;
46
+ updateEntry(dn: string, data: Record<string, unknown>): Promise<void>;
47
+ }
48
+ export interface BaseEditor {
49
+ getConfig(): EditorConfig;
50
+ getApi(): EditorAPI;
51
+ getCurrentOrgDn(): string | null;
52
+ getCurrentUserDn?(): string | null;
53
+ init(): Promise<void>;
54
+ createUser?(data: Record<string, unknown>): Promise<void>;
55
+ deleteUser?(dn: string): Promise<void>;
56
+ }
57
+ export type StatusType = 'error' | 'success' | 'info' | 'warning';
58
+ export interface Theme {
59
+ name: string;
60
+ primaryColor: string;
61
+ primaryColorDark: string;
62
+ gradientStart: string;
63
+ gradientEnd: string;
64
+ }
65
+ export declare const THEMES: Record<string, Theme>;
@@ -0,0 +1,33 @@
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
+ export declare function escapeHtml(text: string | null | undefined): string;
10
+ /**
11
+ * Convert camelCase or snake_case to Title Case
12
+ */
13
+ export declare function toTitleCase(text: string): string;
14
+ /**
15
+ * Create an HTML element with attributes and children
16
+ */
17
+ export declare function createElement(tag: string, attributes?: Record<string, string>, children?: (string | HTMLElement)[]): HTMLElement;
18
+ /**
19
+ * Set innerHTML safely (assumes content has been properly escaped)
20
+ */
21
+ export declare function setInnerHTML(element: HTMLElement, html: string): void;
22
+ /**
23
+ * Get element by ID with type safety
24
+ */
25
+ export declare function getElementByIdSafe<T extends HTMLElement = HTMLElement>(id: string): T | null;
26
+ /**
27
+ * Query selector with type safety
28
+ */
29
+ export declare function querySelectorSafe<T extends HTMLElement = HTMLElement>(selector: string, parent?: Document | HTMLElement): T | null;
30
+ /**
31
+ * Query selector all with type safety
32
+ */
33
+ export declare function querySelectorAllSafe<T extends HTMLElement = HTMLElement>(selector: string, parent?: Document | HTMLElement): NodeListOf<T>;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Form utility functions
3
+ * @module browser/shared/utils/form
4
+ */
5
+ import type { SchemaAttribute, PointerOption } from '../types';
6
+ /**
7
+ * Get user-friendly field label from field name
8
+ */
9
+ export declare function getFieldLabel(fieldName: string, attribute?: SchemaAttribute, customLabels?: Record<string, string>): string;
10
+ /**
11
+ * Generate HTML for a form field based on schema attribute
12
+ */
13
+ export declare function generateFormField(fieldName: string, attribute: SchemaAttribute, options?: {
14
+ customLabels?: Record<string, string>;
15
+ pointerOptionsLoader?: (branch: string) => Promise<PointerOption[]>;
16
+ }): Promise<string>;
17
+ /**
18
+ * Process form data and convert types based on schema
19
+ */
20
+ export declare function processFormData(formData: FormData, schema: Record<string, SchemaAttribute>): Record<string, unknown>;
21
+ /**
22
+ * Collect values from pointer array fields
23
+ */
24
+ export declare function collectPointerArrayValues(container: HTMLElement): Record<string, string[]>;
25
+ /**
26
+ * Group schema fields by category
27
+ */
28
+ export declare function groupSchemaFields(schema: Record<string, SchemaAttribute>, categorizer?: (fieldName: string, attribute: SchemaAttribute) => string | null): Map<string, [string, SchemaAttribute][]>;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Schema utility functions
3
+ * @module browser/shared/utils/schema
4
+ */
5
+ import type { PointerOption } from '../types';
6
+ /**
7
+ * Load pointer options from API
8
+ */
9
+ export declare function loadPointerOptions(branch: string, apiLoader: (branch: string) => Promise<PointerOption[]>, useCache?: boolean): Promise<PointerOption[]>;
10
+ /**
11
+ * Clear pointer options cache
12
+ */
13
+ export declare function clearPointerOptionsCache(): void;
14
+ /**
15
+ * Replace placeholders in schema branches
16
+ */
17
+ export declare function replacePlaceholders(value: string | string[], replacements: Record<string, string>): string | string[];
18
+ /**
19
+ * Replace placeholders in schema attributes
20
+ */
21
+ export declare function replaceSchemaPlaceholders<T extends Record<string, unknown>>(schema: T, replacements: Record<string, string>): T;
22
+ /**
23
+ * Fetch organization path from API
24
+ */
25
+ export declare function getOrganizationPath(orgDn: string, apiBaseUrl: string): Promise<string>;
26
+ /**
27
+ * Load schema from URL or object
28
+ */
29
+ export declare function loadSchema<T = unknown>(schemaSource: string | T): Promise<T>;