<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-mimi-room-policy-02" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="MIMI Room Policy">Room Policy for the More Instant Messaging Interoperability (MIMI) Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-mimi-room-policy-02"/>
    <author fullname="Rohan Mahy">
      <organization>Rohan Mahy Consulting Services</organization>
      <address>
        <email>rohan.ietf@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="October" day="20"/>
    <area>Applications and Real-Time</area>
    <workgroup>More Instant Messaging Interoperability</workgroup>
    <keyword>room policy</keyword>
    <abstract>
      <?line 34?>

<t>This document describes a set of concrete room policies for the
More Instant Messaging Interoperability (MIMI) Working Group. It describes
several independent properties and policy attributes which can be combined
to model a wide range of chat and multimedia conference types.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ietf-wg-mimi.github.io/mimi-room-policy/draft-ietf-mimi-room-policy.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-mimi-room-policy/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        More Instant Messaging Interoperability Working Group mailing list (<eref target="mailto:mimi@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/mimi/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/mimi/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-mimi/mimi-room-policy"/>.</t>
    </note>
  </front>
  <middle>
    <?line 41?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The MIMI architecture <xref target="I-D.ietf-mimi-arch"/> describes how each room
has an associated policy. Providers offer a "policy envelope"
of supported and allowed policy settings, from which the creator of a room
selects a specific room policy. The room policy might further allow
individual participants to make specific choices (for example, allowing
but not requiring read-message notifications), while constraining other
choices (for example, prohibiting self-deleting messages). Individual
users can examine the room policy to determine if it is consistent with
policies they accept either before or immediately on joining a room.
<xref section="4.4" sectionFormat="of" target="I-D.ietf-mimi-arch"/></t>
      <t>Making rooms interoperable across existing clients is challenging, as rooms
and clients can support different policies and capabilities across vendors
and providers. Our goal is to balance the policy and authorization goals of
the room with the policy and authorization goals of the end user, so we can support a broad range of vendors and providers.</t>
      <t>Each room is owned by one provider at a time. The owning provider controls the range of acceptable policies. The user responsible for the room can further choose among the acceptable policies. Users (regardless if on other providers) can either accept the policies of the room or not.</t>
      <t>However we want to make it as easy as possible for clients from other providers to comply with the room policy primitives without enumerating specific features or requiring all clients implementations to present an identical user experience. An important aspect of this is the system of configurable Role-based access control with granular capabilities per role (described in <xref target="roles"/>).
Each user in the participant list (defined in <xref target="I-D.ietf-mimi-protocol"/>) has
exactly one role. By virtue of a user's credential, a user might also be
<em>preauthorized</em> with a specific role as described in <xref target="preauthorized-users"/>.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t><strong>Room ID</strong>:
An identifier which uniquely identifies a room.</t>
      <t><strong>User ID</strong>:
An internal identifier which uniquely identifies a user.</t>
      <t><strong>Nickname</strong>:
The identifier by which a user is referred inside a room. Depending on the context it may be a display name, handle, pseudonym, or temporary identifier. The nickname in one room need not correlate with the nickname for the same user in a different room.</t>
      <t><strong>Client ID</strong>:
An internal identifier which uniquely identifies one client/device instance of one user account.</t>
      <t><strong>Persistent vs. Temporary rooms</strong>:
A temporary room is no longer joinable once the last participant exits whereas a persistent room is not destroyed when the last participant exist. As MLS has no notion of a group with no members, a persistent room could consist of a sequence of distinct MLS groups, zero or one of which would exist at a time.</t>
      <section anchor="moderation-terms">
        <name>Moderation Terms</name>
        <t><strong>Knock</strong>:
To request entry into a room.</t>
        <t><strong>Ban</strong>:
To remove a user from a room such that the user is not allowed to re-enter the room (until and unless the ban has been removed). It is distinct from merely removing a user from a room.</t>
        <t><strong>Kick</strong>:
To temporarily remove a participant's clients from a room. The user is allowed to re-enter the room at any time.</t>
        <t><strong>Voice (noun)</strong>:
The privilege to send messages in a room.</t>
        <t><strong>Revoke Voice</strong>:
To remove the permission to send messages in a room.</t>
        <t><strong>Grant Voice</strong>:
To grant the permission to send messages in a room.</t>
      </section>
      <section anchor="room-capabilities">
        <name>Room Capabilities</name>
        <t><strong>Membership-Approach</strong>:
The overall approach of membership authorization in a room, which could be open, members-only (administrated), fixed-membership, or parent-dependent.</t>
        <ul spacing="normal">
          <li>
            <t><strong>Open room</strong>: Typically an open room can be joined by any non-banned user. It can be represented solely by a permissive set of roles as defined in <xref target="roles"/>.</t>
          </li>
          <li>
            <t><strong>Members-Only room</strong>: A members-only room can only be joined by a user in the particpant list, or who is pre-authorized. Authorized users can add or remove users to the room. In an enterprise context, it is also common (but not required) for users from a particular domain, group, or workgroup to be pre-authorized to add themselves to a Members-Only room. It can be represented solely by a set of less permissive roles as defined in <xref target="roles"/>.</t>
          </li>
          <li>
            <t><strong>Fixed-Membership room</strong>: Fixed-membership rooms have the list of participants specified when they are created. Other users cannot be added. Ordinary users cannot leave or be removed, however a user can remove all its clients from the associated MLS group. The most common case of a fixed-membership room is a 1:1 conversation. This room membership style is used to implement Direct Message (DM) and Group DM features. Only a single fixed-membership room can exist for any unique set of participants.</t>
          </li>
          <li>
            <t><strong>Parent-dependent room</strong>: In a parent-dependent room, the list participants of the room must be a strict subset of the participants of the parent room. If a user leaves or is removed from the parent room, that user is automatically removed from any parent-dependent rooms of that parent.</t>
          </li>
        </ul>
        <!--
Multi-device vs. Single-device:
A multi-device room can have multiple simultaneous clients of the same user as participants in the room. A single-device room can have a maximum of one client per user in the room at any moment.

Knock-Enabled vs. Knock-Disabled:
In a knock-enabled room, non-banned users are allowed to programmatically request entry into the room. In a knock-disabled room this functionality is disabled.
-->

</section>
    </section>
    <section anchor="roles">
      <name>Role-Based Access Control</name>
      <t>The Role-Based Access Control component contains a list of all the roles in the room, and the capabilities associated with them.
It contains a <tt>role_index</tt>, which is used to refer to the role elsewhere. (Note that role indexes might not be contiguous.)
The <tt>role_index</tt> zero is reserved to refer to a participant that does not (yet) or no longer appears (or will no longer appear) in the participant list.</t>
      <t>The component also contains a <tt>role_name</tt> (a human-readable text string name for the
role), and a <tt>role_description</tt> (another string, which can have zero length).</t>
      <t>Each Role also can contain constraints on the minimum and maximum number of participants, and the minimum and maximum number of active participants.
If the minimum number is zero, there is no minimum number of participants for that particular role.
If there is no maximum number of participants for a particular role, that parameter is absent.</t>
      <ul empty="true">
        <li>
          <t>If the maximum number of active participants is zero, then no participants are allowed to have clients in the room's MLS group.</t>
        </li>
      </ul>
      <t>The <tt>authorized_role_changes</tt> field is used to provide fine-grained control about which transitions are allowed when adding and removing participants and when moving participants to new roles, including banning/unbanning, and promoting/demoting to or from roles with moderator or administrator privileges.
A more detailed discussion is in the description of the specific capabilities in the next section.</t>
      <ul empty="true">
        <li>
          <t>This design results in each participant only having a single role at a time, with a single list of capabilities and an explicit list of allowed role transitions. It makes the authorization process for a verifier consistent regardless of the complexity of the set of authorization rules.</t>
        </li>
      </ul>
      <t>Some examples are provided in <xref target="role-examples"/>.</t>
      <t>RoleData is the format of the <tt>data</tt> field inside the ComponentData struct for the Role-Based Access Control component in the <tt>app_data_dictionary</tt> GroupContext extension defined in <xref target="I-D.ietf-mls-extensions"/>.</t>
      <sourcecode type="tls-presentation"><![CDATA[
/* See MIMI Capability Types IANA registry */
uint16 CapablityType;

struct {
   uint32 from_role_index;
   uint32 target_role_indexes<V>;
} SingleSourceRoleChangeTargets;

struct {
  uint32 role_index;
  opaque role_name<V>;
  opaque role_description<V>;
  CapabilityType role_capabilities<V>;
  uint32 minimum_participants_constraint;
  optional uint32 maximum_participants_constraint;
  uint32 minimum_active_participants_constraint;
  optional uint32 maximum_active_participants_constraint;
  SingleSourceRoleChangeTargets authorized_role_changes<V>;
} Role;

struct {
  Role roles<V>;
} RoleData;

RoleData RoleUpdate;
]]></sourcecode>
      <t>RoleUpdate (which has the same format as RoleData) is the format of the <tt>update</tt> field inside the AppDataUpdate struct in an AppDataUpdate Proposal for the Role-Based Access Control component.
If the contents of the <tt>update</tt> field are valid and if the proposer is authorized to generate such an update, the value of the <tt>update</tt> field completely replaces the value of the <tt>data</tt> field.</t>
      <ul empty="true">
        <li>
          <t>Note that in the MIMI environment, changing the definitions of roles is anticipated to be very rare over the lifetime of a room (for example changing a room which has grown dramatically from cooperatively managed by all participants to explicitly moderated or administered).</t>
        </li>
      </ul>
      <t>Changing Role definitions is sufficiently disruptive, that an update to this component is not valid if it appear in the same commit as any Participant List change.</t>
    </section>
    <section anchor="preauthorized-users">
      <name>Preauthorized Users</name>
      <t>Preauthorized users are MIMI users and external senders that have authorization to adopt a role in a room by virtue of certain credential claims or properties, as opposed to being individually enumerated in the participant list.
For example, a room for employee benefits might be available to join with the regular participant role to all full-time employees with a residence in a specific country; while anyone working in the human resources department might be able to join the same room as a moderator.
This data structure is consulted in two situations: for external joins (external commits) and external proposals when the requester does not already appear in the participant list; and separately when an existing participant explicitly tries to change its <em>own</em> role.</t>
      <ul empty="true">
        <li>
          <t>Only consulting Preauthorized users in these cases prevents several attacks. For example, it prevents an explicitly banned user from rejoining a group based on a preauthorization.</t>
        </li>
      </ul>
      <t>PreAuthData is the format of the <tt>data</tt> field inside the ComponentData struct for the Preauthorized Participants component in the <tt>application_data</tt> GroupContext extension.</t>
      <t>The individual <tt>PreAuthRoleEntry</tt> rules in <tt>PreAuthData</tt> are consulted one at a time.
A <tt>PreAuthRoleEntry</tt> matches for a requester when every <tt>Claim.claim_id</tt> has a corresponding claim in the requester's MLS Credential which exactly matches the corresponding <tt>claim_value</tt>.
When the rules in a Preauthorized users struct match multiple roles, the requesting client receives the first role which matches its claims.</t>
      <sourcecode type="tls-presentation"><![CDATA[
struct {
  /* MLS Credential Type of the "claim"  */
  CredentialType credential_type;
  /* the binary representation of an X.509 OID, a JWT claim name  */
  /* string, or the CBOR map claim key in a CWT (an int or tstr)  */
  opaque id<V>;
} ClaimId;

struct {
  ClaimId claim_id;
  opaque claim_value<V>;
} Claim;

struct {
  /* when all claims in the claimset are satisfied, the claimset */
  */ is satisfied */
  Claim claimset<V>;
  Role target_role;
} PreAuthRoleEntry;

struct {
  PreAuthRoleEntry preauthorized_entries<V>;
} PreAuthData;

PreAuthData PreAuthUpdate;
]]></sourcecode>
      <!--
struct {
  select (Credential.credential_type) {
    case basic:
        struct {}; /* only identity */
    case x509:
        /* ex: subjectAltName (2.5.29.17) = hex 06 03 55 1d 1e */
        opaque oid<V>;
        /* for sequence or set types, the specific item (1-based) */
        /* in the collection. zero means any item in a collection */
        uint8 ordinal;
    case jwt:
        opaque json_path<V>;
    case cwt:
        CborKeyNameOrArrayIndex cbor_path<V>;
  };
} Claim;

struct {
    /* a CBOR CDE encoded integer, tstr, bstr, or tagged version of */
    /* any of those map key types. Ex: -1 = 0x20, "hi" = 0x626869,  */
    /* 1(3600) = 0xC1190E10 */
    opaque cbor_encoded_claim<V>;
    optional uint array_index;
} CborKeyNameOrArrayIndex;
-->

<t>PreAuthUpdate (which has the same format as PreAuthData) is the format of the <tt>update</tt> field inside the AppDataUpdate struct in an AppDataUpdate Proposal for the Preauthorized Participants component.
If the contents of the <tt>update</tt> field are valid and if the proposer is authorized to generate such an update, the value of the <tt>update</tt> field completely replaces the value of the <tt>data</tt> field.</t>
      <ul empty="true">
        <li>
          <t>As with the definition of roles, in MIMI it is not expected that the definition of Preauthorized users would change frequently. Instead the claims in the underlying credentials would be modified without modifying the preauthorization policy.</t>
        </li>
      </ul>
      <t>Changing Preauthorized user definitions is sufficiently disruptive, that an update to this component is not valid if it appears in the same commit as any Participant List change, except for user removals.</t>
      <t>Because the Preauthorized users component usually authorizes non-members, it is also a natural choice for providing concrete authorization for policy enforcing systems incorporated into or which run in coordination with the MIMI Hub provider or specific MLS Distribution Services. For example, a preauthorized role could allow the Hub to remove participants and to ban them, but not to add any users or devices. This unifies the authorization model for members and non-members.</t>
    </section>
    <section anchor="base-room-policy-format-syntax">
      <name>Base Room policy format syntax</name>
      <section anchor="membership-related-policy">
        <name>Membership-related policy</name>
        <ul empty="true">
          <li>
            <t><strong>TODO</strong>: refactor membership_style to be constraints to the role-based access control system</t>
          </li>
        </ul>
        <t>The <tt>membership_style</tt> of a room can express some additional constraints on
membership transitions in a room. It can have one of the following values:</t>
        <ul spacing="normal">
          <li>
            <t>ordinary (default)</t>
          </li>
          <li>
            <t>fixed-membership</t>
          </li>
          <li>
            <t>parent-dependent</t>
          </li>
        </ul>
        <artwork><![CDATA[
enum {
  reserved(0)
  ordinary(1),
  fixed-membership(2),
  parent-dependent(3),
  (255)
} MembershipStyle;
]]></artwork>
        <t>An ordinary room has no constraints beyond those of the role-based access control system.
A fixed-membership room (which can be used for DMs or Group DMs) has a participant list set once at creation time that cannot be added to.
A parent-dependent room always has a strict subset of the participants of its parent room.
A parent-dependent room is always hosted on the same Hub as the parent room.</t>
        <t>If the membership_style is <tt>parent-dependent</tt> the <tt>parent_room_uri</tt> <bcp14>MUST</bcp14> be set with the room ID of the parent.
Otherwise the field is zero-length.</t>
        <t>If <tt>multi_device</tt> is true (the default), the MLS group may contain multiple clients per user.
If false only a single client can be an MLS member at one time.</t>
        <!--If `knock_allowed` is true, a non-participant can send a knock requesting access to the target room. If false, a user cannot. This option can only be enabled if the membership_style is members-only. The default is false.
-->

<artwork><![CDATA[
enum {
  false(0),
  true(1)
} bool;

struct {
  MembershipStyle membership_style;
  Uri parent_room_uri<V>;
  bool multi_device;
  bool persistent_room;
  ...
} BaseRoomPolicy;
]]></artwork>
        <t>If persistent_room is false, the room will be automatically inaccsessible when the corresponding MLS group is destroyed (when there are no clients in the group).
If persistent_room is true, the room policy will remain and a client whose user has appropriate authorization can create a new MLS group for the same room.</t>
      </section>
      <section anchor="delivery-and-read-notifications-pseudonyms">
        <name>Delivery and Read notifications, Pseudonyms</name>
        <artwork><![CDATA[
enum {
  optional(0),
  required(1),
  forbidden(2)
} Optionality;

struct {
  ...
  Optionality delivery_notifications;
  Optionality read_receipts;
  bool pseudonymous_ids;
  ...
} RoomPolicy;
]]></artwork>
        <t>The delivery_notifications value can be set to "forbidden", "optional", or "required". If the value is set to "optional", the client uses its local configuration to determine if it should send delivery notifications in the group.</t>
        <t>The read_receipts value can be set to "forbidden", "optional", or "required". If the value is set to "optional", the client uses its local configuration to determine if it should send read receipts in the group.</t>
        <t>The format for delivery notifications and read receipts is described in Section 5.12 of <xref target="I-D.ietf-mimi-content"/>.</t>
        <t>If pseudonymous_ids is true, clients in the MLS group are free to use pseudonymous identifiers in their MLS credentials. Otherwise the policy of the room is that "real" long-term identifiers are required in MLS credentials in the room's corresponding MLS group.</t>
      </section>
      <section anchor="link-logging-history-and-bot-policies">
        <name>Link, Logging, History, and Bot policies</name>
        <sourcecode type="tls"><![CDATA[
struct {
  bool on_request;
  Uri join_link;
  bool multiuser;
  uint32 expiration;
  Uri link_requests;
} LinkPolicy;

enum {
  direct(0),
  hubProxy(1),
  ohttp(2),
  (255)
} DownloadPrivacyType;

enum {
  unspecified(0),
  localProvider(1),
  hub(2),
  (255)
} AssetUploadLocation;

struct {
  DownloadPrivacyType allowed_download_types<V>;
  DownloadPrivacyType forbidden_download_types<V>;
  DownloadPrivacyType default_download_type;
} DownloadPrivacy;

struct {
  AssetUploadLocation asset_upload_location;
  opaque upload_domain<V>;
  DownloadPrivacy download_privacy;
  uint64 max_image;
  uint64 max_audio;
  uint64 max_video;
  uint64 max_attachment;
} AssetPolicy;

struct {
  Optionality logging;
  Uri logging_clients<V>;
  Uri machine_readable_policy;
  Uri human_readable_policy;
} LoggingPolicy;

struct {
  Optionality history_sharing;
  Role who_can_share<V>;
  bool automatically_share;
  uint32 max_time_period;
} HistoryPolicy;

struct {
  opaque name<V>;
  opaque description<V>;
  Uri homepage;
  Role bot_role;
  bool can_read;
  bool can_write;
  bool can_target_message_in_group;
  bool per_user_content;
} Bot;

struct {
  ...
  bool discoverable;
  LinkPolicy link_policy;
  AssetPolicy asset_policy;
  LoggingPolicy logging_policy;
  HistoryPolicy history_sharing;
  Bot allowed_bots<V>;
  ...
} RoomPolicy;
]]></sourcecode>
      </section>
      <section anchor="link-policies">
        <name>Link policies</name>
        <t>If discoverable is true, the room is searchable. Presumably this means the the only way to join the room in a client user interface is to be added by an administrator or to use a joining link.
Inside the LinkPolicy are several fields that describe the behavior of links.If the on_request field is true, no joining link will be provided in the room policy; the client will need to fetch a joining link out-of-band or generate a valid one for itself. If present, the URI in link_requests can be used by the client to request an invite code. The value of join_link is empty and the other fields are ignored.If the on_request field is false, the join_link field will contain a joining link. If the link will work for multiple users, multiuser is true. The expiration field represents the time, in seconds after the start of the UNIX epoch (1-January-1970) when the link will expire. The link_requests field can be empty.</t>
      </section>
      <section anchor="asset-policies">
        <name>Asset policies</name>
        <t>Assets refer to attached files, images, audio files, and video files.</t>
      </section>
      <section anchor="logging-policies">
        <name>Logging policies</name>
        <t>Inside the LoggingPolicy, the logging field can be forbidden, optional, or required. If logging is forbidden then the other fields are empty. If logging is required, the list of logging_clients needs to contain at least one logging URI. Each provider should have no more than one logging client at a time in a room. The machine_readable_policy and human_readable_policy fields optionally contain pointers to the owning provider's machine readable and human readable logging policies, respectively. If logging is optional and there is at least one logging_client then logging is active for the room.</t>
      </section>
      <section anchor="chat-history-policies">
        <name>Chat history policies</name>
        <t>Inside the HistoryPolicy, if history_sharing is forbidden, this means that clients (including bots) are expected to not to share chat history with new joiners, in which case who_can_share is empty, automatically_share is false, and max_time_period is zero.
Otherwise who_can_share is a list of roles that are authorized to share history (for example, only admins and owners can share). The values of none and outcast cannot be used in who_can_share. If automatically_share is true, clients can share history with new joiners without user initiation. The history that is shared is limited to max_time_period seconds worth of history.</t>
      </section>
      <section anchor="chat-bot-policies">
        <name>Chat bot policies</name>
        <t>Inside the RoomPolicy there is a list of allowed_bots. Each of which has several fields. The name, description, and homepage are merely descriptive. The bot_role indicates if the chat bot would be treated as a system-user, owner, admin, regular_user, or visitor.
The can_read and can_write fields indicate if the chat bot is allowed to read messages or send messages in the MLS group, respectively. If can_target_message_in_group is true it indicates that the chat bot can send an MLS targeted message (see Section 2.2 of <xref target="I-D.ietf-mls-extensions"/>) or use a different conversation or out-of-band channel to send a message to specific individual users in the room. If per_user_content is true, the chat bot is allowed to send messages with distinct content to each member. (For example a poker bot could deal a different hand to each user in a chat).Users could set policies to reject or leave groups with bots rights that are inconsistent with the user's privacy goals.</t>
      </section>
    </section>
    <section anchor="operational-policy">
      <name>Operational policy</name>
      <t>Section 7 of the <xref target="RFC9750"/> defines a set of operational
policy considerations that influence interoperability of MLS clients. MIMI
explicitly address a handful of the issues in the document by taking a position on ordering (Proposals referenced in a Commit need to be received before the Commit; the Commit entering a new epoch needs to be received before any other messages in that epoch), privacy of handshake messages (handshakes can be a PublicMessage or SemiPrivateMessage), and GroupInfo storage (committers need to provide a valid GroupInfo to the Hub). The rest of these issues are described here. Just because a topic is listed does not mean that a room needs to take a position; nor different rooms on a Hub need to have different policies for these items.</t>
      <section anchor="some-mls-related-policy-that-could-be-tied-to-a-room">
        <name>Some MLS-related policy that could be tied to a room</name>
        <ul spacing="normal">
          <li>
            <t>any mandatory or forbidden MLS extensions.</t>
          </li>
          <li>
            <t>which proposals are valid to have in a commit, including but not limited to:
            </t>
            <ul spacing="normal">
              <li>
                <t>when, and under what circumstances, a reinitialization proposal is allowed.</t>
              </li>
              <li>
                <t>when proposals from external senders are allowed and how to authorize those proposals.</t>
              </li>
              <li>
                <t>when external joiners are allowed and how to authorize those external commits.</t>
              </li>
              <li>
                <t>which other proposal types are allowed.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>when members should commit pending proposals in a group.</t>
          </li>
          <li>
            <t>when two credentials represent the same client.</t>
          </li>
          <li>
            <t>how long to allow a member to stay in a group without updating its leaf keys before removing them.</t>
          </li>
          <li>
            <t>When and how to pad messages.</t>
          </li>
          <li>
            <t>When to send a reinitialization proposal.</t>
          </li>
          <li>
            <t>How often clients should update their leaf keys.</t>
          </li>
          <li>
            <t>Whether to prefer sending full commits or partial/empty commits.</t>
          </li>
          <li>
            <t>Whether there should be a required_capabilities extension in groups.</t>
          </li>
          <li>
            <t>minimum and maximum lifetime of KeyPackages</t>
          </li>
          <li>
            <t>if last resort KeyPackages are allowed</t>
          </li>
          <li>
            <t>how long to store resumption PSK (how much time and how many epochs)</t>
          </li>
          <li>
            <t>minimum and maximum number past epochs to keep</t>
          </li>
          <li>
            <t>how long to keep unused nonce and key pairs for a sender</t>
          </li>
          <li>
            <t>maximum number of unused key pairs to keep</t>
          </li>
          <li>
            <t>maximum number of steps that clients will move a secret tree ratchet forward in response to a single message before rejecting it</t>
          </li>
          <li>
            <t>tolerance to out of order app messages</t>
          </li>
          <li>
            <t>tolerance to out of order handshake messages</t>
          </li>
          <li>
            <t>handshakes may be which of PublicMessage, PrivateMessage, or SemiPrivateMessage.</t>
          </li>
          <li>
            <t>if external joiners are allowed</t>
          </li>
          <li>
            <t>if external proposals are allowed
            </t>
            <ul spacing="normal">
              <li>
                <t>if so, who can submit</t>
              </li>
              <li>
                <t>which member(s) are responsible for submitting pending proposals</t>
              </li>
            </ul>
          </li>
          <li>
            <t>how a joiner gets access to the ratchet_tree</t>
          </li>
        </ul>
        <t>The structure below describes provides a way to describe many of these parameters.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  ProtocolVersion versions<V>;
  CipherSuite cipher_suites<V>;
  ExtensionType extensions<V>;
  ProposalType proposals<V>;
  CredentialType credentials<V>;
  WireFormats wire_formats<V>;
  ComponentID component_ids<V>;
  ComponentID safe_aad_types<V>;
  MediaType media_types<V>;
  ContentType content_types<V>;
} ExtendedCapabilities;

