<?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.23 (Ruby 3.4.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mahy-mimi-app-components-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.27.0 -->
  <front>
    <title abbrev="MIMI Application State">Application State Components for More Instant Messaging Interoperability (MIMI)</title>
    <seriesInfo name="Internet-Draft" value="draft-mahy-mimi-app-components-01"/>
    <author fullname="Rohan Mahy">
      <organization>Rohan Mahy Consulting Service</organization>
      <address>
        <email>rohan.ietf@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="February" day="11"/>
    <area>Applications and Real-Time</area>
    <workgroup>More Instant Messaging Interoperability</workgroup>
    <keyword>participant list</keyword>
    <keyword>roles</keyword>
    <keyword>capabilities</keyword>
    <keyword>room metadata</keyword>
    <keyword>components registry</keyword>
    <abstract>
      <?line 39?>

<t>This document presents structures for room metadata, participant lists, pre-authorized roles for future participants, and role-based access control, all of which are intended for use in MIMI (More Instant Messaging Interoperability).</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://rohanmahy.github.io/mimi-app-components/draft-mahy-mimi-app-components.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-mahy-mimi-app-components/"/>.
      </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/rohanmahy/mimi-app-components"/>.</t>
    </note>
  </front>
  <middle>
    <?line 43?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document introduces specific structures to carry room metadata, the room participant list (introduced conceptually in <xref target="I-D.ietf-mimi-arch"/>), room policy for preauthorizing users into the room based on identity-based attributes, and per-room role definitions.
Each of these structures is represented as an MLS application component as defined in <xref target="I-D.barnes-mls-appsync"/> (soon to be merged into <xref target="I-D.ietf-mls-extensions"/>).
Each component is represented in the MLS GroupContext for the room.</t>
      <t>This document is provided as a standalone document as it is short and easy to receive early review in its short format. The goal is to incorporate the contents of this draft into <xref target="I-D.ietf-mimi-room-policy"/>.</t>
      <t>While this work is intended for use with MIMI, it is suitable for use with
other systems using MLS (for example, non-authority-based messaging systems) that require similar functionality.</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?>

</section>
    <section anchor="room-metadata">
      <name>Room Metadata</name>
      <t>The Room Metadata component contains data about a room which might be displayed as human-readable information for the room, such as the name of the room and a URL pointing to its room image/avatar.</t>
      <t>It can contain a list of <tt>room_descriptions</tt>, each of which can have a specific <tt>language_tag</tt> and <tt>media_type</tt> along with the <tt>description_content</tt>. An empty <tt>media_type</tt> implies <tt>text/plain;charset=utf-8</tt>.</t>
      <t>RoomMetaData is the format of the <tt>data</tt> field inside the ComponentData struct for the Room Metadata component in the <tt>application_data</tt> GroupContext extension.</t>
      <sourcecode type="tls-presentation"><![CDATA[
/* a valid URI (ex: MIMI URI) */
struct {
  opaque uri<V>;
} Uri;

/* a sequence of valid UTF8 without nulls */
struct {
  opaque string<V>;
} UTF8String;

struct {
  /* an empty media_type is equivalent to text/plain;charset=utf-8 */
  opaque media_type<V>;
  opaque language_tag<V>;
  opaque description_content<V>;
} RichDescription;

struct {
  Uri room_uri;
  UTF8String room_name;
  RichDescription room_descriptions<V>;
  /* an https URI resolving to an avatar image */
  Uri room_avatar;
  UTF8String room_subject;
  UTF8String room_mood;
} RoomMetaData;

RoomMetaData RoomMetaUpdate;
]]></sourcecode>
      <t>RoomMetaUpdate (which has the same format as RoomMetaData) is the format of the <tt>update</tt> field inside the AppDataUpdate struct in an AppDataUpdate Proposal for the Room Metadata 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>
      <t>Only a single Room metadata update is valid per commit.</t>
    </section>
    <section anchor="participant-list">
      <name>Participant List</name>
      <t>The participant list is a list of "users" in a room.
Within a room, each user is assigned exactly one <em>role</em> (expressed with a <tt>role_index</tt> and described in <xref target="roles"/>) at any given time (specifically within any MLS epoch).
In a room that has multiple MLS clients per "user", the identifier for each user in <tt>participants.user</tt> is the same across all that user's clients in the room.
Note that each user has a single role at any point in time, and therefore all clients of the same user also have the same role.</t>
      <t>The participant list may include inactive participants, which currently do not have any clients in the corresponding MLS group, for example if their clients do not have available KeyPackages or if all of their clients are temporarily "kicked" out of the group.
The participant list can also contain participants that are explicitly banned, by assigning them a suitable role which does not have any capabilities.</t>
      <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque user<V>;
  uint32 role_index;
} UserRolePair;

struct {
  UserRolePair participants<V>;
} ParticipantListData;
]]></sourcecode>
      <t>ParticipantListData is the format of the <tt>data</tt> field inside the ComponentData struct for the Participant list Metadata component in the <tt>application_data</tt> GroupContext extension.</t>
      <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint32 user_index;
  uint32 role_index;
} UserindexRolePair;

