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,399 @@
1
+ # Web Logs Plugin
2
+
3
+ HTTP request logging middleware for debugging and monitoring.
4
+
5
+ ## Overview
6
+
7
+ The `weblogs` plugin logs all incoming HTTP requests and responses with timing information, status codes, and authenticated user details.
8
+
9
+ ## Configuration
10
+
11
+ ```bash
12
+ --plugin core/weblogs
13
+ ```
14
+
15
+ No additional configuration required.
16
+
17
+ ## Log Output
18
+
19
+ ### Request Logging
20
+
21
+ Each request is logged when it arrives:
22
+
23
+ ```
24
+ [debug] Incoming request: GET /api/v1/ldap/users
25
+ ```
26
+
27
+ ### Response Logging
28
+
29
+ Each response is logged when completed:
30
+
31
+ ```json
32
+ {
33
+ "level": "info",
34
+ "message": "GET /api/v1/ldap/users 200 45ms",
35
+ "user": "admin",
36
+ "method": "GET",
37
+ "url": "/api/v1/ldap/users",
38
+ "status": 200,
39
+ "responseTime": "45ms"
40
+ }
41
+ ```
42
+
43
+ ## Log Fields
44
+
45
+ | Field | Description | Example |
46
+ | -------------- | ------------------------------- | --------------------------------- |
47
+ | `message` | Summary line | `GET /api/v1/ldap/users 200 45ms` |
48
+ | `user` | Authenticated user (if any) | `admin` |
49
+ | `method` | HTTP method | `GET`, `POST`, `PUT`, `DELETE` |
50
+ | `url` | Full URL including query params | `/api/v1/ldap/users?match=*` |
51
+ | `status` | HTTP status code | `200`, `404`, `500` |
52
+ | `responseTime` | Request duration | `45ms`, `123ms` |
53
+ | `error` | Error message (if applicable) | `Connection timeout` |
54
+
55
+ ## Use Cases
56
+
57
+ ### 1. Request Monitoring
58
+
59
+ Track all API usage:
60
+
61
+ ```bash
62
+ --plugin core/weblogs \
63
+ --log-level info
64
+ ```
65
+
66
+ Output:
67
+
68
+ ```
69
+ [info] POST /api/v1/ldap/users 201 123ms {"user":"admin"}
70
+ [info] GET /api/v1/ldap/users/jdoe 200 23ms {"user":"admin"}
71
+ [info] PUT /api/v1/ldap/users/jdoe 200 89ms {"user":"admin"}
72
+ [info] DELETE /api/v1/ldap/users/test 200 45ms {"user":"admin"}
73
+ ```
74
+
75
+ ### 2. Performance Analysis
76
+
77
+ Identify slow endpoints:
78
+
79
+ ```bash
80
+ --plugin core/weblogs \
81
+ --log-level info | grep -E '[0-9]{3,}ms'
82
+ ```
83
+
84
+ Shows requests taking >100ms:
85
+
86
+ ```
87
+ [info] GET /api/v1/ldap/organizations/top 200 345ms
88
+ [info] POST /api/v1/ldap/users 201 523ms
89
+ ```
90
+
91
+ ### 3. Security Auditing
92
+
93
+ Track who accesses what:
94
+
95
+ ```bash
96
+ --plugin core/auth/token \
97
+ --plugin core/weblogs
98
+ ```
99
+
100
+ Output:
101
+
102
+ ```json
103
+ {
104
+ "level": "info",
105
+ "message": "DELETE /api/v1/ldap/users/jdoe 200 45ms",
106
+ "user": "admin",
107
+ "method": "DELETE",
108
+ "url": "/api/v1/ldap/users/jdoe"
109
+ }
110
+ ```
111
+
112
+ ### 4. Error Tracking
113
+
114
+ Monitor failed requests:
115
+
116
+ ```bash
117
+ --plugin core/weblogs | grep -E ' (4|5)[0-9]{2} '
118
+ ```
119
+
120
+ Shows 4xx and 5xx responses:
121
+
122
+ ```
123
+ [info] GET /api/v1/ldap/users/notfound 404 12ms
124
+ [info] POST /api/v1/ldap/users 400 8ms {"error":"Missing required field: cn"}
125
+ [info] GET /api/v1/ldap/users 500 234ms {"error":"LDAP connection timeout"}
126
+ ```
127
+
128
+ ## Integration
129
+
130
+ ### With Authentication Plugins
131
+
132
+ ```bash
133
+ --plugin core/auth/token \
134
+ --plugin core/weblogs \
135
+ --auth-token "secret-token"
136
+ ```
137
+
138
+ Logs include authenticated user:
139
+
140
+ ```json
141
+ {
142
+ "user": "token number 0",
143
+ "message": "GET /api/v1/ldap/users 200 45ms"
144
+ }
145
+ ```
146
+
147
+ ### With Authorization Plugin
148
+
149
+ ```bash
150
+ --plugin core/auth/token \
151
+ --plugin core/auth/authzPerBranch \
152
+ --plugin core/weblogs
153
+ ```
154
+
155
+ Track authorization failures:
156
+
157
+ ```json
158
+ {
159
+ "user": "limited_user",
160
+ "message": "GET /api/v1/ldap/users 403 5ms",
161
+ "error": "User does not have read permission"
162
+ }
163
+ ```
164
+
165
+ ## Log Levels
166
+
167
+ Configure log level to control verbosity:
168
+
169
+ ```bash
170
+ --log-level debug # All requests + debug info
171
+ --log-level info # Completed requests only
172
+ --log-level warn # Only warnings and errors
173
+ --log-level error # Only errors
174
+ ```
175
+
176
+ ### Debug Level
177
+
178
+ ```bash
179
+ --plugin core/weblogs \
180
+ --log-level debug
181
+ ```
182
+
183
+ Output:
184
+
185
+ ```
186
+ [debug] Incoming request: POST /api/v1/ldap/users
187
+ [debug] Request body: {"uid":"newuser","cn":"New User",...}
188
+ [info] POST /api/v1/ldap/users 201 123ms
189
+ ```
190
+
191
+ ### Info Level
192
+
193
+ ```bash
194
+ --plugin core/weblogs \
195
+ --log-level info
196
+ ```
197
+
198
+ Output:
199
+
200
+ ```
201
+ [info] POST /api/v1/ldap/users 201 123ms {"user":"admin"}
202
+ [info] GET /api/v1/ldap/users 200 45ms {"user":"admin"}
203
+ ```
204
+
205
+ ## Event Handling
206
+
207
+ The plugin logs three types of events:
208
+
209
+ ### 1. Normal Completion
210
+
211
+ Request completes successfully:
212
+
213
+ ```javascript
214
+ res.on('finish', () => {
215
+ // Log: "GET /api/v1/ldap/users 200 45ms"
216
+ });
217
+ ```
218
+
219
+ ### 2. Response Error
220
+
221
+ Error occurs during response:
222
+
223
+ ```javascript
224
+ res.on('error', err => {
225
+ // Log: "GET /api/v1/ldap/users 500 234ms" {"error":"Connection timeout"}
226
+ });
227
+ ```
228
+
229
+ ### 3. Connection Closed
230
+
231
+ Client closes connection before response:
232
+
233
+ ```javascript
234
+ res.on('close', () => {
235
+ // Log: "GET /api/v1/ldap/users - - {"error":"Connection closed before response was sent"}
236
+ });
237
+ ```
238
+
239
+ ## Log Parsing
240
+
241
+ ### JSON Format
242
+
243
+ Logs are in JSON format for easy parsing:
244
+
245
+ ```bash
246
+ cat app.log | jq 'select(.status >= 400)'
247
+ ```
248
+
249
+ Filters 4xx and 5xx responses:
250
+
251
+ ```json
252
+ {
253
+ "level": "info",
254
+ "message": "GET /api/v1/ldap/users/notfound 404 12ms",
255
+ "status": 404,
256
+ "method": "GET",
257
+ "url": "/api/v1/ldap/users/notfound"
258
+ }
259
+ ```
260
+
261
+ ### Statistics
262
+
263
+ Generate request statistics:
264
+
265
+ ```bash
266
+ cat app.log | jq -r '.message' | awk '{print $1}' | sort | uniq -c
267
+ ```
268
+
269
+ Output:
270
+
271
+ ```
272
+ 45 DELETE
273
+ 123 GET
274
+ 67 POST
275
+ 34 PUT
276
+ ```
277
+
278
+ ### Response Time Analysis
279
+
280
+ Average response time per endpoint:
281
+
282
+ ```bash
283
+ cat app.log | jq -r 'select(.responseTime) | "\(.url) \(.responseTime)"' | \
284
+ sed 's/ms$//' | \
285
+ awk '{sum[$1]+=$2; count[$1]++} END {for (url in sum) print url, sum[url]/count[url] "ms"}'
286
+ ```
287
+
288
+ ## Performance Impact
289
+
290
+ The weblogs plugin adds minimal overhead:
291
+
292
+ - **Request logging**: ~0.1ms
293
+ - **Response logging**: ~0.5ms
294
+ - **Total overhead**: <1ms per request
295
+
296
+ For high-traffic deployments:
297
+
298
+ 1. Use `--log-level warn` to reduce logging
299
+ 2. Log to file instead of console
300
+ 3. Use log aggregation service
301
+
302
+ ## Log Rotation
303
+
304
+ Configure log rotation using environment or external tools:
305
+
306
+ ### Using Winston File Transport
307
+
308
+ ```bash
309
+ --log-file ./logs/ldap-rest.log \
310
+ --log-max-size 10485760 \ # 10MB
311
+ --log-max-files 5
312
+ ```
313
+
314
+ ### Using logrotate (Linux)
315
+
316
+ ```
317
+ /var/log/ldap-rest/*.log {
318
+ daily
319
+ rotate 7
320
+ compress
321
+ delaycompress
322
+ notifempty
323
+ create 0640 ldap-rest ldap-rest
324
+ sharedscripts
325
+ postrotate
326
+ systemctl reload ldap-rest
327
+ endscript
328
+ }
329
+ ```
330
+
331
+ ## Troubleshooting
332
+
333
+ ### Problem: No Logs Appearing
334
+
335
+ **Solutions:**
336
+
337
+ 1. Ensure plugin is loaded:
338
+
339
+ ```bash
340
+ --plugin core/weblogs
341
+ ```
342
+
343
+ 2. Check log level:
344
+
345
+ ```bash
346
+ --log-level info # or debug
347
+ ```
348
+
349
+ 3. Verify logs go to stdout/stderr:
350
+ ```bash
351
+ ldap-rest --plugin core/weblogs 2>&1 | tee app.log
352
+ ```
353
+
354
+ ### Problem: Too Many Logs
355
+
356
+ **Solutions:**
357
+
358
+ 1. Increase log level:
359
+
360
+ ```bash
361
+ --log-level warn # Only warnings and errors
362
+ ```
363
+
364
+ 2. Filter specific endpoints:
365
+
366
+ ```bash
367
+ ldap-rest --plugin core/weblogs 2>&1 | grep -v '/health'
368
+ ```
369
+
370
+ 3. Use log aggregation with filtering
371
+
372
+ ### Problem: User Field Empty
373
+
374
+ **Symptoms:**
375
+
376
+ ```json
377
+ { "message": "GET /api/v1/ldap/users 200 45ms" }
378
+ ```
379
+
380
+ No `user` field in logs.
381
+
382
+ **Solutions:**
383
+
384
+ 1. Enable authentication plugin:
385
+
386
+ ```bash
387
+ --plugin core/auth/token \
388
+ --plugin core/weblogs
389
+ ```
390
+
391
+ 2. Verify authentication is working:
392
+ ```bash
393
+ curl -H "Authorization: Bearer token" http://localhost:8081/api/v1/ldap/users
394
+ ```
395
+
396
+ ## See Also
397
+
398
+ - [Authentication Plugins](authentication.md) - User authentication
399
+ - [Winston Logger](https://github.com/winstonjs/winston) - Logging library used
@@ -0,0 +1,113 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>LDAP Group Editor Demo</title>
7
+
8
+ <!-- Google Fonts -->
9
+ <link
10
+ href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap"
11
+ rel="stylesheet"
12
+ />
13
+ <link
14
+ href="https://fonts.googleapis.com/icon?family=Material+Icons"
15
+ rel="stylesheet"
16
+ />
17
+
18
+ <!-- Shared CSS -->
19
+ <link rel="stylesheet" href="/static/browser/common-demo.css" />
20
+
21
+ <!-- Library CSS -->
22
+ <link rel="stylesheet" href="/static/browser/ldap-user-editor.css" />
23
+
24
+ <style>
25
+ :root {
26
+ --primary-color: #185a9d;
27
+ --primary-color-dark: #0d3a6b;
28
+ }
29
+
30
+ body {
31
+ background: linear-gradient(135deg, #43cea2 0%, #185a9d 100%);
32
+ }
33
+
34
+ .demo-header h1 {
35
+ color: #185a9d;
36
+ }
37
+
38
+ .action-button {
39
+ background: var(--primary-color);
40
+ }
41
+
42
+ .action-button:hover {
43
+ background: var(--primary-color-dark);
44
+ }
45
+
46
+ .field-group-title {
47
+ color: var(--primary-color);
48
+ }
49
+ </style>
50
+ </head>
51
+ <body>
52
+ <div class="demo-container">
53
+ <div class="demo-header">
54
+ <h1>👥 LDAP Group Editor</h1>
55
+ <p>
56
+ Browse and manage LDAP groups with support for mailing lists and team
57
+ mailboxes
58
+ </p>
59
+ </div>
60
+
61
+ <div id="status-container"></div>
62
+
63
+ <div id="ldap-group-editor" style="min-height: 600px"></div>
64
+ </div>
65
+
66
+ <!-- Shared utilities -->
67
+ <script src="/static/browser/shared.js"></script>
68
+ <!-- Library JS -->
69
+ <script src="/static/browser/ldap-group-editor.js"></script>
70
+
71
+ <script>
72
+ const { LdapGroupEditor } = window.LdapGroupEditor;
73
+ const { showStatus } = window.MiniDmShared;
74
+
75
+ async function initEditor() {
76
+ try {
77
+ const editor = new LdapGroupEditor({
78
+ containerId: 'ldap-group-editor',
79
+ apiBaseUrl: window.location.origin,
80
+ onGroupSaved: groupDn => {
81
+ console.log('Group saved:', groupDn);
82
+ showStatus(
83
+ 'status-container',
84
+ 'Group saved successfully!',
85
+ 'success'
86
+ );
87
+ },
88
+ onError: error => {
89
+ console.error('Editor error:', error);
90
+ showStatus(
91
+ 'status-container',
92
+ `Error: ${error.message}`,
93
+ 'error'
94
+ );
95
+ },
96
+ });
97
+
98
+ await editor.init();
99
+ showStatus(
100
+ 'status-container',
101
+ 'LDAP Group Editor loaded successfully!',
102
+ 'success'
103
+ );
104
+ } catch (error) {
105
+ console.error('Failed to initialize editor:', error);
106
+ showStatus('status-container', `Error: ${error.message}`, 'error');
107
+ }
108
+ }
109
+
110
+ initEditor();
111
+ </script>
112
+ </body>
113
+ </html>