<?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.6.36 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mahy-mimi-group-chat-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title abbrev="MIMI Group Chat">Group Chat Framework for More Instant Messaging Interoperability (MIMI)</title>
    <seriesInfo name="Internet-Draft" value="draft-mahy-mimi-group-chat-00"/>
    <author initials="R." surname="Mahy" fullname="Rohan Mahy">
      <organization>Wire</organization>
      <address>
        <email>rohan.mahy@wire.com</email>
      </address>
    </author>
    <date year="2023" month="July" day="10"/>
    <area>art</area>
    <workgroup>MIMI</workgroup>
    <keyword>group chat</keyword>
    <keyword>muc</keyword>
    <keyword>multiuser chat</keyword>
    <keyword>multi-user chat</keyword>
    <keyword>mls</keyword>
    <keyword>xep-45</keyword>
    <abstract>
      <?line 66?>

<t>This document describes a group instant messaging ("group chat") semantic framework
for the More Instant Messaging Interoperability (MIMI) Working Group. It describes
several properties and policy options which can be combined to model a wide
range of chat and multimedia conference types. It also describes how to build
these options as an overlay to Messaging Layer Security (MLS) groups and to
authorize MLS primitives.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-mahy-mimi-group-chat/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        MIMI 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/rohan-wire/mimi-groupchat/"/>.</t>
    </note>
  </front>
  <middle>
    <?line 75?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Group instant messaging ("group chat") is available on dozens of messaging
platforms. It can be used in a proliferation of modes, from a three-person
adhoc chat group, to an open discussion group, to a fully-moderated
auditorium-style group, and in many other configurations.  While they go by many names,
(channels, groups, chats, rooms), in this document we will refer to group chats
as rooms.</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. We need to map these functions onto the primitives of
the underlying Messaging Layer Security (MLS) protocol <xref target="I-D.ietf-mls-protocol"/>
used for end-to-end encryption.</t>
      <t>We assume that 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>This work is largely complimentary to the work of specifying an MLS Distribution
Service for MIMI in <xref target="I-D.robert-mimi-delivery-service"/>.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <section anchor="general-terms">
        <name>General Terms</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>This document borrows heavily from the semantics of the Multi-User Chat <xref target="MUC"/>
extension of the Extensible Messaging and Presence Protocol (XMPP) <xref target="XMPP"/>.
The terms used here differ from MUC in two important ways.
First, MUC has separate notions of an "affiliation" (which effectively applies to a user),
and a "role" (which effectively applies to a client). This document describes
roles that are assigned to users, but permissions associated with those roles
apply to the user or to a client of such a user, depending on the context. For
example, while a user might have an admin role authorizing her to add a new user
to a group chat, only one of her clients which is a member of the associated
MLS group is actually capable of adding the new user's clients to the group.
Second, MLS uses the term <em>member</em> to refer to clients that have the keying material
for the group in a particular epoch. To avoid confusion, the MUC affiliation
"member" corresponds to the user role "regular-user" in this document, and "visitor"
becomes a role associated with a user.</t>
        <t>The terms in this document and <xref target="I-D.ralston-mimi-terminology"/> have not yet
been aligned.</t>
        <dl>
          <dt><strong>Room</strong>:</dt>
          <dd>
            <t>A room, also known as a chat room or group chat, is a virtual space users
figuratively enter in order to participate in text-based conferencing.
When used with MLS it typically has a 1:1 relationship with an MLS group.</t>
          </dd>
          <dt><strong>User</strong>:</dt>
          <dd>
            <t>A single human user or automated agent (ex: chat bot) with a distinct identifiable
representation in a room.</t>
          </dd>
          <dt><strong>Client</strong>:</dt>
          <dd>
            <t>An instant messaging agent instance associated with a specific user account on a
specific device. For example, the mobile phone instance used by the user
@alice@example.com.</t>
          </dd>
          <dt><strong>Multi-device support</strong>:</dt>
          <dd>
            <t>A room which supports users, each of which can have multiple client instances
(ex: a Desktop client and mobile phone).</t>
          </dd>
          <dt><strong>Role</strong>:</dt>
          <dd>
            <t>A long-lived position reflecting the privilege level of a <em>user</em> 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>
          </dd>
          <dt><strong>Occupant</strong>:</dt>
          <dd>
            <t>A user that has at least one client in the corresponding MLS group,
<em>and</em> a role of owner, admin, regular-user, or visitor.</t>
          </dd>
          <dt><strong>Room ID</strong>:</dt>
          <dd>
            <t>An identifier which uniquely identifies a room.</t>
          </dd>
          <dt><strong>User ID</strong>:</dt>
          <dd>
            <t>An internal identifier which uniquely identifies a user.</t>
          </dd>
          <dt><strong>Nickname</strong>:</dt>
          <dd>
            <t>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>
          </dd>
          <dt><strong>Client ID</strong>:</dt>
          <dd>
            <t>An internal identifier which uniquely identifies one client/device instance
of one user account.</t>
          </dd>
          <dt><strong>Persistent vs. Temporary rooms</strong>:</dt>
          <dd>
            <t>In MUC, 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>
          </dd>
        </dl>
      </section>
      <section anchor="moderation-terms">
        <name>Moderation Terms</name>
        <dl>
          <dt><strong>Knock</strong>:</dt>
          <dd>
            <t>To request entry into a room.</t>
          </dd>
          <dt><strong>Ban</strong>:</dt>
          <dd>
            <t>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>
          </dd>
          <dt><strong>Kick</strong>:</dt>
          <dd>
            <t>To temporarily remove a participant or visitor from a room. The user is allowed
to re-enter the room at any time.</t>
          </dd>
          <dt><strong>Voice</strong> <em>(noun)</em>:</dt>
          <dd>
            <t>The privilege to send messages in a room.</t>
          </dd>
          <dt><strong>Revoke Voice</strong>:</dt>
          <dd>
            <t>To remove the permission to send messages in a room.</t>
          </dd>
          <dt><strong>Grant Voice</strong>:</dt>
          <dd>
            <t>To grant the permission to send messages in a room.</t>
          </dd>
          <dt><strong>Moderator</strong>:</dt>
          <dd>
            <t>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>
          </dd>
        </dl>
      </section>
      <section anchor="user-roles">
        <name>User Roles</name>
        <dl>
          <dt><strong>System-user</strong>:</dt>
          <dd>
            <t>A virtual user of the one of the providers with specific abilities, for example
to remove users with deleted accounts from all groups associated with that
user.</t>
          </dd>
          <dt><strong>Room Owner</strong>:</dt>
          <dd>
            <t>The user who created the room or a user who has been designated by the room
creator or owner as someone with owner status (if allowed); an owner is allowed
to change the room configuration and destroy persistent rooms, in addition to all admin
status. A room owner has the role of "owner".</t>
          </dd>
          <dt><strong>Room Administrator</strong>:</dt>
          <dd>
            <t>A user empowered by the room owner to perform administrative functions such
as adding, removing, or banning users; however, a room administrator is not
allowed to change the room configuration or to destroy a persistent room.
A room administrator has the role "admin".</t>
          </dd>
          <dt><strong>Regular-user</strong>:</dt>
          <dd>
            <t>A user that is either preauthorized to join the room or that has at least
one client that is a member of the corresponding MLS group; and that has no
other more specific role in the room. It has the role of "regular-user"</t>
          </dd>
          <dt><strong>Visitor</strong>:</dt>
          <dd>
            <t>In a moderated room, a user who does not automatically have voice when added to
a room. (in contrast to a regular-user). A visitor has a role of "visitor".</t>
          </dd>
          <dt><strong>Outcast</strong>:</dt>
          <dd>
            <t>A user who has been banned from a room. An outcast has a role of "outcast".</t>
          </dd>
        </dl>
      </section>
      <section anchor="mls-terms">
        <name>MLS Terms</name>
        <t>The terms MLS client, MLS group, (MLS group) member, Proposal, bare proposal,
Commit, External Commit, external join, group_id, epoch,
LeafNode, KeyPackage, GroupInfo,
GroupContext, GroupContextExtensions Proposal, Distribution Service (DS),
Authentication Service (AS), Credential, CredentialType, and
required_capabilities have the same meanings as in the MLS
protocol <xref target="I-D.ietf-mls-protocol"/>.</t>
        <t>An MLS <strong>KeyPackage</strong> (KP) is used to establish initial keying material in a group,
