<?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.24 (Ruby 3.4.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-mimi-room-policy-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.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-01"/>
    <author fullname="Rohan Mahy">
      <organization>Rohan Mahy Consulting Services</organization>
      <address>
        <email>rohan.ietf@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="March" day="02"/>
    <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.</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. (There is not a 1:1 correlation of MLS group to room ID in a persistent 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;

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;
  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="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="I-D.ietf-mls-architecture"/> 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>
      </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>
          <li>
            <t>which ciphersuites are acceptable.</t>
          </li>
        </ul>
      </section>
      <section anchor="areas-for-future-works">
        <name>Areas for future works</name>
        <t>Which credential types are allowed/required</t>
        <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>Which media types are required to send and required to understand in MIMI.</t>
        <t>What Additional authenticated data, can/should be sent unencrypted in an otherwise encrypted message.</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" xml:base="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-mimi-arch.xml">
          <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>Unaffiliated</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="21" month="October" year="2024"/>
            <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-02"/>
        </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="19" month="February" 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-06"/>
        </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="20" month="December" year="2024"/>
            <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-05"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-mls-architecture">
          <front>
            <title>The Messaging Layer Security (MLS) Architecture</title>
            <author fullname="Benjamin Beurdouche" initials="B." surname="Beurdouche">
              <organization>Inria &amp; Mozilla</organization>
            </author>
            <author fullname="Eric Rescorla" initials="E." surname="Rescorla">
              <organization>Windy Hill Systems, LLC</organization>
            </author>
            <author fullname="Emad Omara" initials="E." surname="Omara">
         </author>
            <author fullname="Srinivas Inguva" initials="S." surname="Inguva">
         </author>
            <author fullname="Alan Duric" initials="A." surname="Duric">
              <organization>Wire</organization>
            </author>
            <date day="3" month="August" year="2024"/>
            <abstract>
              <t>   The Messaging Layer Security (MLS) protocol (I-D.ietf-mls-protocol)
   provides a Group Key Agreement protocol for messaging applications.
   MLS is meant to protect against eavesdropping, tampering, message
   forgery, and provide Forward Secrecy (FS) and Post-Compromise
   Security (PCS).

   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 tradeoffs 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.

   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, or the authentication service.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mls-architecture-15"/>
        </reference>
      </references>
    </references>
    <?line 774?>

<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 {
  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>;
  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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
VnBzr5hr19m6bq58lnaZ604d27ne3OsJfCpPppUxbXn3utnW3CB1yV86BtD+
/0oMn8eY7TaInfkuI3C6UJc3PtWEIKI215uaeivj7E0zkYz3anqu7avorUfh
R61R5ubIJ7m/cQQEXziTlWi7rVfsxIoxN9HLCOGQ0aULbDu4DP2QgbsCPDbG
PJIEtoDmzdjiHkzQtLcbmvMrDvbluLabegtThLwyxwW/dGUjg5X06tPXm5aR
DsvRmhO+OEctaSkp9jWfrwbqkKzmMIlTtziHOHvzjSzN9scBRwVGRdLqZDVh
54XTgEQcEd2dNlab0g/yzmWr0F3tbRqbqPAlE/zp5gcxG7UKW8Ynnh3vZ1Tx
+bwOEnS81OwErc4ggcqhI+lPKANqYI+smYb9R9Ui5/7QdB/4hADlYbqs34aF
m97RQ82ENw8zfNgsCPyiVdxQPa13aJb8Ln0qMW0+AQhzzPA1gCT5Ji/E6Ax8
MlED55wqduIoCNR5/yN9E7/ybBMDsj0qzl9crOY2dzHySJqs0NTFEvqsye/l
DSpNeY+3dV6w0bD3GbIa01I2X7zdzKup1VL7PpbWCJ+Vkn19asP9upJdtqoo
yMY+q4R7cbWVh5JgfmKmqwrQO4zSsyTyVCCM11WQROWM/kBwH9yNO58dwRsM
6XOEbtuOeRR+Hrg9wu/az1PKTTWwNtTeHO2jOT05FBLTfnRzhzbfIYc2BMCN
AEj3bnGSHIYZt91zxk4gbb+/AJ06P4fkKE9B6c2cN2S4RDLpq28O/5P+U1Tb
CL5KurxSk1ZwiK8En7TE+4EnG0SRTlxETQMiGrsTJ3IlyqX2D1xPJpaiJjE1
TTbuL5Jpy+Uh2SC2SWx4TjZsv0lsvk1i22uyYeZM1FBjLYSJM4yFJbGZz9fp
KjsowsG9XSxpmblsv+7HBgNJ2swjiRVo/5MlSP/Ta+5JWwMOC1yrTY3fzgcG
mfBvNRglka3Hwtz9Hd2kxCXBLUr8QZhYXKa3J3EhWGCEKfEgAfeMCjea+QGd
fpQEGo5dNSsSAZ65304lCD6634EMnnSIzK0VxVJs+DESPv2HThHRf+5m9Uks
7bmj9OxEpDabtUop+nA4JCmZzqkN9bav1Usyv+gt5PBRY01VxFQ/10dL7b2T
S68YZMhUL1E8HpVz9gUhMxXRqZmkUTzLFvl8rWmXOIPCAh4kmr8Mce9GM7hl
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
TyR1a+ZqGqRz/n/RsFDn6fEAAA==

-->

</rfc>
