Overview
LibXMTP implements a flexible permission system for group management. Permissions are stored as MLS Unknown Group Context Extensions and control who can perform various group actions.PolicySet
ThePolicySet struct defines all permission policies for a group.
Fields
| Field | Type | Description |
|---|---|---|
add_member_policy | MembershipPolicies | Who can add members |
remove_member_policy | MembershipPolicies | Who can remove members |
update_metadata_policy | HashMap<String, MetadataPolicies> | Per-field metadata update policies |
add_admin_policy | PermissionsPolicies | Who can add admins |
remove_admin_policy | PermissionsPolicies | Who can remove admins |
update_permissions_policy | PermissionsPolicies | Who can update permission policies |
Methods
new
new_dm
evaluate_commit
commit- Validated commit to evaluate
true if commit is valid, false otherwise
Validation Rules:
- Add member policy not violated
- Remove member policy not violated (super admins cannot be removed)
- Metadata update policies not violated
- Admin add/remove policies not violated
- Super admin changes require super admin privileges
- Last super admin cannot be removed
- Permission changes require super admin privileges
to_bytes / from_bytes
Preconfigured Policies
PreconfiguredPolicies Enum
to_policy_set
from_policy_set
All Members (Default)
The default preconfigured policy allows broad member participation:| Action | Policy |
|---|---|
| Add members | Allow (any member) |
| Remove members | Allow if admin or super admin |
| Update metadata (general) | Allow (any member) |
| Update disappearing messages | Allow if admin or super admin |
| Update protocol version | Allow if super admin |
| Add admin | Allow if super admin |
| Remove admin | Allow if super admin |
| Update permissions | Allow if super admin |
Admin Only
The admin-only policy restricts most actions to admins:| Action | Policy |
|---|---|
| Add members | Allow if admin or super admin |
| Remove members | Allow if admin or super admin |
| Update metadata (all fields) | Allow if admin or super admin |
| Update protocol version | Allow if super admin |
| Add admin | Allow if super admin |
| Remove admin | Allow if super admin |
| Update permissions | Allow if super admin |
Membership Policies
MembershipPolicies Enum
Factory Methods
BasePolicies
- Allow - Allow unconditionally
- Deny - Deny unconditionally
- AllowSameMember - Allow if change applies to actor’s own installations
- AllowIfAdminOrSuperAdmin - Allow if actor is admin or super admin
- AllowIfSuperAdmin - Allow if actor is super admin
MembershipPolicy Trait
Metadata Policies
MetadataPolicies Enum
Factory Methods
default_map
MessageDisappearInNSandMessageDisappearFromNSdefault to admin-onlyMinimumSupportedProtocolVersiondefaults to super-admin-only- Other fields use the provided policy
MetadataBasePolicies
MetadataPolicy Trait
Permissions Policies
PermissionsPolicies Enum
Factory Methods
PermissionsBasePolicies
PermissionsPolicy Trait
Composite Policies
AndCondition
Evaluates totrue if all contained policies evaluate to true.
AnyCondition
Evaluates totrue if any contained policy evaluates to true.
GroupMutablePermissions
Wrapper struct for storing permissions as an MLS extension.Methods
new
preconfigured_policy
Conversions
Helper Function
Admin Roles
Admin
- Can perform actions allowed by admin-or-super-admin policies
- Cannot modify super admins
- Cannot change permission policies
Super Admin
- Can perform all admin actions
- Can add/remove other super admins (but not the last one)
- Can add/remove regular admins
- Can change permission policies
- Automatically set as the group creator
- Cannot be removed from the group (must remain at least one)
- Cannot leave the group (must be demoted first)
Unrecognized Metadata Fields
When evaluating metadata changes for fields without explicit policies:- Fields starting with
_(super admin prefix): Require super admin - All other fields: Require admin or super admin
Error Handling
PolicyError
GroupMutablePermissionsError
Usage Examples
Creating a Custom Policy
Using Preconfigured Policies
Extracting Permissions from a Group
Source References
- PolicySet:
crates/xmtp_mls/src/groups/group_permissions.rs:884 - Preconfigured Policies:
crates/xmtp_mls/src/groups/group_permissions.rs:1311 - Membership Policies:
crates/xmtp_mls/src/groups/group_permissions.rs:670 - Metadata Policies:
crates/xmtp_mls/src/groups/group_permissions.rs:173 - Permissions Policies:
crates/xmtp_mls/src/groups/group_permissions.rs:430