analogous to DoubleRatchet <xref target="DoubleRatchet"/> prekeys, except one KP is used for
a client per group but each recipient does not require a separate one.</t>
        <t>An MLS <strong>GroupInfo</strong> (GI) object is the information needed for a client to
externally join an MLS group using an External Commit. The GroupInfo
changes with each MLS epoch.</t>
        <t>MLS <strong>group membership</strong> means that the client is included as a LeafNode in
the MLS group and has the information necessary to encrypt to and decrypt
from the group.</t>
        <t><strong>MLS group agreement</strong> refers to the property of MLS that for every epoch in an
MLS group, every member can verify that they have the same membership and
the same GroupContext. By using the <tt>room_policy</tt> MLS extension
<xref target="I-D.mahy-mls-room-policy-ext"/>, this document uses this property to insure that every
MLS member has the room policy and can independently authorize any MLS action
taken within the group.</t>
      </section>
    </section>
    <section anchor="joining-rooms">
      <name>Joining Rooms</name>
      <t>The basic lifecycle of a room starts with creating a room and setting its policies and
operating style. Then additional users need to join it, leave it, send messages in it,
and eventually delete it. There are several methods of
joining, but most systems only implement a user interface for a subset of them.
In any case, most room policies focus on what <strong>users</strong> are allowed to do, while MLS
primitives focus on creating MLS groups and adding or removing MLS <strong>clients</strong> from them.</t>
      <t>Many messaging systems support multiple devices or client instances per user.
In a multi-device context, we expect if the user Alice has 3 stable devices, then
all three of Alice's clients/devices will be members of the MLS groups for each room
in which she belongs. If Alice deletes an old client, it should be removed
from all the MLS groups she belongs to; and if Alice adds a new client, it
should immediately join all the groups she belongs to. Finally if Alice joins
or is added to a new multi-device room, all here clients are added near
simultaneously.</t>
      <t>For the purposes of mapping clients to users, we adopt some specific terms.
A client that is a member of the MLS group corresponding to a room is an
"in-room client".
A user that has at least one in-room client is an "occupant" of the room. It can be
an owner, an admin, a visitor, or a "regular user" in the room.  A user might also have no
relationship with a room or it might be an outcast (a user who is banned from a
room).</t>
      <t>Say Alice is already in a room. In what ways can Bob end up in the same room as Alice?</t>
      <t>Alice could try to add Bob directly. To do that Alice needs to have the
appropriate room permissions, and Bob needs to allow Alice to fetch the
necessary information (the KeyPackages) to each of Bob's clients.
Depending on the provider and Bob's preferences, and Bob's
relationship with Alice, the provider might not allow Alice to get a KeyPackage
without some explicit consent.</t>
      <t>Alternatively Bob could try to join immediately. To do that Bob needs to have
permission to fetch the MLS group's GroupInfo and then enter the group via and
external join. Bob might be allowed
to fetch the GroupInfo, for example because the room was open, because Bob was already
pre-authorized, or because Bob used a joining link.</t>
      <t>Finally, in some rooms Bob can "knock" and request admittance into the room.</t>
      <t>Walking through the same scenarios (See <xref target="fig-join-methods"/>) in slightly more detail,
let's use the example of an members-only administered room where Alice is an admin,
and examine the ways in which Bob could end up as a regular user in the room. In
this context, "the group" refers to the MLS group corresponding to the room.</t>
      <t>1) If Alice and Bob already have a consent relationship that Bob's provider is aware of,
Alice can claim an MLS KeyPackage for each of Bob's clients and add them to the group.
Bob also becomes a regular user of the room.</t>
      <t>2) If Alice and Bob don't have a consent relationship, Alice can request one by
indicating that user <tt>@alice@example.com</tt> (Alice) asks user <tt>@bob@example.com</tt> (Bob)
to consent to communicating in <tt>#room35@example.com</tt> (a specific room). (Alice
could also immediately add Bob to the room's pre-authorization list, which would
allow Bob to join as in step 3. However Alice might only grant pre-authorization
contingent on Bob's consent for her to contact Bob directly.)</t>
      <t>If Bob grants consent,
Bob includes a KeyPackage for each of his clients. Bob could grant
consent to Alice for her to add him to any room or just the specific room requested.
(Bob can remove his consent at any time.) Alice uses the provided KeyPackages to
add all Bob's clients to the group. If the KeyPackages expire before Alice adds
Bob, she now has consent from Bob and can fetch fresh KeyPackages to add each of
Bob's clients as in step 1.</t>
      <t>3) Bob discovers the room and tries to join directly with an external join.
Bob might discover a public and open group
or Bob may have established a new client that needs to join Bob's existing groups.
An external join requires a GroupInfo object and a
<tt>ratchet_tree</tt> extension. If Bob is pre-authorized as a future occupant of the group,
Bob's client can download the GroupInfo from the room's owning provider, send an
External Commit and immediately add the rest of his clients.</t>
      <t>If Bob is not already pre-authorized, Bob can "knock", requesting to be admitted to
the room, including KeyPackages for each of his clients. This also creates a
consent for any admin of the room to re-fetch Bob's KeyPackages. An admin or owner
can then decide to use the (provided or newly fetches KeyPackages) to directly
add all of Bob's clients.</t>
      <t>4) Bob receives a join link. Bob uses the link to join directly with an external join.
