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,589 @@
1
+ # LDAP Groups Plugin
2
+
3
+ The `ldapGroups` plugin provides comprehensive management of LDAP groups and their members, with automatic member validation and cleanup when users are deleted.
4
+
5
+ ## Overview
6
+
7
+ This plugin manages groups stored as `groupOfNames` or similar object classes in a flat LDAP branch. It provides:
8
+
9
+ - Group CRUD operations (Create, Read, Update, Delete)
10
+ - Member management (add/remove members)
11
+ - Automatic member validation (ensures members exist)
12
+ - Automatic cleanup (removes deleted users from all groups)
13
+ - Schema validation support
14
+ - Hook integration for lifecycle events
15
+
16
+ ## Configuration
17
+
18
+ ### CLI Arguments
19
+
20
+ ```bash
21
+ --plugin core/ldap/groups \
22
+ --ldap-group-base "ou=groups,dc=example,dc=com" \
23
+ --ldap-groups-main-attribute cn \
24
+ --group-class top,groupOfNames \
25
+ --group-schema ./static/schemas/twake/groups.json \
26
+ --group-dummy-user "cn=fakeuser" \
27
+ --groups-allow-unexistent-members false
28
+ ```
29
+
30
+ ### Configuration Options
31
+
32
+ | Argument | Environment Variable | Default | Description |
33
+ | ----------------------------------- | ------------------------------- | ------------------------------------ | -------------------------------- |
34
+ | `--ldap-group-base` | `DM_LDAP_GROUP_BASE` | `{ldap_base}` | Base DN for groups branch |
35
+ | `--ldap-groups-main-attribute` | `DM_LDAP_GROUPS_MAIN_ATTRIBUTE` | `cn` | Main attribute (RDN) for groups |
36
+ | `--group-class` / `--group-classes` | `DM_GROUP_CLASSES` | `["top", "groupOfNames"]` | Object classes for groups |
37
+ | `--group-schema` | `DM_GROUP_SCHEMA` | `./static/schemas/twake/groups.json` | Path to JSON schema |
38
+ | `--group-default-attributes` | `DM_GROUP_DEFAULT_ATTRIBUTES` | `{}` | Default attributes (JSON) |
39
+ | `--group-dummy-user` | `DM_GROUP_DUMMY_USER` | `cn=fakeuser` | Dummy member DN for empty groups |
40
+ | `--groups-allow-unexistent-members` | `DM_ALLOW_UNEXISTENT_MEMBERS` | `false` | Allow non-existent members |
41
+
42
+ ### Important Notes
43
+
44
+ - **Empty Groups**: `groupOfNames` requires at least one member. The plugin uses a dummy member (configurable via `--group-dummy-user`) for empty groups.
45
+ - **Member Validation**: By default, the plugin validates that all members exist in LDAP before adding them. Set `--groups-allow-unexistent-members true` to disable validation.
46
+ - **Automatic Cleanup**: When a user is deleted, the plugin automatically removes them from all groups via the `ldapdeleterequest` hook.
47
+
48
+ ## REST API
49
+
50
+ ### List Groups
51
+
52
+ ```http
53
+ GET /api/v1/ldap/groups
54
+ ```
55
+
56
+ **Query Parameters:**
57
+
58
+ - `match` (optional): Filter by group name (supports wildcards and LDAP filters)
59
+ - `attributes` (optional): Comma-separated list of attributes to return
60
+
61
+ **Example:**
62
+
63
+ ```bash
64
+ curl "http://localhost:8081/api/v1/ldap/groups?match=admin*&attributes=cn,member,description"
65
+ ```
66
+
67
+ **Response (200):**
68
+
69
+ ```json
70
+ {
71
+ "admins": {
72
+ "dn": "cn=admins,ou=groups,dc=example,dc=com",
73
+ "cn": "admins",
74
+ "member": [
75
+ "uid=john.doe,ou=users,dc=example,dc=com",
76
+ "uid=jane.smith,ou=users,dc=example,dc=com"
77
+ ],
78
+ "description": "System administrators"
79
+ },
80
+ "admin-backup": {
81
+ "dn": "cn=admin-backup,ou=groups,dc=example,dc=com",
82
+ "cn": "admin-backup",
83
+ "member": ["uid=backup.admin,ou=users,dc=example,dc=com"]
84
+ }
85
+ }
86
+ ```
87
+
88
+ ### Get Group by cn or DN
89
+
90
+ ```http
91
+ GET /api/v1/ldap/groups/{cn}
92
+ ```
93
+
94
+ **Path Parameter:**
95
+
96
+ - `cn`: Group cn value (e.g., `developers`) OR full DN (URL-encoded if DN)
97
+
98
+ **Examples:**
99
+
100
+ ```bash
101
+ # Get by cn
102
+ curl "http://localhost:8081/api/v1/ldap/groups/developers"
103
+
104
+ # Get by full DN (URL-encoded)
105
+ curl "http://localhost:8081/api/v1/ldap/groups/cn%3Ddevelopers%2Cou%3Dgroups%2Cdc%3Dexample%2Cdc%3Dcom"
106
+ ```
107
+
108
+ **Response (200):**
109
+
110
+ ```json
111
+ {
112
+ "dn": "cn=developers,ou=groups,dc=example,dc=com",
113
+ "cn": "developers",
114
+ "description": "Development team",
115
+ "member": [
116
+ "uid=john.doe,ou=users,dc=example,dc=com",
117
+ "uid=jane.smith,ou=users,dc=example,dc=com"
118
+ ]
119
+ }
120
+ ```
121
+
122
+ **Response (404):**
123
+
124
+ ```json
125
+ {
126
+ "error": "Group not found"
127
+ }
128
+ ```
129
+
130
+ ### Create Group
131
+
132
+ ```http
133
+ POST /api/v1/ldap/groups
134
+ ```
135
+
136
+ **Request Body:**
137
+
138
+ ```json
139
+ {
140
+ "cn": "developers",
141
+ "description": "Development team",
142
+ "member": [
143
+ "uid=john.doe,ou=users,dc=example,dc=com",
144
+ "uid=jane.smith,ou=users,dc=example,dc=com"
145
+ ]
146
+ }
147
+ ```
148
+
149
+ **Notes:**
150
+
151
+ - `cn` is required
152
+ - `member` can be a string (single member) or array (multiple members)
153
+ - If no members provided, a dummy member is automatically added
154
+ - Additional attributes can be included based on schema
155
+
156
+ **Response (200):**
157
+
158
+ ```json
159
+ {
160
+ "success": true
161
+ }
162
+ ```
163
+
164
+ ### Modify Group
165
+
166
+ ```http
167
+ PUT /api/v1/ldap/groups/{cn}
168
+ ```
169
+
170
+ **Path Parameter:**
171
+
172
+ - `cn`: Group common name
173
+
174
+ **Request Body:**
175
+
176
+ ```json
177
+ {
178
+ "replace": {
179
+ "description": "Updated development team"
180
+ },
181
+ "add": {
182
+ "businessCategory": "IT"
183
+ },
184
+ "delete": ["ou"]
185
+ }
186
+ ```
187
+
188
+ **Important:**
189
+
190
+ - Cannot modify `cn` attribute directly (use rename endpoint instead)
191
+ - Cannot modify `member` attribute here (use member management endpoints instead)
192
+ - Supports `add`, `replace`, and `delete` operations
193
+
194
+ **Response (200):**
195
+
196
+ ```json
197
+ {
198
+ "success": true
199
+ }
200
+ ```
201
+
202
+ ### Rename Group
203
+
204
+ ```http
205
+ POST /api/v1/ldap/groups/{cn}/rename
206
+ ```
207
+
208
+ **Path Parameter:**
209
+
210
+ - `cn`: Current group common name
211
+
212
+ **Request Body:**
213
+
214
+ ```json
215
+ {
216
+ "newCn": "new-group-name"
217
+ }
218
+ ```
219
+
220
+ **Response (200):**
221
+
222
+ ```json
223
+ {
224
+ "success": true
225
+ }
226
+ ```
227
+
228
+ **Description:**
229
+
230
+ Renames a group by changing its `cn` attribute. This performs an LDAP modifyDN operation to change the RDN of the group entry.
231
+
232
+ ### Move Group
233
+
234
+ ```http
235
+ POST /api/v1/ldap/groups/{cn}/move
236
+ ```
237
+
238
+ **Path Parameter:**
239
+
240
+ - `cn`: Group common name
241
+
242
+ **Request Body:**
243
+
244
+ ```json
245
+ {
246
+ "targetOrgDn": "ou=NewDepartment,ou=organization,dc=example,dc=com"
247
+ }
248
+ ```
249
+
250
+ **Response (200):**
251
+
252
+ ```json
253
+ {
254
+ "success": true
255
+ }
256
+ ```
257
+
258
+ **Description:**
259
+
260
+ Moves a group to a different organization by updating its `twakeDepartmentLink` and `twakeDepartmentPath` attributes.
261
+
262
+ **Authorization:**
263
+
264
+ When using the `authzPerBranch` plugin, moving a group requires:
265
+
266
+ - **Read** permission on the source organization
267
+ - **Write** permission on the destination organization
268
+
269
+ **Requirements:**
270
+
271
+ - Target organization must exist
272
+ - Group cannot be moved to the same organization
273
+ - Requires `twakeDepartmentLink` and `twakeDepartmentPath` attributes in config
274
+
275
+ ### Delete Group
276
+
277
+ ```http
278
+ DELETE /api/v1/ldap/groups/{cn}
279
+ ```
280
+
281
+ **Path Parameter:**
282
+
283
+ - `cn`: Group common name
284
+
285
+ **Response (200):**
286
+
287
+ ```json
288
+ {
289
+ "success": true
290
+ }
291
+ ```
292
+
293
+ ### Add Members
294
+
295
+ ```http
296
+ POST /api/v1/ldap/groups/{cn}/members
297
+ ```
298
+
299
+ **Path Parameter:**
300
+
301
+ - `cn`: Group common name
302
+
303
+ **Request Body:**
304
+
305
+ ```json
306
+ {
307
+ "member": "uid=new.user,ou=users,dc=example,dc=com"
308
+ }
309
+ ```
310
+
311
+ Or multiple members:
312
+
313
+ ```json
314
+ {
315
+ "member": [
316
+ "uid=user1,ou=users,dc=example,dc=com",
317
+ "uid=user2,ou=users,dc=example,dc=com"
318
+ ]
319
+ }
320
+ ```
321
+
322
+ **Validation:**
323
+
324
+ - By default, members must exist in LDAP (configurable)
325
+ - Duplicate members are ignored
326
+ - Member DNs are validated
327
+
328
+ **Response (200):**
329
+
330
+ ```json
331
+ {
332
+ "success": true
333
+ }
334
+ ```
335
+
336
+ ### Remove Member
337
+
338
+ ```http
339
+ DELETE /api/v1/ldap/groups/{cn}/members/{member}
340
+ ```
341
+
342
+ **Path Parameters:**
343
+
344
+ - `cn`: Group common name
345
+ - `member`: Member DN (URL-encoded)
346
+
347
+ **Example:**
348
+
349
+ ```bash
350
+ curl -X DELETE "http://localhost:8081/api/v1/ldap/groups/developers/members/uid%3Djohn.doe%2Cou%3Dusers%2Co%3Dgov%2Cc%3Dmu"
351
+ ```
352
+
353
+ **Notes:**
354
+
355
+ - If removing the last real member, the dummy member is automatically added
356
+ - Member DN must be URL-encoded in the path
357
+
358
+ **Response (200):**
359
+
360
+ ```json
361
+ {
362
+ "success": true
363
+ }
364
+ ```
365
+
366
+ ## Schema Support
367
+
368
+ The plugin supports JSON schema validation for group attributes. Example schema:
369
+
370
+ ```json
371
+ {
372
+ "strict": true,
373
+ "attributes": {
374
+ "objectClass": {
375
+ "type": "array",
376
+ "default": ["top", "groupOfNames"],
377
+ "required": true
378
+ },
379
+ "cn": {
380
+ "type": "string",
381
+ "test": "^[a-zA-Z0-9._-]+$",
382
+ "required": true
383
+ },
384
+ "member": {
385
+ "type": "array",
386
+ "items": { "type": "string" },
387
+ "required": true
388
+ },
389
+ "description": {
390
+ "type": "string",
391
+ "required": false
392
+ }
393
+ }
394
+ }
395
+ ```
396
+
397
+ ## Hooks
398
+
399
+ The plugin emits and listens to lifecycle hooks:
400
+
401
+ ### Emitted Hooks
402
+
403
+ - `ldapgroupaddrequest` - Before creating a group (can modify dn, attributes, members)
404
+ - `ldapgroupadddone` - After group created successfully
405
+ - `ldapgroupmodify` - Before modifying group
406
+ - `ldapgroupmodifydone` - After group modified
407
+ - `ldapgroupdelete` - Before deleting group
408
+ - `ldapgroupdeletedone` - After group deleted
409
+ - `ldapgroupaddmember` - Before adding members
410
+ - `ldapgroupaddmemberdone` - After members added
411
+ - `ldapgroupdeletemember` - Before removing members
412
+ - `ldapgroupdeletememberdone` - After members removed
413
+
414
+ ### Listened Hooks
415
+
416
+ - `ldapdeleterequest` - Automatically removes deleted users from all groups
417
+
418
+ **Example Hook:**
419
+
420
+ ```javascript
421
+ hooks: {
422
+ ldapgroupaddrequest: async ([dn, entry, members, op]) => {
423
+ // Validate or modify before group creation
424
+ console.log('Creating group:', dn);
425
+ console.log('Initial members:', members);
426
+
427
+ // Add automatic attributes
428
+ entry.businessCategory = 'Auto-generated';
429
+
430
+ return [dn, entry, members, op];
431
+ },
432
+
433
+ ldapgroupadddone: async ([dn, op]) => {
434
+ console.log('Group created successfully:', dn);
435
+ }
436
+ }
437
+ ```
438
+
439
+ ## Member Validation
440
+
441
+ The plugin includes sophisticated member validation:
442
+
443
+ ### Default Behavior (Validation Enabled)
444
+
445
+ ```javascript
446
+ // This will succeed if uid=john.doe exists
447
+ await addGroupMembers('developers', 'uid=john.doe,ou=users,dc=example,dc=com');
448
+
449
+ // This will fail if uid=nonexistent doesn't exist
450
+ await addGroupMembers(
451
+ 'developers',
452
+ 'uid=nonexistent,ou=users,dc=example,dc=com'
453
+ );
454
+ // Error: Member does not exist
455
+ ```
456
+
457
+ ### Disable Validation
458
+
459
+ ```bash
460
+ --groups-allow-unexistent-members true
461
+ ```
462
+
463
+ With validation disabled, any DN can be added as a member (useful for external references or cross-domain groups).
464
+
465
+ ## Automatic Cleanup
466
+
467
+ When a user is deleted from LDAP, the plugin automatically:
468
+
469
+ 1. Detects the deletion via `ldapdeleterequest` hook
470
+ 2. Searches all groups for the deleted user
471
+ 3. Removes the user from all groups
472
+ 4. Adds dummy member if group becomes empty
473
+
474
+ This ensures referential integrity without manual intervention.
475
+
476
+ ## Examples
477
+
478
+ ### Example 1: Create Development Team Group
479
+
480
+ ```bash
481
+ curl -X POST http://localhost:8081/api/v1/ldap/groups \
482
+ -H "Content-Type: application/json" \
483
+ -d '{
484
+ "cn": "dev-team",
485
+ "description": "Development Team",
486
+ "businessCategory": "Engineering",
487
+ "member": [
488
+ "uid=alice,ou=users,dc=example,dc=com",
489
+ "uid=bob,ou=users,dc=example,dc=com"
490
+ ]
491
+ }'
492
+ ```
493
+
494
+ ### Example 2: Add Member to Existing Group
495
+
496
+ ```bash
497
+ curl -X POST http://localhost:8081/api/v1/ldap/groups/dev-team/members \
498
+ -H "Content-Type: application/json" \
499
+ -d '{
500
+ "member": "uid=charlie,ou=users,dc=example,dc=com"
501
+ }'
502
+ ```
503
+
504
+ ### Example 3: Update Group Description
505
+
506
+ ```bash
507
+ curl -X PUT http://localhost:8081/api/v1/ldap/groups/dev-team \
508
+ -H "Content-Type: application/json" \
509
+ -d '{
510
+ "replace": {
511
+ "description": "Senior Development Team"
512
+ }
513
+ }'
514
+ ```
515
+
516
+ ### Example 4: Remove Member
517
+
518
+ ```bash
519
+ curl -X DELETE "http://localhost:8081/api/v1/ldap/groups/dev-team/members/uid%3Dalice%2Cou%3Dusers%2Co%3Dgov%2Cc%3Dmu"
520
+ ```
521
+
522
+ ### Example 5: List All Groups
523
+
524
+ ```bash
525
+ curl "http://localhost:8081/api/v1/ldap/groups?attributes=cn,member,description"
526
+ ```
527
+
528
+ ## Integration with Other Plugins
529
+
530
+ ### With Users Plugin
531
+
532
+ When a user is deleted:
533
+
534
+ ```bash
535
+ DELETE /api/v1/ldap/users/john.doe
536
+ ```
537
+
538
+ The groups plugin automatically removes `john.doe` from all groups.
539
+
540
+ ### With Organizations Plugin
541
+
542
+ Groups can reference users from different organizations:
543
+
544
+ ```json
545
+ {
546
+ "cn": "cross-dept-team",
547
+ "member": [
548
+ "uid=user1,ou=dept1,ou=org,dc=example,dc=com",
549
+ "uid=user2,ou=dept2,ou=org,dc=example,dc=com"
550
+ ]
551
+ }
552
+ ```
553
+
554
+ ## Troubleshooting
555
+
556
+ ### Empty Group Error
557
+
558
+ **Problem:** `Object class 'groupOfNames' requires attribute 'member'`
559
+
560
+ **Solution:** The plugin automatically handles this by adding a dummy member. Ensure `--group-dummy-user` is properly configured:
561
+
562
+ ```bash
563
+ --group-dummy-user "cn=placeholder,ou=users,dc=example,dc=com"
564
+ ```
565
+
566
+ ### Member Validation Fails
567
+
568
+ **Problem:** `Member does not exist in LDAP`
569
+
570
+ **Solutions:**
571
+
572
+ 1. Ensure the user exists before adding them to the group
573
+ 2. use `core/ldap/externalUsersInGroups` plugin
574
+ 3. Disable validation: `--groups-allow-unexistent-members true`
575
+
576
+ ### Cannot Modify Members via PUT
577
+
578
+ **Problem:** Attempting to modify `member` attribute via PUT endpoint
579
+
580
+ **Solution:** Use dedicated member management endpoints:
581
+
582
+ - Add: `POST /api/v1/ldap/groups/{cn}/members`
583
+ - Remove: `DELETE /api/v1/ldap/groups/{cn}/members/{member}`
584
+
585
+ ## See Also
586
+
587
+ - [LDAP Flat Plugin](./ldapFlat.md) - For managing flat LDAP entities (users, positions, nomenclature) through schema-driven approach
588
+ - [LDAP Organizations Plugin](./ldapOrganizations.md) - For managing hierarchical organizational structures with validation
589
+ - [Schema Examples](../static/schemas/) - Group schema examples for Twake, Standard, and Active Directory