enum {
  unspecified(0),
  immediateCommit(1),
  randomDelay(2),
  preferenceWheel(3),
  designatedCommitter(4),
  (255)
} PendingProposalStrategy;

struct {
  PendingProposalStrategy pending_proposal_strategy;
  uint64 minimumDelayMs;
  uint64 maximumDelayMs;
} PendingProposalPolicy;

struct {
  uint64 minimumTime;
  uint64 defaultTime;
  uint64 maximumTime;
} MinDefaultMaxTime;


struct {
  uint8  epoch_tolerance;
  uint16 pad_to_size;
  uint32 max_generations_skipahead;
} AppMessagePolicy;

struct {
  ExtendedCapabilities mandatory_capabilities;
  ExtendedCapabilities default_capabilities;
  ExtendedCapabilities forbidden_capabilities;
  WireFormats handshake_formats<V>;
  bool external_proposal_allowed;
  bool external_commit_allowed;
  PendingProposalPolicy pending_proposal_policy;
  MinDefaultMaxTime LeafNode_update_time;
  AppMessagePolicy app_message_policy;
  unit64 max_kp_lifetime;
  uint64 max_credential_lifetime;
  uint64 resumption_psk_lifetime;
  MinDefaultMaxTime sender_nonce_keypair_lifetime;
  uint32 max_keypairs;
  MinDefaultMaxTime buffer_incoming_message_time;
  uint32 max_buffered_messages;
} OperationalParameters;
]]></sourcecode>
      </section>
      <section anchor="not-relevant-to-mimi-between-client-and-its-provider">
        <name>Not relevant to MIMI (between client and its provider)</name>
        <ul spacing="normal">
          <li>
            <t>how many KPs to keep active</t>
          </li>
          <li>
            <t>how group IDs are constructed</t>
          </li>
        </ul>
      </section>
      <section anchor="areas-for-future-works">
        <name>Areas for future works</name>
        <t>How to protect and share the GroupInfo objects needed for external joins.</t>
        <t>If an application wishes to detect and possibly discipline members that send malformed commits with the intention of corrupting a group's state, there must be a method for reporting and validating malformed commits.