The link (and any optional password) acts as authorization to fetch the GroupInfo.
Bob's client adds itself via External Commit and immediately adds any of Bob's
other clients.</t>
      <figure anchor="fig-join-methods">
        <name>Different ways to join a room using MLS clients</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="720" width="376" viewBox="0 0 376 720" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
              <path d="M 40,176 L 40,240" fill="none" stroke="black"/>
              <path d="M 40,288 L 40,352" fill="none" stroke="black"/>
              <path d="M 136,360 L 136,432" fill="none" stroke="black"/>
              <path d="M 136,656 L 136,688" fill="none" stroke="black"/>
              <path d="M 152,128 L 152,168" fill="none" stroke="black"/>
              <path d="M 160,304 L 160,336" fill="none" stroke="black"/>
              <path d="M 184,192 L 184,224" fill="none" stroke="black"/>
              <path d="M 264,32 L 264,240" fill="none" stroke="black"/>
              <path d="M 264,272 L 264,352" fill="none" stroke="black"/>
              <path d="M 264,432 L 264,640" fill="none" stroke="black"/>
              <path d="M 368,32 L 368,240" fill="none" stroke="black"/>
              <path d="M 368,272 L 368,352" fill="none" stroke="black"/>
              <path d="M 368,432 L 368,640" fill="none" stroke="black"/>
              <path d="M 264,32 L 368,32" fill="none" stroke="black"/>
              <path d="M 8,80 L 120,80" fill="none" stroke="black"/>
              <path d="M 176,80 L 256,80" fill="none" stroke="black"/>
              <path d="M 40,176 L 168,176" fill="none" stroke="black"/>
              <path d="M 184,208 L 256,208" fill="none" stroke="black"/>
              <path d="M 40,240 L 168,240" fill="none" stroke="black"/>
              <path d="M 264,240 L 368,240" fill="none" stroke="black"/>
              <path d="M 264,272 L 368,272" fill="none" stroke="black"/>
              <path d="M 40,288 L 144,288" fill="none" stroke="black"/>
              <path d="M 160,320 L 256,320" fill="none" stroke="black"/>
              <path d="M 40,352 L 144,352" fill="none" stroke="black"/>
              <path d="M 264,352 L 368,352" fill="none" stroke="black"/>
              <path d="M 264,432 L 368,432" fill="none" stroke="black"/>
              <path d="M 8,480 L 104,480" fill="none" stroke="black"/>
              <path d="M 160,480 L 256,480" fill="none" stroke="black"/>
              <path d="M 8,608 L 104,608" fill="none" stroke="black"/>
              <path d="M 160,608 L 256,608" fill="none" stroke="black"/>
              <path d="M 264,640 L 368,640" fill="none" stroke="black"/>
              <path d="M 112,608 L 136,656" fill="none" stroke="black"/>
              <path d="M 136,560 L 160,608" fill="none" stroke="black"/>
              <path d="M 112,480 L 136,528" fill="none" stroke="black"/>
              <path d="M 136,432 L 160,480" fill="none" stroke="black"/>
              <path d="M 128,80 L 152,128" fill="none" stroke="black"/>
              <path d="M 152,32 L 176,80" fill="none" stroke="black"/>
              <path d="M 128,80 L 152,32" fill="none" stroke="black"/>
              <path d="M 152,128 L 176,80" fill="none" stroke="black"/>
              <path d="M 112,480 L 136,432" fill="none" stroke="black"/>
              <path d="M 136,528 L 160,480" fill="none" stroke="black"/>
              <path d="M 112,608 L 136,560" fill="none" stroke="black"/>
              <path d="M 136,656 L 160,608" fill="none" stroke="black"/>
              <path d="M 168,176 C 176.83064,176 184,183.16936 184,192" fill="none" stroke="black"/>
              <path d="M 168,240 C 176.83064,240 184,232.83064 184,224" fill="none" stroke="black"/>
              <path d="M 144,288 C 152.83064,288 160,295.16936 160,304" fill="none" stroke="black"/>
              <path d="M 144,352 C 152.83064,352 160,344.83064 160,336" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="264,608 252,602.4 252,613.6 " fill="black" transform="rotate(0,256,608)"/>
              <polygon class="arrowhead" points="264,480 252,474.4 252,485.6 " fill="black" transform="rotate(0,256,480)"/>
              <polygon class="arrowhead" points="264,320 252,314.4 252,325.6 " fill="black" transform="rotate(0,256,320)"/>
              <polygon class="arrowhead" points="264,208 252,202.4 252,213.6 " fill="black" transform="rotate(0,256,208)"/>
              <polygon class="arrowhead" points="264,80 252,74.4 252,85.6 " fill="black" transform="rotate(0,256,80)"/>
              <polygon class="arrowhead" points="160,168 148,162.4 148,173.6 " fill="black" transform="rotate(90,152,168)"/>
              <polygon class="arrowhead" points="144,688 132,682.4 132,693.6 " fill="black" transform="rotate(90,136,688)"/>
              <polygon class="arrowhead" points="144,360 132,354.4 132,365.6 " fill="black" transform="rotate(270,136,360)"/>
              <polygon class="arrowhead" points="128,80 116,74.4 116,85.6 " fill="black" transform="rotate(0,120,80)"/>
              <polygon class="arrowhead" points="112,608 100,602.4 100,613.6 " fill="black" transform="rotate(0,104,608)"/>
              <polygon class="arrowhead" points="112,480 100,474.4 100,485.6 " fill="black" transform="rotate(0,104,480)"/>
              <g class="text">
                <text x="24" y="52">Alice</text>
                <text x="84" y="52">requests</text>
                <text x="220" y="52">Yes,</text>
                <text x="24" y="68">Bob's</text>
                <text x="60" y="68">KP</text>
                <text x="212" y="68">KP</text>
                <text x="152" y="84">OK?</text>
                <text x="312" y="116">Alice</text>
                <text x="40" y="132">No,</text>
                <text x="72" y="132">Bob</text>
                <text x="312" y="132">sends</text>
                <text x="44" y="148">does</text>
                <text x="80" y="148">not</text>
                <text x="120" y="148">authz</text>
                <text x="316" y="148">Commit</text>
                <text x="308" y="164">with</text>
                <text x="224" y="180">CONSENT</text>
                <text x="304" y="180">Add</text>
                <text x="88" y="196">Alice</text>
                <text x="220" y="196">KP</text>
                <text x="100" y="212">requests</text>
                <text x="96" y="228">CONSENT</text>
                <text x="304" y="292">admin</text>
                <text x="72" y="308">Bob</text>
                <text x="212" y="308">KP</text>
                <text x="304" y="308">sends</text>
                <text x="80" y="324">sends</text>
                <text x="128" y="324">KNOCK</text>
                <text x="308" y="324">Commit</text>
                <text x="348" y="324">w/</text>
                <text x="76" y="340">with</text>
                <text x="108" y="340">KP</text>
                <text x="216" y="340">answering</text>
                <text x="296" y="340">Add</text>
                <text x="200" y="356">admin</text>
                <text x="196" y="372">adds</text>
                <text x="232" y="372">Bob</text>
                <text x="24" y="388">No,</text>
                <text x="60" y="388">room</text>
                <text x="28" y="404">does</text>
                <text x="64" y="404">not</text>
                <text x="104" y="404">authz</text>
                <text x="16" y="436">Bob</text>
                <text x="56" y="436">tries</text>
                <text x="92" y="436">to</text>
                <text x="16" y="452">get</text>
                <text x="44" y="452">GI</text>
                <text x="68" y="452">to</text>
                <text x="204" y="452">Yes,</text>
                <text x="20" y="468">join</text>
                <text x="64" y="468">group</text>
                <text x="196" y="468">GI</text>
                <text x="136" y="484">OK?</text>
                <text x="316" y="516">External</text>
                <text x="300" y="532">Join</text>
                <text x="300" y="548">then</text>
                <text x="336" y="548">add</text>
                <text x="16" y="564">Bob</text>
                <text x="48" y="564">has</text>
                <text x="72" y="564">a</text>
                <text x="320" y="564">remaining</text>
                <text x="20" y="580">join</text>
                <text x="60" y="580">link</text>
                <text x="204" y="580">Yes,</text>
                <text x="312" y="580">clients</text>
                <text x="12" y="596">to</text>
                <text x="40" y="596">get</text>
                <text x="68" y="596">GI</text>
                <text x="196" y="596">GI</text>
                <text x="136" y="612">OK?</text>
                <text x="56" y="708">bad</text>
                <text x="92" y="708">link</text>
                <text x="124" y="708">or</text>
                <text x="172" y="708">password</text>
                <text x="232" y="708">error</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
                  .             +------------+
Alice requests   / \     Yes,   |            |
Bob's KP        /   \    KP     |            |
-------------->+ OK? +--------->|            |
                \   /           |            |
                 \ /            |   Alice    |
   No, Bob        +             |   sends    |
   does not authz |             |   Commit   |
                  v             |   with     |
    +----------------.  CONSENT |   Add      |
    |   Alice         |   KP    |            |
    |   requests      +-------->|            |
    |   CONSENT       |         |            |
    +----------------'          +------------+

                                +------------+
    +-------------.             |  admin     |
    |  Bob         |     KP     |  sends     |
    |  sends KNOCK +----------->|  Commit w/ |
    |  with KP     |  answering |  Add       |
    +-------------'   admin     +------------+
                ^     adds Bob
 No, room       |
 does not authz |
                |
Bob tries to    +               +------------+
get GI to      / \     Yes,     |            |
join group    /   \    GI       |            |
------------>+ OK? +----------->|            |
              \   /             |            |
               \ /              |  External  |
                +               |  Join      |
                                |  then add  |
Bob has a       .               |  remaining |
join link      / \     Yes,     |  clients   |
to get GI     /   \    GI       |            |
------------>+ OK? +----------->|            |
              \   /             |            |
               \ /              +------------+
                +
                |
                v
     bad link or password error
]]></artwork>
        </artset>
      </figure>
    </section>
    <section anchor="room-capabilities">
      <name>Room Capabilities</name>
      <t>In earlier sections we described several different types of rooms.
These are room policies composed from sets of room capabilities.
Each capability has two options. Most group chat use cases can
be composed from these specific capabilities.</t>
      <dl>
        <dt><strong>Membership-Style</strong>:</dt>
        <dd>
          <t>The overall approach of membership authorization in a room, which could be
open, members-only (administrated), fixed-membership, or parent-dependent.</t>
        </dd>
        <dt><strong>Open room</strong>:</dt>
        <dd>
          <t>An open room can be joined by any non-banned user.</t>
        </dd>
        <dt><strong>Members-Only room</strong>:</dt>
        <dd>
          <t>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 for users from a particular domain, group, or workgroup to be
