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