MLS requires the following parameters to be defined, which must be the same for two implementations to interoperate:</t>
        <t>Application-level identifiers of public key material (specifically the application_id extension as defined in Section 5.3.3 of [RFC9420]).</t>
      </section>
    </section>
    <section anchor="role-capabilities">
      <name>Role Capabilities</name>
      <t>As described in <xref target="roles"/>, each role has a list of capabilities, which in rare cases could be empty.
When we say that the holder of a capability can take some action, we mean that whatever entity is taking the action (a participant, a potential future participant, or an external party) has a specific entry in the Participant List struct and a corresponding role--or is preauthorized to take action with a specific role via the Preauthorized Users struct--and that the <tt>role_capabilities</tt> list contains the relevant capability.</t>
      <t>Unless otherwise specified, capabilities apply both to sending a set of consistent MLS proposals that could be committed by any member of the corresponding MLS group, and to sending an MLS commit containing a set of consistent MLS proposals.</t>
      <section anchor="membership-capabilities">
        <name>Membership Capabilities</name>
        <t>The membership capabilities below allow authorized holders to update the Participant list, or change the active participants (by removing and adding MLS clients corresponding to those participants), or both.</t>
        <ul spacing="normal">
          <li>
            <t><tt>canAddParticipant</tt> - the holder of this capability can add another user, that is not already in the participant list, to the participant list.
(This capability does not apply to the holder adding itself.)
The <tt>authorized_role_changes</tt> list in the holder's role is consulted to authorize the added user's target role.
The <tt>authorized_role_changes</tt> list <bcp14>MUST</bcp14> have an entry where the <tt>authorized_role_changes.from_role_index</tt> equals zero, and that entry's <tt>target_role_indexes</tt> list includes the target role.
The proposed action is only authorized if the action respects both the <tt>maximum_participants_constraint</tt> (if present) and <tt>maximum_active_participants_constraint</tt> (if present) for the added user's target role.
When the participant list addition for the target role is authorized, the holder is also authorized to add any MLS clients matching the added user to the room's MLS group .</t>
          </li>
          <li>
            <t><tt>canAddOwnClient</tt> - a holder of this capability that is in the participant list, can add its own client (via an external commit or external proposal); and can add other clients that share the same user identity (via Add proposals) if the holder's client is already a member of the corresponding MLS group.</t>
          </li>
          <li>
            <t><tt>canAddSelf</tt> - the holder of this capability can use an external commit or external proposal to add itself to the participant list.
(The holder <bcp14>MUST NOT</bcp14> already appear in the participant list).
Its usage differs slightly based on in which role it appears.
            </t>
            <ul spacing="normal">
              <li>
                <t>When <tt>canAddSelf</tt> appears on role zero, any user who is not already in the participant list can add itself, with certain provisions. The holder consults the <tt>authorized_role_changes</tt> list for an entry with <tt>from_role_index</tt> equal to zero. The holder can add itself with any non-zero <tt>target_role_indexes</tt> from that entry, if the action respects both the <tt>maximum_participants_constraint</tt> (if present) and <tt>maximum_active_participants_constraint</tt> (if present) for the added user's target role.</t>
              </li>
              <li>
                <t>When <tt>canAddSelf</tt> appears on a non-zero role, a client can only become the holder of this capability via the Preauthorized users mechanism.