pre-authorized to add themselves to a Members-Only room.</t>
        </dd>
        <dt><strong>Fixed-Membership room</strong>:</dt>
        <dd>
          <t>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>
        </dd>
        <dt><strong>Parent-dependent room</strong>:</dt>
        <dd>
          <t>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>
        </dd>
        <dt><strong>Multi-device vs. Single-device:</strong></dt>
        <dd>
          <t>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>
        </dd>
        <dt><strong>Knock-Enabled vs. Knock-Disabled</strong>:</dt>
        <dd>
          <t>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>
        </dd>
        <dt><strong>Moderated vs. Unmoderated</strong>:</dt>
        <dd>
          <t>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>
        </dd>
      </dl>
      <t>In the next section we describe how these room characteristics influence the
rules used to authorize specific MLS primitives.</t>
    </section>
    <section anchor="authorizing-mls-primitives">
      <name>Authorizing MLS primitives</name>
      <t>Below is a list of MLS primitives:</t>
      <ul spacing="normal">
        <li>create an MLS group</li>
        <li>add a client to a group (Commit with Add)</li>
        <li>fetch a KeyPackage</li>
        <li>join a group (External Commit)</li>
        <li>fetch GroupInfo</li>
        <li>remove a client from a group (Commit with Remove)</li>
        <li>leave a group</li>
        <li>send an application message</li>
        <li>update the policy of the group (ex: Commit with GroupContextExtensions)</li>
      </ul>
      <t>In general bare proposals are authorized like a Commit from the proposer,
except as described below.</t>
      <t>Most of these primitives are validated by the clients in an MLS group. For
example, the clients in an MLS group each individually verify that a Commit
sent by Alice to add Bob is valid, because Alice is an admin in the
corresponding room.</t>
      <t>Some primitives are verified primarily by the responsible provider in MIMI.
This includes, for example, creating a room, validating the first Commit in an MLS group,
fetching KeyPackages, or fetching a GroupInfo.</t>
      <section anchor="create-an-mls-group">
        <name>Create an MLS group</name>
        <t>MLS groups are created locally, but for the purposes of this discussion
we consider the initial Commit message starting epoch 1 (associated with
an already created room) to cause the group to exist on the owning provider
and to be accessible to others.</t>
        <t>A user who is an admin or owner of the room, can "create" the corresponding MLS group.
In a persistent group, a regular user can also "create" the corresponding MLS group.</t>
      </section>
      <section anchor="send-a-commit-with-add-proposal">
        <name>Send a Commit with Add proposal</name>
        <t>In any of these conditions, a client is authorized to send Add proposals in a
Commit:</t>
        <ul spacing="normal">
          <li>if the user of the client to be added is already an occupant of the room; or</li>
          <li>if the room is open; or</li>
          <li>if the room is parent-dependent <em>and</em> the client is a member of the parent group; or</li>
          <li>if the room is flexible-membership <em>and</em> the "adding user" is a room admin or owner</li>
        </ul>
        <t>If the room is single-device, clients must also check that the resulting MLS group
will only contain a single client per user. This check needs to look at the
combination of all proposals included in the Commit.</t>
        <t>Whenever a logging device, bot, or system-user is added to an MLS group,
each receiver should verify this is both consistent with the overall room
policy, and acceptable to the user of the client.</t>
      </section>
      <section anchor="fetch-keypackages">
        <name>Fetch KeyPackages</name>
        <t>Most KeyPackages are designed to be used in a single group. In this case they are
"claimed" and consumed. In MIMI the provider is responsible for authorization checks
for fetching KeyPackages, enforcing rate limiting, etc. The client who created the
KeyPackages (the target client) is responsible for verifying that its KeyPackages
are not used more than once or used in an unintended group.</t>
        <t>The requester <bcp14>SHOULD</bcp14> include the destination room or group id context in which the
target KeyPackage will be used (to add the target client) when requesting
KeyPackages. This allows the provider to correlate a claimed KeyPackage with an
Add proposal to prevent DoS and spam. Privacy concerns may dictate that the requester
prefers to omit this information or use a pseudonymous context or rate limited
token such as PrivacyPass <xref target="I-D.ietf-privacypass-architecture"/>.</t>
        <t>In any of these conditions, the provider of the target client
is authorized to provide a client KeyPackage:</t>
        <ul spacing="normal">
          <li>if the requester represents the same user as the target KeyPackage; or</li>
          <li>if the target user consented for the requester to access their KeyPackages
(for this specific room or for all rooms); or</li>
          <li>if the requester requests a small number of outstanding KeyPackages (ex: 3) at a time
as allowed by the target provider's policy. See Note 1 below.</li>
        </ul>
        <t>This check does not apply if the target explicitly provided a KeyPackage to the
requester, for example in a knock or grant of consent.</t>
        <t>Note 1: Partially trusting the requester may be more appropriate if the requester
and the target already have an existing relationship, for example, if they are in a
shared group, they have a friend-of-friend relation, or the target address is
already in the requesters contact list or vice versa.</t>
      </section>
      <section anchor="send-an-external-commit-or-external-proposal-to-add-itself">
        <name>Send an External Commit (or External Proposal) to add itself.</name>
        <t>In any of these conditions, a client with a valid GroupInfo and <tt>ratchet_tree</tt>
is authorized to send an External Commit or External Proposal to Add its own
client to a group:</t>
        <ul spacing="normal">
          <li>if the joining user is already an occupant of the room; or</li>
          <li>if the joining user is already pre-authorized to enter the room; or</li>
          <li>if the target room is open; or</li>
          <li>if the target room is parent-dependent <em>and</em> the joining client is a member of
the parent MLS group; or</li>
          <li>if the joining user proves possession of a valid joining link (and the related
password or code, if the link required one). See <xref target="room-join-links"/> and
<xref target="room-policy-format-syntax"/> for more information about join links.</li>
        </ul>
        <t>If the room is single-device, clients must also check that the resulting MLS group
will only contain a single client per user. This check needs to look at the
combination of all proposals included in the Commit.</t>
      </section>
      <section anchor="fetch-the-groupinfo">
        <name>Fetch the GroupInfo</name>
        <t>This primitive is almost same as join step above. This is proving to the room's
<strong>owning provider</strong> that the requested client is authorized to get the GroupInfo</t>
        <t>A provider is authorized to return a valid GroupInfo and <tt>ratchet_tree</tt> for
the target group, in any of these conditions:</t>
        <ul spacing="normal">
          <li>if the joining user is already an occupant of the room; or</li>
          <li>if the joining user is already pre-authorized to enter the room; or</li>
          <li>if the target room is open; or</li>
          <li>if the target room is parent-dependent <em>and</em> the requesting client is a member of
the parent MLS group; or</li>
          <li>if the joining user proves possession of a valid joining link (and the related
password or code, if the link required one). See <xref target="room-join-links"/> and
<xref target="room-policy-format-syntax"/> for more information about join links.</li>
        </ul>
      </section>
      <section anchor="receive-a-welcome-message">
        <name>Receive a Welcome message</name>
        <t>A client that receives a Welcome message determines the corresponding room
policies from the GroupContext and independently verifies:</t>
        <ul spacing="normal">
          <li>if the client's policies are compatible with the policy of the room;</li>
          <li>if the user and clients already in the group are acceptable to receiving client; and</li>
          <li>if the client's user consented (directly or indirectly) to being added to the room.</li>
        </ul>
        <t>If the policies are incompatible or there is no consent, the client <bcp14>SHOULD</bcp14>
immediately leave the group and silently discard any application messages
received. The client could also report the sender of the Welcome message
for anti-spam/anti-abuse purposes.</t>
      </section>
      <section anchor="send-a-commit-with-remove-proposal">
        <name>Send a Commit with Remove proposal</name>
        <t>The principles of which users can join a room were discussed extensively. The
principles of which clients can leave a room are:</t>
        <ul spacing="normal">
          <li>a user or the user's provider can remove some or all of its clients;</li>
          <li>the owning provider can remove a disruptive client or (all the clients of a) user;</li>
          <li>in flexible membership rooms, an admin or owner can remove (all the clients of)
another user that has the same or lower access in the room.</li>
        </ul>
        <t>To Send a Commit containing a Remove proposal, or to verify such a Commit,
