ldap-rest 1.1.0 → 1.2.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 (115) hide show
  1. package/bin/index.mjs +8 -7
  2. package/dist/abstract/ldapFlat.js +1 -1
  3. package/dist/abstract/plugin.js +1 -1
  4. package/dist/abstract/twakePlugin.js +1 -1
  5. package/dist/bin/index.js +1 -1
  6. package/dist/config/args.js +1 -1
  7. package/dist/config/schema.js +1 -1
  8. package/dist/lib/changeContext.js +1 -1
  9. package/dist/lib/entitySchema/validator.js +1 -0
  10. package/dist/lib/expressFormatedResponses.js +1 -1
  11. package/dist/lib/health.js +1 -0
  12. package/dist/lib/instanceProviders.js +1 -1
  13. package/dist/lib/ldapActions.js +1 -1
  14. package/dist/lib/ldapSchema.js +1 -1
  15. package/dist/lib/metrics.js +1 -0
  16. package/dist/lib/requestContext.js +1 -1
  17. package/dist/lib/shutdown.js +1 -0
  18. package/dist/lib/staticFiles.js +1 -0
  19. package/dist/lib/storage/store.js +1 -1
  20. package/dist/lib/utils.js +1 -1
  21. package/dist/logger/winston.js +1 -1
  22. package/dist/plugins/auth/crowdsec.js +1 -1
  23. package/dist/plugins/auth/openidconnect.js +1 -1
  24. package/dist/plugins/demo/helloworld.js +1 -1
  25. package/dist/plugins/ldap/bulkImport.js +1 -1
  26. package/dist/plugins/ldap/departmentSync.js +1 -1
  27. package/dist/plugins/ldap/flatGeneric.js +1 -1
  28. package/dist/plugins/ldap/groups.js +1 -1
  29. package/dist/plugins/ldap/organizations.js +1 -1
  30. package/dist/plugins/metrics.js +1 -0
  31. package/dist/plugins/rabbitmq.js +1 -1
  32. package/dist/plugins/scim/baseResolver.js +1 -1
  33. package/dist/plugins/scim/bulk.js +1 -1
  34. package/dist/plugins/scim/errors.js +1 -1
  35. package/dist/plugins/scim/filter.js +1 -1
  36. package/dist/plugins/scim/groups.js +1 -1
  37. package/dist/plugins/scim/mapping.js +1 -1
  38. package/dist/plugins/scim/patch.js +1 -1
  39. package/dist/plugins/scim/projection.js +1 -1
  40. package/dist/plugins/scim/scim.js +1 -1
  41. package/dist/plugins/scim/users.js +1 -1
  42. package/dist/plugins/static.js +1 -1
  43. package/dist/plugins/storage/file.js +1 -1
  44. package/dist/plugins/storage/postgres.js +1 -1
  45. package/dist/plugins/storage/valkey.js +1 -1
  46. package/dist/plugins/storage.js +1 -1
  47. package/dist/plugins/twake/calendar.js +1 -1
  48. package/dist/plugins/twake/clouderyProvision.js +1 -1
  49. package/dist/plugins/twake/cozyProvision.js +1 -1
  50. package/dist/plugins/twake/drive.js +1 -1
  51. package/dist/plugins/twake/groups.js +1 -1
  52. package/dist/plugins/twake/james.js +1 -1
  53. package/dist/plugins/twake/migrationProxy.js +1 -0
  54. package/dist/plugins/twake/spaces.js +1 -1
  55. package/dist/plugins/weblogs.js +1 -1
  56. package/dist/src/abstract/ldapFlat.d.ts +3 -13
  57. package/dist/src/abstract/plugin.d.ts +20 -0
  58. package/dist/src/abstract/twakePlugin.d.ts +23 -1
  59. package/dist/src/bin/index.d.ts +46 -1
  60. package/dist/src/config/args.d.ts +12 -1
  61. package/dist/src/lib/changeContext.d.ts +11 -0
  62. package/dist/src/lib/entitySchema/validator.d.ts +64 -0
  63. package/dist/src/lib/expressFormatedResponses.d.ts +19 -0
  64. package/dist/src/lib/health.d.ts +63 -0
  65. package/dist/src/lib/instanceProviders.d.ts +4 -0
  66. package/dist/src/lib/ldapActions.d.ts +32 -2
  67. package/dist/src/lib/metrics.d.ts +44 -0
  68. package/dist/src/lib/requestContext.d.ts +40 -0
  69. package/dist/src/lib/shutdown.d.ts +20 -0
  70. package/dist/src/lib/staticFiles.d.ts +33 -0
  71. package/dist/src/lib/storage/store.d.ts +8 -0
  72. package/dist/src/lib/utils.d.ts +15 -0
  73. package/dist/src/logger/winston.d.ts +4 -0
  74. package/dist/src/plugins/ldap/groups.d.ts +18 -3
  75. package/dist/src/plugins/ldap/organizations.d.ts +3 -5
  76. package/dist/src/plugins/metrics.d.ts +17 -0
  77. package/dist/src/plugins/rabbitmq.d.ts +37 -1
  78. package/dist/src/plugins/scim/errors.d.ts +2 -0
  79. package/dist/src/plugins/scim/types.d.ts +2 -1
  80. package/dist/src/plugins/static.d.ts +12 -0
  81. package/dist/src/plugins/storage/file.d.ts +4 -0
  82. package/dist/src/plugins/storage/postgres.d.ts +7 -14
  83. package/dist/src/plugins/storage/valkey.d.ts +2 -15
  84. package/dist/src/plugins/storage.d.ts +8 -0
  85. package/dist/src/plugins/twake/drive.d.ts +8 -0
  86. package/dist/src/plugins/twake/groups.d.ts +1 -2
  87. package/dist/src/plugins/twake/james.d.ts +2 -0
  88. package/dist/src/plugins/twake/migrationProxy.d.ts +71 -0
  89. package/docs/client-development/api/reference.md +5 -9
  90. package/docs/client-development/api/rest-api.md +4 -10
  91. package/docs/client-development/schemas/README.md +60 -21
  92. package/docs/plugin-development/README.md +15 -13
  93. package/docs/plugin-development/dependencies.md +8 -0
  94. package/docs/plugin-development/hooks.md +1 -1
  95. package/docs/usage/README.md +1 -0
  96. package/docs/usage/configuration.md +62 -24
  97. package/docs/usage/operations.md +193 -0
  98. package/docs/usage/plugins/README.md +2 -0
  99. package/docs/usage/plugins/auth/authz-per-branch.md +2 -1
  100. package/docs/usage/plugins/integrations/README.md +8 -4
  101. package/docs/usage/plugins/integrations/groups.md +2 -2
  102. package/docs/usage/plugins/integrations/mail-migration.md +102 -0
  103. package/docs/usage/plugins/integrations/scim.md +16 -3
  104. package/docs/usage/plugins/integrations/spaces.md +1 -1
  105. package/docs/usage/plugins/ldap/bulk-import.md +3 -1
  106. package/docs/usage/plugins/ldap/flat-generic.md +5 -2
  107. package/docs/usage/plugins/ldap/on-change.md +2 -1
  108. package/docs/usage/plugins/ldap/organizations.md +7 -7
  109. package/docs/usage/plugins/utilities/metrics.md +21 -0
  110. package/docs/usage/plugins/utilities/static.md +16 -8
  111. package/docs/usage/plugins/utilities/storage.md +7 -0
  112. package/docs/usage/plugins/utilities/weblogs.md +51 -30
  113. package/docs/usage/upgrading.md +84 -0
  114. package/package.json +11 -2
  115. package/static/schemas/example/README.md +1 -0