The <tt>authorized_role_changes</tt> list in the target role <bcp14>MUST</bcp14> have an entry where the <tt>from_role_index</tt> is zero and the <tt>target_role_indexes</tt> contains the target role.
In addition, the action <bcp14>MUST</bcp14> respect both the <tt>maximum_participants_constraint</tt> (if present) and <tt>maximum_active_participants_constraint</tt> (if present) for the added user's target role.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>canUseJoinCode</tt> - the holder of this capability can externally join a room using a join code for that room, provided the join code is valid, the join code refers to a valid target role, and both the <tt>maximum_participants_constraint</tt> (if present) and <tt>maximum_active_participants_constraint</tt> (if present) constraints are respected.</t>
          </li>
          <li>
            <t><tt>canRemoveParticipant</tt> - the holder of this capability can propose a) the removal of another user (excluding itself) from the participant list, and b) removal of all of that user's clients, as a single action.
There <bcp14>MUST NOT</bcp14> be any clients of the removed user in the MLS group after the corresponding commit.
A proposer holding this capability consults its role's <tt>authorized_role_changes</tt> entries for an entry where <tt>from_role_index</tt> matches the target user's current role; if the <tt>target_role_indexes</tt> for that entry contains zero, and the <tt>minimum_participants_constraint</tt> and <tt>minimum_active_participants_constraint</tt> are satisfied, the proposal is authorized.</t>
          </li>
          <li>
            <t><tt>canRemoveOwnClient</tt> - the holder of this capability can propose to remove its own client using an MLS Remove or SelfRemove proposal without changing the Participant list.
Due to restrictions in MLS which insure the consistency of the group, this action cannot be committed by the leaving user.
If the <tt>minimum_active_participants_constraint</tt> is satisfied, the proposal is authorized.</t>
          </li>
          <li>
            <t><tt>canRemoveSelf</tt> - the holder of this capability can propose to remove itself from (i.e. leave) the participant list; it <bcp14>MUST</bcp14> simultaneously propose to remove all of its remaining clients from the corresponding MLS group.
Due to restrictions in MLS which insure the consistency of the group, this action cannot be committed by the leaving user.
A proposer holding this capability consults its role's <tt>authorized_role_changes</tt> entries for an entry where <tt>from_role_index</tt> matches its current role; if the <tt>target_role_indexes</tt> for that entry contains zero, and the <tt>minimum_participants_constraint</tt> and <tt>minimum_active_participants_constraint</tt> are satisfied, the proposal is authorized.</t>
          </li>
          <li>
            <t><tt>canKick</tt> - the holder of this capability can propose removal of another participant's clients, without changing the Participant List.
If the <tt>minimum_active_participants_constraint</tt> is satisfied, the proposal is authorized.</t>
          </li>
          <li>
            <t><tt>canChangeUserRole</tt> - the holder of this capability is authorized to change the role of another participant (but not itself), according to the holder's <tt>authorized_role_changes</tt> list, from a role represented by an entry where the target's current role matches <tt>from_role_index</tt> to any of the non-zero <tt>target_role_indexes</tt> in the same element of <tt>authorized_role_changes</tt>.
The <tt>minimum_participants_constraint</tt> and <tt>minimum_active_participants_constraint</tt> for the target user's current role, and the <tt>maximum_participants_constraint</tt> (if present) and <tt>maximum_active_participants_constraint</tt> (if present) for the target user's target role must also be satisfied.</t>
          </li>
          <li>
            <t><tt>canChangeOwnRole</tt> - the holder of this capability is authorized to change its own role to the first non-zero role it matches in the Preauthorized users component (see <xref target="preauthorized-users"/>).
The <tt>authorized_role_changes</tt> list is <em>not</em> consulted.
The <tt>minimum_participants_constraint</tt> and <tt>minimum_active_participants_constraint</tt> for the holder's original role, and the
<tt>maximum_participants_constraint</tt> (if present) and <tt>maximum_active_participants_constraint</tt> (if present) for the holder's target role must also be satisfied.</t>
          </li>
          <li>
            <t><tt>canBan</tt> - the holder of this capability can propose to "ban" another user.
Specifically, a successful ban changes the target user's role to a special "banned" role (if it exists), and removes all the banned user's clients.
The "banned" role always has <tt>role_index</tt> = 1 and <tt>role_name</tt> = "banned" (without quotes).  </t>
            <ul empty="true">
              <li>
                <t>A "banned" role does not have to exist in a room, but to use the <tt>canBan</tt> and <tt>canUnban</tt> capabilities, the role needs to exist exactly as described above.
While holding <tt>canChangeUserRole</tt> and <tt>canKick</tt> capabilities would allow the same action, it could potentially allow the holder other actions which might be undesirable in some contexts, such as kicking clients without banning.</t>
              </li>
            </ul>
            <t>
A proposer holding this capability consults its role's <tt>authorized_role_changes</tt> entries for an entry where <tt>from_role_index</tt> matches the target user's current role; if the <tt>target_role_indexes</tt> for that entry contains the <tt>role_index</tt> 1; that <tt>role_name</tt> = "banned" for the role with role_index = 1, and the <tt>minimum_participants_constraint</tt> and <tt>minimum_active_participants_constraint</tt> are satisfied, the proposal is authorized.</t>
          </li>
          <li>
            <t><tt>canUnban</tt> - the holder of this capability can propose to "unban" another user.
Specifically, a successful unban changes the target user's role from <tt>role_index</tt> = 1 to another non-zero <tt>role_index</tt> allowed by the holder's <tt>authorized_role_changes</tt> list.
Adding clients for that unbanned user is <em>not</em> authorized by this capability.
The authorization of this capability is identical to the <tt>canChangeUserRole</tt> capability, except that the <tt>from_role_index</tt> for the unbanned user <bcp14>MUST</bcp14> be 1, and the <tt>role_name</tt> of role 1 <bcp14>MUST</bcp14> be "banned".</t>
          </li>
        </ul>
      </section>
      <section anchor="adjust-metadata">
        <name>Adjust metadata</name>
        <t>The holder of each of the following capabilities is authorized to update the Room metadata defined in <xref target="I-D.ietf-mimi-protocol"/>, changing the relevant field:</t>
        <ul spacing="normal">
          <li>
            <t><tt>canChangeRoomName</tt></t>
          </li>
          <li>
            <t><tt>canChangeRoomDescription</tt></t>
          </li>
          <li>
            <t><tt>canChangeRoomAvatar</tt></t>
          </li>
          <li>
            <t><tt>canChangeRoomSubject</tt></t>
          </li>
          <li>
            <t><tt>canChangeRoomMood</tt></t>
          </li>
        </ul>
      </section>
      <section anchor="message-capabilities">
        <name>Message Capabilities</name>
        <t>The capabilities below refer to functionality related to the instant messages, for example sent using the MIMI content format <xref target="I-D.ietf-mimi-content"/>.</t>
        <ul spacing="normal">
          <li>
            <t><tt>canSendMessage</tt> - the holder can send instant messages to the room. Setting specific message fields may require additional capabilities.</t>
          </li>
          <li>
            <t><tt>canReceiveMessage</tt> - the holder can receive instant messages from the room.</t>
          </li>
          <li>
            <t><tt>canCopyMessage</tt> - the holder can copy content from a received instant
message.</t>
          </li>
          <li>
            <t><tt>canReportAbuse</tt> - the holder can report a franked instant message as abusive.</t>
          </li>
          <li>
            <t><tt>canReplyToMessage</tt> - the holder can send a message replying to another message.</t>
          </li>
          <li>
            <t><tt>canReactToMessage</tt> - the holder can send a reaction, replying to another message, and using the "reaction" disposition.</t>
          </li>
          <li>
            <t><tt>canDeleteOwnReaction</tt> - the holder can retract (unlike) it own previous reaction.</t>
          </li>
          <li>
            <t><tt>canDeleteOtherReaction</tt> - the holder can delete the reaction of another user's previous reaction</t>
          </li>
          <li>
            <t><tt>canEditOwnMessage</tt> - the holder can edit the content of one of its own previously sent messages</t>
          </li>
          <li>
            <t><tt>canDeleteOwnMessage</tt> - the holder can retract one of its own previously sent messages</t>
          </li>
          <li>
            <t><tt>canDeleteOtherMessage</tt> - the holder can retract messages for other users.</t>
          </li>
          <li>
            <t><tt>canStartTopic</tt> - the holder can set the topic for a message</t>
          </li>
          <li>
            <t><tt>canReplyInTopic</tt> - the holder can send a message replying to a previous message, using the same topic as the original sender.</t>
          </li>
          <li>
            <t><tt>canEditOwnTopic</tt> - the holder can change the topic of a previously sent message</t>
          </li>
          <li>
            <t><tt>canEditOtherTopic</tt> - the holder can change the topic of a message previously sent by another user.</t>
          </li>
          <li>
            <t><tt>canSendLink</tt> - the holder can send an inline link</t>
          </li>
          <li>
            <t><tt>canSendLinkPreview</tt> - the holder can send an inline link with an associated