the following conditions apply:</t>
        <ul spacing="normal">
          <li>if the Remove (or SelfRemove) Proposal was sent by an MLS member; or</li>
          <li>if the Remove Proposal was sent by the system user of the owning provider; or</li>
          <li>if the Remove Proposal was sent by the system user corresponding to the
removed user's provider; or</li>
          <li>
            <t>if the room is not fixed-membership, <strong>AND</strong> all the following:
            </t>
            <ul spacing="normal">
              <li>the removing user is an admin or owner of the room, and</li>
              <li>an admin cannot remove an owner or system user, and</li>
              <li>an owner cannot remove a system user, and</li>
              <li>for any client being removed, all their clients are being removed at the same time.</li>
            </ul>
          </li>
        </ul>
        <t>In addition no Remove proposal can remove the last client from an MLS group. Instead
the last client or the owning provider should delete the group.</t>
      </section>
      <section anchor="leave-an-mls-group">
        <name>Leave an MLS group</name>
        <t>A client can always send a proposal (a Remove proposal or SelfRemove proposal)
to leave, EXCEPT if
- the leaving client is the only admin/owner of a members-only group; or
- the leaving client is the last member of the MLS group.</t>
      </section>
      <section anchor="destroy-an-mls-group">
        <name>Destroy an MLS group</name>
        <t>A client can only destroy an MLS group if the client is the last member
of the MLS group.</t>
        <t>In rare circumstances (ex: all users in the room were deleted), the owning provider
can safely destroy a room and its corresponding MLS group.</t>
      </section>
      <section anchor="send-an-application-message">
        <name>Send an application message</name>
        <t>A client can send an application message under the following conditions:</t>
        <ul spacing="normal">
          <li>the client's user is an occupant of an unmoderated room; or</li>
          <li>the client's user is a "regular user" or moderator of a moderated room; or</li>
          <li>the client is a visitor of the room  AND has been granted "voice" in the room.</li>
        </ul>
      </section>
      <section anchor="update-the-room-group-policy">
        <name>Update the room / group policy</name>
        <t>An admin or owner can send a GroupContextExtensions proposal in the MLS group
which changes the policy of the room provided that:</t>
        <ul spacing="normal">
          <li>an admin cannot remove an owner from the pre-authorized list; and</li>
          <li>the new policy cannot result in no occupants with in-room clients; and</li>
          <li>the new policy cannot result in no admins with in-room clients; and</li>
          <li>a fixed-membership room cannot be changed to a flexible-membership room.</li>
        </ul>
        <t>[TODO: check this more rigorously]</t>
        <t>If clients advertise acceptable policies, a policy change Commit must
be still compatible with all client policies, <em>or</em> remove clients incompatible
with the new policy.</t>
      </section>
      <section anchor="send-other-mls-proposal-types">
        <name>Send other MLS proposal types</name>
        <t>We have wandered into the policies described in
Section 6 of <xref target="I-D.ietf-mls-architecture"/>.</t>
        <ul spacing="normal">
          <li>PSK - optional</li>
          <li>ReInit - need special rules. future MLS versions. may be useful for
moving a room to a new provider.</li>
          <li>Update - what is the policy? minimum and maximum intervals</li>
          <li>External Proposals - default allowed for uses above</li>
        </ul>
      </section>
    </section>
    <section anchor="other-room-policies">
      <name>Other Room Policies</name>
      <t>The owning provider of a room may also offer additional features such as</t>
      <ul spacing="normal">
        <li>
          <t>if links to join a room are allowed, and if so:
          </t>
          <ul spacing="normal">
            <li>if a password or code is required,</li>
            <li>their validity period (ex: one week),</li>
            <li>if they are single or multiple use, and</li>
            <li>if they are only valid for a particular domain, workgroup, or user;</li>
          </ul>
        </li>
        <li>if logging is allowed, for example as required in many countries for
financial transactions and healthcare discussion;</li>
        <li>if chat bots are allowed as users;</li>
        <li>
          <t>if chat history can be shared with new joiners, and if so:
          </t>
          <ul spacing="normal">
            <li>if shared automatically or manually,</li>
            <li>for how long,</li>
          </ul>
        </li>
        <li>if Direct Messaging is allow inside the context of a room;</li>
        <li>to what extent meta-data privacy is supported</li>
      </ul>
      <t>Various messaging providers offer the option to change the name of a room, add
a subject or topic to a room, rename nicknames, change status, change the display
name of a user, and share presence. These features are not discussed in this
document as some of them are out of scope of MIMI (ex: presence) and they do not
interact strongly with the authorization of MLS primitives.</t>
      <t>The policy could also include a machine readable description of the anti-spam
and anti-abuse policies. This document does <em>not</em> include such a description,
since these policies are the same for every room, and a policy would have to
be included for every provider with participating users in a room.</t>
      <dl>
        <dt><strong>Hidden vs. Public</strong>:</dt>
        <dd>
          <t>A public room is discoverable/searchable. A hidden room is not.</t>
        </dd>
        <dt><strong>Non-anonymous vs. Semi-anonymous</strong>:</dt>
        <dd>
          <t>In non-anonymous rooms, the expectation is that each user presents
a long-term stable identifier which can be correlated across rooms. In
semi-anonymous rooms, it is acceptable to obtain a pseudonymous identifier
which is unique per room, but would still be associated with the user's
provider.</t>
        </dd>
        <dt><strong>Password-Protected vs. Unsecured</strong>:</dt>
        <dd>
          <t>A password-protected room is one that a user cannot enter without first
providing the correct password or code. An unsecured room can be
entered without entering a password or code.</t>
        </dd>
      </dl>
      <section anchor="fixed-membership-groups-naming-convention">
        <name>Fixed-membership groups, naming convention</name>
        <t>This document proposes a room naming convention for fixed-membership groups.</t>
        <ul spacing="normal">
          <li>Take the user IDs of the participants as MIMI URIs,</li>
          <li>sort in lexical order,</li>
          <li>concatenate and separate with the horizontal tab character (U+0009),</li>
          <li>hash with SHA-256,</li>
          <li>base64url encode with no padding</li>
          <li>prepend with two octothorpe characters '#' (U+0023)</li>
          <li>format as a MIMI URI using the provider of the first initiator of the room</li>
        </ul>
        <t>For example, consider a fixed-membership group first created by Cathy at provider
<tt>example.com</tt> with users with the following handles and providers:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Handle</th>
              <th align="right">Provider</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">@cathy</td>
              <td align="right">example.com</td>
            </tr>
            <tr>
              <td align="right">@alice</td>
              <td align="right">providerA.example</td>
            </tr>
            <tr>
              <td align="right">@betty</td>
              <td align="right">providerB.example</td>
            </tr>
            <tr>
              <td align="right">@bobby</td>
              <td align="right">providerB.example</td>
            </tr>
            <tr>
              <td align="right">@willy</td>
              <td align="right">providerA.example</td>
            </tr>
          </tbody>
        </table>
        <t>Represented as MIMI URIs and lexically sorted:</t>
        <artwork><![CDATA[
im:mimi=%40alice@providerA.example
im:mimi=%40betty@providerB.example
im:mimi=%40bobby@providerB.example
im:mimi=%40cathy@example.com
im:mimi=%40willy@providerA.example
]]></artwork>
        <t>Concatenated with tab characters, hashed with SHA-256 (shown in hex):</t>
        <artwork><![CDATA[
c48899b3e98903a80548eebb7f4a9804cba7dedc08ac153b9570f6cb7c5b6072
]]></artwork>
        <t>Then base64url encoded with no padding:</t>
        <artwork><![CDATA[
xIiZs-mJA6gFSO67f0qYBMun3twIrBU7lXD2y3xbYHI
]]></artwork>
        <t>As a room name this becomes:</t>
        <artwork><![CDATA[
##xIiZs-mJA6gFSO67f0qYBMun3twIrBU7lXD2y3xbYHI
]]></artwork>
        <t>And as a fixed-membership room URL in the example.com domain it becomes:</t>
        <artwork><![CDATA[
im:mimi=##xIiZs-mJA6gFSO67f0qYBMun3twIrBU7lXD2y3xbYHI@example.com
]]></artwork>
      </section>
      <section anchor="room-join-links">
        <name>Room join links</name>
        <t>Room join links are useful to allow clients to find a room, to authorize
