OVERVIEW
This specification outlines how to achieve the “channel moderation” feature in Mattermost. Channel moderation provides system admins—and in future channel admins—with toggles to enable and disable various channel-level features including:
Making a channel “read-only” (or the inverse, enabling posting) for members and guests
Allowing or disallowing members and guest from adding and removing other members
Allowing or disallowing members and guests from using channel mentions (@all, @channel, @here)
GOALS
Describe the backend architecture and required changes.
Describe the webapp changes.
Describe the mobile (React Native) app changes.
SCOPE
In:
exposing channel moderation in the system console in the channel details view
updates to the UI (webapp and mobile) to apply the
create_post
permissionupdates to the UI (webapp and mobile) to apply the new
use_channel_mentions
permission
Out:
CLI changes
chat-facing administration of channel moderation settings
BACKGROUND READING
TERMINOLOGY
“channel moderation”: although this term is used throughout this document it may not end up being the customer-facing terminology used as some find it confusing vs something that describes that permissions are being overridden.
“higher-scoped scheme”: the system scheme or team scheme from which the channel derives all of its permissions in the absence of a channel scheme. This is a necessary concept because previously there was no ongoing “inheritance”-style relationship between schemes.
SPECIFICATIONS
High-level Architecture
The Channel Moderation feature leverages the existing permissions system to create a channel scheme for each channel for which channel moderation is enabled.
Enabling moderation for a given channel creates a record in the Schemes
table with a Scope
value channel
. It also creates two new Roles
records. The new Roles
records initially copy their Permissions
value from the higher-scoped scheme.
A set of the permissions associated to the new channel scheme’s guest and member can subsequently be edited to provide users with those roles in that channel different permissions—in the context of the channel—than the configured on the higher-scoped schemes.
If moderation is disabled, the channel the Schemes
record is deleted and the channel members and guests automatically revert having the permissions as configured on the higher-scoped scheme.
Pseudo-relationship between channel schemes its higher-scoped scheme
Per the permissions system design a channel scheme completely overrides all channel-scoped permissions for the given channel. This means that if there are permissions that are not exposed by channel moderation, admins will expect those permissions to be configured as per the higher-scoped scheme—lest permissions be overridden behind the scenes on the channel scheme without the knowledge of admins. Since there is no “inheritance” as such between the schemes, all channel-scoped permissions that are not modified by the channel moderation UI must be updated on the channel scheme upon each change to the higher-scoped scheme.
Channel-scoped permissions are the only type of permissions that can be used by channel-scoped schemes and thus they’re the only ones modifiable by channel moderation settings and also the only ones that must be updated per changes to the higher-scoped scheme.
Actions that trigger synchronization of permissions from high-scoped schemes to channel schemes:
Updates to all channel schemes:
add a channel-scoped permission to the system scheme
remove a channel-scoped permission from the system scheme
Updates to all of the channel schemes for a given team:
add a channel-scoped permission to a team scheme with an associated team
remove a channel-scoped permissions from a team scheme with an associated team
add a team to a team scheme
remove a team from a team scheme
Question: Is updating permissions from higher-scoped schemes' roles to channel schemes' roles compatible and feasible with the future custom roles feature?
Permissions
New permission:
A new permission named use_channel_mentions
has been created, without which users are not able to use @all, @channel, and @here.
Guest role permissions modified by channel moderation:
edit_post
delete_post
add_reaction
/remove_reaction
create_post
use_channel_mentions
Member role permissions modified by channel moderation:
manage_public_channel_members
/manage_private_channel_members
edit_post
edit_others_posts
delete_post
delete_others_posts
add_reaction
/remove_reaction
create_post
use_channel_mentions
All other channel-scoped permissions on channel schemes' associated Roles
records are kept synchronized with their higher-scoped scheme (some are not exposed via the UI but they will be synchronized none-the-less to maintain parity with the API rather than a single client’s UI):
manage_public_channel_properties
manage_private_channel_properties
delete_public_channel
delete_private_channel
remove_others_reactions
upload_file
create_post_public
create_post_ephemeral
manage_channel_roles
read_channel
Question: Do we need to expose create_post
and use_channel_mentions
in the system and team schemes UI?
Schema
There are no schema changes.
REST API
When “enable channel moderation” (wording as per design) is toggled on, a POST
request is made to the existing API endpoint /api/v4/schemes
to create the channel scheme.
The new Roles
records that are created will be updated to match the Permissions
value from the higher-scoped scheme. Question: does it already copy the permissions from the previous scheme? If so then no update is required. If not can we consider making that a permanent part of the create team and channel scheme API behaviour, avoiding a separate update?
When “enable channel moderation” toggled off, a DELETE
request is made to /api/v4/schemes/:scheme_id
.
Question: Does the delete scheme API endpoint cleanup orphaned Roles
records? If not does it make sense to make that a permanent part of the API behaviour?
The ability to send @here, @all, and @channel must have access controlled by the new use_channel_mentions
permission.
CLI
Out of scope.
Configuration
None needed. Question: will channel moderation be experimental?
Frontend
Design of channel moderation UI in the system console TBD.
Preventing posting based on permissions (rather than it currently being prevented based on the experimental read-only town square feature) must be implemented throughout the UI.
Preventing access to @here, @all, @channel must be controlled by the new
use_channel_mentions
permission.
Mobile
Preventing posting based on permissions (rather than it currently being prevented based on the experimental read-only town square feature) must be implemented throughout the UI.
Preventing access to @here, @all, @channel must be controlled by the new
use_channel_mentions
permission.
Performance
If the synchronization of permissions (as described above) occur synchronously then those actions will incur a performance degradation.
If the actions occur asynchronously—say in a background job—then the actions will not incur a performance degradation, but at the cost of added complexity.
Plugins
TBD
CREDITS
Give credit here to anyone who helped you write the spec or provided feedback to improve it.