preview.</t>
          </li>
          <li>
            <t><tt>canFollowLink</tt> - the holder can open a sent inline link.</t>
          </li>
          <li>
            <t><tt>canCopyLink</tt> - the holder can copy the URL of a sent inline link.</t>
          </li>
        </ul>
        <t>The Hub can enforce whether a member can send a message. It can also withhold fanout of application messages to clients of a user. The other capabilities in this section can only be enforced by other clients.</t>
      </section>
      <section anchor="asset-capabilities">
        <name>Asset Capabilities</name>
        <ul spacing="normal">
          <li>
            <t><tt>canUploadAttachment</tt> - the holder can upload a file with the "attachent" disposition.</t>
          </li>
          <li>
            <t><tt>canDownloadAttachment</tt> - the holder can download a file with the "attachent" disposition.</t>
          </li>
          <li>
            <t><tt>canUploadImage</tt> - the holder can upload a file with the media type of "image" and the disposition of "render"</t>
          </li>
          <li>
            <t><tt>canDownloadImage</tt> - the holder can download a file with the media type of "image" and the disposition of "render"</t>
          </li>
          <li>
            <t><tt>canUploadVideo</tt> - the holder can upload a file with the media type of "video" and the disposition of "render"</t>
          </li>
          <li>
            <t><tt>canDownloadVideo</tt> - the holder can download a file with the media type of "video" and the disposition of "render"</t>
          </li>
          <li>
            <t><tt>canUploadSound</tt> - the holder can upload a file with the media type of "audio" and the disposition of "render"</t>
          </li>
          <li>
            <t><tt>canDownloadSound</tt> - the holder can download a file with the media type of "audio" and the disposition of "render"</t>
          </li>
        </ul>
      </section>
      <section anchor="real-time-media">
        <name>Real-time media</name>
        <t>The MIMI Working has not yet defined requirements for real-time media, however the capabilities below are widely representative of the permissions that would be required.</t>
        <ul spacing="normal">
          <li>
            <t><tt>canStartCall</tt> - the holder can initiate a new real-time call/conference</t>
          </li>
          <li>
            <t><tt>canJoinCall</tt> - the holder can join an existing real-time call/conference</t>
          </li>
          <li>
            <t><tt>canSendAudio</tt> - the holder is authorized to contribute audio in a call/conference.</t>
          </li>
          <li>
            <t><tt>canReceiveAudio</tt> - the holder is authorized to receive audio in a call/conference.</t>
          </li>
          <li>
            <t><tt>canSendVideo</tt> - the holder is authorized to contribute video in a call/conference.</t>
          </li>
          <li>
            <t><tt>canReceiveVideo</tt> - the holder is authorized to receive video in a call/conference.</t>
          </li>
          <li>
            <t><tt>canShareScreen</tt> - the holder is authorized to contribute screen sharing in a call/conference</t>
          </li>
          <li>
            <t><tt>canViewSharedScreen</tt> - the holder is authorized to receive screen sharing in a call/conference</t>
          </li>
        </ul>
      </section>
      <section anchor="disruptive-policy-changes">
        <name>Disruptive Policy Changes</name>
        <ul spacing="normal">
          <li>
            <t><tt>canChangeRoomMembershipStyle</tt> - the holder is authorized to modify the base room membership style.</t>
          </li>
          <li>
            <t><tt>canChangeRoleDefinitions</tt> - the holder is authorized to make changes to the definitions of the Roles component.</t>
          </li>
          <li>
            <t><tt>canChangePreauthorizedUserList</tt> - the holder is authorized to make changes to the Preauthorized Users component.</t>
          </li>
          <li>
            <t><tt>canDestroyRoom</tt> - the holder is authorized to completely destroy the room.</t>
          </li>
          <li>
            <t><tt>canReinitGroup</tt> - the holder is authorized to send an MLS ReInit proposal.</t>
          </li>
        </ul>
      </section>
      <section anchor="reserved-capabilities">
        <name>Reserved Capabilities</name>
        <t>The following capability names are reserved for possible future use</t>
        <ul spacing="normal">
          <li>
            <t><tt>canCreateJoinCode</tt></t>
          </li>
          <li>
            <t><tt>canKnock</tt></t>
          </li>
          <li>
            <t><tt>canAcceptKnock</tt></t>
          </li>
          <li>
            <t><tt>canCreateSubgroup</tt></t>
          </li>
          <li>
            <t><tt>canSendDirectMessage</tt></t>
          </li>
          <li>
            <t><tt>canTargetMessage</tt></t>
          </li>
          <li>
            <t><tt>canChangeOwnName</tt></t>
          </li>
          <li>
            <t><tt>canChangeOwnPresence</tt></t>
          </li>
          <li>
            <t><tt>canChangeOwnMood</tt></t>
          </li>
          <li>
            <t><tt>canChangeOwnAvatar</tt></t>
          </li>
          <li>
            <t><tt>canCreateRoom</tt></t>
          </li>
          <li>
            <t><tt>canChangeMlsOperationalPolicies</tt></t>
          </li>
          <li>
            <t><tt>canChangeOtherPolicyAttribute</tt></t>
          </li>
          <li>
            <t>MLS specific
            </t>
            <ul spacing="normal">
              <li>
                <t>update - update policy</t>
              </li>
              <li>
                <t>PSK - psk policy</t>
              </li>
              <li>
                <t>external proposal - general operational policy rules</t>
              </li>
              <li>
                <t>external commit - general operational policy rules</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="extensibility-of-the-policy-format">
      <name>Extensibility of the policy format</name>
      <t>Finally, The extensibility mechanism allows for future addition of new room policies.</t>
      <artwork><![CDATA[
enum {
  null(0),
  boolean(1),
  number(2),
  string(3),
  jsonObject(4)
} ExtType;

struct {
  opaque name<V>;
  ExtType type;
  opaque value<V>;
} PolicyExtension;

struct {
  ...
  PolicyExtension policy_extensions<V>;
} RoomPolicy;
]]></artwork>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This entire document focuses on authorization policy.
TODO More Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="preauthorized-users-mls-application-component">
        <name>Preauthorized users MLS application component</name>
        <t>TBC</t>
      </section>
      <section anchor="role-definitions-mls-application-component">
        <name>Role definitions MLS application component</name>
        <t>TBC</t>
      </section>
      <section anchor="new-mimi-role-capabilities-registry">
        <name>New MIMI Role Capabilities registry</name>
        <t>Create a new registry with the following values assigned sequentially using the reference RFCXXXX.</t>
        <artwork><![CDATA[
canAddParticipant
canRemoveParticipant
canAddOwnClient
canRemoveSelf
canAddSelf
canCreateJoinCode - reserved for future use
canUseJoinCode
canBan
canUnBan
canKick
canKnock
canAcceptKnock
canChangeUserRole
canChangeOwnRole
canCreateSubgroup
canSendMessage
canReceiveMessage
canCopyMessage
canReportAbuse
canReactToMessage
canEditReaction
canDeleteReaction
canEditOwnMessage
canDeleteOwnMessage
canDeleteAnyMessage
canStartTopic
canReplyInTopic
canEditTopic
canSendDirectMessage
canTargetMessage
canUploadImage
canUploadVideo
canUploadAttachment
canDownloadImage
canDownloadVideo
canDownloadAttachment
canSendLink
canSendLinkPreview
canFollowLink
canCopyLink
canChangeRoomName
canChangeRoomDescription
canChangeRoomAvatar
canChangeRoomSubject
canChangeRoomMood
canChangeOwnName
canChangeOwnPresence
canChangeOwnMood
canChangeOwnAvatar
canStartCall
canJoinCall
canSendAudio
canReceiveAudio
canSendVideo
canReceiveVideo
canShareScreen
canViewSharedScreen
canChangeRoomMembershipStyle
canChangeRoleDefinitions
canChangePreauthorizedUserList
canChangeMlsOperationalPolicies
canDestroyRoom
canSendMLSReinitProposal
]]></artwork>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="I-D.ietf-mimi-arch">
          <front>
            <title>An Architecture for More Instant Messaging Interoperability (MIMI)</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <date day="21" month="November" year="2024"/>
            <abstract>
              <t>   The More Instant Messaging Interoperability (MIMI) working group is
   defining a suite of protocols that allow messaging providers to
   interoperate with one another.  This document lays out an overall
   architecture enumerating the MIMI protocols and how they work
   together to enable an overall messaging experience.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mimi-arch-01"/>
        </reference>
        <reference anchor="I-D.ietf-mimi-protocol">
          <front>
            <title>More Instant Messaging Interoperability (MIMI) using HTTPS and MLS</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Matthew Hodgson" initials="M." surname="Hodgson">
              <organization>The Matrix.org Foundation C.I.C.</organization>
            </author>
            <author fullname="Konrad Kohbrok" initials="K." surname="Kohbrok">
              <organization>Phoenix R&amp;D</organization>
            </author>
            <author fullname="Rohan Mahy" initials="R." surname="Mahy">
              <organization>Rohan Mahy Consulting Services</organization>
            </author>
            <author fullname="Travis Ralston" initials="T." surname="Ralston">
              <organization>The Matrix.org Foundation C.I.C.</organization>
            </author>
            <author fullname="Raphael Robert" initials="R." surname="Robert">
              <organization>Phoenix R&amp;D</organization>
            </author>
            <date day="7" month="July" year="2025"/>
            <abstract>
              <t>   This document specifies the More Instant Messaging Interoperability
   (MIMI) transport protocol, which allows users of different messaging
   providers to interoperate in group chats (rooms), including to send
   and receive messages, share room policy, and add participants to and
   remove participants from rooms.  MIMI describes messages between
   providers, leaving most aspects of the provider-internal client-
   server communication up to the provider.  MIMI integrates the
   Messaging Layer Security (MLS) protocol to provide end-to-end
   security assurances, including authentication of protocol
   participants, confidentiality of messages exchanged within a room,
   and agreement on the state of the room.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mimi-protocol-04"/>
        </reference>
        <reference anchor="RFC2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="I-D.ietf-mls-extensions">
          <front>
            <title>The Messaging Layer Security (MLS) Extensions</title>
            <author fullname="Raphael Robert" initials="R." surname="Robert">
              <organization>Phoenix R&amp;D</organization>
            </author>
            <date day="21" month="July" year="2025"/>
            <abstract>
              <t>   The Messaging Layer Security (MLS) protocol is an asynchronous group
   authenticated key exchange protocol.  MLS provides a number of
   capabilities to applications, as well as several extension points
   internal to the protocol.  This document provides a consolidated
   application API, guidance for how the protocol's extension points
   should be used, and a few concrete examples of both core protocol
   extensions and uses of the application API.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mls-extensions-08"/>
        </reference>
        <reference anchor="I-D.ietf-mimi-content">
          <front>
            <title>More Instant Messaging Interoperability (MIMI) message content</title>
            <author fullname="Rohan Mahy" initials="R." surname="Mahy">
              <organization>Rohan Mahy Consulting Services</organization>
            </author>
            <date day="7" month="July" year="2025"/>
            <abstract>
              <t>   This document describes content semantics common in Instant Messaging
   (IM) systems and describes a profile suitable for instant messaging
   interoperability of messages end-to-end encrypted inside the MLS
   (Message Layer Security) Protocol.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mimi-content-07"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9750">
          <front>
            <title>The Messaging Layer Security (MLS) Architecture</title>
            <author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="S. Inguva" initials="S." surname="Inguva"/>
            <author fullname="A. Duric" initials="A." surname="Duric"/>
            <date month="April" year="2025"/>
            <abstract>
              <t>The Messaging Layer Security (MLS) protocol (RFC 9420) provides a group key agreement protocol for messaging applications. MLS is designed to protect against eavesdropping, tampering, and message forgery, and to provide forward secrecy (FS) and post-compromise security (PCS).</t>
              <t>This document describes the architecture for using MLS in a general secure group messaging infrastructure and defines the security goals for MLS. It provides guidance on building a group messaging system and discusses security and privacy trade-offs offered by multiple security mechanisms that are part of the MLS protocol (e.g., frequency of public encryption key rotation). The document also provides guidance for parts of the infrastructure that are not standardized by MLS and are instead left to the application.</t>
              <t>While the recommendations of this document are not mandatory to follow in order to interoperate at the protocol level, they affect the overall security guarantees that are achieved by a messaging application. This is especially true in the case of active adversaries that are able to compromise clients, the Delivery Service (DS), or the Authentication Service (AS).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9750"/>
          <seriesInfo name="DOI" value="10.17487/RFC9750"/>
        </reference>
      </references>
    </references>
    <?line 870?>

