<?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.17 (Ruby 3.3.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-mimi-room-policy-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title abbrev="MIMI Room Policy">Room Policy for the More Instant Messaging Interoperability (MIMI) Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-mimi-room-policy-00"/>
    <author fullname="Rohan Mahy">
      <organization>Rohan Mahy Consulting Services</organization>
      <address>
        <email>rohan.ietf@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="November" day="15"/>
    <area>Applications and Real-Time</area>
    <workgroup>More Instant Messaging Interoperability</workgroup>
    <keyword>room policy</keyword>
    <abstract>
      <?line 35?>

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

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

<t>Role:
A long-lived position reflecting the privilege level of a participant in a room. Possible values are owner, admin, regular-user, visitor, none, or outcast. A role closely maps to the MUC concept of affiliation, not the MUC concept of role.</t>
      <t>Occupant:
A user that has at least one client in the corresponding MLS group, and a role of owner, admin, regular-user, or visitor.</t>
      <t>Room ID:
An identifier which uniquely identifies a room.</t>
      <t>User ID:
An internal identifier which uniquely identifies a user.</t>
      <t>Nickname:
The identifier by which a user is referred inside a room. Depending on the context it may be a display name, handle, pseudonym, or temporary identifier. The nickname in one room need not correlate with the nickname for the same user in a different room.</t>
      <t>Client ID:
An internal identifier which uniquely identifies one client/device instance of one user account.</t>
      <t><strong>Persistent vs. Temporary rooms</strong>:
A temporary room is destroyed when the last occupant exits whereas a persistent room is not destroyed when the last occupant exist. As MLS has no notion of a group with no members, a persistent room could consist of a sequence of distinct MLS groups, zero or one of which would exist at a time.</t>
      <section anchor="moderation-terms">
        <name>Moderation Terms</name>
        <t>Knock:
To request entry into a room.</t>
        <t>Ban:
To remove a user from a room such that the user is not allowed to re-enter the room (until and unless the ban has been removed). A banned user has a role of "outcast". Typically this action is only used in an open or semi-open room. It is distinct than merely removing a user from an administered group.</t>
        <t>Kick:
To temporarily remove a participant or visitor from a room. The user is allowed to re-enter the room at any time.</t>
        <t>Voice (noun):
The privilege to send messages in a room.</t>
        <t>Revoke Voice:
To remove the permission to send messages in a room.</t>
        <t>Grant Voice:
To grant the permission to send messages in a room.</t>
        <t>Moderator:
A client whose user has a role of admin or owner in the room. A moderator can ban users, and (when allowed in the room) can grant and revoke voice, kick individual clients, and grant access (ex: in response to a knock).</t>
      </section>
    </section>
    <section anchor="room-capabilities">
      <name>Room Capabilities</name>
      <t>Membership-Style:
The overall approach of membership authorization in a room, which could be open, members-only (administrated), fixed-membership, or parent-dependent.</t>
      <t>Open room:
An open room can be joined by any non-banned user.</t>
      <t>Members-Only room:
A members-only room can only be joined by a user in the occupant list,
or who is pre-authorized. Authorized users can add or remove users to the
room. In an enterprise context, it is also common (but not required) for
users from a particular domain, group, or workgroup to be pre-authorized to
add themselves to a Members-Only room.</t>
      <t>Fixed-Membership room:
Fixed-membership rooms have the list of occupants specified when they are created. Other users cannot be added. Occupants cannot leave or be removed, however a user can remove all its clients from the associated MLS group. The most common case of a fixed-membership room is a 1:1 conversation. This room membership style is used to implement Direct Message (DM) and Group DM features. Only a single fixed-membership room can exist for any unique set of occupants.</t>
      <t>Parent-dependent room:
In a parent-dependent room, the list occupants of the room must be a strict subset of the occupants of the parent room. If a user leaves or is removed from the parent room, that user is automatically removed from any parent-dependent rooms of that parent.</t>
      <t>Multi-device vs. Single-device:
A multi-device room can have multiple simultaneous clients of the same user as participants in the room. A single-device room can have a maximum of one client per user in the room at any moment.</t>
      <t>Knock-Enabled vs. Knock-Disabled:
In a knock-enabled room, non-banned users are allowed to programmatically request entry into the room. In a knock-disabled room this functionality is disabled.</t>
      <t>Moderated vs. Unmoderated:
An an unmoderated room, any occupant can send messages to the room. In a moderated room, only occupants who have "voice" can send messages to the room.</t>
    </section>
    <section anchor="room-policy-format-syntax">
      <name>Room policy format syntax</name>
      <section anchor="membership-related-policy">
        <name>Membership-related policy</name>
        <t>The <tt>membership_style</tt> of a room can be one of the following values:</t>
        <ul spacing="normal">
          <li>
            <t>open</t>
          </li>
          <li>
            <t>members-only (default)</t>
          </li>
          <li>
            <t>fixed-membership</t>
          </li>
          <li>
            <t>parent-dependent</t>
          </li>
        </ul>
        <artwork><![CDATA[
enum {
  reserved(0)
  open(1),
  members-only(2),
  fixed-membership(3),
  parent-dependent(4),
  (255)
} MembershipStyle;
]]></artwork>
        <t>An open room allows any unbanned user. A members-only room allows only
invited or preauthorized users to join. A fixed-membership room (which can
be used for DMs or Group DMs) has a list of authorized users set at creation
time that cannot be added to. A parent-dependent room always has a strict subset of the participants of its parent room.</t>
        <t>If the membership_style is <tt>parent-dependent</tt> the <tt>parent_room_uri</tt> <bcp14>MUST</bcp14> be set with the room ID of the parent. Otherwise the field is zero-length.</t>
        <t>If <tt>multi_device</tt> is true (the default), the MLS group may contain multiple clients per user. If false only a single client can be an MLS member at one time.</t>
        <t>If <tt>knock_allowed</tt> is true, a non-participant can send a knock requesting access to the target room. If false, a user cannot. This option can only be enabled if the membership_style is members-only. The default is false.</t>
        <t>If <tt>moderated</tt> is true, the room supports granting and revoking voice. The default is false.</t>
        <artwork><![CDATA[
enum {
  false(0),
  true(1)
} bool;

struct {
  MembershipStyle membership_style;
  Uri parent_room_uri<V>;
  bool multi_device;
  bool knock_allowed;
  bool moderated;
  bool persistent_room;
  bool password_protected;
  ...
} RoomPolicy;
]]></artwork>
        <t>If persistent_room is false, the room will be automatically deleted when the corresponding MLS group is destroyed (when there are no clients in the group). If persistent_room is true, the room policy will remain and a client whose user has appropriate authorization can create a new MLS group for the same room. (There is not a 1:1 correlation of MLS group to room ID in a persistent room.)</t>
        <t>If password_protected is true, the room requires a passcode or passphrase when a client of a new user requests access to the GroupInfo used to join a group. The default is false.</t>
      </section>
      <section anchor="pre-authorized-users">
        <name>Pre-authorized users</name>
        <artwork><![CDATA[
enum {
  reserved(0),
  system(1),
  owner(2),
  admin(3),
  regular_user(4),
  visitor(5),
  banned(6),
  (255)
} Role;

struct {
  Role target_role;
  /* preauth_domain consists of ASCII letters, digits, and hyphens */
  opaque preauth_domain<V>;
  /* the remaining fields are in the form of a URI */
  opaque preauth_workgroup<V>;
  opaque preauth_group<V>;
  opaque preauth_user<V>;
} PreAuthPerRoleList;

struct {
  ...
  PreAuthPerRoleList pre_auth_list<V>;
  ...
} RoomPolicy;
]]></artwork>
        <t>In members-only rooms, it is convenient to pre-authorize specific users--or users from specific domains, workgroups/teams, and groups--to specific roles. The workgroup, group, and user are expressed as a Uri. The domain is expressed in US-ASCII letters, digits, and hyphens only. If the domain is internationalized, the Internationalized Domain Names <xref target="RFC5890"/> conversion <bcp14>MUST</bcp14> be done before filling in this value.</t>
        <t>Note that the system role is used to authorize external proposals for operations for other users. For example, the system role can be used to authorize a provider to remove clients from groups when the corresponding user account is deleted.</t>
      </section>
      <section anchor="delivery-and-read-notifications-pseudonyms">
        <name>Delivery and Read notifications, Pseudonyms</name>
        <artwork><![CDATA[
enum {
  optional(0),
  required(1),
  forbidden(2)
} Optionality;

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

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

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

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

struct {
  ...
  bool discoverable;
  LinkPolicy link_policy;
  LoggingPolicy logging_policy;
  HistoryPolicy history_sharing;
  Bot allowed_bots<V>;
  ...
} RoomPolicy;
]]></sourcecode>
        <section anchor="link-policies">
          <name>Link policies</name>
          <t>If discoverable is true, the room is searchable. Presumably this means the the only way to join the room in a client user interface is to be added by an administrator or to use a joining link.
Inside the LinkPolicy are several fields that describe the behavior of links.If the on_request field is true, no joining link will be provided in the room policy; the client will need to fetch a joining link out-of-band or generate a valid one for itself. If present, the URI in link_requests can be used by the client to request an invite code. The value of join_link is empty and the other fields are ignored.If the on_request field is false, the join_link field will contain a joining link. If the link will work for multiple users, multiuser is true. The expiration field represents the time, in seconds after the start of the UNIX epoch (1-January-1970) when the link will expire. The link_requests field can be empty.</t>
        </section>
        <section anchor="logging-policies">
          <name>Logging policies</name>
          <t>Inside the LoggingPolicy, the logging field can be forbidden, optional, or required. If logging is forbidden then the other fields are empty. If logging is required, the list of logging_clients needs to contain at least one logging URI. Each provider should have no more than one logging client at a time in a room. The machine_readable_policy and human_readable_policy fields optionally contain pointers to the owning provider's machine readable and human readable logging policies, respectively. If logging is optional and there is at least one logging_client then logging is active for the room.</t>
        </section>
        <section anchor="chat-history-policies">
          <name>Chat history policies</name>
          <t>Inside the HistoryPolicy, if history_sharing is forbidden, this means that clients (including bots) are expected to not to share chat history with new joiners, in which case who_can_share is empty, automatically_share is false, and max_time_period is zero.
Otherwise who_can_share is a list of roles that are authorized to share history (for example, only admins and owners can share). The values of none and outcast cannot be used in who_can_share. If automatically_share is true, clients can share history with new joiners without user initiation. The history that is shared is limited to max_time_period seconds worth of history.</t>
        </section>
        <section anchor="chat-bot-policies">
          <name>Chat bot policies</name>
          <t>Inside the RoomPolicy there is a list of allowed_bots. Each of which has several fields. The name, description, and homepage are merely descriptive. The bot_role indicates if the chat bot would be treated as a system-user, owner, admin, regular_user, or visitor.
The can_read and can_write fields indicate if the chat bot is allowed to read messages or send messages in the MLS group, respectively. If can_target_message_in_group is true it indicates that the chat bot can send an MLS targeted message (see Section 2.2 of [I-D.ietf-mls-extensions]) or use a different conversation or out-of-band channel to send a message to specific individual users in the room. If per_user_content is true, the chat bot is allowed to send messages with distinct content to each member. (For example a poker bot could deal a different hand to each user in a chat).Users could set policies to reject or leave groups with bots rights that are inconsistent with the user's privacy goals.</t>
        </section>
      </section>
      <section anchor="extensibility-of-the-policy-format">
        <name>Extensibility of the policy format</name>
        <t>Finally, The extensibility mechanism allows for future addition of new room policies.</t>
        <artwork><![CDATA[
enum {
  null(0),
  boolean(1),
  number(2),
  string(3),
  jsonObject(4)
} ExtType;

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

struct {
  ...
  PolicyExtension policy_extensions<V>;
} RoomPolicy;
]]></artwork>
        <t>foo</t>
      </section>
    </section>
    <section anchor="role-based-access-control">
      <name>Role-Based Access Control</name>
      <t>With Role-Based Access Control, the room policy defines a list of roles and the capabilities associated with each role.</t>
      <artwork><![CDATA[
enum {
  reserved(0),
  canAddParticipant(1),
  ...
  (65535)
} Capability;

struct {
  int role_index;
  opaque role_name<V>;
  opaque role_description<V>;
  Capability role_capabilities<V>;
  int minimum_participants_constraint;
  optional int maximum_participants_constraint;
  int minimum_active_participants_constraint;
  optional int maximum_active_participants_constraint;
} Role

struct {
  Role target_role;
  /* preauth_domain consists of ASCII letters, digits, and hyphens */
  opaque preauth_domain<V>;
  /* the remaining fields are in the form of a URI */
  opaque preauth_workgroup<V>;
  opaque preauth_group<V>;
  opaque preauth_user<V>;
} PreAuthPerRoleList;

struct {
  Role roles<V>;
  ...
  PreAuthPerRoleList pre_auth_list<V>;
  ...
} RoomPolicy;
]]></artwork>
      <section anchor="capability-categories">
        <name>Capability Categories</name>
        <section anchor="membership-capabilities">
          <name>Membership Capabilities</name>
          <ul spacing="normal">
            <li>
              <t>canAddParticipant</t>
            </li>
            <li>
              <t>canRemoveParticipant</t>
            </li>
            <li>
              <t>canAddOwnClient</t>
            </li>
            <li>
              <t>canRemoveSelf</t>
            </li>
            <li>
              <t>canAddSelf</t>
            </li>
            <li>
              <t>canCreateJoinLink</t>
            </li>
            <li>
              <t>canUseJoinLink</t>
            </li>
          </ul>
          <t>These actions are subject to role constraints described below.</t>
        </section>
        <section anchor="moderation-capabilities">
          <name>Moderation Capabilities</name>
          <ul spacing="normal">
            <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>canKnock</t>
            </li>
            <li>
              <t>canAcceptKnock</t>
            </li>
            <li>
              <t>canChangeUserRole</t>
            </li>
            <li>
              <t>canCreateSubgroup</t>
            </li>
          </ul>
          <t>These actions are subject to role constraints described below.</t>
        </section>
        <section anchor="breakouts">
          <name>Breakouts</name>
          <ul spacing="normal">
            <li>
              <t>canSendDirectMessage</t>
            </li>
            <li>
              <t>canTargetMessage</t>
            </li>
          </ul>
        </section>
        <section anchor="message-capabilities">
          <name>Message Capabilities</name>
          <ul spacing="normal">
            <li>
              <t>canSendMessage</t>
            </li>
            <li>
              <t>canReceiveMessage</t>
            </li>
            <li>
              <t>canReportAbuse</t>
            </li>
            <li>
              <t>canReactToMessage</t>
            </li>
            <li>
              <t>canEditReaction</t>
            </li>
            <li>
              <t>canDeleteReaction</t>
            </li>
            <li>
              <t>canEditOwnMessage</t>
            </li>
            <li>
              <t>canDeleteOwnMessage</t>
            </li>
            <li>
              <t>canDeleteAnyMessage</t>
            </li>
            <li>
              <t>canStartTopic</t>
            </li>
            <li>
              <t>canReplyInTopic</t>
            </li>
            <li>
              <t>canSendDirectMessage</t>
            </li>
            <li>
              <t>canTargetMessage</t>
            </li>
          </ul>
          <t>The Hub can enforce whether a member can send a message and not fanout application messages. Other capabilities can only be enforced by other clients.</t>
        </section>
        <section anchor="asset-capabilities">
          <name>Asset Capabilities</name>
          <ul spacing="normal">
            <li>
              <t>canUploadImage</t>
            </li>
            <li>
              <t>canUploadVideo</t>
            </li>
            <li>
              <t>canUploadAttachment</t>
            </li>
            <li>
              <t>canDownloadImage</t>
            </li>
            <li>
              <t>canDownloadVideo</t>
            </li>
            <li>
              <t>canDownloadAttachment</t>
            </li>
            <li>
              <t>canSendLink</t>
            </li>
            <li>
              <t>canSendLinkPreview</t>
            </li>
            <li>
              <t>canFollowLink</t>
            </li>
          </ul>
        </section>
        <section anchor="adjust-metadata">
          <name>Adjust metadata</name>
          <ul spacing="normal">
            <li>
              <t>canChangeRoomName</t>
            </li>
            <li>
              <t>canChangeRoomSubject</t>
            </li>
            <li>
              <t>canChangeRoomAvatar</t>
            </li>
            <li>
              <t>canChangeOwnName</t>
            </li>
            <li>
              <t>canChangeOwnPresence</t>
            </li>
            <li>
              <t>canChangeOwnMood</t>
            </li>
            <li>
              <t>canChangeOwnAvatar</t>
            </li>
          </ul>
        </section>
        <section anchor="real-time-media">
          <name>Real-time media</name>
          <ul spacing="normal">
            <li>
              <t>canStartCall</t>
            </li>
            <li>
              <t>canJoinCall</t>
            </li>
            <li>
              <t>canSendAudio</t>
            </li>
            <li>
              <t>canReceiveAudio</t>
            </li>
            <li>
              <t>canSendVideo</t>
            </li>
            <li>
              <t>canReceiveVideo</t>
            </li>
            <li>
              <t>canShareScreen</t>
            </li>
            <li>
              <t>canViewSharedScreen</t>
            </li>
          </ul>
        </section>
        <section anchor="disruptive-policy-changes">
          <name>Disruptive Policy Changes</name>
          <ul spacing="normal">
            <li>
              <t>canChangeRoomMembershipStyle</t>
            </li>
            <li>
              <t>canChangeOtherPolicyAttribute</t>
            </li>
            <li>
              <t>canDestroyRoom</t>
            </li>
            <li>
              <t>MLS specific
              </t>
              <ul spacing="normal">
                <li>
                  <t>update</t>
                </li>
                <li>
                  <t>reinit</t>
                </li>
                <li>
                  <t>PSK</t>
                </li>
                <li>
                  <t>external proposal</t>
                </li>
                <li>
                  <t>external commit</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="role-constraints">
        <name>Role constraints</name>
        <t>Minimum and maximum number of each role.</t>
      </section>
    </section>
    <section anchor="operational-policy">
      <name>Operational policy</name>
      <t>Section 7 of the <xref target="I-D.ietf-mls-architecture"/> defines a set of operational
policy considerations that influence interoperability of MLS clients. MIMI
explicitly address a handful of the issues in the document by taking a position on ordering (Proposals referenced in a Commit need to be received before the Commit; the Commit entering a new epoch needs to be received before any other messages in that epoch), privacy of handshake messages (handshakes can be a PublicMessage or SemiPrivateMessage), and GroupInfo storage (committers need to provide a valid GroupInfo to the Hub). The rest of these issues are described here. Just because a topic is listed does not mean that a room needs to take a position; nor different rooms on a Hub need to have different policies for these items.</t>
      <section anchor="some-mls-related-policy-that-could-be-tied-to-a-room">
        <name>Some MLS-related policy that could be tied to a room</name>
        <ul spacing="normal">
          <li>
            <t>any mandatory or forbidden MLS extensions.</t>
          </li>
          <li>
            <t>which proposals are valid to have in a commit, including but not limited to:
            </t>
            <ul spacing="normal">
              <li>
                <t>when, and under what circumstances, a reinitialization proposal is allowed.</t>
              </li>
              <li>
                <t>when proposals from external senders are allowed and how to authorize those proposals.</t>
              </li>
              <li>
                <t>when external joiners are allowed and how to authorize those external commits.</t>
              </li>
              <li>
                <t>which other proposal types are allowed.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>when members should commit pending proposals in a group.</t>
          </li>
          <li>
            <t>when two credentials represent the same client.</t>
          </li>
          <li>
            <t>how long to allow a member to stay in a group without updating its leaf keys before removing them.</t>
          </li>
          <li>
            <t>When and how to pad messages.</t>
          </li>
          <li>
            <t>When to send a reinitialization proposal.</t>
          </li>
          <li>
            <t>How often clients should update their leaf keys.</t>
          </li>
          <li>
            <t>Whether to prefer sending full commits or partial/empty commits.</t>
          </li>
          <li>
            <t>Whether there should be a required_capabilities extension in groups.</t>
          </li>
          <li>
            <t>minimum and maximum lifetime of KeyPackages</t>
          </li>
          <li>
            <t>if last resort KeyPackages are allowed</t>
          </li>
          <li>
            <t>how long to store resumption PSK (how much time and how many epochs)</t>
          </li>
          <li>
            <t>minimum and maximum number past epochs to keep</t>
          </li>
          <li>
            <t>how long to keep unused nonce and key pairs for a sender</t>
          </li>
          <li>
            <t>maximum number of unused key pairs to keep</t>
          </li>
          <li>
            <t>maximum number of steps that clients will move a secret tree ratchet forward in response to a single message before rejecting it</t>
          </li>
          <li>
            <t>tolerance to out of order app messages</t>
          </li>
          <li>
            <t>tolerance to out of order handshake messages</t>
          </li>
          <li>
            <t>handshakes may be which of PublicMessage, PrivateMessage, or SemiPrivateMessage.</t>
          </li>
          <li>
            <t>if external joiners are allowed</t>
          </li>
          <li>
            <t>if external proposals are allowed
            </t>
            <ul spacing="normal">
              <li>
                <t>if so, who can submit</t>
              </li>
              <li>
                <t>which member(s) are responsible for submitting pending proposals</t>
              </li>
            </ul>
          </li>
          <li>
            <t>how a joiner gets access to the ratchet_tree</t>
          </li>
        </ul>
      </section>
      <section anchor="not-relevant-to-mimi-between-client-and-its-provider">
        <name>Not relevant to MIMI (between client and its provider)</name>
        <ul spacing="normal">
          <li>
            <t>how many KPs to keep active</t>
          </li>
          <li>
            <t>how group IDs are constructed</t>
          </li>
          <li>
            <t>which ciphersuites are acceptable.</t>
          </li>
        </ul>
      </section>
      <section anchor="areas-for-future-works">
        <name>Areas for future works</name>
        <t>Which credential types are allowed/required</t>
        <t>How to protect and share the GroupInfo objects needed for external joins.</t>
        <t>If an application wishes to detect and possibly discipline members that send malformed commits with the intention of corrupting a group's state, there must be a method for reporting and validating malformed commits.
MLS requires the following parameters to be defined, which must be the same for two implementations to interoperate:</t>
        <t>Which media types are required to send and required to understand in MIMI.</t>
        <t>What Additional authenticated data, can/should be sent unencrypted in an otherwise encrypted message.</t>
        <t>Application-level identifiers of public key material (specifically the application_id extension as defined in Section 5.3.3 of [RFC9420]).</t>
      </section>
    </section>
    <section anchor="some-types-of-rooms-with-rbac">
      <name>Some types of rooms with RBAC</name>
      <section anchor="strict-administrator-policy">
        <name>Strict administrator policy</name>
        <t>Role levels (low to high capabilities):</t>
        <ul spacing="normal">
          <li>
            <t>banned</t>
          </li>
          <li>
            <t>guest</t>
          </li>
          <li>
            <t>ordinary_user</t>
          </li>
          <li>
            <t>group_admin</t>
          </li>
          <li>
            <t>super_admin</t>
          </li>
        </ul>
        <t>Capabilities per role</t>
        <ul spacing="normal">
          <li>
            <t>banned
            </t>
            <ul spacing="normal">
              <li>
                <t>(no capabilities)</t>
              </li>
            </ul>
          </li>
          <li>
            <t>guest
      - canSendMessage
      - canReceiveMessage
      - canRemoveSelf</t>
          </li>
          <li>
            <t>ordinary_user
            </t>
            <ul spacing="normal">
              <li>
                <t>(everything guest can do, plus:)
                </t>
                <ul spacing="normal">
                  <li>
                    <t>canAddOwnClient</t>
                  </li>
                  <li>
                    <t>canChangeOwnName,Presence,Mood,Avatar</t>
                  </li>
                  <li>
                    <t>canReport</t>
                  </li>
                  <li>
                    <t>canSendLinks</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>canSendImages</t>
              </li>
              <li>
                <t>canSendVideos</t>
              </li>
            </ul>
          </li>
          <li>
            <t>group_admin
      - (everything ordinary_user can do, plus:)
      - canSendAttachments
      - canAddParticipant
      - canRemoveParticipant
      - canBanish - promote
      - canUnBanish
      - canKick
      - canChangeRoomName,Subject,Avatar
      - canPromoteRole(from=[ordinary]; to=[admin])
      - canDemoteRole([from=[admin], to=[ordinary])
      - canDestroyRoom
      - canCreateJoinLink</t>
          </li>
          <li>
            <t>super_admin
            </t>
            <ul spacing="normal">
              <li>
                <t>(everything group_admin can do, plus:)</t>
              </li>
              <li>
                <t>canPromoteRole(from=[ordinary,admin], to=[superadmin])</t>
              </li>
              <li>
                <t>canDemoteRole(from=[superadmin], to=[ordinary,admin])</t>
              </li>
              <li>
                <t>canChangeRoomMembershipStyle</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Role constraints: must have at least 1 "admin"</t>
      </section>
      <section anchor="cooperative-room-everyone-can-add-and-remove">
        <name>Cooperative room (everyone can add and remove)</name>
        <t>Role levels (low to high capabilities):</t>
        <ul spacing="normal">
          <li>
            <t>banned</t>
          </li>
          <li>
            <t>ordinary_user</t>
          </li>
          <li>
            <t>group_admin</t>
          </li>
          <li>
            <t>super_admin</t>
          </li>
        </ul>
        <t>Capabilities per role</t>
        <ul spacing="normal">
          <li>
            <t>banned
            </t>
            <ul spacing="normal">
              <li>
                <t>(no capabilities)</t>
              </li>
            </ul>
          </li>
          <li>
            <t>ordinary_user
      - canSendMessage
      - canReceiveMessage
      - canRemoveSelf
      - canAddOwnClient
      - canChangeOwnName,Presence,Mood,Avatar
      - canReport
      - canAddParticipant
      - canRemoveParticipant
      - canKick
      - canChangeRoomName,Subject,Avatar
      - canCreateJoinLink
      - canSendLinks
            </t>
            <ul spacing="normal">
              <li>
                <t>canSendImages</t>
              </li>
              <li>
                <t>canSendVideos</t>
              </li>
              <li>
                <t>canSendAttachments</t>
              </li>
            </ul>
          </li>
          <li>
            <t>group_admin
      - (everything ordinary_user can do, plus:)
      - canBanish
      - canUnBanish
      - canPromoteRole(from=[ordinary], to=[admin])
      - canDemoteRole([from=[admin], to=[ordinary])
      - canDestroyRoom</t>
          </li>
          <li>
            <t>super_admin
            </t>
            <ul spacing="normal">
              <li>
                <t>(everything group_admin can do, plus:)</t>
              </li>
              <li>
                <t>canPromoteRole(from=[ordinary,admin], to=[superadmin])</t>
              </li>
              <li>
                <t>canDemoteRole(from=[superadmin], to=[ordinary,admin])</t>
              </li>
              <li>
                <t>canChangeRoomMembershipStyle</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Role constraints: must have at least 1 "group_admin"</t>
      </section>
      <section anchor="moderated-room">
        <name>Moderated room</name>
        <t>Role levels (low to high capabilities):</t>
        <ul spacing="normal">
          <li>
            <t>banned</t>
          </li>
          <li>
            <t>non-participant</t>
          </li>
          <li>
            <t>guest</t>
          </li>
          <li>
            <t>attendee</t>
          </li>
          <li>
            <t>speaker</t>
          </li>
          <li>
            <t>moderator</t>
          </li>
          <li>
            <t>super_admin</t>
          </li>
        </ul>
        <t>Capabilities per role</t>
        <ul spacing="normal">
          <li>
            <t>banned
            </t>
            <ul spacing="normal">
              <li>
                <t>(no capabilities)</t>
              </li>
            </ul>
          </li>
          <li>
            <t>non-participant
      - canKnock
      - canJoinViaLink</t>
          </li>
          <li>
            <t>guest
      - canReceiveMessage
      - canRemoveSelf</t>
          </li>
          <li>
            <t>attendee
            </t>
            <ul spacing="normal">
              <li>
                <t>(everything guest can do, plus:)
                </t>
                <ul spacing="normal">
                  <li>
                    <t>canAddOwnClient</t>
                  </li>
                  <li>
                    <t>canChangeOwnName,Presence,Mood,Avatar</t>
                  </li>
                  <li>
                    <t>canReport</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>speaker
            </t>
            <ul spacing="normal">
              <li>
                <t>(everything attendee can do, plus:)
                </t>
                <ul spacing="normal">
                  <li>
                    <t>canSendMessage</t>
                  </li>
                  <li>
                    <t>canChangeRoomName,Subject,Avatar</t>
                  </li>
                  <li>
                    <t>canSendLinks</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>canSendImages</t>
              </li>
              <li>
                <t>canSendVideos</t>
              </li>
              <li>
                <t>canSendAttachments</t>
              </li>
            </ul>
          </li>
          <li>
            <t>moderator
      - (everything ordinary_user can do, plus:)
      - canAddParticipant
      - canRemoveParticipant
      - canAcceptKnock
      - canBan
      - canUnBan
      - canKick
      - canPromoteRole(from=[attendee]; to=[speaker])
      - canDemoteRole([from=[speaker], to=[attendee])
      - canCreateJoinLink</t>
          </li>
          <li>
            <t>super_admin
            </t>
            <ul spacing="normal">
              <li>
                <t>(everything moderator can do, plus:)
                </t>
                <ul spacing="normal">
                  <li>
                    <t>canDestroyRoom</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>canPromoteRole(from=[attendee,speaker], to=[moderator])</t>
              </li>
              <li>
                <t>canDemoteRole(from=[moderator], to=[attendee,speaker])</t>
              </li>
              <li>
                <t>canChangeRoomMembershipStyle</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Role constraints: must have at least 1 "moderator"</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="I-D.ietf-mimi-arch">
          <front>
            <title>An Architecture for More Instant Messaging Interoperability (MIMI)</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <date day="2" month="April" 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-00"/>
        </reference>
        <reference anchor="RFC2119">
          <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">
          <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="RFC5890">
          <front>
            <title>Internationalized Domain Names for Applications (IDNA): Definitions and Document Framework</title>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <date month="August" year="2010"/>
            <abstract>
              <t>This document is one of a collection that, together, describe the protocol and usage context for a revision of Internationalized Domain Names for Applications (IDNA), superseding the earlier version. It describes the document collection and provides definitions and other material that are common to the set. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5890"/>
          <seriesInfo name="DOI" value="10.17487/RFC5890"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <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="10" month="June" 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-04"/>
        </reference>
        <reference anchor="I-D.ietf-mls-architecture">
          <front>
            <title>The Messaging Layer Security (MLS) Architecture</title>
            <author fullname="Benjamin Beurdouche" initials="B." surname="Beurdouche">
              <organization>Inria &amp; Mozilla</organization>
            </author>
            <author fullname="Eric Rescorla" initials="E." surname="Rescorla">
              <organization>Windy Hill Systems, LLC</organization>
            </author>
            <author fullname="Emad Omara" initials="E." surname="Omara">
         </author>
            <author fullname="Srinivas Inguva" initials="S." surname="Inguva">
         </author>
            <author fullname="Alan Duric" initials="A." surname="Duric">
              <organization>Wire</organization>
            </author>
            <date day="3" month="August" year="2024"/>
            <abstract>
              <t>   The Messaging Layer Security (MLS) protocol (I-D.ietf-mls-protocol)
   provides a Group Key Agreement protocol for messaging applications.
   MLS is meant to protect against eavesdropping, tampering, message
   forgery, and provide Forward Secrecy (FS) and Post-Compromise
   Security (PCS).

   This document describes the architecture for using MLS in a general
   secure group messaging infrastructure and defines the security goals
   for MLS.  It provides guidance on building a group messaging system
   and discusses security and privacy tradeoffs offered by multiple
   security mechanisms that are part of the MLS protocol (e.g.,
   frequency of public encryption key rotation).  The document also
   provides guidance for parts of the infrastructure that are not
   standardized by MLS and are instead left to the application.

   While the recommendations of this document are not mandatory to
   follow in order to interoperate at the protocol level, they affect
   the overall security guarantees that are achieved by a messaging
   application.  This is especially true in the case of active
   adversaries that are able to compromise clients, the delivery
   service, or the authentication service.

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

<section anchor="complete-tls-presentation-language-syntax">
      <name>Complete TLS Presentation Language Syntax</name>
      <artwork><![CDATA[
enum {
  false(0),
  true(1)
} bool;

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

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

enum {
  reserved(0),
  system(1),
  owner(2),
  admin(3),
  regular_user(4),
  visitor(5),
  banned(6),
  (255)
} Role;

struct {
  Role target_role;
  /* preauth_domain consists of ASCII letters, digits, and hyphens */
  opaque preauth_domain<V>;
  /* the remaining fields are in the form of a URI */
  opaque preauth_workgroup<V>;
  opaque preauth_group<V>;
  opaque preauth_user<V>;
} PreAuthPerRoleList;

enum {
  reserved(0)
  open(1),
  members-only(2),
  fixed-membership(3),
  parent-dependent(4),
  (255)
} MembershipStyle;

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

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

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

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

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

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

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

RoomPolicy room_policy;
]]></artwork>
    </section>
    <section anchor="example-roles-and-permissions-scheme">
      <name>Example Roles and Permissions scheme</name>
      <ul spacing="normal">
        <li>
          <t>Owner</t>
        </li>
        <li>
          <t>Admin</t>
        </li>
        <li>
          <t>Moderator</t>
        </li>
        <li>
          <t>Ordinary-user</t>
        </li>
        <li>
          <t>Guest</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1de3Mbx5H/fz/FHv1HQBcAWracxFJeFCnZjEWRR0r2pVwu
eIEdEGvtA9nZJYWolM9yn+U+2fWve54LkJJsXZzU5apyImbn0dPv7ukZTyaT
pCu6Uj1I9y6apkrPm7JYbNJl06bdSqWnTavSk1p3Wd2lp0rr7Kqor6ilU22z
Vm02L8qi26Sj05PTk/30vG26ZtGUe0k2n7fqmmbFhzSYei9ZZJ26atrNg7So
l02S5M2iziqCIG+zZTcpVLecVEVVTFoaNVnzqMknnyS6n1eF1kVTd5s1dT95
/PxJmn6UZqVuaKGiztVa0f+ru71xuqfyomvaIivx4+TwEf1De9o7uXj+ZC+p
+2qu2gdJTqA8SBZNrVWte/0g7dpeJQT2Z0nWqoxmPVyvaf2so1V1mtV5eqGy
cvK8qNRectO0L6/apl9jm++GqL3kpdrQuPxBkk5SbDCVDSbXqu4JljR97xnT
VPCx9y3Bgy5fYga0V1lRUjuQ+Segddq0V2jP2sWK2lddt9YPDg7QDU3FtZra
bgdoOJi3zY1WB5jgAAOvim7Vz2lo26yyuspWm4MhpdCtJLTqLljBdZ/KDNOi
2Rp4IORHry3yT1ddRUyVZH23alrgjlZZ9mUpjHOB6dNTGknNBHxWF39jkoWf
0iMiYV92wNClaq+LhdLUXQmSGELe/Z+u0DJdNFWS1E1b0UTXRJgEzOp/JZPJ
JM3mumuzRZckz1eFTomR+4rYL82VXrTFXBHHpFp1abNMiccWrepUQPOCvhs5
S95TziJKT9OTYMlEq2vqX6aBPKRrnqTDiuBhQWqadR0N6YlW6c2qWKzSBaFq
rgjWal7UKk+6Jq2aXJW0jZsiJ9iz+krxblZZxzNVQGhFspZhh0vVqnqhmB/1
VHBUFXleqiT5CJtpm7xfgDDAGGkX6AbmvE4tup5Q8Pr1f5xMjqdeB+DrmzcB
RlfNTaoyAhaITFYZdpRmWjeLgrjO7m0KVXRNMLea4CW4aAt7ZtuqvlYl4WMv
oZ3ofr1uWgzEdrKybG7cJKAd2EWP02VLVBMkQS0SKTPSLkBFJoBoVdIWmOBr
tSiWxSKU7mmK7QYNhJarVUcs3NJ0raxLHJYXBHNPxFtnRK1FsSZ20CnIkL1U
fubFqgH3piOwj3qVVetSjWUSAjchkqZ106Wt+mtftOATAjefVMxWCp8wi+i0
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

-->

</rfc>
