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,325 @@
1
+ # LDAP External Users in Groups Plugin
2
+
3
+ The `externalUsersInGroups` plugin automatically creates external user entries on-the-fly when they are added to groups. This is particularly useful for mailing lists that include external contacts.
4
+
5
+ ## Overview
6
+
7
+ This plugin intercepts group member validation and automatically creates missing user entries in a dedicated external branch. This allows you to:
8
+
9
+ - Add external email addresses to groups/mailing lists without pre-creating users
10
+ - Keep external contacts separate from internal users
11
+ - Prevent creation of external users with managed domains
12
+ - Automatically manage external user lifecycle
13
+
14
+ ## Configuration
15
+
16
+ ### CLI Arguments
17
+
18
+ ```bash
19
+ --plugin core/ldap/externalUsersInGroups \
20
+ --external-members-branch "ou=contacts,dc=example,dc=com" \
21
+ --external-branch-class top,inetOrgPerson \
22
+ --mail-domain example.com,company.org
23
+ ```
24
+
25
+ ### Configuration Options
26
+
27
+ | Argument | Environment Variable | Default | Description |
28
+ | ------------------------------------------------------- | ---------------------------- | ------------------------------- | -------------------------------------------------------- |
29
+ | `--external-members-branch` | `DM_EXTERNAL_MEMBERS_BRANCH` | `ou=contacts,dc=example,dc=com` | Branch for external user entries |
30
+ | `--external-branch-class` / `--external-branch-classes` | `DM_EXTERNAL_BRANCH_CLASSES` | `["top", "inetOrgPerson"]` | Object classes for external users |
31
+ | `--mail-domain` / `--mail-domains` | `DM_MAIL_DOMAIN` | `[]` | Managed mail domains (cannot be used for external users) |
32
+
33
+ ### Important Notes
34
+
35
+ - **Dependencies**: This plugin requires the `core/ldap/groups` plugin
36
+ - **DN Format**: External members are in the format `mail={email},{external_members_branch}`
37
+ - **Domain Protection**: External users cannot be created if their mail are in managed domains (configured via `--mail-domain`)
38
+ - **Automatic Creation**: Users are created automatically when added to a group if they don't exist
39
+
40
+ ## How It Works
41
+
42
+ ### Member Validation Hook
43
+
44
+ The plugin hooks into the `ldapgroupvalidatemembers` event:
45
+
46
+ 1. **Check DN Format**: Validates member DN matches `mail={email},{external_members_branch}`
47
+ 2. **Search Existing**: Checks if the user already exists in LDAP
48
+ 3. **Domain Validation**: Ensures email domain is not in managed domains list
49
+ 4. **Auto-Create**: If user doesn't exist, creates it with minimal attributes
50
+ 5. **Custom Hooks**: Allows modification via `externaluserentry` and `externaluseradded` hooks
51
+
52
+ ### Created Entry Structure
53
+
54
+ When an external user is created, the following attributes are set:
55
+
56
+ ```javascript
57
+ {
58
+ objectClass: ["top", "inetOrgPerson"], // From config
59
+ mail: "external@example.org",
60
+ cn: "external@example.org", // Using ldap_groups_main_attribute
61
+ sn: "external@example.org"
62
+ }
63
+ ```
64
+
65
+ ## Usage Examples
66
+
67
+ ### Example 1: Add External User to Mailing List
68
+
69
+ ```bash
70
+ curl -X POST http://localhost:8081/api/v1/ldap/groups \
71
+ -H "Content-Type: application/json" \
72
+ -d '{
73
+ "cn": "newsletter",
74
+ "description": "Company Newsletter",
75
+ "member": [
76
+ "uid=john.doe,ou=users,dc=example,dc=com",
77
+ "mail=external@partner.com,ou=contacts,dc=example,dc=com"
78
+ ]
79
+ }'
80
+ ```
81
+
82
+ **What happens:**
83
+
84
+ 1. Group "newsletter" is created
85
+ 2. Internal user `john.doe` is validated (must exist)
86
+ 3. External user `external@partner.com` is checked:
87
+ - Not found in LDAP
88
+ - Domain `partner.com` is not in managed domains
89
+ - User entry is automatically created in `ou=contacts,dc=example,dc=com`
90
+ 4. Both members are added to the group
91
+
92
+ ### Example 2: Add Multiple External Members
93
+
94
+ ```bash
95
+ curl -X POST http://localhost:8081/api/v1/ldap/groups/newsletter/members \
96
+ -H "Content-Type: application/json" \
97
+ -d '{
98
+ "member": [
99
+ "mail=contact1@external.org,ou=contacts,dc=example,dc=com",
100
+ "mail=contact2@external.org,ou=contacts,dc=example,dc=com"
101
+ ]
102
+ }'
103
+ ```
104
+
105
+ Both external users will be created automatically if they don't exist.
106
+
107
+ ### Example 3: Domain Protection
108
+
109
+ ```bash
110
+ # Assuming --mail-domain example.com,company.org
111
+
112
+ curl -X POST http://localhost:8081/api/v1/ldap/groups/newsletter/members \
113
+ -H "Content-Type: application/json" \
114
+ -d '{
115
+ "member": "mail=someone@example.com,ou=contacts,dc=example,dc=com"
116
+ }'
117
+ ```
118
+
119
+ **Result:** Error - `Cannot create external user with managed domain: someone@example.com`
120
+
121
+ This prevents accidentally creating external entries for internal users.
122
+
123
+ ## Hooks
124
+
125
+ The plugin emits custom hooks for integration:
126
+
127
+ ### externaluserentry
128
+
129
+ Called before creating an external user entry. Allows modification of DN and attributes.
130
+
131
+ ```javascript
132
+ hooks: {
133
+ externaluserentry: async ([dn, entry]) => {
134
+ // Add custom attributes
135
+ entry.displayName = entry.mail;
136
+ entry.description = 'External contact';
137
+
138
+ // Modify DN if needed
139
+ const newDn = dn; // or modify
140
+
141
+ return [newDn, entry];
142
+ };
143
+ }
144
+ ```
145
+
146
+ ### externaluseradded
147
+
148
+ Called after an external user is successfully created.
149
+
150
+ ```javascript
151
+ hooks: {
152
+ externaluseradded: async (dn, entry) => {
153
+ console.log('External user created:', dn);
154
+ console.log('Attributes:', entry);
155
+
156
+ // Send notification, update external system, etc.
157
+ };
158
+ }
159
+ ```
160
+
161
+ ## Integration with Groups Plugin
162
+
163
+ The plugin works seamlessly with the groups plugin:
164
+
165
+ ### Normal Group Operations
166
+
167
+ ```bash
168
+ # Create group with mix of internal and external users
169
+ POST /api/v1/ldap/groups
170
+ {
171
+ "cn": "project-team",
172
+ "member": [
173
+ "uid=internal1,ou=users,dc=example,dc=com",
174
+ "mail=external@partner.com,ou=contacts,dc=example,dc=com"
175
+ ]
176
+ }
177
+
178
+ # Add external member to existing group
179
+ POST /api/v1/ldap/groups/project-team/members
180
+ {
181
+ "member": "mail=another@partner.com,ou=contacts,dc=example,dc=com"
182
+ }
183
+ ```
184
+
185
+ ### Member Cleanup
186
+
187
+ When an external user is deleted, the groups plugin automatically removes them from all groups (via the `ldapdeleterequest` hook).
188
+
189
+ ## Advanced Configuration
190
+
191
+ ### Custom Object Classes
192
+
193
+ Use different object classes for external users:
194
+
195
+ ```bash
196
+ --external-branch-class top,person,organizationalPerson,inetOrgPerson
197
+ ```
198
+
199
+ ### Multiple Managed Domains
200
+
201
+ Protect multiple domains from external user creation:
202
+
203
+ ```bash
204
+ --mail-domain example.com,company.org,subsidiary.net
205
+ ```
206
+
207
+ ### Custom Attributes via Hooks
208
+
209
+ Add organization-specific attributes to external users:
210
+
211
+ ```javascript
212
+ // In your plugin configuration
213
+ hooks: {
214
+ externaluserentry: async ([dn, entry]) => {
215
+ entry.o = 'External Partners';
216
+ entry.userType = 'external';
217
+ entry.employeeType = 'contact';
218
+ return [dn, entry];
219
+ };
220
+ }
221
+ ```
222
+
223
+ ## Troubleshooting
224
+
225
+ ### External User Not Created
226
+
227
+ **Problem:** Member addition fails but external user is not created
228
+
229
+ **Solutions:**
230
+
231
+ 1. Verify DN format: `mail={email},{external_members_branch}`
232
+ 2. Check external branch exists in LDAP
233
+ 3. Ensure plugin is registered after groups plugin
234
+ 4. Check LDAP permissions for creating entries in external branch
235
+
236
+ ### Managed Domain Error
237
+
238
+ **Problem:** `Cannot create external user with managed domain: user@example.com`
239
+
240
+ **Solutions:**
241
+
242
+ 1. Use the correct branch for internal users: `ou=users,dc=example,dc=com`
243
+ 2. Remove domain from `--mail-domain` if it should allow external users
244
+ 3. This is expected behavior for internal domains - create user in users branch instead
245
+
246
+ ### Malformed Member DN
247
+
248
+ **Problem:** `Malformed member mail=user,ou=contacts,dc=example,dc=com`
249
+
250
+ **Solution:** Use correct format with email address:
251
+
252
+ ```
253
+ mail=user@domain.com,ou=contacts,dc=example,dc=com
254
+ ```
255
+
256
+ ### Missing Attributes
257
+
258
+ **Problem:** External users are created but lack required attributes
259
+
260
+ **Solution:** Use `externaluserentry` hook to add custom attributes:
261
+
262
+ ```javascript
263
+ hooks: {
264
+ externaluserentry: async ([dn, entry]) => {
265
+ // Extract name from email
266
+ const [localPart] = entry.mail.split('@');
267
+ entry.givenName = localPart;
268
+ entry.displayName = localPart;
269
+
270
+ return [dn, entry];
271
+ };
272
+ }
273
+ ```
274
+
275
+ ## Use Cases
276
+
277
+ ### Mailing Lists
278
+
279
+ Create mailing lists that mix internal employees and external partners:
280
+
281
+ ```bash
282
+ curl -X POST http://localhost:8081/api/v1/ldap/groups \
283
+ -d '{
284
+ "cn": "partners-list",
285
+ "description": "Partner Communications",
286
+ "member": [
287
+ "uid=employee1,ou=users,dc=example,dc=com",
288
+ "mail=partner1@acme.com,ou=contacts,dc=example,dc=com",
289
+ "mail=partner2@vendor.org,ou=contacts,dc=example,dc=com"
290
+ ]
291
+ }'
292
+ ```
293
+
294
+ ### Project Collaboration
295
+
296
+ Add external consultants to project groups:
297
+
298
+ ```bash
299
+ curl -X POST http://localhost:8081/api/v1/ldap/groups/project-alpha/members \
300
+ -d '{
301
+ "member": [
302
+ "mail=consultant@consulting.com,ou=contacts,dc=example,dc=com"
303
+ ]
304
+ }'
305
+ ```
306
+
307
+ ### Newsletter Management
308
+
309
+ Manage newsletter subscriptions with automatic contact creation:
310
+
311
+ ```bash
312
+ # Add new subscriber (auto-creates contact)
313
+ curl -X POST http://localhost:8081/api/v1/ldap/groups/newsletter/members \
314
+ -d '{"member": "mail=subscriber@gmail.com,ou=contacts,dc=example,dc=com"}'
315
+
316
+ # Unsubscribe (removes from group)
317
+ curl -X DELETE \
318
+ "http://localhost:8081/api/v1/ldap/groups/newsletter/members/mail%3Dsubscriber%40gmail.com%2Cou%3Dcontacts%2Cdc%3Dexample%2Cdc%3Dcom"
319
+ ```
320
+
321
+ ## See Also
322
+
323
+ - [LDAP Groups Plugin](./ldapGroups.md) - Core groups management (required dependency)
324
+ - [LDAP Flat Plugin](./ldapFlat.md) - For managing internal users
325
+ - [Schema Examples](../static/schemas/) - Schema examples for groups and users