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