Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Version History

« Previous Version 24 Next »

OVERVIEW

This specification outlines how to achieve the “channel moderation” feature in Mattermost. Channel moderation provides system administrators with toggles to disable members and/or guest of a given channel from performing the following:

  • creating posts

  • adding and removing members

  • using channel mentions

GOALS

  1. Describe the backend architecture and required changes.

  2. Describe the webapp changes.

  3. Describe the mobile 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 permission

  • updates to the UI (webapp and mobile) to apply the new use_channel_mentions permission

Out:

  • CLI changes

  • chat-facing administration of channel moderation settings

  • plugin changes

  • feature tracking

BACKGROUND READING

  1. Channel Moderation Settings feature specification

  2. High fidelity designs

TERMINOLOGY

“channel moderation”: although this term is used throughout this document it may not end up being the customer-facing terminology as some find it confusing compared to an alternative 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 newly necessary term/concept because previously there was no ongoing inheritance-style relationship between schemes.

“channel mentions”: the at-mentions “@all”, “@here”, and “@channel”.

“channel scheme”: a Schemes record with a Type value of channel. It overrides the permissions for given channels much like a team scheme overrides the permissions for a given team.

“moderated permissions”: permissions listed in the document overview that may be restricted on the channel level.

SPECIFICATIONS

High-level Architecture

The channel moderation feature leverages the existing permissions system to create a channel scheme for each channel for which moderation is enabled. Channel moderation is considered enabled if the channel has been configured to have any of the moderated permissions be more restrictive at the channel level than is configured on the channel’s higher-scoped scheme.

The channel scheme causes permissions to be overridden and configurable for the channel. More technically, a record is created in the Schemes table with a Scope value channel. Three new Roles records are also created and their Name values used to set the new Schemes record’s DefaultChannelAdminRole, DefaultChannelUserRole, and DefaultChannelGuestRoles. The new Roles records initially copy their Permissions value from the higher-scoped scheme’s associated Roles records.

Guest and member Roles records' moderated permissions are then removed from the Permissions fields to further limit the permissions of the specific channel associated to the channel scheme.

If none of the moderated permissions are more restrictive than the higher-scoped scheme then the channel’s associated Schemes record is deleted and the channel members and guests automatically revert to using the permissions as configured on the higher-scoped scheme.

Relationship between a channel scheme and its higher-scoped scheme

Per the permissions system design, a channel scheme completely overrides all channel-scoped permissions on the associated channel(s). 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.

For example, say the higher-scoped scheme removes the “Archive Channels” permission (technically the delete_public_channel and delete_private_channel permissions). That permission is not configurable on the channel scheme given the current UI, so the system admin would not expect that permission to remain present for all channel that have moderation enabled, in spite of the fact that the permissions architecture would leave it present on the channel scheme by default. So we must have code that removes that permission from the channel scheme for all affected channels.


[vvv TBD vvv]

Since there is no “inheritance” as such between schemes, all channel-scoped permissions that are not modified by the channel moderation UI are 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 schemes, thus they’re the only permissions modifiable by channel moderation settings, and the only permissions that must be updated per changes to the higher-scoped scheme.

Question for dev: Instead of keeping the non-channel-moderated channel-scoped permissions synchronized between the higher-scoped scheme and the channel schemes could we change the core way the permissions system works to use the channel scheme for a set of permissions and the higher-scoped scheme for the rest?

The following actions 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 (if it has an associated team)

  • remove a channel-scoped permissions from a team scheme (if it has an associated team)

  • add a team to a team scheme

  • remove a team from a team scheme

  • delete a team scheme

  • create a team scheme (if it has an associated team)


Question for Platform team: Is this synchronization compatible with the plan for the future custom roles?

[^^^ TBD ^^^]


Permissions

New permission:

use_channel_mentions

Guest role permissions modified by channel moderation:

add_reaction/remove_reaction
create_post
use_channel_mentions

Member role permissions modified by channel moderation:

add_reaction/remove_reaction
create_post
manage_public_channel_members/manage_private_channel_members
use_channel_mentions

Guest, member, and channel admin role channel-scoped permissions that must be read from (or replicated from) the higher-scoped scheme:

create_post_public
create_post_ephemeral
delete_post/delete_others_posts
edit_post/edit_others_posts
manage_channel_roles
manage_public_channel_properties/manage_private_channel_properties
delete_public_channel/delete_private_channel
read_channel
remove_others_reactions
upload_file

Question for PM: Do we need to expose create_post and use_channel_mentions in the system and team schemes UI?

Schema

No schema changes.

REST API

[{
        "name": "create_post",
        "roles": {
            "guests": {
                "value": false,
                "enabled": true
            },
            "members": {
                "value": false,
                "enabled": true
            }
        }
    },
    {
        "name": "post_reactions",
        "roles": {
            "guests": {
                "value": false,
                "enabled": false
            },
            "members": {
                "value": true,
                "enabled": true
            }
        }
    },
    {
        "name": "manage_members",
        "roles": {
            "members": {
                "value": true,
                "enabled": true
            }
        }
    }, {
        "name": "use_channel_mentions",
        "roles": {
            "guests": {
                "value": false,
                "enabled": true
            },
            "members": {
                "value": true,
                "enabled": true
            }
        }
    }
]
  • A new endpoint to update the channel moderation configuration. For example, to re-add the ability for only members to create posts the API endpoint POST /api/v4/channels/:channel_id/moderations would receive:

[{
    "name": "create_post",
    "roles": {
        "members": true
    }
}]
  • Update the create post flow (for example in mattermost-server/app/notifications.go) to restrict access to channel mention notifications to those with the use_channel_mentions permission.

CLI

Out of scope.

Configuration

None.

Webapp only

Mobile and Webapp

  • Prevent posting based on the create_post permissions.

  • Preventing access to channel mentions based on the use_channel_mentions permission.

Performance


[vvv TBD vvv]

The synchronization of permissions (as described above) will cause a performance performance degradation when updating channel-scoped permissions on the system scheme or on team schemes.

[^^^ TBD ^^^]


Plugins

Out of scope.

CREDITS

Give credit here to anyone who helped you write the spec or provided feedback to improve it.

  • No labels