joining that room, and optionally to communicate a code or passphrase in
an automated fashion.</t>
        <t>The details of how a client obtains or creates a join link are out-of-scope
of MIMI, but a MIMI client should be able to join a room using a provided
join link. Such a link should always be specific to a specific room.</t>
        <t>When generating a link, the creator might allow a link to be used by a
single specific user, for an arbitrary single user, or for any number of
new users. The link might have a specific expiration date and time. The link
might include or require a code or passphrase.</t>
        <t>Below is an example of a join link (the whitespace shown before the
'@' is not included in the URI):</t>
        <artwork><![CDATA[
im:mimi=#d_Nv1ZCPWArKtN0vhC_Wqw?join;code=k5KUJgAZuDesTsMVxRP
  @example.com
]]></artwork>
      </section>
    </section>
    <section anchor="room-policy-format-syntax">
      <name>Room Policy format syntax</name>
      <t>This document proposes a room policy document format using the TLS
Presentation Language format <xref target="RFC8446"/>. The complete format is
in <xref target="formal-syntax"/>.</t>
      <t>This section will explain the fields in the RoomPolicy struct in
chunks of related policy. An elipsis indicates that a chunk has been omitted which
was or will be explained in another part of this section.</t>
      <section anchor="membership-related-policy">
        <name>Membership-related policy</name>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  false(0),
  true(1)
} bool;

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

struct {
  MembershipStyle membership_style;
  Uri parent_room_uri<V>;
  bool multi_device;
  bool knock_allowed;
  bool moderated;
  bool persistent_room;
  bool password_protected;
  ...
} RoomPolicy;
]]></sourcecode>
        <t>The <tt>membership_style</tt> can be one of the following values as discussed in
<xref target="room-capabilities"/>:</t>
        <ul spacing="normal">
          <li>open</li>
          <li>members-only (default)</li>
          <li>fixed-membership</li>
          <li>parent-dependent</li>
        </ul>
        <t>If the <tt>membership_style</tt> is parent-dependent the parent_room_uri <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 user can send a knock requesting access to the
target room. If false, a user cannot. This option can only be enabled
if the <tt>membership_style</tt> 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>
        <t>If <tt>persistent_room</tt> is false, the room will be automatically deleted when the
corresponding MLS group is destroyed (when there are no clients in the group).
If <tt>persistent_room</tt> 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 <tt>password_protected</tt> 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>
        <sourcecode type="tls-presentation"><![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;
]]></sourcecode>
        <t>In <tt>members-only</tt> 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 <em>other</em> 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>
        <sourcecode type="tls-presentation"><![CDATA[
enum {
  optional(0),
  required(1),
  forbidden(2)
} Optionality;

struct {
  ...
  Optionality delivery_notifications;
  Optionality read_receipts;
  bool pseudonymous_ids;
  ...
} RoomPolicy;
]]></sourcecode>
        <t>The <tt>delivery_notifications</tt> 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 <tt>read_receipts</tt> 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 <tt>pseudonymous_ids</tt> 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-presentation"><![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 <tt>discoverable</tt> 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.</t>
          <t>Inside the LinkPolicy are several fields that describe the behavior of links.</t>
          <t>If the <tt>on_request</tt> 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 <tt>link_requests</tt>
can be used by the client to request an invite code.
The value of <tt>join_link</tt> is empty and the other fields are ignored.</t>
          <t>If the <tt>on_request</tt> field is false, the <tt>join_link</tt> field will contain a
joining link. If the link will work for multiple users, <tt>multiuser</tt> 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 <tt>link_requests</tt> field
can be empty.</t>
        </section>
        <section anchor="logging-policies">
          <name>Logging policies</name>
          <t>Inside the LoggingPolicy, the <tt>logging</tt> field can be forbidden, optional, or
required. If <tt>logging</tt> is forbidden then the other fields are empty. If
<tt>logging</tt> is required, the list of <tt>logging_clients</tt> 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 <tt>machine_readable_policy</tt> and <tt>human_readable_policy</tt> fields optionally
contain pointers to the owning provider's machine readable and human readable
logging policies, respectively.
If <tt>logging</tt> is optional and there is at least one <tt>logging_client</tt> then logging
is active for the room.</t>
        </section>
        <section anchor="chat-history-policies">
          <name>Chat history policies</name>
          <t>Inside the HistoryPolicy, if <tt>history_sharing</tt> is forbidden, this means that
clients (including bots) are expected to not to share chat history with new
joiners, in which case <tt>who_can_share</tt> is empty, <tt>automatically_share</tt> is false,
and <tt>max_time_period</tt> is zero.</t>
          <t>Otherwise <tt>who_can_share</tt> 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 <tt>who_can_share</tt>. If
<tt>automatically_share</tt> is true, clients can share history with new joiners without
user initiation. The history that is shared is limited to <tt>max_time_period</tt> 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 <tt>allowed_bots</tt>. Each of which has
several fields. The <tt>name</tt>, <tt>description</tt>, and <tt>homepage</tt> are merely descriptive.
The <tt>bot_role</tt> indicates if the chat bot would be treated as a <tt>system-user</tt>, <tt>owner</tt>,
<tt>admin</tt>, <tt>regular_user</tt>, or <tt>visitor</tt>.</t>
          <t>The <tt>can_read</tt> and <tt>can_write</tt> fields indicate if the chat bot is allowed to
read messages or send messages in the MLS group, respectively.
If <tt>can_target_message_in_group</tt> is true it indicates that the chat bot can
send an MLS targeted message (see Section 2.2 of <xref target="I-D.ietf-mls-extensions"/>)
or use a different conversation or out-of-band
channel to send a message to specific individual users in the room. If
<tt>per_user_content</tt> 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).</t>
          <t>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>
        <sourcecode type="tls-presentation"><![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;
]]></sourcecode>
        <t>Finally, The extensibility mechanism allows for future addition of new room
policies.</t>
      </section>
    </section>
    <section anchor="formal-syntax">
      <name>Formal Syntax</name>
      <t>Below is the complete TLS Presentation</t>
      <sourcecode type="tls-presentation"><![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;
]]></sourcecode>
      <section anchor="mls-extension">
        <name>MLS extension</name>
        <t><xref target="I-D.mahy-mls-room-policy-ext"/> defines a new <tt>room_policy</tt> GroupContext
extension to MLS, that holds the room policy document format described in
this document.</t>
      </section>
    </section>
    <section anchor="specific-examples">
      <name>Specific examples</name>
      <section anchor="one-on-one-chat">
        <name>One-on-one chat</name>
        <t>A 1:1 chat is a fixed-membership room with exactly two specific pre-authorized
users: "@alice@providerA.example" (owner) and "@bobby@providerB.example"
(regular-user). For fixed-membership rooms all users in the room must be
explicitly pre-authorized. Each user can each have multiple clients. Also
included are system users from the providers who are authorized to remove
their own users if their accounts have been deleted.</t>
        <t>Even if both Alice and Bob "leave the room" and delete the corresponding MLS group,
if either initiates a DM to the other at a later time, the room itself is
persistent and can be associated with a different (new) MLS group.</t>
        <sourcecode type="tls-presentation"><![CDATA[
room_policy.membership-style = fixed;
room_policy.persistent_room = true;

room_policy.pre_auth_list[0].target_role = system;
room_policy.pre_auth_list[0].preauth_user[0] =
   "im:mimi=providerA.example";
room_policy.pre_auth_list[0].preauth_user[1] =
   "im:mimi=providerB.example";

room_policy.pre_auth_list[1].target_role = owner;
room_policy.pre_auth_list[1].preauth_user[0] =
   "im:mimi=%40alice@providerA.example";

room_policy.pre_auth_list[2].target_role = regular_user;
room_policy.pre_auth_list[2].preauth_user[0] =
   "im:mimi=%40bobby@providerB.example";
]]></sourcecode>
      </section>
      <section anchor="administrated-room">
        <name>Administrated room</name>
        <t>In this simple administrated room, Alice is the owner.
