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,444 @@
1
+ # LDAP Flat Generic Plugin
2
+
3
+ Generic plugin to manage flat LDAP entities using JSON schema files. Automatically creates API endpoints based on schema metadata.
4
+
5
+ ## Overview
6
+
7
+ The `ldapFlatGeneric` plugin provides a schema-driven approach to managing LDAP flat entities (users, positions, or any custom entity type). Instead of writing custom plugins, you define entity schemas in JSON files, and the plugin automatically generates:
8
+
9
+ - REST API endpoints (GET, POST, PUT, DELETE)
10
+ - Schema validation
11
+ - LDAP CRUD operations
12
+ - Search functionality
13
+ - Hooks for customization
14
+
15
+ ## Configuration
16
+
17
+ ```bash
18
+ --plugin core/ldap/flatGeneric \
19
+ --ldap-flat-schema ./static/schemas/twake/users.json \
20
+ --ldap-flat-schema ./static/schemas/twake/positions.json
21
+ ```
22
+
23
+ **Environment Variable:**
24
+
25
+ ```bash
26
+ DM_LDAP_FLAT_SCHEMA="./static/schemas/twake/users.json,./static/schemas/twake/positions.json"
27
+ ```
28
+
29
+ ## Schema Format
30
+
31
+ Each schema file must include an `entity` metadata section and attribute definitions.
32
+
33
+ ### Basic Schema Structure
34
+
35
+ ```json
36
+ {
37
+ "entity": {
38
+ "name": "twakeUser",
39
+ "mainAttribute": "uid",
40
+ "objectClass": ["top", "twakeAccount", "twakeWhitePages"],
41
+ "singularName": "user",
42
+ "pluralName": "users",
43
+ "base": "ou=users,{ldap_base}",
44
+ "defaultAttributes": {}
45
+ },
46
+ "strict": true,
47
+ "attributes": {
48
+ "objectClass": {
49
+ "type": "array",
50
+ "items": { "type": "string" },
51
+ "default": ["top", "twakeAccount"],
52
+ "required": true,
53
+ "fixed": true
54
+ },
55
+ "uid": {
56
+ "type": "string",
57
+ "test": "^[a-zA-Z0-9._-]{1,255}$",
58
+ "required": true
59
+ },
60
+ "cn": {
61
+ "type": "string",
62
+ "required": true
63
+ },
64
+ "mail": {
65
+ "type": "string",
66
+ "test": "^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$",
67
+ "required": false
68
+ }
69
+ }
70
+ }
71
+ ```
72
+
73
+ ### Entity Metadata
74
+
75
+ - **name**: Internal name used for hooks (e.g., `ldap{name}add`)
76
+ - **mainAttribute**: DN attribute (e.g., `uid`, `cn`)
77
+ - **objectClass**: LDAP objectClass values
78
+ - **singularName**: Used in API paths and messages (e.g., "user")
79
+ - **pluralName**: Used in API paths (e.g., "users")
80
+ - **base**: LDAP base DN, supports config placeholders like `{ldap_base}`
81
+ - **defaultAttributes**: Default values for optional attributes
82
+
83
+ ### Attribute Types
84
+
85
+ #### String
86
+
87
+ ```json
88
+ {
89
+ "cn": {
90
+ "type": "string",
91
+ "test": "^[a-zA-Z ]+$",
92
+ "required": true
93
+ }
94
+ }
95
+ ```
96
+
97
+ #### Array
98
+
99
+ ```json
100
+ {
101
+ "objectClass": {
102
+ "type": "array",
103
+ "items": { "type": "string" },
104
+ "default": ["top", "person"],
105
+ "required": true
106
+ }
107
+ }
108
+ ```
109
+
110
+ #### Pointer (DN Reference)
111
+
112
+ ```json
113
+ {
114
+ "manager": {
115
+ "type": "pointer",
116
+ "branch": ["ou=users,dc=example,dc=com"],
117
+ "required": false
118
+ }
119
+ }
120
+ ```
121
+
122
+ Pointer validation ensures the DN exists and is within allowed branches.
123
+
124
+ #### Fixed Attributes
125
+
126
+ ```json
127
+ {
128
+ "objectClass": {
129
+ "type": "array",
130
+ "fixed": true,
131
+ "default": ["top", "person"]
132
+ }
133
+ }
134
+ ```
135
+
136
+ Fixed attributes:
137
+
138
+ - Auto-provisioned with default value on creation
139
+ - Cannot be modified after creation
140
+ - Cannot be deleted
141
+
142
+ ## Generated APIs
143
+
144
+ For each schema, the plugin generates REST API endpoints:
145
+
146
+ ### List Entries
147
+
148
+ ```bash
149
+ GET /api/v1/ldap/{pluralName}?match={filter}&attributes={attrs}
150
+ ```
151
+
152
+ **Example:**
153
+
154
+ ```bash
155
+ curl http://localhost:8081/api/v1/ldap/users?match=uid=*smith*&attributes=uid,cn,mail
156
+ ```
157
+
158
+ **Response:**
159
+
160
+ ```json
161
+ {
162
+ "jsmith": {
163
+ "dn": "uid=jsmith,ou=users,dc=example,dc=com",
164
+ "uid": "jsmith",
165
+ "cn": "John Smith",
166
+ "mail": "jsmith@example.com"
167
+ }
168
+ }
169
+ ```
170
+
171
+ ### Get Entry
172
+
173
+ ```bash
174
+ GET /api/v1/ldap/{pluralName}/{id}
175
+ ```
176
+
177
+ **Example:**
178
+
179
+ ```bash
180
+ curl http://localhost:8081/api/v1/ldap/users/jsmith
181
+ ```
182
+
183
+ ### Create Entry
184
+
185
+ ```bash
186
+ POST /api/v1/ldap/{pluralName}
187
+ Content-Type: application/json
188
+
189
+ {
190
+ "uid": "newuser",
191
+ "cn": "New User",
192
+ "sn": "User",
193
+ "mail": "newuser@example.com"
194
+ }
195
+ ```
196
+
197
+ ### Modify Entry
198
+
199
+ ```bash
200
+ PUT /api/v1/ldap/{pluralName}/{id}
201
+ Content-Type: application/json
202
+
203
+ {
204
+ "replace": {
205
+ "cn": "Updated Name"
206
+ },
207
+ "add": {
208
+ "telephoneNumber": "+1234567890"
209
+ },
210
+ "delete": ["description"]
211
+ }
212
+ ```
213
+
214
+ ### Delete Entry
215
+
216
+ ```bash
217
+ DELETE /api/v1/ldap/{pluralName}/{id}
218
+ ```
219
+
220
+ ## Schema Examples
221
+
222
+ ### Example 1: Simple Users
223
+
224
+ ```json
225
+ {
226
+ "entity": {
227
+ "name": "standardUser",
228
+ "mainAttribute": "uid",
229
+ "objectClass": ["top", "inetOrgPerson"],
230
+ "singularName": "user",
231
+ "pluralName": "users",
232
+ "base": "ou=users,{ldap_base}"
233
+ },
234
+ "strict": true,
235
+ "attributes": {
236
+ "objectClass": {
237
+ "type": "array",
238
+ "items": { "type": "string" },
239
+ "default": ["top", "inetOrgPerson"],
240
+ "required": true,
241
+ "fixed": true
242
+ },
243
+ "uid": {
244
+ "type": "string",
245
+ "test": "^[a-z][a-z0-9_-]{2,32}$",
246
+ "required": true
247
+ },
248
+ "cn": {
249
+ "type": "string",
250
+ "required": true
251
+ },
252
+ "sn": {
253
+ "type": "string",
254
+ "required": true
255
+ },
256
+ "mail": {
257
+ "type": "string",
258
+ "test": "^[^@]+@[^@]+\\.[^@]+$",
259
+ "required": false
260
+ }
261
+ }
262
+ }
263
+ ```
264
+
265
+ ### Example 2: Positions/Roles
266
+
267
+ ```json
268
+ {
269
+ "entity": {
270
+ "name": "twakePosition",
271
+ "mainAttribute": "cn",
272
+ "objectClass": ["top", "twakePosition"],
273
+ "singularName": "position",
274
+ "pluralName": "positions",
275
+ "base": "ou=positions,{ldap_base}"
276
+ },
277
+ "strict": true,
278
+ "attributes": {
279
+ "objectClass": {
280
+ "type": "array",
281
+ "default": ["top", "twakePosition"],
282
+ "required": true,
283
+ "fixed": true
284
+ },
285
+ "cn": {
286
+ "type": "string",
287
+ "test": "^[a-zA-Z0-9 &/,.-]+$",
288
+ "required": true
289
+ },
290
+ "description": {
291
+ "type": "string",
292
+ "required": false
293
+ }
294
+ }
295
+ }
296
+ ```
297
+
298
+ ### Example 3: With Pointers
299
+
300
+ ```json
301
+ {
302
+ "entity": {
303
+ "name": "employee",
304
+ "mainAttribute": "uid",
305
+ "objectClass": ["top", "inetOrgPerson", "employee"],
306
+ "singularName": "employee",
307
+ "pluralName": "employees",
308
+ "base": "ou=employees,{ldap_base}"
309
+ },
310
+ "attributes": {
311
+ "uid": {
312
+ "type": "string",
313
+ "required": true
314
+ },
315
+ "cn": {
316
+ "type": "string",
317
+ "required": true
318
+ },
319
+ "sn": {
320
+ "type": "string",
321
+ "required": true
322
+ },
323
+ "manager": {
324
+ "type": "pointer",
325
+ "branch": ["ou=employees,{ldap_base}"],
326
+ "required": false
327
+ },
328
+ "departmentNumber": {
329
+ "type": "pointer",
330
+ "branch": ["ou=departments,{ldap_base}"],
331
+ "required": true
332
+ }
333
+ }
334
+ }
335
+ ```
336
+
337
+ ## Hooks
338
+
339
+ The plugin generates hooks for each entity type:
340
+
341
+ - `ldap{Name}add` - Before adding entry
342
+ - `ldap{Name}adddone` - After adding entry
343
+ - `ldap{Name}modify` - Before modifying entry
344
+ - `ldap{Name}modifydone` - After modifying entry
345
+ - `ldap{Name}delete` - Before deleting entry
346
+ - `ldap{Name}deletedone` - After deleting entry
347
+
348
+ **Example:** For an entity named `twakeUser`, hooks are:
349
+
350
+ - `ldaptwakeUseradd`
351
+ - `ldaptwakeUseradddone`
352
+ - etc.
353
+
354
+ ## Validation
355
+
356
+ ### Schema Validation
357
+
358
+ All operations are validated against the schema:
359
+
360
+ - **Required attributes**: Must be present
361
+ - **Type checking**: String, array, etc.
362
+ - **Pattern matching**: Regex validation via `test` property
363
+ - **Pointer validation**: DN must exist and be in allowed branch
364
+ - **Fixed attributes**: Cannot be modified or deleted
365
+
366
+ ### Strict Mode
367
+
368
+ When `"strict": true`, only attributes defined in the schema are allowed. Additional attributes are rejected.
369
+
370
+ When `"strict": false`, additional attributes are permitted.
371
+
372
+ ## Configuration Placeholders
373
+
374
+ Schema bases can use configuration placeholders:
375
+
376
+ ```json
377
+ {
378
+ "entity": {
379
+ "base": "ou=users,{ldap_base}"
380
+ }
381
+ }
382
+ ```
383
+
384
+ Placeholders are replaced with config values:
385
+
386
+ - `{ldap_base}` → `--ldap-base` value
387
+ - `{ldap_top_organization}` → `--ldap-top-organization` value
388
+ - Any config key in lowercase with underscores
389
+
390
+ ## Multiple Schemas
391
+
392
+ Load multiple schemas to manage different entity types:
393
+
394
+ ```bash
395
+ --ldap-flat-schema ./schemas/users.json \
396
+ --ldap-flat-schema ./schemas/positions.json \
397
+ --ldap-flat-schema ./schemas/contractors.json
398
+ ```
399
+
400
+ Each schema creates separate API endpoints under its `pluralName`.
401
+
402
+ ## Integration with Other Plugins
403
+
404
+ ### With onChange
405
+
406
+ ```bash
407
+ --plugin core/ldap/onChange \
408
+ --plugin core/ldap/flatGeneric \
409
+ --ldap-flat-schema ./schemas/users.json \
410
+ --mail-attribute mail
411
+ ```
412
+
413
+ Generates `onLdapMailChange` hooks when mail attribute changes.
414
+
415
+ ### With James (Twake Mail)
416
+
417
+ ```bash
418
+ --plugin core/ldap/onChange \
419
+ --plugin core/ldap/flatGeneric \
420
+ --plugin twake/james \
421
+ --ldap-flat-schema ./schemas/twake/users.json \
422
+ --mail-attribute mail \
423
+ --james-webadmin-url http://localhost:8000
424
+ ```
425
+
426
+ Automatically syncs mail changes to James mail server.
427
+
428
+ ## Comparison with ldapFlat (Deprecated)
429
+
430
+ | Feature | ldapFlat | ldapFlatGeneric |
431
+ | ------------------ | ----------------------- | ---------------------------- |
432
+ | **Configuration** | Hardcoded plugin | JSON schema files |
433
+ | **Flexibility** | Limited to users/groups | Any entity type |
434
+ | **Validation** | Basic | Full schema validation |
435
+ | **Maintenance** | Manual code changes | Update JSON files |
436
+ | **Multiple Types** | Separate plugins | One plugin, multiple schemas |
437
+
438
+ **Migration:** Replace `ldapFlat` plugins with `ldapFlatGeneric` and schema files.
439
+
440
+ ## See Also
441
+
442
+ - [ldapFlat.md](ldapFlat.md) - Legacy flat LDAP plugin
443
+ - [ldapGroups.md](ldapGroups.md) - Group management
444
+ - [ldapOrganizations.md](ldapOrganizations.md) - Organization tree