<section anchor="role-examples">
      <name>Role examples</name>
      <section anchor="cooperatively-administered-room">
        <name>Cooperatively administered room</name>
        <t>This is an example set of role policies, which is suitable for friends and family rooms and small groups of peers in a workgroup or club.</t>
        <ul spacing="normal">
          <li>
            <t>no_role
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 0</t>
              </li>
              <li>
                <t>no capabilities</t>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>banned
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 1</t>
              </li>
              <li>
                <t>no capabilities</t>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>ordinary_user
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 2</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>canAddParticipant</t>
                  </li>
                  <li>
                    <t>canRemoveParticipant</t>
                  </li>
                  <li>
                    <t>canAddOwnClient</t>
                  </li>
                  <li>
                    <t>canRemoveOwnClient</t>
                  </li>
                  <li>
                    <t>canRemoveSelf</t>
                  </li>
                  <li>
                    <t>canSendMessage</t>
                  </li>
                  <li>
                    <t>canReceiveMessage</t>
                  </li>
                  <li>
                    <t>canCopyMessage</t>
                  </li>
                  <li>
                    <t>canReportAbuse</t>
                  </li>
                  <li>
                    <t>canReplyToMessage</t>
                  </li>
                  <li>
                    <t>canReactToMessage</t>
                  </li>
                  <li>
                    <t>canDeleteOwnReaction</t>
                  </li>
                  <li>
                    <t>canEditOwnMessage</t>
                  </li>
                  <li>
                    <t>canDeleteOwnMessage</t>
                  </li>
                  <li>
                    <t>canStartTopic</t>
                  </li>
                  <li>
                    <t>canReplyInTopic</t>
                  </li>
                  <li>
                    <t>canEditOwnTopic</t>
                  </li>
                  <li>
                    <t>canUploadImage</t>
                  </li>
                  <li>
                    <t>canUploadVideo</t>
                  </li>
                  <li>
                    <t>canUploadSound</t>
                  </li>
                  <li>
                    <t>canUploadAttachment</t>
                  </li>
                  <li>
                    <t>canDownloadImage</t>
                  </li>
                  <li>
                    <t>canDownloadVideo</t>
                  </li>
                  <li>
                    <t>canDownloadSound</t>
                  </li>
                  <li>
                    <t>canDownloadAttachment</t>
                  </li>
                  <li>
                    <t>canSendLink</t>
                  </li>
                  <li>
                    <t>canSendLinkPreview</t>
                  </li>
                  <li>
                    <t>canFollowLink</t>
                  </li>
                  <li>
                    <t>canCopyLink</t>
                  </li>
                  <li>
                    <t>canChangeRoomName</t>
                  </li>
                  <li>
                    <t>canChangeRoomAvatar</t>
                  </li>
                  <li>
                    <t>canChangeRoomSubject</t>
                  </li>
                  <li>
                    <t>canChangeRoomMood</t>
                  </li>
                  <li>
                    <t>canChangeOwnName</t>
                  </li>
                  <li>
                    <t>canChangeOwnPresence</t>
                  </li>
                  <li>
                    <t>canChangeOwnMood</t>
                  </li>
                  <li>
                    <t>canChangeOwnAvatar</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[2]), (2,[0])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>group_admin
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 3</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(include all the capabilities authorized for an ordinary_user)</t>
                  </li>
                  <li>
                    <t>canBan</t>
                  </li>
                  <li>
                    <t>canUnBan</t>
                  </li>
                  <li>
                    <t>canKick</t>
                  </li>
                  <li>
                    <t>canRevokeVoice</t>
                  </li>
                  <li>
                    <t>canGrantVoice</t>
                  </li>
                  <li>
                    <t>canChangeUserRole</t>
                  </li>
                  <li>
                    <t>canDeleteOtherMessage</t>
                  </li>
                  <li>
                    <t>canEditOtherTopic</t>
                  </li>
                  <li>
                    <t>canChangeRoomDescription</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 1</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[1,2,3]), (1,[0,2,3]), (2,[0,1,3]), (3,[0,1,2])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>super_admin
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 4</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(include all the capabilities authorized for a group_admin)</t>
                  </li>
                  <li>
                    <t>canChangeRoomMembershipStyle</t>
                  </li>
                  <li>
                    <t>canChangePreauthorizedUserList</t>
                  </li>
                  <li>
                    <t>canDestroyRoom</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[1,2,3,4]), (1,[0,2,3,4]), (2,[0,1,3,4]), (3,[0,1,2,4]), (4,[0,1,2,3])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>policy_enforcer
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 5</t>
              </li>
              <li>
                <t>capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(does not include any other capabilities)</t>
                  </li>
                  <li>
                    <t>canRemoveParticipant</t>
                  </li>
                  <li>
                    <t>canChangeUserRole</t>
                  </li>
                  <li>
                    <t>canBan</t>
                  </li>
                  <li>
                    <t>canUnban</t>
                  </li>
                  <li>
                    <t>canChangeRoleDefinitions</t>
                  </li>
                  <li>
                    <t>canChangePreauthorizedUserList</t>
                  </li>
                  <li>
                    <t>canChangeMlsOperationalPolicies</t>
                  </li>
                  <li>
                    <t>canDestroyRoom</t>
                  </li>
                  <li>
                    <t>canSendMLSReinitProposal</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 1</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = 2</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[1]), (1,[0]), (2,[0,1]), (3,[0,1]), (4,[0,1])]</tt></t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Notes: can remove a banned user from the list (cleanup) but not restore them</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="strictly-administered-room">
        <name>Strictly administered room</name>
        <t>This is an example set of role policies, which is suitable for friends and family rooms and small groups of peers in a workgroup or club.</t>
        <ul spacing="normal">
          <li>
            <t>no_role
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 0</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>canUseJoinCode</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[2])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>banned
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 1</t>
              </li>
              <li>
                <t>no capabilities</t>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>ordinary_user
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 2</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>canAddOwnClient</t>
                  </li>
                  <li>
                    <t>canAddSelf</t>
                  </li>
                  <li>
                    <t>canRemoveOwnClient</t>
                  </li>
                  <li>
                    <t>canRemoveSelf</t>
                  </li>
                  <li>
                    <t>canChangeOwnRole</t>
                  </li>
                  <li>
                    <t>canSendMessage</t>
                  </li>
                  <li>
                    <t>canReceiveMessage</t>
                  </li>
                  <li>
                    <t>canCopyMessage</t>
                  </li>
                  <li>
                    <t>canReportAbuse</t>
                  </li>
                  <li>
                    <t>canReactToMessage</t>
                  </li>
                  <li>
                    <t>canDeleteOwnReaction</t>
                  </li>
                  <li>
                    <t>canEditOwnMessage</t>
                  </li>
                  <li>
                    <t>canDeleteOwnMessage</t>
                  </li>
                  <li>
                    <t>canStartTopic</t>
                  </li>
                  <li>
                    <t>canReplyInTopic</t>
                  </li>
                  <li>
                    <t>canUploadImage</t>
                  </li>
                  <li>
                    <t>canUploadVideo</t>
                  </li>
                  <li>
                    <t>canUploadSound</t>
                  </li>
                  <li>
                    <t>canUploadAttachment</t>
                  </li>
                  <li>
                    <t>canDownloadImage</t>
                  </li>
                  <li>
                    <t>canDownloadVideo</t>
                  </li>
                  <li>
                    <t>canDownloadSound</t>
                  </li>
                  <li>
                    <t>canDownloadAttachment</t>
                  </li>
                  <li>
                    <t>canSendLink</t>
                  </li>
                  <li>
                    <t>canSendLinkPreview</t>
                  </li>
                  <li>
                    <t>canFollowLink</t>
                  </li>
                  <li>
                    <t>canCopyLink</t>
                  </li>
                  <li>
                    <t>canChangeOwnName</t>
                  </li>
                  <li>
                    <t>canChangeOwnPresence</t>
                  </li>
                  <li>
                    <t>canChangeOwnMood</t>
                  </li>
                  <li>
                    <t>canChangeOwnAvatar</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[2]), (2,[0])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>group_admin
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 3</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(include all the capabilities authorized for an ordinary_user)</t>
                  </li>
                  <li>
                    <t>canAddParticipant</t>
                  </li>
                  <li>
                    <t>canRemoveParticipant</t>
                  </li>
                  <li>
                    <t>canBan</t>
                  </li>
                  <li>
                    <t>canUnBan</t>
                  </li>
                  <li>
                    <t>canKick</t>
                  </li>
                  <li>
                    <t>canChangeUserRole</t>
                  </li>
                  <li>
                    <t>canCreateJoinCode - reserved for future use</t>
                  </li>
                  <li>
                    <t>canDeleteOtherReaction</t>
                  </li>
                  <li>
                    <t>canDeleteOtherMessage</t>
                  </li>
                  <li>
                    <t>canEditOwnTopic</t>
                  </li>
                  <li>
                    <t>canEditOtherTopic</t>
                  </li>
                  <li>
                    <t>canChangeRoomDescription</t>
                  </li>
                  <li>
                    <t>canChangeRoomName</t>
                  </li>
                  <li>
                    <t>canChangeRoomAvatar</t>
                  </li>
                  <li>
                    <t>canChangeRoomSubject</t>
                  </li>
                  <li>
                    <t>canChangeRoomMood</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 1</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[1,2,3]), (1,[0,2,3]), (2,[0,1,3]), (3,[0,1,2])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>super_admin
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 4</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(include all the capabilities authorized for a group_admin)</t>
                  </li>
                  <li>
                    <t>canChangeRoomMembershipStyle</t>
                  </li>
                  <li>
                    <t>canChangeRoleDefinitions</t>
                  </li>
                  <li>
                    <t>canChangePreauthorizedUserList</t>
                  </li>
                  <li>
                    <t>canDestroyRoom</t>
                  </li>
                  <li>
                    <t>canSendMLSReinitProposal</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[1,2,3,4]), (1,[0,2,3,4]), (2,[0,1,3,4]), (3,[0,1,2,4]), (4,[0,1,2,3])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>policy_enforcer
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 5</t>
              </li>
              <li>
                <t>capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(does not include any other capabilities)</t>
                  </li>
                  <li>
                    <t>canRemoveParticipant</t>
                  </li>
                  <li>
                    <t>canChangeUserRole</t>
                  </li>
                  <li>
                    <t>canBan</t>
                  </li>
                  <li>
                    <t>canUnban</t>
                  </li>
                  <li>
                    <t>canChangeRoleDefinitions</t>
                  </li>
                  <li>
                    <t>canChangePreauthorizedUserList</t>
                  </li>
                  <li>
                    <t>canChangeMlsOperationalPolicies</t>
                  </li>
                  <li>
                    <t>canDestroyRoom</t>
                  </li>
                  <li>
                    <t>canSendMLSReinitProposal</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 1</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = 2</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[1]), (1,[0]), (2,[0,1]), (3,[0,1]), (4,[0,1])]</tt></t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Notes: can remove a banned user from the list (cleanup) but not restore them</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="moderated-room">
        <name>Moderated room</name>
        <ul spacing="normal">
          <li>
            <t>no_role
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 0</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>canUseJoinCode</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[2,3])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>banned
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 1</t>
              </li>
              <li>
                <t>no capabilities</t>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>guest
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 2</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>canRemoveSelf</t>
                  </li>
                  <li>
                    <t>canReceiveMessage</t>
                  </li>
                  <li>
                    <t>canCopyMessage</t>
                  </li>
                  <li>
                    <t>canReactToMessage</t>
                  </li>
                  <li>
                    <t>canDeleteOwnReaction</t>
                  </li>
                  <li>
                    <t>canFollowLink</t>
                  </li>
                  <li>
                    <t>canCopyLink</t>
                  </li>
                  <li>
                    <t>canDownloadImage</t>
                  </li>
                  <li>
                    <t>canDownloadVideo</t>
                  </li>
                  <li>
                    <t>canDownloadSound</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[2]), (2,[0])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>attendee
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 3</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(include all the capabilities authorized for a guest)</t>
                  </li>
                  <li>
                    <t>canAddOwnClient</t>
                  </li>
                  <li>
                    <t>canAddSelf</t>
                  </li>
                  <li>
                    <t>canRemoveOwnClient</t>
                  </li>
                  <li>
                    <t>canChangeOwnRole</t>
                  </li>
                  <li>
                    <t>canReportAbuse</t>
                  </li>
                  <li>
                    <t>canReplyInTopic</t>
                  </li>
                  <li>
                    <t>canDownloadAttachment</t>
                  </li>
                  <li>
                    <t>canChangeOwnName</t>
                  </li>
                  <li>
                    <t>canChangeOwnPresence</t>
                  </li>
                  <li>
                    <t>canChangeOwnAvatar</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[3]), (3,[0])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>speaker
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 4</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(include all the capabilities authorized for a speaker)</t>
                  </li>
                  <li>
                    <t>canSendMessage</t>
                  </li>
                  <li>
                    <t>canEditOwnMessage</t>
                  </li>
                  <li>
                    <t>canDeleteOwnMessage</t>
                  </li>
                  <li>
                    <t>canStartTopic</t>
                  </li>
                  <li>
                    <t>canUploadImage</t>
                  </li>
                  <li>
                    <t>canUploadVideo</t>
                  </li>
                  <li>
                    <t>canUploadSound</t>
                  </li>
                  <li>
                    <t>canUploadAttachment</t>
                  </li>
                  <li>
                    <t>canSendLink</t>
                  </li>
                  <li>
                    <t>canSendLinkPreview</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[4]), (4,[0])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>moderator
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 5</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(include all the capabilities authorized for an ordinary_user)</t>
                  </li>
                  <li>
                    <t>canAddParticipant</t>
                  </li>
                  <li>
                    <t>canRemoveParticipant</t>
                  </li>
                  <li>
                    <t>canBan</t>
                  </li>
                  <li>
                    <t>canUnBan</t>
                  </li>
                  <li>
                    <t>canKick</t>
                  </li>
                  <li>
                    <t>canChangeUserRole</t>
                  </li>
                  <li>
                    <t>canCreateJoinCode - reserved for future use</t>
                  </li>
                  <li>
                    <t>canDeleteOtherReaction</t>
                  </li>
                  <li>
                    <t>canDeleteOtherMessage</t>
                  </li>
                  <li>
                    <t>canEditOwnTopic</t>
                  </li>
                  <li>
                    <t>canEditOtherTopic</t>
                  </li>
                  <li>
                    <t>canChangeRoomName</t>
                  </li>
                  <li>
                    <t>canChangeRoomAvatar</t>
                  </li>
                  <li>
                    <t>canChangeRoomSubject</t>
                  </li>
                  <li>
                    <t>canChangeRoomMood</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 1</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[1,2,3,4,5]), (1,[0,2,3,4,5]), (2,[0,1,3,4,5]), (3,[0,1,2,4,5]), (4,[0,1,2,3,5]), (5,[0,1,2,3,4])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>super_admin
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 6</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(include all the capabilities authorized for a moderator)</t>
                  </li>
                  <li>
                    <t>canChangeRoomDescription</t>
                  </li>
                  <li>
                    <t>canChangeRoomMembershipStyle</t>
                  </li>
                  <li>
                    <t>canChangeRoleDefinitions</t>
                  </li>
                  <li>
                    <t>canChangePreauthorizedUserList</t>
                  </li>
                  <li>
                    <t>canDestroyRoom</t>
                  </li>
                  <li>
                    <t>canSendMLSReinitProposal</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[1,2,3,4,5,6]), (1,[0,2,3,4,5,6]), (2,[0,1,3,4,5,6]), (3,[0,1,2,4,5,6]), (4,[0,1,2,3,5,6]), (5,[0,1,2,3,4,6]), (6,[0,1,2,3,4,5])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>policy_enforcer
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 7</t>
              </li>
              <li>
                <t>capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(does not include any other capabilities)</t>
                  </li>
                  <li>
                    <t>canRemoveParticipant</t>
                  </li>
                  <li>
                    <t>canChangeUserRole</t>
                  </li>
                  <li>
                    <t>canBan</t>
                  </li>
                  <li>
                    <t>canUnban</t>
                  </li>
                  <li>
                    <t>canChangeRoleDefinitions</t>
                  </li>
                  <li>
                    <t>canChangePreauthorizedUserList</t>
                  </li>
                  <li>
                    <t>canChangeMlsOperationalPolicies</t>
                  </li>
                  <li>
                    <t>canDestroyRoom</t>
                  </li>
                  <li>
                    <t>canSendMLSReinitProposal</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 1</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = 2</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[1]), (1,[0]), (2,[0,1]), (3,[0,1]), (4,[0,1]), (5, [0,1]), (6, [0,1])]</tt></t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Notes: can remove a banned user from the list (cleanup) but not restore them</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="multi-organization-administered-room">
        <name>Multi-organization administered room</name>
        <t>In this example room policy, Alice from organization A is a super admin.
