This commit is contained in:
stpeter 2011-08-15 15:27:24 -06:00
parent d90c7b5bf1
commit 72517af33b
1 changed files with 119 additions and 75 deletions

View File

@ -47,7 +47,7 @@
<registry/>
&stpeter;
<revision>
<version>1.25rc3</version>
<version>1.25rc4</version>
<date>in progress, last updated 2011-08-15</date>
<initials>psa</initials>
<remark>
@ -436,7 +436,7 @@
</section1>
<section1 topic='Scope' anchor='scope'>
<p>This document addresses common requirements related to configuration of, participation in, and administration of individual text-based conference rooms. All of the requirements addressed herein apply at the level of the individual room and are "common" in the sense that they have been widely discussed within the Jabber community or are familiar from existing text-based conference environments (e.g., Internet Relay Chat as defined in &rfc1459; and its successors: &rfc2810;, &rfc2811;, &rfc2812;, &rfc2813;).</p>
<p>This document addresses common requirements related to configuration of, participation in, and administration of individual text-based conference rooms. All of the requirements addressed herein apply at the level of the individual room and are "common" in the sense that they have been widely discussed within the Jabber/XMPP community or are familiar from existing text-based conference environments (e.g., Internet Relay Chat as defined in &rfc1459; and its successors: &rfc2810;, &rfc2811;, &rfc2812;, &rfc2813;).</p>
<p>This document explicitly does <em>not</em> address the following:</p>
<ul>
<li>Relationships between rooms (e.g., hierarchies of rooms)</li>
@ -503,7 +503,7 @@
<di><dt>Kick</dt><dd>To temporarily remove a participant or visitor from a room; the user is allowed to re-enter the room at any time. A kicked user has a role of "none".</dd></di>
<di><dt>Logging</dt><dd>Storage of discussions that occur within a room for public retrieval outside the context of the room.</dd></di>
<di><dt>Member</dt><dd>A user who is on the "whitelist" for a members-only room or who is registered with an open room. A member has an affiliation of "member".</dd></di>
<di><dt>Moderator</dt><dd>A room role that is usually associated with room admins but that may be granted to non-admins; is allowed to kick users, grant and revoke voice, etc. A moderator has a role of "moderator".</dd></di>
<di><dt>Moderator</dt><dd>A room role that is usually associated with room admins but that can be granted to non-admins; is allowed to kick users, grant and revoke voice, etc. A moderator has a role of "moderator".</dd></di>
<di><dt>MUC</dt><dd>The multi-user chat protocol for text-based conferencing specified in this document.</dd></di>
<di><dt>Multi-Session Nick</dt><dd>If allowed by the service, a user can associate more than one full JID with the same room JID (e.g., the user juliet@capulet.lit is allowed to log in simultaneously as the nick "JuliC" in the characters@chat.shakespeare.lit chatroom from both juliet@capulet.lit/balcony and juliet@capulet.lit/chamber). Multi-session nicks are not currently defined in this document.</dd></di>
<di><dt>Occupant</dt><dd>Any user who is in a room (this is an "abstract class" and does not correspond to any specific role).</dd></di>
@ -514,7 +514,7 @@
<di><dt>Role</dt><dd>A temporary position or privilege level within a room, distinct from a user's long-lived affiliation with the room; the possible roles are "moderator", "participant", and "visitor" (it is also possible to have no defined role). A role lasts only for the duration of an occupant's visit to a room.</dd></di>
<di><dt>Room</dt><dd>A virtual space that users figuratively enter in order to participate in real-time, text-based conferencing with other users.</dd></di>
<di><dt>Room Administrator</dt><dd>A user empowered by the room owner to perform administrative functions such as banning users; however, a room administrator is not allowed to change the room configuration or to destroy the room. An admin has an affiliation of "admin".</dd></di>
<di><dt>Room ID</dt><dd>The localpart of a Room JID, which may be opaque and thus lack meaning for human users (see under <link url='#bizrules'>Business Rules</link> for syntax); contrast with Room Name.</dd></di>
<di><dt>Room ID</dt><dd>The localpart of a Room JID, which might be opaque and thus lack meaning for human users (see under <link url='#bizrules'>Business Rules</link> for syntax); contrast with Room Name.</dd></di>
<di><dt>Room JID</dt><dd>The &lt;room@service&gt; address of a room.</dd></di>
<di><dt>Room Name</dt><dd>A user-friendly, natural-language name for a room, configured by the room owner and presented in Service Discovery queries; contrast with Room ID.</dd></di>
<di><dt>Room Nickname</dt><dd>The resourcepart of an Occupant JID (see <link url='#bizrules'>Business Rules</link> for syntax); this is the "friendly name" by which an occupant is known in the room.</dd></di>
@ -609,7 +609,7 @@
</table>
<p>Roles are temporary in that they do not necessarily persist across a user's visits to the room and MAY change during the course of an occupant's visit to the room. An implementation MAY persist roles across visits and SHOULD do so for moderated rooms (since the distinction between visitor and participant is critical to the functioning of a moderated room).</p>
<p>There is no one-to-one mapping between roles and affiliations (e.g., a member could be a participant or a visitor).</p>
<p>A moderator is the most powerful occupant within the context of the room, and can to some extent manage other occupants' roles in the room. A participant has fewer privileges than a moderator, although he or she always has the right to speak. A visitor is a more restricted role within the context of a moderated room, since visitors are not allowed to send messages to all occupants (depending on room configuration, it is even possible that visitors' presence will not be broadcasted to the room).</p>
<p>A moderator is the most powerful role within the context of the room, and can to some extent manage other occupants' roles in the room. A participant has fewer privileges than a moderator, although he or she always has the right to speak. A visitor is a more restricted role within the context of a moderated room, since visitors are not allowed to send messages to all occupants (depending on room configuration, it is even possible that visitors' presence will not be broadcasted to the room).</p>
<p>Roles are granted, revoked, and maintained based on the occupant's room nickname or full JID rather than bare JID. The privileges associated with these roles, as well as the actions that trigger changes in roles, are defined below.</p>
<p>Information about roles MUST be sent in all presence stanzas generated or reflected by the room and thus sent to occupants (if the room is configured to broadcast presence for a given role).</p>
<section3 topic='Privileges' anchor='roles-priv'>
@ -801,7 +801,7 @@
</tr>
</table>
<p>* A moderator MUST NOT be able to revoke moderator status from an occupant who is equal to or above the moderator in the hierarchy of affiliations.</p>
<p class='box'>Note: Certain roles are typically implicit in certain affiliations. For example, an admin or owner is automatically a moderator, so if an occupant is granted an affiliation of admin then the occupant will by that fact be granted a role of moderator; similarly, when an occupant is granted an affiliation of member in a moderated room, the occupant automatically has a role of participant. However, the loss of the admin affiliation does not necessarily mean that the occupant no longer has a role of moderator (since a "mere" occupant can be a moderator). Therefore, the role that is gained when an occupant is granted a certain affiliation is stable, whereas the role that is lost when an occupant loses a certain affilitation is not hardcoded and is left up to the implementation. Since a client cannot predict what the role will be after revoking a certain affiliation, if it wants to remove both the admin/owner affiliation and the moderator role at the same time then it must specifically request the role change in addition to the affiliation change by including both the 'role' attribute and the 'affiliation' attribute.</p>
<p class='box'>Note: Certain roles are typically implicit in certain affiliations. For example, an admin or owner is automatically a moderator, so if an occupant is granted an affiliation of admin then the occupant will by that fact be granted a role of moderator; similarly, when an occupant is granted an affiliation of member in a moderated room, the occupant automatically has a role of participant. However, the loss of the admin affiliation does not necessarily mean that the occupant no longer has a role of moderator (since a "mere" occupant can be a moderator). Therefore, the role that is gained when an occupant is granted a certain affiliation is stable, whereas the role that is lost when an occupant loses a certain affilitation is not hardcoded and is left up to the implementation.</p>
</section3>
</section2>
@ -816,7 +816,7 @@
<li>None (the absence of an affiliation)</li>
</ol>
<p>Support for the owner affiliation is REQUIRED. Support for the admin, member, and outcast affiliations is RECOMMENDED. (The "None" affiliation is the absence of an affiliation.)</p>
<p>These affiliations are long-lived in that they persist across a user's visits to the room and are not affected by happenings in the room. In addition, there is no one-to-one mapping between these affiliations and an occupant's role within the room. Affiliations are granted, revoked, and maintained based on the user's bare JID (not the full JID as with roles).</p>
<p>These affiliations are long-lived in that they persist across a user's visits to the room and are not affected by happenings in the room. In addition, there is no one-to-one mapping between these affiliations and an occupant's role within the room. Affiliations are granted, revoked, and maintained based on the user's bare JID, not the nick (and thus implicitly the full JID) as with roles.</p>
<p>If a user without a defined affiliation enters a room, the user's affiliation is defined as "none"; however, this affiliation does not persist across visits (i.e., a service does not maintain a "none list" across visits).</p>
<p>The member affiliation provides a way for a room owner or admin to specify a "whitelist" of users who are allowed to enter a members-only room. When a member enters a members-only room, his or her affiliation does not change, no matter what his or her role is. The member affiliation also provides a way for users to effectively register with an open room and thus be lastingly associated with that room in some way (one result may be that the user's nickname is reserved in the room).</p>
<p>An outcast is a user who has been banned from a room and who is not allowed to enter the room.</p>
@ -922,7 +922,7 @@
</tr>
</table>
<p>* As a default, an unaffiliated user enters a moderated room as a visitor, and enters an open room as a participant. A member enters a room as a participant. An admin or owner enters a room as a moderator.</p>
<p>** An admin or owner MUST NOT be able to revoke moderation privileges from another admin or owner.</p>
<p>** An admin or owner MUST NOT be able to revoke moderator status from another admin or owner.</p>
</section3>
<section3 topic='Changing Affiliations' anchor='affil-change'>
@ -1121,34 +1121,44 @@
<field var='FORM_TYPE' type='hidden'>
<value>http://jabber.org/protocol/muc#roominfo</value>
</field>
<field var='muc#roominfo_description' label='Description'>
<field var='muc#roominfo_description'
label='Description'>
<value>The place for all good witches!</value>
</field>
<field var='muc#roominfo_changesubject' label='Occupants May Change the Subject'>
<field var='muc#roominfo_changesubject'
label='Occupants May Change the Subject'>
<value>true</value>
</field>
<field var='muc#roominfo_contactjid' label='Contact Addresses'>
<field var='muc#roominfo_contactjid'
label='Contact Addresses'>
<value>crone1@shakespeare.lit</value>
</field>
<field var='muc#roominfo_subject' label='Current Discussion Topic'>
<field var='muc#roominfo_subject'
label='Current Discussion Topic'>
<value>Spells</value>
</field>
<field var='muc#roomconfig_changesubject' label='Subject can be modified'>
<field var='muc#roomconfig_changesubject'
label='Subject can be modified'>
<value>true</value>
</field>
<field var='muc#roominfo_occupants' label='Number of occupants'>
<field var='muc#roominfo_occupants'
label='Number of occupants'>
<value>3</value>
</field>
<field var='muc#roominfo_ldapgroup' label='Associated LDAP Group'>
<field var='muc#roominfo_ldapgroup'
label='Associated LDAP Group'>
<value>dc=lit,dc=shakespeare,cn=witches</value>
</field>
<field var='muc#roominfo_lang' label='Language of discussion'>
<field var='muc#roominfo_lang'
label='Language of discussion'>
<value>en</value>
</field>
<field var='muc#roominfo_logs' label='URL for discussion logs'>
<field var='muc#roominfo_logs'
label='URL for discussion logs'>
<value>http://www.shakespeare.lit/chatlogs/coven/</value>
</field>
<field var='muc#roominfo_pubsub' label='Associated pubsub node'>
<field var='muc#roominfo_pubsub'
label='Associated pubsub node'>
<value>xmpp:pubsub.shakespeare.lit?;node=the-coven-node</value>
</field>
</x>
@ -1348,7 +1358,7 @@
</presence>
]]></example>
<p>In this example, the user from the previous example has entered the room, by which time two other people had already entered the room: a user with a room nickname of "firstwitch" (who is a room owner) and a user with a room nickname of "secondwitch" (who is a room admin).</p>
<p>Unless the room is configured to not broadcast presence from new occupants below a certain affiliation level as controlled by the 'muc#roomconfig_presencebroadcast' room configuration option, the service MUST also send presence from the new occupant's room JID to the full JIDs of all the occupants (including the new occupant).</p>
<p>Unless the room is configured to not broadcast presence from new occupants below a certain affiliation level (as controlled by the "muc#roomconfig_presencebroadcast" room configuration option), the service MUST also send presence from the new occupant's room JID to the full JIDs of all the occupants (including the new occupant).</p>
<example caption="Service Sends New Occupant's Presence to All Occupants"><![CDATA[
<presence
from='coven@chat.shakespeare.lit/thirdwitch'
@ -1431,7 +1441,7 @@
</section3>
<section3 topic='Semi-Anonymous Rooms' anchor='enter-semianon'>
<p>If the room is semi-anonymous, the service MUST send presence from the new occupant to all occupants as specified above (i.e., unless the room is configured to not broadcast presence from new occupants below a certain affiliation level as controlled by the 'muc#roomconfig_presencebroadcast' room configuration option), but MUST include the new occupant's full JID only in the presence notifications it sends to occupants with a role of "moderator" and not to non-moderator occupants.</p>
<p>If the room is semi-anonymous, the service MUST send presence from the new occupant to all occupants as specified above (i.e., unless the room is configured to not broadcast presence from new occupants below a certain affiliation level as controlled by the "muc#roomconfig_presencebroadcast" room configuration option), but MUST include the new occupant's full JID only in the presence notifications it sends to occupants with a role of "moderator" and not to non-moderator occupants.</p>
<p>(Note: All subsequent examples include the 'jid' attribute for each &lt;item/&gt; element, even though this information is not sent to non-moderators in semi-anonymous rooms.)</p>
</section3>
@ -1527,7 +1537,7 @@
</presence>
]]></example>
<p>Alternatively, the room could kick an "idle user" in order to free up space (whether the definition of "idle user" is up to the implementation).</p>
<p>If the room has reached its maximum number of occupants and a room admin or owner attempts to join, the room MUST allow the admin or owner to join, up to some reasonable number of additional occupants.</p>
<p>If the room has reached its maximum number of occupants and a room admin or owner attempts to join, the room MUST allow the admin or owner to join, up to some reasonable number of additional occupants; this helps to prevent denial of service attacks caused by stuffing the room with non-admin users.</p>
</section3>
<section3 topic='Locked Room' anchor='enter-locked'>
@ -1770,7 +1780,7 @@
<body>Harpier cries: 'tis time, 'tis time.</body>
</message>
]]></example>
<p>If the sender has voice in the room (this is the default except in moderated rooms), the service MUST change the 'from' attribute to the sender's room JID and reflect the message out to the full JID of each occupant.</p>
<p>If the sender has voice in the room (this is the default except in moderated rooms) and the message does not violate any service-level or room-level policies (e.g., policies regarding message content or size), the service MUST change the 'from' attribute to the sender's room JID and reflect the message out to the full JID of each occupant.</p>
<example caption='Service Reflects Message to All Occupants'><![CDATA[
<message
from='coven@chat.shakespeare.lit/thirdwitch'
@ -2426,7 +2436,7 @@
<p>If a user has registered with a room, the room MAY choose to restrict the user to use of the registered nickname only in that room. If it does so, it SHOULD return a &notacceptable; error to the user if the user attempts to join the room with a roomnick other than the user's registered roomnick (this enables a room to "lock down" roomnicks for consistent identification of occupants).</p>
</section2>
<section2 topic='Getting Member List' anchor='getmemberlist'>
<section2 topic='Getting the Member List' anchor='getmemberlist'>
<p>If allowed in accordance with room configuration, an occupant MAY be allowed to retrieve the list of room members. For details, see the <link url='#modifymember'>Modifying the Member List</link> section of this document.</p>
</section2>
@ -2462,7 +2472,7 @@
</section2>
<section2 topic='Requesting Voice' anchor='requestvoice'>
<p>It is not possible for a visitor to speak (i.e., send a message to all occupants) in a moderated room. To request voice, a visitor SHOULD send a &MESSAGE; stanza containing a data form to the room itself, where the data form contains only a 'muc#role' field with a value of "participant".</p>
<p>It is not possible for a visitor to speak (i.e., send a message to all occupants) in a moderated room. To request voice, a visitor SHOULD send a &MESSAGE; stanza containing a data form to the room itself, where the data form contains only a "muc#role" field with a value of "participant".</p>
<example caption='Occupant Requests Voice'><![CDATA[
<message from='hag66@shakespeare.lit/pda'
id='yd53c486'
@ -2548,7 +2558,8 @@
<status>gone where the goblins go</status>
</presence>
]]></example>
<p>Note that normal presence stanza generation rules apply as defined in &xmppim;, so that if the user sends a general unavailable presence stanza, the user's server will broadcast that stanza to the client's &ROOMJID;; as a result, there is no need for the leaving client to send directed unavailable presence to its room JID. It is possible that a user might not be able to gracefully exit the room by sending unavailable presence. If the user goes offline without sending unavailable presence, the user's server is responsible for sending unavailable presence on behalf of the user (in accordance with <cite>RFC 6121</cite>). However, if there is no activity in the room then the room MAY periodically poll its occupants to ensure that there are no "ghost users" in the room (e.g., by using presence probes or &xep0199;). If the user's server goes offline or connectivity is lost between the user's server and the MUC service to which the user is connected (e.g., in federated communications), the MUC service is responsible for monitoring error stanzas it receives in order to determine if the user has gone offline. If the MUC service determines that the user has gone offline, it must treat the user as if the user had itself sent unavailable presence.</p>
<p>Normal presence stanza generation rules apply as defined in &xmppim;, so that if the user sends a general unavailable presence stanza, the user's server will broadcast that stanza to the client's &ROOMJID;; as a result, there is no need for the leaving client to send directed unavailable presence to its room JID. It is possible that a user might not be able to gracefully exit the room by sending unavailable presence. If the user goes offline without sending unavailable presence, the user's server is responsible for sending unavailable presence on behalf of the user (in accordance with <cite>RFC 6121</cite>).</p>
<p>Note: See <link url='#impl-service-ghosts'>Ghost Users</link> for suggestions regarding room occupants that appear to be present in the room but that are actually offline.</p>
<p>Note: If the room is not persistent and this occupant is the last to exit, the service is responsible for destroying the room.</p>
</section2>
@ -2992,7 +3003,7 @@
type='unavailable'>
<x xmlns='http://jabber.org/protocol/muc#user'>
<item affiliation='outcast' role='none'>
<actor nick='♚'/>
<actor nick='The ♚'/>
<reason>Treason</reason>
</item>
<status code='301'/>
@ -4360,21 +4371,6 @@
</x>
</presence>
[ ... ]
]]></example>
<p>If the user is not in the room, the service MAY send a message from the room itself to the room occupants, indicating the loss of owner status by including an &lt;x/&gt; element qualified by the 'http://jabber.org/protocol/muc#user' namespace and containing an &lt;item/&gt; child with the 'affiliation' attribute set to a value other than "owner".</p>
<example caption="Service Notes Loss of Owner Affiliation"><![CDATA[
<message
from='chat.shakespeare.lit'
id='9BA59EFC-393A-401D-B8DB-0E520E7601C9'
to='crone1@shakespeare.lit/desktop'>
<x xmlns='http://jabber.org/protocol/muc#user'>
<item affiliation='admin'
jid='hecate@shakespeare.lit'
role='none'/>
</x>
</message>
[ ... ]
]]></example>
</section2>
@ -4404,7 +4400,7 @@
</query>
</iq>
]]></example>
<p>The owner MAY then modify the owner list. In order to do so, the owner MUST send the changed items (i.e., only the "delta") back to the service; <note>This is different from the behavior of room configuration, wherein the 'muc#roomconfig_roomowners' field specifies the full list of room owners, not the delta.</note> each item MUST include the 'affiliation' and 'jid' attributes but SHOULD NOT include the 'nick' attribute and MUST NOT include the 'role' attribute (which is used to manage roles such as participant rather than affiliations such as owner):</p>
<p>The owner MAY then modify the owner list. In order to do so, the owner MUST send the changed items (i.e., only the "delta") back to the service; <note>This is different from the behavior of room configuration, wherein the "muc#roomconfig_roomowners" field specifies the full list of room owners, not the delta.</note> each item MUST include the 'affiliation' and 'jid' attributes but SHOULD NOT include the 'nick' attribute and MUST NOT include the 'role' attribute (which is used to manage roles such as participant rather than affiliations such as owner):</p>
<example caption='Owner Sends Modified Owner List to Service'><![CDATA[
<iq from='bard@shakespeare.lit/globe'
id='owner4'
@ -4596,7 +4592,7 @@
</query>
</iq>
]]></example>
<p>The owner MAY then modify the admin list. In order to do so, the owner MUST send the changed items (i.e., only the "delta") back to the service; <note>This is different from the behavior of room configuration, wherein the 'muc#roomconfig_roomadmins' field specifies the full list of room admins, not the delta.</note> each item MUST include the 'affiliation' attribute (normally set to a value of "admin" or "none") and 'jid' attribute but SHOULD NOT include the 'nick' attribute and MUST NOT include the 'role' attribute (which is used to manage roles such as participant rather than affiliations such as owner).</p>
<p>The owner MAY then modify the admin list. In order to do so, the owner MUST send the changed items (i.e., only the "delta") back to the service; <note>This is different from the behavior of room configuration, wherein the "muc#roomconfig_roomadmins" field specifies the full list of room admins, not the delta.</note> each item MUST include the 'affiliation' attribute (normally set to a value of "admin" or "none") and 'jid' attribute but SHOULD NOT include the 'nick' attribute and MUST NOT include the 'role' attribute (which is used to manage roles such as participant rather than affiliations such as owner).</p>
<example caption='Owner Sends Modified Admin List to Service'><![CDATA[
<iq from='bard@shakespeare.lit/globe'
id='admin4'
@ -5073,10 +5069,12 @@
<field
var='muc#roominfo_ldapgroup'
type='text-single'
label='An associated LDAP group that defines room membership;
this should be an LDAP Distinguished Name according to an
implementation-specific or deployment-specific definition
of a group.'/>
label='An associated LDAP group that defines
room membership; this should be an LDAP
Distinguished Name according to an
implementation-specific or
deployment-specific definition of a
group.'/>
<field
var='muc#roominfo_logs'
type='text-single'
@ -5105,11 +5103,21 @@
&REGPROCESS;
<code><![CDATA[
<statuscode>
<number>the three-digit code number</number>
<stanza>the stanza type of which it is a child (message or presence)</stanza>
<context>the use case or situation in which the status is used</context>
<purpose>a natural-language description of the meaning</purpose>
<child>the descriptive child element (reserved for future use)</child>
<number>
the three-digit code number
</number>
<stanza>
the stanza type of which it is a child (message or presence)
</stanza>
<context>
the use case or situation in which the status is used
</context>
<purpose>
a natural-language description of the meaning
</purpose>
<child>
the descriptive child element (reserved for future use)
</child>
</statuscode>
]]></code>
<p>The registrant may register more than one status code at a time, each contained in a separate &lt;statuscode/&gt; element.</p>
@ -5122,25 +5130,33 @@
<number>100</number>
<stanza>message or presence</stanza>
<context>Entering a room</context>
<purpose>Inform user that any occupant is allowed to see the user's full JID</purpose>
<purpose>
Inform user that any occupant is allowed to see the user's full JID
</purpose>
</statuscode>
<statuscode>
<number>101</number>
<stanza>message (out of band)</stanza>
<context>Affiliation change</context>
<purpose>Inform user that his or her affiliation changed while not in the room</purpose>
<purpose>
Inform user that his or her affiliation changed while not in the room
</purpose>
</statuscode>
<statuscode>
<number>102</number>
<stanza>message</stanza>
<context>Configuration change</context>
<purpose>Inform occupants that room now shows unavailable members</purpose>
<purpose>
Inform occupants that room now shows unavailable members
</purpose>
</statuscode>
<statuscode>
<number>103</number>
<stanza>message</stanza>
<context>Configuration change</context>
<purpose>Inform occupants that room now does not show unavailable members</purpose>
<purpose>
Inform occupants that room now does not show unavailable members
</purpose>
</statuscode>
<statuscode>
<number>104</number>
@ -5154,89 +5170,117 @@
<number>110</number>
<stanza>presence</stanza>
<context>Any room presence</context>
<purpose>Inform user that presence refers to itself</purpose>
<purpose>
Inform user that presence refers to itself
</purpose>
</statuscode>
<statuscode>
<number>170</number>
<stanza>message or initial presence</stanza>
<context>Configuration change</context>
<purpose>Inform occupants that room logging is now enabled</purpose>
<purpose>
Inform occupants that room logging is now enabled
</purpose>
</statuscode>
<statuscode>
<number>171</number>
<stanza>message</stanza>
<context>Configuration change</context>
<purpose>Inform occupants that room logging is now disabled</purpose>
<purpose>
Inform occupants that room logging is now disabled
</purpose>
</statuscode>
<statuscode>
<number>172</number>
<stanza>message</stanza>
<context>Configuration change</context>
<purpose>Inform occupants that the room is now non-anonymous</purpose>
<purpose>
Inform occupants that the room is now non-anonymous
</purpose>
</statuscode>
<statuscode>
<number>173</number>
<stanza>message</stanza>
<context>Configuration change</context>
<purpose>Inform occupants that the room is now semi-anonymous</purpose>
<purpose>
Inform occupants that the room is now semi-anonymous
</purpose>
</statuscode>
<statuscode>
<number>174</number>
<stanza>message</stanza>
<context>Configuration change</context>
<purpose>Inform occupants that the room is now fully-anonymous (unused)</purpose>
<purpose>
Inform occupants that the room is now fully-anonymous (unused)
</purpose>
</statuscode>
<statuscode>
<number>201</number>
<stanza>presence</stanza>
<context>Entering a room</context>
<purpose>Inform user that a new room has been created</purpose>
<purpose>
Inform user that a new room has been created
</purpose>
</statuscode>
<statuscode>
<number>210</number>
<stanza>presence</stanza>
<context>Entering a room</context>
<purpose>Inform user that service has assigned or modified occupant's roomnick</purpose>
<purpose>
Inform user that service has assigned or modified occupant's roomnick
</purpose>
</statuscode>
<statuscode>
<number>301</number>
<stanza>presence</stanza>
<context>Removal from room</context>
<purpose>Inform user that he or she has been banned from the room</purpose>
<purpose>
Inform user that he or she has been banned from the room
</purpose>
</statuscode>
<statuscode>
<number>303</number>
<stanza>presence</stanza>
<context>Exiting a room</context>
<purpose>Inform all occupants of new room nickname</purpose>
<purpose>
Inform all occupants of new room nickname
</purpose>
</statuscode>
<statuscode>
<number>307</number>
<stanza>presence</stanza>
<context>Removal from room</context>
<purpose>Inform user that he or she has been kicked from the room</purpose>
<purpose>
Inform user that he or she has been kicked from the room
</purpose>
</statuscode>
<statuscode>
<number>321</number>
<stanza>presence</stanza>
<context>Removal from room</context>
<purpose>Inform user that he or she is being removed from the room
because of an affiliation change</purpose>
<purpose>
Inform user that he or she is being removed from the room
because of an affiliation change
</purpose>
</statuscode>
<statuscode>
<number>322</number>
<stanza>presence</stanza>
<context>Removal from room</context>
<purpose>Inform user that he or she is being removed from the room
because the room has been changed to members-only and the user
is not a member</purpose>
<purpose>
Inform user that he or she is being removed from the room
because the room has been changed to members-only and the
user is not a member
</purpose>
</statuscode>
<statuscode>
<number>332</number>
<stanza>presence</stanza>
<context>Removal from room</context>
<purpose>Inform user that he or she is being removed from the room
because the MUC service is being shut down</purpose>
<purpose>
Inform user that he or she is being removed from the room
because the MUC service is being shut down
</purpose>
</statuscode>
]]></code>
</section3>
@ -5450,7 +5494,7 @@ xmpp:coven@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit;password=cauld
</section3>
<section3 topic='Ghost Users' anchor='impl-service-ghosts'>
<p>Deployment experience has shown that sometimes a user can appear to be an occupant in a room even though the user's real JID has gone offline since joining. Such users are called "ghosts". To help prevent ghost users, a MUC service SHOULD remove a user if the service receives a delivery-related error in relation to a stanza it has previously sent to the user (in this context, the delivery-related errors are &gone;, &notfound;, &recipient;, &redirect;, &remoteserver;, and &timeout;). A MUC service MAY also use &xep0199; to periodically check the availability of room occupants.</p>
<p>Deployment experience has shown that sometimes a user can appear to be an occupant in a room even though the user's real JID has gone offline since joining. Such users are called "ghosts". To help prevent ghost users, a MUC service SHOULD remove a user if the service receives a delivery-related error in relation to a stanza it has previously sent to the user (in this context, the delivery-related errors are &gone;, &notfound;, &recipient;, &redirect;, &remoteserver;, and &timeout;). A MUC service MAY also use &xep0199; or similar methods to periodically check the availability of room occupants. If the MUC service determines that the user has gone offline, it must treat the user as if the user had itself sent unavailable presence.</p>
</section3>
</section2>