@@ -28,13 +28,13 @@ This plugin manages hierarchical organizations stored as `organizationalUnit` (o
28
28
 
29
29
  ### Configuration Options
30
30
 
31
- | Argument | Environment Variable | Default | Description |
32
- | ----------------------------------------------------------- | ------------------------------------- | ------------------------------- | --------------------------------------------------- |
33
- | `--ldap-top-organization` | `DM_LDAP_TOP_ORGANIZATION` | _Required_ | DN of the top-level organization |
34
- | `--ldap-organization-class` / `--ldap-organization-classes` | `DM_LDAP_ORGANIZATION_CLASSES` | `["top", "organizationalUnit"]` | Object classes for organizations |
35
- | `--ldap-organization-link-attribute` | `DM_LDAP_ORGANIZATION_LINK_ATTRIBUTE` | `twakeDepartmentLink` | Attribute for linking users/groups to organizations |
36
- | `--ldap-organization-path-attribute` | `DM_LDAP_ORGANIZATION_PATH_ATTRIBUTE` | `twakeDepartmentPath` | Attribute for the organizational path |
37
- | `--ldap-organization-path-separator` | `DM_LDAP_ORGANIZATION_PATH_SEPARATOR` | `" / "` | Separator for path components |
31
+ | Argument | Environment Variable | Default | Description |
32
+ | ----------------------------------------------------------- | ------------------------------------- | ---------------------------------------- | --------------------------------------------------- |
33
+ | `--ldap-top-organization` | `DM_LDAP_TOP_ORGANIZATION` | _Required_ | DN of the top-level organization |
34
+ | `--ldap-organization-class` / `--ldap-organization-classes` | `DM_LDAP_ORGANIZATION_CLASSES` | `top,organizationalUnit,twakeDepartment` | Object classes for organizations |
35
+ | `--ldap-organization-link-attribute` | `DM_LDAP_ORGANIZATION_LINK_ATTRIBUTE` | `twakeDepartmentLink` | Attribute for linking users/groups to organizations |
36
+ | `--ldap-organization-path-attribute` | `DM_LDAP_ORGANIZATION_PATH_ATTRIBUTE` | `twakeDepartmentPath` | Attribute for the organizational path |
37
+ | `--ldap-organization-path-separator` | `DM_LDAP_ORGANIZATION_PATH_SEPARATOR` | `" / "` | Separator for path components |
38
38
 
39
39
  ### Important Notes
40
40
 
@@ -0,0 +1,21 @@
1
+ # Metrics Plugin
2
+
3
+ Prometheus metrics of the server, on a port of their own.
4
+
5
+ ## Configuration
6
+
7
+ ```bash
8
+ --plugin core/metrics --metrics-port 9464
9
+ ```
10
+
11
+ `--metrics-port` (`DM_METRICS_PORT`, 9464) is the port `GET /metrics` is
12
+ served on, see [configuration](../../configuration.md#coremetrics).
13
+
14
+ The port is separate from the API's: nothing on it goes through the
15
+ authentication, the rate limiting or the request id, so it must not be
16
+ reachable from outside the cluster or the host. The Helm chart exposes it
17
+ on the Service and to a Prometheus operator with `metrics.enabled` and
18
+ `metrics.serviceMonitor.enabled`.
19
+
20
+ What is measured, and how to read it, is in
21
+ [operations](../../operations.md#metrics).
@@ -242,12 +242,7 @@ for instance to `/static/index.html`.
242
242
 
243
243
  ### Example 4: Multiple Static Plugins
244
244
 
245
- Not directly supported, but you can nest directories:
246
-
247
- ```bash
248
- --plugin core/static \
249
- --static-path ./static
250
- ```
245
+ One plugin serves several applications from sub-directories:
251
246
 
252
247
  ```
253
248
  ./static/
@@ -259,14 +254,27 @@ Not directly supported, but you can nest directories:
259
254
  users.json
260
255
  ```
261
256
 
262
- Access via:
263
-
264
257
  ```
265
258
  /static/docs/index.html
266
259
  /static/app/index.html
267
260
  /static/schemas/users.json
268
261
  ```
269
262
 
263
+ A second directory takes a second instance, loaded under a name of its own
264
+ with its own `static_name` and `static_path`
265
+ ([`module:name:{json}`](../auth/README.md#serving-several-populations-from-one-server)):
266
+
267
+ ```bash
268
+ --plugin core/static --static-path ./static \
269
+ --plugin 'core/static:console:{"static_name":"console","static_path":"./console"}'
270
+ ```
271
+
272
+ Give them paths that do not nest: `console` and `console/app` would have the
273
+ first one answer requests meant for the second. The plugins that announce a
274
+ schema URL (groups, organizations, flat entities, SCIM) ask every instance,
275
+ the one registered as `static` first, and leave out one whose path lies under
276
+ an earlier one's, or holds it.
277
+
270
278
  ## Security Considerations
271
279
 
272
280
  ### Path Traversal
@@ -110,6 +110,13 @@ answer "absent" with a warning and writes fail at once instead of waiting.
110
110
  does not answer or a package that is not installed; the server starts anyway,
111
111
  and every operation tries to connect again.
112
112
 
113
+ ## Readiness
114
+
115
+ `GET /readyz` lists the plugin as `degraded` when the backend does not
116
+ answer; the `ldap` backend keeps its records in the directory the probe
117
+ checks on its own, see
118
+ [operations](../../operations.md#what-the-shipped-plugins-report).
119
+
113
120
  ## Expiry
114
121
 
115
122
  Two rules the backends do not get to reinterpret:
@@ -18,6 +18,9 @@ No additional configuration required.
18
18
 
19
19
  ### Request Logging
20
20
 
21
+ Each line carries the `requestId` of the answer's `X-Request-Id`, see
22
+ [operations](../../operations.md#request-id).
23
+
21
24
  Each request is logged when it arrives:
22
25
 
23
26
  ```
@@ -31,26 +34,31 @@ Each response is logged when completed at **notice** level (between info and war
31
34
  ```json
32
35
  {
33
36
  "level": "notice",
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"
37
+ "message": {
38
+ "requestId": "6effd260-b079-4335-b727-544189ed33a6",
39
+ "method": "GET",
40
+ "url": "/api/v1/ldap/users",
41
+ "status": 200,
42
+ "duration": 45,
43
+ "ip": "10.0.9.12",
44
+ "user": "admin"
45
+ },
46
+ "requestId": "6effd260-b079-4335-b727-544189ed33a6",
47
+ "timestamp": "2026-10-26T18:07:03.286Z"
40
48
  }
41
49
  ```
42
50
 
43
51
  ## Log Fields
44
52
 
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` |
53
+ | Field | Description | Example |
54
+ | ----------- | ------------------------------- | ------------------------------ |
55
+ | `user` | Authenticated user (if any) | `admin` |
56
+ | `requestId` | The answer's `X-Request-Id` | `6effd260-b079-…` |
57
+ | `method` | HTTP method | `GET`, `POST`, `PUT`, `DELETE` |
58
+ | `url` | Full URL including query params | `/api/v1/ldap/users?match=*` |
59
+ | `status` | HTTP status code | `200`, `404`, `500` |
60
+ | `duration` | Request duration, in ms | `45`, `123` |
61
+ | `error` | Error message (if applicable) | `Connection timeout` |
54
62
 
55
63
  ## Enriching the Log Line From Another Plugin
56
64
 
@@ -77,6 +85,7 @@ Output:
77
85
  "level": "notice",
78
86
  "message": {
79
87
  "uids": ["jdoe", "asmith"],
88
+ "requestId": "6effd260-b079-4335-b727-544189ed33a6",
80
89
  "method": "POST",
81
90
  "url": "/api/_getldapentries",
82
91
  "status": 200,
@@ -89,7 +98,7 @@ Output:
89
98
 
90
99
  Notes:
91
100
 
92
- - Core fields (`method`, `url`, `status`, `duration`, `ip`, `user`, `error`)
101
+ - Core fields (`requestId`, `method`, `url`, `status`, `duration`, `ip`, `user`, `error`)
93
102
  always take precedence: a plugin cannot overwrite them.
94
103
  - The value must be set **before** the response completes (i.e. before
95
104
  `res.json()` / `res.end()`), since the entry is written on the `finish` event.
@@ -319,27 +328,40 @@ res.on('close', () => {
319
328
  Logs are in JSON format for easy parsing:
320
329
 
321
330
  ```bash
322
- cat app.log | jq 'select(.status >= 400)'
331
+ cat app.log | jq 'select(.message.status? >= 400)'
323
332
  ```
324
333
 
325
334
  Filters 4xx and 5xx responses:
326
335
 
327
336
  ```json
328
337
  {
329
- "level": "info",
330
- "message": "GET /api/v1/ldap/users/notfound 404 12ms",
331
- "status": 404,
332
- "method": "GET",
333
- "url": "/api/v1/ldap/users/notfound"
338
+ "level": "notice",
339
+ "message": {
340
+ "requestId": "6effd260-b079-4335-b727-544189ed33a6",
341
+ "method": "GET",
342
+ "url": "/api/v1/ldap/users/notfound",
343
+ "status": 404,
344
+ "duration": 12,
345
+ "ip": "10.0.9.12"
346
+ },
347
+ "requestId": "6effd260-b079-4335-b727-544189ed33a6",
348
+ "timestamp": "2026-10-26T18:07:03.286Z"
334
349
  }
335
350
  ```
336
351
 
352
+ The lines of one request, the access line and what the server logged while
353
+ serving it:
354
+
355
+ ```bash
356
+ cat app.log | jq 'select(.requestId == "6effd260-b079-4335-b727-544189ed33a6")'
357
+ ```
358
+
337
359
  ### Statistics
338
360
 
339
361
  Generate request statistics:
340
362
 
341
363
  ```bash
342
- cat app.log | jq -r '.message' | awk '{print $1}' | sort | uniq -c
364
+ cat app.log | jq -r 'select(.message.method?) | .message.method' | sort | uniq -c
343
365
  ```
344
366
 
345
367
  Output:
@@ -356,8 +378,7 @@ Output:
356
378
  Average response time per endpoint:
357
379
 
358
380
  ```bash
359
- cat app.log | jq -r 'select(.responseTime) | "\(.url) \(.responseTime)"' | \
360
- sed 's/ms$//' | \
381
+ cat app.log | jq -r 'select(.message.duration?) | "\(.message.url) \(.message.duration)"' | \
361
382
  awk '{sum[$1]+=$2; count[$1]++} END {for (url in sum) print url, sum[url]/count[url] "ms"}'
362
383
  ```
363
384
 
@@ -377,16 +398,16 @@ For high-traffic deployments:
377
398
 
378
399
  ## Log Rotation
379
400
 
380
- Configure log rotation using environment or external tools:
401
+ Rotate the log file with external tools:
381
402
 
382
- ### Using Winston File Transport
403
+ ### Writing to a file
383
404
 
384
405
  ```bash
385
- --log-file ./logs/ldap-rest.log \
386
- --log-max-size 10485760 \ # 10MB
387
- --log-max-files 5
406
+ --logger file --log-file ./logs/ldap-rest.log
388
407
  ```
389
408
 
409
+ The server does not rotate the file itself.
410
+
390
411
  ### Using logrotate (Linux)
391
412
 
392
413
  ```
@@ -4,6 +4,90 @@ What to check before deploying, newest first. Only releases that need a
4
4
  decision or a configuration change appear here; see the
5
5
  [CHANGELOG](../../CHANGELOG.md) for everything else.
6
6
 
7
+ ## From 1.2.0 to 1.2.1
8
+
9
+ ### `{org}` once in a Twake branch pattern
10
+
11
+ **Who is affected:** a deployment whose `--twake-group-base`,
12
+ `--twake-group-user-base` or `--twake-space-base` holds `{org}` more than
13
+ once. None is known.
14
+
15
+ The server refuses to start on such a pattern. It filled the first `{org}`
16
+ only and read the organization back from the first one, so a second
17
+ occurrence never worked; now that every occurrence is filled, the two
18
+ readings would disagree.
19
+
20
+ ## From 1.1 to 1.2.0
21
+
22
+ ### The process stops on an uncaught exception
23
+
24
+ **Who is affected:** every deployment; a supervisor, Kubernetes or systemd,
25
+ restarts the process, as it should.
26
+
27
+ An exception nothing caught was logged and the process kept serving in a
28
+ state nobody knew. The binary now shuts down and exits with 1. On
29
+ `SIGTERM` it also drains what is in flight within `--shutdown-timeout`
30
+ (20 s) and closes its connections before the signal ends it, where the
31
+ signal ended the process at once, the broker connection closed first when
32
+ `core/rabbitmq` was loaded. A host assembling the server in its own
33
+ process gets neither unless it asks: `run()` no longer installs the handlers
34
+ that logged an uncaught exception or an unhandled rejection and kept the
35
+ process alive, so without `exitOnCrash()` or handlers of its own, Node's
36
+ action applies and the process ends on either. See
37
+ [shutdown](operations.md#shutdown).
38
+
39
+ ### The readiness of a pod follows the directory
40
+
41
+ **Who is affected:** a deployment of the Helm chart, whose probes now call
42
+ `GET /healthz` and `GET /readyz` instead of opening the listen port.
43
+
44
+ A pod leaves the endpoints while the directory does not answer, where it
45
+ kept receiving requests and answering 500; a rollout started during a
46
+ directory outage waits for the directory. Both routes are served without
47
+ authentication: an Ingress routing `/` exposes them, keep the two paths to
48
+ the cluster. See [operations](operations.md#health-and-readiness).
49
+
50
+ ### `--ldap-dn` and `--ldap-pwd` are required
51
+
52
+ **Who is affected:** a deployment that left one of them unset, and so bound
53
+ as `cn=admin,dc=example,dc=com` or with the password `admin`; the published
54
+ Docker image carried both in its `ENV`, and the Helm chart's example only set
55
+ the password.
56
+
57
+ The server now stops at startup naming the missing option. Set `DM_LDAP_DN`
58
+ and `DM_LDAP_PWD` (or `--ldap-dn` and `--ldap-pwd`) to the values that were
59
+ implied.
60
+
61
+ ### Every entity route checks the shape of a value
62
+
63
+ **Who is affected:** a script or connector writing through `/api/v1/ldap/<entity>`,
64
+ `/api/v1/ldap/groups` or `/api/v1/ldap/organizations` text that is not a
65
+ number for a `number` or `integer`, a `delete` of a `required` attribute as
66
+ a whole, or a change naming an attribute a strict schema does not declare;
67
+ one writing through `/api/v1/ldap/<entity>` several values for an attribute
68
+ the schema does not type `array`; and one changing a `fixed` attribute of a
69
+ group, which the server dropped from the change and answered 200. The
70
+ server now answers 400, naming the attribute. A group creation sending a
71
+ value under a `fixed` attribute now writes the schema's default, or the
72
+ value when the schema gives none, where it wrote nothing. The shipped LSC connector sends shapes that stay
73
+ accepted, a list of one in a `replace` and one value for an `array` on a
74
+ creation; its whole-attribute delete is refused for a `required` attribute,
75
+ as any, and a group synchronisation that forces `objectClass` or another
76
+ `fixed` attribute now has the whole update refused: keep those attributes
77
+ out of the group updates.
78
+
79
+ Send one value for a single-valued attribute, a list for an `array` (one
80
+ value, or a list of one, is taken either way), numbers as numbers or digits,
81
+ and `null` or `[]` in a `replace` to clear an attribute. The rules are in
82
+ [what a value must look like](../client-development/schemas/README.md#what-a-value-must-look-like).
83
+
84
+ ### `--logger`: `console` or `file`
85
+
86
+ A `DM_LOGGER` set to anything else wrote `error.log` in the working
87
+ directory; the server now stops at startup. Set `DM_LOGGER=file` to keep
88
+ that file, and `DM_LOG_FILE` to name another one. An empty `DM_LOGGER` is
89
+ `console`.
90
+
7
91
  ## From 1.0 to 1.1.0
8
92
 
9
93
  ### The static files can no longer be framed by another origin
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ldap-rest",
3
- "version": "1.1.0",
3
+ "version": "1.2.1",
4
4
  "description": "Light directory manager",
5
5
  "keywords": [
6
6
  "Identity-Manager"
@@ -160,6 +160,10 @@
160
160
  "types": "./dist/src/plugins/ldap/trash.d.ts",
161
161
  "import": "./dist/plugins/ldap/trash.js"
162
162
  },
163
+ "./plugin-metrics": {
164
+ "types": "./dist/src/plugins/metrics.d.ts",
165
+ "import": "./dist/plugins/metrics.js"
166
+ },
163
167
  "./plugin-rabbitmq": {
164
168
  "types": "./dist/src/plugins/rabbitmq.d.ts",
165
169
  "import": "./dist/plugins/rabbitmq.js"
@@ -288,6 +292,10 @@
288
292
  "types": "./dist/src/plugins/twake/lifecycleEvents.d.ts",
289
293
  "import": "./dist/plugins/twake/lifecycleEvents.js"
290
294
  },
295
+ "./plugin-twake-migrationproxy": {
296
+ "types": "./dist/src/plugins/twake/migrationProxy.d.ts",
297
+ "import": "./dist/plugins/twake/migrationProxy.js"
298
+ },
291
299
  "./plugin-twake-spaces": {
292
300
  "types": "./dist/src/plugins/twake/spaces.d.ts",
293
301
  "import": "./dist/plugins/twake/spaces.js"
@@ -754,6 +762,7 @@
754
762
  "multer": "^2.0.2",
755
763
  "node-fetch": "^3.3.2",
756
764
  "p-limit": "^7.1.1",
765
+ "prom-client": "^15.1.3",
757
766
  "winston": "^3.17.0"
758
767
  },
759
768
  "devDependencies": {
@@ -795,7 +804,7 @@
795
804
  "typescript": "^5.9.2"
796
805
  },
797
806
  "optionalDependencies": {
798
- "@linagora/rabbitmq-client": "^0.1.2",
807
+ "@linagora/rabbitmq-client": "^0.7.2",
799
808
  "express-openid-connect": "^2.19.2",
800
809
  "iovalkey": "^0.4.0",
801
810
  "lemonldap-ng-handler": "^0.7.3",
@@ -20,6 +20,7 @@ Point a server at them with:
20
20
  ```sh
21
21
  node bin/index.mjs \
22
22
  --ldap-base dc=example,dc=org \
23
+ --ldap-dn cn=admin,dc=example,dc=org --ldap-pwd secret \
23
24
  --ldap-top-organization ou=organization,dc=example,dc=org \
24
25
  --ldap-group-base ou=lists,ou=groups,dc=example,dc=org \
25
26
  --group-schema static/schemas/example/groups.json \