If Alice adds another user, the user does not need to be added to the
pre-authorized list while one of the user's clients is a member of the
MLS group, but if the user requires a role other than default one, Alice
will need to add the new user to the pre-authorization list of the new role.</t>
        <sourcecode type="tls-presentation"><![CDATA[
room_policy.membership-style = members-only;
room_policy.pre_auth_list[0].target_role = owner;
room_policy.pre_auth_list[0].preauth_user[0] =
   "im:mimi=%40alice@providerA.example";
]]></sourcecode>
      </section>
      <section anchor="open-room">
        <name>Open room</name>
        <t>In this open room, Alice is an admin and can kick or ban
other occupants of the room.</t>
        <sourcecode type="tls-presentation"><![CDATA[
room_policy.membership-style = open;
room_policy.pre_auth_list[1].target_role = admin;
room_policy.pre_auth_list[1].preauth_user[0] =
   "im:mimi=%40alice@providerA.example"
]]></sourcecode>
      </section>
      <section anchor="semi-open-room">
        <name>Semi-open room</name>
        <t>In this room, anyone from the "engineering" workgroup of
<tt>example.com</tt> can automatically join as an admin. Anyone
from the <tt>example.net</tt> domain, the "sales" workgroup
of <tt>example.com</tt>, or the "companyX" workgroup of <tt>provider.example</tt>
can join as a regular-user. Other users could be added manually
by an admin, via the join link below, or via a knock.</t>
        <sourcecode type="tls-presentation"><![CDATA[
room_policy.membership-style = members-only;
room_policy.persistent_room = true;
room_policy.knock_allowed = true;

room_policy.pre_auth_list[0].target_role = admin;
room_policy.pre_auth_list[0].preauth_workgroup[0] =
   "im:mimi=#engineering@example.com"

room_policy.pre_auth_list[1].target_role = regular_user
room_policy.pre_auth_list[1].preauth_domain[0] =
   "im:mimi=example.net";
room_policy.pre_auth_list[1].preauth_workgroup[0] =
   "im:mimi=#sales@example.com";
room_policy.pre_auth_list[1].preauth_workgroup[1] =
   "im:mimi=#companyX@provider.example";

room_policy.link_policy.on_request = false;
room_policy.link_policy.join_link =
   "im:mimi=#d_Nv1ZCPWArKtN0vhC_Wqw?join;" +
   "code=k5KUJgAZuDesTsMVxRP@example.com";
room_policy.link_policy.multiuser = true;
room_policy.link_policy.expiration =
  1699207200;  /* 2023-11-05 18:00:00 UTC */
room_policy.link_policy.link_requests =
  "https://im.example.com/link-me?room=" +
  "#d_Nv1ZCPWArKtN0vhC_Wqw@example.com";
]]></sourcecode>
      </section>
      <section anchor="moderated-room">
        <name>Moderated room</name>
        <t>In this moderated room, Alice is an owner and Adam is a admin.
When Bob and Cathy join the group, neither of them can send
messages to the group until Alice or Adam grants them "voice",
most likely using a machine-readable message.</t>
        <sourcecode type="tls-presentation"><![CDATA[
room_policy.membership-style = members-only;
room_policy.moderated = true;

room_policy.pre_auth_list[0].target_role = owner;
room_policy.pre_auth_list[0].preauth_user[0] =
   "im:mimi=%40alice@providerA.example";

room_policy.pre_auth_list[1].target_role = admin;
room_policy.pre_auth_list[1].preauth_user[0] =
   "im:mimi=%40adam@providerA.example";
]]></sourcecode>
      </section>
      <section anchor="room-with-mandatory-logging">
        <name>Room with mandatory logging</name>
        <t>Alice messages her doctor Cathy. Cathy's provider requires logging
of all patient interactions. The logging client shows up in the
"roster"/user-list that Alice sees. Alice's client learns about
the logging even before the first message with Cathy. Because the
room is administered instead of fixed-membership, either
user (since both have at least admin permissions) could add another
user to the room. For example, Alice might include her partner, child,
or parent. Cathy might add a nurse, lab technician, assistant,
intern, or specialist.</t>
        <sourcecode type="tls-presentation"><![CDATA[
room_policy.membership-style = members-only;
room_policy.pre_auth_list[0].target_role = owner;
room_policy.pre_auth_list[0].preauth_user[0] =
   "im:mimi=%40alice@providerA.example";

room_policy.pre_auth_list[1].target_role = admin;
room_policy.pre_auth_list[1].preauth_user[0] =
   "im:mimi=%40cathy@medicalProviderC.example";

room_policy.logging_policy.logging = required;
room_policy.logging_policy.enabled = true;

room_policy.logging_policy.logging_clients[0] =
  "im:mimi=%40logging/#Y9agWMglTlaP8F251hmgVQ" +
  "medicalProviderC.example";

room_policy.logging_policy.machine_readable_policy =
  "https://medicalProviderC.example/P3P/im_policy.xml";
room_policy.logging_policy.human_readable_policy =
  "https://medicalProviderC.example/legal/IM+logging.html";
]]></sourcecode>
        <t>If instead of being a patient, Alice was an auditor, whose
provider required logging as well, each provider could have its
own authorized logger.</t>
        <sourcecode type="tls-presentation"><![CDATA[
room_policy.logging_policy.logging_clients[1] =
  "im:mimi=%40auditlogging/#Y9agWMglTlaP8F251hmgVQ" +
  "providerA.example";
]]></sourcecode>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document registers the "application/mimi-room-policy" media type.
The registration template follows:</t>
      <dl>
        <dt>Type name:</dt>
        <dd>
          <t>application</t>
        </dd>
        <dt>Subtype name:</dt>
        <dd>
          <t>mimi-room-policy</t>
        </dd>
        <dt>Required parameters:</dt>
        <dd>
          <t>none</t>
        </dd>
        <dt>Optional parameters:</dt>
        <dd>
          <dl>
            <dt>version</dt>
            <dd>
              <t/>
            </dd>
            <dt>  version:</dt>
            <dd>
              <t>The MIMI room policy protocol version expressed as a string
  <tt>&lt;major&gt;.&lt;minor&gt;</tt>.  If omitted the version is "1.0", which
  corresponds to the version published in RFC XXXX.</t>
            </dd>
          </dl>
        </dd>
        <dt>Encoding considerations:</dt>
        <dd>
          <t>MIMI room policy documents are represented using the TLS
presentation language <xref target="RFC8446"/>. Therefore this media type needs to be
treated as binary data.</t>
        </dd>
        <dt>Security considerations:</dt>
        <dd>
          <t>MIMI room policy documents can contain sensitive information and are
designed to be transmitted either inside encrypted and authenticated
Messaging Layer Security (MLS) <xref target="I-D.ietf-mls-protocol"/> messages,
or over a protocol protected using a secure transport such as HTTP
<xref target="RFC9112"/> <xref target="RFC9113"/> <xref target="RFC9114"/> over TLS <xref target="RFC8446"/>. The
security considerations in this document (RFC XXXX) also apply.</t>
        </dd>
        <dt>Interoperability considerations:</dt>
        <dd>
          <t>N/A</t>
        </dd>
        <dt>Published specification:</dt>
        <dd>
          <t>RFC XXXX</t>
        </dd>
        <dt>Applications that use this media type:</dt>
        <dd>
          <t>MLS-based instant messaging applications</t>
        </dd>
        <dt>Fragment identifier considerations:</dt>
        <dd>
          <t>N/A</t>
        </dd>
      </dl>
      <t>Additional information:</t>
      <ul spacing="normal">
        <li>Deprecated alias names for this type: N/A</li>
        <li>Magic number(s): N/A</li>
        <li>File extension(s): N/A</li>
        <li>Macintosh file type code(s): N/A</li>
      </ul>
      <dl>
        <dt>Person &amp; email address to contact for further information:</dt>
        <dd>
          <t>IETF MIMI Working Group <eref target="mailto:mimi@ietf.org">mimi@ietf.org</eref></t>
        </dd>
        <dt>Intended usage:</dt>
        <dd>
          <t>COMMON</t>
        </dd>
        <dt>Restrictions on usage:</dt>
        <dd>
          <t>N/A</t>
        </dd>
        <dt>Author:</dt>
        <dd>
          <t>IETF MIMI Working Group</t>
        </dd>
        <dt>Change controller:</dt>
        <dd>
          <t>IESG</t>
        </dd>
        <dt>Provisional registration? (standards tree only):</dt>
        <dd>
          <t>No</t>
        </dd>
      </dl>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>While this section is not started, the entire focus of this document is on