There are per organization user and admin roles for orgs A, B, and C.
Organizational admins can only move users to and from their org user role, their org admin role, the no_role; and can ban (but not unban) their own org users.
The non-host orgs do not have the <tt>canChangeOwnRole</tt> and <tt>canAddSelf</tt>, and are limited to 3 admins per org.</t>
        <ul spacing="normal">
          <li>
            <t>no_role
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 0</t>
              </li>
              <li>
                <t>no capabilities</t>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>banned
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 1</t>
              </li>
              <li>
                <t>no capabilities</t>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>org_a_user
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 2</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(all capabilities of org_b_user)</t>
                  </li>
                  <li>
                    <t>canChangeOwnRole</t>
                  </li>
                  <li>
                    <t>canAddSelf</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[2]), (2,[0])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>org_b_user
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 3</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>canRemoveSelf</t>
                  </li>
                  <li>
                    <t>canAddOwnClient</t>
                  </li>
                  <li>
                    <t>canRemoveOwnClient</t>
                  </li>
                  <li>
                    <t>canSendMessage</t>
                  </li>
                  <li>
                    <t>canReceiveMessage</t>
                  </li>
                  <li>
                    <t>canCopyMessage</t>
                  </li>
                  <li>
                    <t>canReportAbuse</t>
                  </li>
                  <li>
                    <t>canReplyInTopic</t>
                  </li>
                  <li>
                    <t>canReactToMessage</t>
                  </li>
                  <li>
                    <t>canDeleteOwnReaction</t>
                  </li>
                  <li>
                    <t>canEditOwnMessage</t>
                  </li>
                  <li>
                    <t>canSendLink</t>
                  </li>
                  <li>
                    <t>canSendLinkPreview</t>
                  </li>
                  <li>
                    <t>canFollowLink</t>
                  </li>
                  <li>
                    <t>canCopyLink</t>
                  </li>
                  <li>
                    <t>canDownloadImage</t>
                  </li>
                  <li>
                    <t>canDownloadVideo</t>
                  </li>
                  <li>
                    <t>canDownloadSound</t>
                  </li>
                  <li>
                    <t>canDownloadAttachment</t>
                  </li>
                  <li>
                    <t>canChangeOwnName</t>
                  </li>
                  <li>
                    <t>canChangeOwnPresence</t>
                  </li>
                  <li>
                    <t>canChangeOwnAvatar</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[3]), (3,[0])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>org_c_user
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 4</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(same capabilities as org_b_user)</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[4]), (4,[0])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>org_a_admin
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 5</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(all capabilities of org_b_admin)</t>
                  </li>
                  <li>
                    <t>canChangeOwnRole</t>
                  </li>
                  <li>
                    <t>canAddSelf</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[2,5]), (2,[0,1,5]), (5,[0,1,2])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>org_b_admin
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 6</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(all capabilities of org_b_user)</t>
                  </li>
                  <li>
                    <t>canDeleteOwnMessage</t>
                  </li>
                  <li>
                    <t>canStartTopic</t>
                  </li>
                  <li>
                    <t>canUploadImage</t>
                  </li>
                  <li>
                    <t>canUploadVideo</t>
                  </li>
                  <li>
                    <t>canUploadSound</t>
                  </li>
                  <li>
                    <t>canUploadAttachment</t>
                  </li>
                  <li>
                    <t>canAddParticipant</t>
                  </li>
                  <li>
                    <t>canRemoveParticipant</t>
                  </li>
                  <li>
                    <t>canBan</t>
                  </li>
                  <li>
                    <t>canKick</t>
                  </li>
                  <li>
                    <t>canChangeUserRole</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 1</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = 3</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 1</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[3,6]), (3,[0,1,6]), (6,[0,1,3])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>org_c_admin
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 7</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(all capabilities of org_b_admin)</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 1</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = 3</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 1</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[4,7]), (4,[0,1,7]), (7,[0,1,4])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>super_admin
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 8</t>
              </li>
              <li>
                <t>authorized capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(include all the capabilities authorized for org_a_admin)</t>
                  </li>
                  <li>
                    <t>canUnBan</t>
                  </li>
                  <li>
                    <t>canDeleteOtherReaction</t>
                  </li>
                  <li>
                    <t>canDeleteOtherMessage</t>
                  </li>
                  <li>
                    <t>canEditOwnTopic</t>
                  </li>
                  <li>
                    <t>canEditOtherTopic</t>
                  </li>
                  <li>
                    <t>canChangeRoomDescription</t>
                  </li>
                  <li>
                    <t>canChangeRoomName</t>
                  </li>
                  <li>
                    <t>canChangeRoomAvatar</t>
                  </li>
                  <li>
                    <t>canChangeRoomSubject</t>
                  </li>
                  <li>
                    <t>canChangeRoomMood</t>
                  </li>
                  <li>
                    <t>canChangeRoomMembershipStyle</t>
                  </li>
                  <li>
                    <t>canChangeRoleDefinitions</t>
                  </li>
                  <li>
                    <t>canChangePreauthorizedUserList</t>
                  </li>
                  <li>
                    <t>canDestroyRoom</t>
                  </li>
                  <li>
                    <t>canSendMLSReinitProposal</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 1</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 1</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = null</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[1,2,3,4,5,6,7,8]), (1,[0,2,3,4,5,6,7,8]), (2,[0,1,5,8]), (3,[0,1,6]), (4,[0,1,7]), (5,[0,1,2,8]), (6,[0,1,3]), (7,[0,1,4]), (8,[0,1,2,5])]</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>policy_enforcer
            </t>
            <ul spacing="normal">
              <li>
                <t>role_index = 9</t>
              </li>
              <li>
                <t>capabilities
                </t>
                <ul spacing="normal">
                  <li>
                    <t>(does not include any other capabilities)</t>
                  </li>
                  <li>
                    <t>canRemoveParticipant</t>
                  </li>
                  <li>
                    <t>canChangeUserRole</t>
                  </li>
                  <li>
                    <t>canBan</t>
                  </li>
                  <li>
                    <t>canUnban</t>
                  </li>
                  <li>
                    <t>canChangeRoleDefinitions</t>
                  </li>
                  <li>
                    <t>canChangePreauthorizedUserList</t>
                  </li>
                  <li>
                    <t>canChangeMlsOperationalPolicies</t>
                  </li>
                  <li>
                    <t>canDestroyRoom</t>
                  </li>
                  <li>
                    <t>canSendMLSReinitProposal</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>constraints
                </t>
                <ul spacing="normal">
                  <li>
                    <t>minimum_participants_constraint = 1</t>
                  </li>
                  <li>
                    <t>maximum_participants_constraint = 2</t>
                  </li>
                  <li>
                    <t>minimum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>maximum_active_participants_constraint = 0</t>
                  </li>
                  <li>
                    <t>authorized_role_changes = <tt>[(0,[1]), (1,[0]), (3,[0,1]), (4,[0,1]), (5,[0,1]), (6,[0,1]), (7,[0,1]), (8,[0,1])]</tt></t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Notes: can remove a banned user from the list (cleanup) but not restore them</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="complete-tls-presentation-language-syntax">
      <name>Complete TLS Presentation Language Syntax</name>
      <artwork><![CDATA[
enum {
  false(0),
  true(1)
} bool;

struct {
  /* a valid Uniform Resource Identifier (URI) */
  opaque uri<V>;
} Uri;

enum {
  optional(0),
  required(1),
  forbidden(2)
} Optionality;

enum {
  reserved(0)
  ordinary(1),
  fixed-membership(2),
  parent-dependent(3),
  (255)
} MembershipStyle;

struct {
  Optionality logging;
  bool enabled;
  Uri logging_clients<V>;
  Uri machine_readable_policy;
  Uri human_readable_policy;
} LoggingPolicy;

struct {
  bool on_request;
  Uri join_link;
  bool multiuser;
  uint32 expiration;
  Uri link_requests;
} LinkPolicy;

struct {
  opaque name<V>;
  opaque description<V>;
  Uri homepage;
  Role bot_role;
  bool can_read;
  bool can_write;
  bool can_target_message_in_group;
  bool per_user_content;
} Bot;

struct {
  Optionality history_sharing;
  Role who_can_share<V>;
  bool automatically_share;
  uint32 max_time_period;
} HistoryPolicy;

enum {
  null(0),
  boolean(1),
  number(2),
  string(3),
  jsonObject(4)
} ExtType;

struct {
  opaque name<V>;
  ExtType type;
  opaque value<V>;
} PolicyExtension;

struct {
  ProtocolVersion versions<V>;
  CipherSuite cipher_suites<V>;
  ExtensionType extensions<V>;
  ProposalType proposals<V>;
  CredentialType credentials<V>;
  WireFormats wire_formats<V>;
  ComponentID component_ids<V>;
  ComponentID safe_aad_types<V>;
  MediaType media_types<V>;
  ContentType content_types<V>;
} ExtendedCapabilities;

enum {
  unspecified(0),
  immediateCommit(1),
  randomDelay(2),
  preferenceWheel(3),
  designatedCommitter(4),
  (255)
} PendingProposalStrategy;

struct {
  PendingProposalStrategy pending_proposal_strategy;
  uint64 minimum_delay_ms;
  uint64 maximum_delay_ms;
} PendingProposalPolicy;

struct {
  uint64 minimum_time;
  uint64 default_time;
  uint64 maximum_time;
} MinDefaultMaxTime;


struct {
  uint8  epoch_tolerance;
  uint16 pad_to_size;
  uint32 max_generations_skipahead;
} AppMessagePolicy;

struct {
  ExtendedCapabilities mandatory_capabilities;
  ExtendedCapabilities default_capabilities;
  ExtendedCapabilities forbidden_capabilities;
  WireFormats handshake_formats<V>;
  bool external_proposal_allowed;
  bool external_commit_allowed;
  PendingProposalPolicy pending_proposal_policy;
  MinDefaultMaxTime LeafNode_update_time;
  AppMessagePolicy app_message_policy;
  unit64 max_kp_lifetime;
  uint64 max_credential_lifetime;
  uint64 resumption_psk_lifetime;
  MinDefaultMaxTime sender_nonce_keypair_lifetime;
  uint32 max_keypairs;
  MinDefaultMaxTime buffer_incoming_message_time;
  uint32 max_buffered_messages;
} OperationalParameters;



struct {
  MembershipStyle membership_style;
  bool multi_device;
  Uri parent_room_uri;
  bool persistent_room;
  Optionality delivery_notifications;
  Optionality read_receipts;
  bool semi_anonymous_ids;
  bool discoverable;
  LinkPolicy link_policy;
  LoggingPolicy logging_policy;
  HistoryPolicy history_sharing;
  Bot allowed_bots<V>;
  OperationalParameters operational_parameters;
  PolicyExtension policy_extensions<V>;
} RoomPolicy;

RoomPolicy room_policy;
]]></artwork>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
9saR5fp683hBlvHLcOZOWZCYPJUT1L5hDrighQ7ZrYCEGKvL25dH/whVkcMG
DnbHf4+yJirX490vP783dGLBzTRpWJmCvzVyScEbRIBl2YiohnNQ6XflxIYQ
/0HLVMIXEsjL0BcK+ZcuxC0i5sUFInUxlXGJgHOGXIIk0WZS35upEQ1GRn8b
2VwtGEoIW6VbJpWtj11m/XjDq2811B06kW/5os076UhJ7hlBHIparNgMo7uD
szEJKYjEWM1FVSDDKUZWoEt9vYwyr52cFeNQ4lpecUc38GsCfy+z1qvWoEut
HarIiTAa+04rFxGI1DJaaMJvzDC2KG3t8YjyEak5OzW2YWzuLOVIs5NXHwin
mmzgJjo9SJiIm+iIke2AXACZb/VjnMfiRqjBtdichz4jn+ugNVVQYOBEYOTk
YVYq51Iu1/cSJL5wVjk9L869oK44LLrk6z1tA65agpEhgKM+ucghbhJD5MpG
2nLpmjU7ndt4N/aE5Uu1UrUuRLm+XoKfN40NlchBWXvFrFcSoU3Nhg51J6Nx
Rg5TWLOp57jn1kZNTIPg4cyTo0T7l+8rsmbMjdA2N5UiFiSgR+qQXtuK/Ykr
7osAmWImKYZFG8yaeAN3qCmTgPTi4OTM0y8dfLRCk3MU2oEoJGsJLTFpNdCm
5gsdkoSFUrc48i3jhhZtaW8lO4WpdCnMQou75BSHKU0rbaud61WYq9+aQ7zZ
iZPvOMacPY32f8QYMdK+qVP5VgKLqBJx91RGnpYEcSJLa4qlp9GZRTvXReSk
hiB3l1auCM+60UOerpHZjXEfr2YNWMy1u5mSNaKzlYK7U2Ye4aBSythu7k/I
dPP9hjiXHyjYkiVQmwTHDUGnNCuO9Ia31JlKTaaMyIyLJcbfxzo7ug6k1qDf
Vkx8EX0D/H1w04kz2VB0P+i9jvjLJvdJOHCuhvFWK7/AdEaUJggRLFbIIJy1
L+X2V7nZyyKa0XDyVm7Z2Q7npB0k5PiRcq5JgLnkquFZ4rkKS/RUdggfXpJ7
CRrZE4KzmIlqz4kD+Wr4VSE5bNC1WC589TZ/riW4n3766+vnB19+/uge5fzE
UCcnh2puuwiEZ9McdHYcmV2SLdJGfLVb6VOhEzKNMR2c0I194Dj2grJDd78R
AXLRpHpiSVU19oyYzGMot3OmSNybSvxK6G5UEZscnBgvapIScVqx+DWyP4VW
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
//8PqA1POsf/AAA=

-->

</rfc>