struct {
  UserindexRolePair changedRoleParticipants<V>
  uint32 removedIndices<V>;
  UserRolePair addedParticipants<V>;
} ParticipantListUpdate;
]]></sourcecode>
      <t>ParticipantListUpdate is the contents of an AppDataUpdate Proposal with the component ID for the participant list.
The index of the <tt>participants</tt> vector in the current <tt>ParticipantListData</tt> struct is referenced as the <tt>user_index </tt> when making changes.
First the <tt>changedRoleParticipants</tt> list contains <tt>UserindexRolePair</tt>s with the index of a user who changed roles and their new role.
Next is the <tt>removedIndices</tt> list which has a list of users to remove completely from the participant list.
Finally there is a list of <tt>addedParticipants</tt> (which contains a user and role) that is appended to the end of the <tt>ParticipantListData</tt>.</t>
      <t>Each of these actions (modifying a user's role, removing a user, and adding a user) is authorized separately according to the rules specified in <xref target="membership-capabilities"/>. If all the changes are authorized, the <tt>ParticipantListData</tt> is modified accordingly.</t>
      <t>A single commit is not valid if it contain any combination of Participant list updates that operate on (add, remove, or change the role of) the same user in the participant list more than once.</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="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>application_data</tt> GroupContext extension.</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="role-capabilities">
      <name>Role Capabilities</name>
      <t>As described in the previous section, 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, 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="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <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-normative-references">
      <name>Normative References</name>
      <reference anchor="I-D.ietf-mimi-arch">
        <front>
          <title>An Architecture for More Instant Messaging Interoperability (MIMI)</title>
          <author fullname="Richard Barnes" initials="R." surname="Barnes">
            <organization>Cisco</organization>
          </author>
          <date day="21" month="November" year="2024"/>
          <abstract>
            <t>   The More Instant Messaging Interoperability (MIMI) working group is
   defining a suite of protocols that allow messaging providers to
   interoperate with one another.  This document lays out an overall
   architecture enumerating the MIMI protocols and how they work
   together to enable an overall messaging experience.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-mimi-arch-01"/>
      </reference>
      <reference anchor="I-D.barnes-mls-appsync">
        <front>
          <title>A Safe Application Interface to Messaging Layer Security</title>
          <author fullname="Joël" initials="" surname="Joël">
            <organization>Amazon</organization>
          </author>
          <author fullname="Richard Barnes" initials="R." surname="Barnes">
            <organization>Cisco</organization>
          </author>
          <author fullname="Rohan Mahy" initials="R." surname="Mahy">
            <organization>Rohan Mahy Consulting Services</organization>
          </author>
          <author fullname="Marta Mularczyk" initials="M." surname="Mularczyk">
            <organization>Amazon</organization>
          </author>
          <date day="12" month="December" year="2024"/>
          <abstract>
            <t>   The Messaging Layer Security protocol enables a group of participants
   to negotiate a common cryptographic state.  While the primary
   function of MLS is to establish shared secret state for the group, an
   MLS group also captures authentication information for group
   participants and information on which the group has confirmed
   agreement.  This document defines an interface interface by which
   multiple uncoordinated application functions may safely reuse the
   cryptographic state of an MLS group for application purposes.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-barnes-mls-appsync-01"/>
      </reference>
      <reference anchor="I-D.ietf-mls-extensions">
        <front>
          <title>The Messaging Layer Security (MLS) Extensions</title>
          <author fullname="Raphael Robert" initials="R." surname="Robert">
            <organization>Phoenix R&amp;D</organization>
          </author>
          <date day="21" month="October" year="2024"/>
          <abstract>
            <t>   This document describes extensions to the Messaging Layer Security
   (MLS) protocol.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Source for this draft and an issue tracker can be found at
   https://github.com/mlswg/mls-extensions.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-mls-extensions-05"/>
      </reference>
      <reference anchor="I-D.ietf-mimi-room-policy">
        <front>
          <title>Room Policy for the More Instant Messaging Interoperability (MIMI) Protocol</title>
          <author fullname="Rohan Mahy" initials="R." surname="Mahy">
            <organization>Rohan Mahy Consulting Services</organization>
          </author>
          <date day="15" month="November" year="2024"/>
          <abstract>
            <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>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-mimi-room-policy-00"/>
      </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-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>
    <?line 555?>

<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 numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
      <!--
<ol type="a">
  <li>One</li>
  <li>Two
    <ol type="a">
      <li>Aaa - Roman Army sounds off
        <ol type="i">
          <li>aye</li>
          <li>aye aye</li>
          <li>aye aye aye</li>
          <li>aye vee</li>
          <li>vee</li>
        </ol></li>
      <li>Bbb</li>
      <li>Ccc</li>
    </ol></li>
  <li>Three</li>
</ol>
-->

</section>
  </back>
  <!-- ##markdown-source:
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
u2g3SVxR0IlAdFqZgakuGo2eRP8HwjMZCLrAAAA=

-->

</rfc>