authorization.</t>
      <t>The goal is to consider and balance consent, authorization, and privacy
requirements from:</t>
      <ul spacing="normal">
        <li>providers</li>
        <li>owners and administrators of rooms</li>
        <li>other users</li>
      </ul>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="I-D.ietf-mls-protocol">
          <front>
            <title>The Messaging Layer Security (MLS) Protocol</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Benjamin Beurdouche" initials="B." surname="Beurdouche">
              <organization>Inria &amp; Mozilla</organization>
            </author>
            <author fullname="Raphael Robert" initials="R." surname="Robert">
              <organization>Phoenix R&amp;D</organization>
            </author>
            <author fullname="Jon Millican" initials="J." surname="Millican">
              <organization>Meta Platforms</organization>
            </author>
            <author fullname="Emad Omara" initials="E." surname="Omara">
              <organization>Google</organization>
            </author>
            <author fullname="Katriel Cohn-Gordon" initials="K." surname="Cohn-Gordon">
              <organization>University of Oxford</organization>
            </author>
            <date day="27" month="March" year="2023"/>
            <abstract>
              <t>   Messaging applications are increasingly making use of end-to-end
   security mechanisms to ensure that messages are only accessible to
   the communicating endpoints, and not to any servers involved in
   delivering messages.  Establishing keys to provide such protections
   is challenging for group chat settings, in which more than two
   clients need to agree on a key but may not be online at the same
   time.  In this document, we specify a key establishment protocol that
   provides efficient asynchronous group key establishment with forward
   secrecy and post-compromise security for groups in size ranging from
   two to thousands.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mls-protocol-20"/>
        </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="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </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>
        <name>Informative References</name>
        <reference anchor="XMPP">
          <front>
            <title>Extensible Messaging and Presence Protocol (XMPP): Core</title>
            <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
            <date month="March" year="2011"/>
            <abstract>
              <t>The Extensible Messaging and Presence Protocol (XMPP) is an application profile of the Extensible Markup Language (XML) that enables the near-real-time exchange of structured yet extensible data between any two or more network entities. This document defines XMPP's core protocol methods: setup and teardown of XML streams, channel encryption, authentication, error handling, and communication primitives for messaging, network availability ("presence"), and request-response interactions. This document obsoletes RFC 3920. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6120"/>
          <seriesInfo name="DOI" value="10.17487/RFC6120"/>
        </reference>
        <reference anchor="MUC" target="http://xmpp.org/extensions/xep-0045.html">
          <front>
            <title>Multi-User Chat</title>
            <author initials="P." surname="Saint-Andre" fullname="Peter Saint-Andre">
              <organization/>
            </author>
            <date year="2022" month="December" day="01"/>
          </front>
          <seriesInfo name="XSF XEP" value="0045"/>
        </reference>
        <reference anchor="DoubleRatchet" target="https://signal.org/docs/specifications/doubleratchet">
          <front>
            <title>The Double Ratchet Algorithm</title>
            <author initials="T." surname="Perrin" fullname="Trevor Perrin">
              <organization>Signal</organization>
            </author>
            <author initials="M." surname="Marlinspike" fullname="Moxie Marlinspike">
              <organization>Signal</organization>
            </author>
            <date year="2016" month="November" day="20"/>
          </front>
        </reference>
        <reference anchor="I-D.mahy-mls-room-policy-ext" target="https://datatracker.ietf.org/doc/html/draft-mahy-mls-room-policy-ext-00">
          <front>
            <title>A Messaging Layer Security (MLS) extension for More Instant Messaging Interoperability (MIMI) room policies</title>
            <author initials="R." surname="Mahy" fullname="Rohan Mahy">
              <organization>Wire</organization>
            </author>
            <date year="2023" month="July" day="11"/>
          </front>
        </reference>
        <reference anchor="I-D.robert-mimi-delivery-service">
          <front>
            <title>MIMI Delivery Service</title>
            <author fullname="Raphael Robert" initials="R." surname="Robert">
              <organization>Phoenix R&amp;D</organization>
            </author>
            <author fullname="Konrad Kohbrok" initials="K." surname="Kohbrok">
              <organization>Phoenix R&amp;D</organization>
            </author>
            <date day="17" month="May" year="2023"/>
            <abstract>
              <t>   This document describes the MIMI Delivery Service.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-robert-mimi-delivery-service-02"/>
        </reference>
        <reference anchor="I-D.ralston-mimi-terminology">
          <front>
            <title>MIMI Terminology</title>
            <author fullname="Travis Ralston" initials="T." surname="Ralston">
              <organization>The Matrix.org Foundation C.I.C.</organization>
            </author>
            <date day="10" month="July" year="2023"/>
            <abstract>
              <t>   This document introduces a set of terminology to use when discussing
   or describing concepts within MIMI.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ralston-mimi-terminology-02"/>
        </reference>
        <reference anchor="I-D.ietf-privacypass-architecture">
          <front>
            <title>The Privacy Pass Architecture</title>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>LIP</organization>
            </author>
            <author fullname="Jana Iyengar" initials="J." surname="Iyengar">
              <organization>Fastly</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="15" month="June" year="2023"/>
            <abstract>
              <t>   This document specifies the Privacy Pass architecture and
   requirements for its constituent protocols used for constructing
   privacy-preserving authentication mechanisms.  It provides
   recommendations on how the architecture should be deployed to ensure
   the privacy of clients and the security of all participating
   entities.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-architecture-13"/>
        </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>Mozilla</organization>
            </author>
            <author fullname="Emad Omara" initials="E." surname="Omara">
              <organization>Google</organization>
            </author>
            <author fullname="Srinivas Inguva" initials="S." surname="Inguva">
              <organization>Twitter</organization>
            </author>
            <author fullname="Alan Duric" initials="A." surname="Duric">
              <organization>Wire</organization>
            </author>
            <date day="16" month="December" year="2022"/>
            <abstract>
              <t>   The Messaging Layer Security (MLS) protocol (I-D.ietf-mls-protocol)
   specification has the role of defining a Group Key Agreement
   protocol, including all the cryptographic operations and
   serialization/deserialization functions necessary for scalable and
   secure group messaging.  The MLS protocol is meant to protect against
   eavesdropping, tampering, message forgery, and provide further
   properties such as Forward Secrecy (FS) and Post-Compromise Security
   (PCS) in the case of past or future device compromises.

   This document describes a general secure group messaging
   infrastructure and its security goals.  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 the MLS Protocol document and left to
   the application or the infrastructure architects to design.

   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 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-10"/>
        </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>Wire</organization>
            </author>
            <date day="20" month="June" year="2023"/>
            <abstract>
              <t>   This document describes content semantics common in Instant Messaging
   (IM) systems and describes an example 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-00"/>
        </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="13" month="March" year="2023"/>
            <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-01"/>
        </reference>
        <reference anchor="RFC9112">
          <front>
            <title>HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns.</t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
        <reference anchor="RFC9113">
          <front>
            <title>HTTP/2</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.</t>
              <t>This document obsoletes RFCs 7540 and 8740.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9113"/>
          <seriesInfo name="DOI" value="10.17487/RFC9113"/>
        </reference>
        <reference anchor="RFC9114">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment. This document describes a mapping of HTTP semantics over QUIC. This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9114"/>
          <seriesInfo name="DOI" value="10.17487/RFC9114"/>
        </reference>
      </references>
    </references>
    <?line 1478?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to Peter Saint-Andre for the clear terminology in XEP-0045 <xref target="MUC"/>, much of which was
borrowed here.</t>
    </section>
    <section numbered="false" anchor="todos">
      <name>TODOs</name>
      <ul spacing="normal">
        <li>Check the authorization rules more thoroughly in the "Update the room /
group policy" Section.</li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
Cn/BVW/t7gM4UfHtBz0N/x2a/wddC6XemNEAAA==

-->

</rfc>
