<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.jabbercn.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-cn">
		<id>http://wiki.jabbercn.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zyhserry</id>
		<title>Jabber/XMPP中文翻译计划 - 用户贡献 [zh-cn]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.jabbercn.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zyhserry"/>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/Zyhserry"/>
		<updated>2026-04-23T23:06:25Z</updated>
		<subtitle>用户贡献</subtitle>
		<generator>MediaWiki 1.18.2</generator>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0045</id>
		<title>XEP-0045</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0045"/>
				<updated>2014-01-02T06:01:09Z</updated>
		
		<summary type="html">&lt;p&gt;Zyhserry: /* 服务端 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0045.html XEP-0045]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0045: 多用户聊天'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本文定义了一个XMPP协议扩展用于多用户文本会议.即多个XMPP可以在一个房间或频道互相交流信息, 类似互联网中继聊天系统(IRC).还有标准聊天室功能如聊天室的主题和邀请，本协议定义了一个强有力的房间控制模型，包括能够踢和禁止用户，任命主持人和管理员，要求会员或密码才能加入房间，等等。&lt;br /&gt;
&lt;br /&gt;
作者:	Peter Saint-Andre&lt;br /&gt;
&lt;br /&gt;
XMPP扩展协议的版权(1999-2008)归XMPP标准化基金会(XSF)所有&lt;br /&gt;
&lt;br /&gt;
版权:	© 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0045#法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.24&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2008-07-16&lt;br /&gt;
&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个草案标准.对本协议的执行是被鼓励的,也适于部署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
传统上, 即时消息被视为由一对一的聊天构成而不是多对多聊天(即所谓&amp;quot;群聊&amp;quot;或&amp;quot;文本会议&amp;quot;). 群聊功能常见于一些系统如 Internet Relay Chat (IRC) 和 流行的IM服务所提供的聊天室功能. Jabber社区早在1999年开发和实施了一个基本的群聊协议. 这个 &amp;quot;groupchat 1.0&amp;quot; 协议为聊天室提供了一个最小功能集但是范围很有限. 本协议(多用户聊天或简称MUC)建立在向后兼容旧的&amp;quot;groupchat 1.0&amp;quot;协议的基础上但是提供高级功能如邀请, 房间主持和管理, 以及专门的房间类型.&lt;br /&gt;
&lt;br /&gt;
==范围==&lt;br /&gt;
&lt;br /&gt;
本文着重于和配置,参与以及管理一个独立的基于文本的会议室相关的通用需求. 这里所指出的需求是应用于单个房间级别的并且是&amp;quot;通用的&amp;quot;, 某种意义上它们是在Jabber社区广泛讨论的或在现有的Jabber之外的基于文本的会议环境(例如, 定义在 [http://tools.ietf.org/html/rfc1459 RFC 1459] [[XEP-0045#附录G:备注|1]]中的Internet Relay Chat 和它的继承者: [http://tools.ietf.org/html/rfc2810 RFC 2810] [[XEP-0045#附录G:备注|2]], [http://tools.ietf.org/html/rfc2811 RFC 2811] [[XEP-0045#附录G:备注|3]], [http://tools.ietf.org/html/rfc2812 RFC 2812] [[XEP-0045#附录G:备注|4]], [http://tools.ietf.org/html/rfc2813 RFC 2813] [[XEP-0045#附录G:备注|5]])中已经存在的.&lt;br /&gt;
&lt;br /&gt;
本文明确地不涉及以下需求:&lt;br /&gt;
&lt;br /&gt;
* 房间之间的关系(例如, 房间的层次结构)&lt;br /&gt;
&lt;br /&gt;
* 多用户聊天服务的管理(例如, 管理跨越整个服务级别的权限或注册一个全局可用的房间昵称)；这些用例定义在[http://xmpp.org/extensions/xep-0133.html Service Administration] [[XEP-0045#附录G:备注|6]]&lt;br /&gt;
&lt;br /&gt;
* 个别消息的主持&lt;br /&gt;
&lt;br /&gt;
* 通过房间发送的消息的加密&lt;br /&gt;
&lt;br /&gt;
* 高级特性, 如附加文件给一个房间, 集成白板, 以及和语音或视频聊天服务的接口&lt;br /&gt;
&lt;br /&gt;
* MUC部署和外来的聊天系统(例如, 和IRC网关或现有的其他IM系统)之间的交互&lt;br /&gt;
&lt;br /&gt;
* 在多个MUC部署之间进行镜像或复制&lt;br /&gt;
&lt;br /&gt;
这一受限的范围并非蔑视这些都很有用的主题; 无论如何, 这意味着本文专注于讨论和介绍一个易于理解的协议能够被类似的Jabber客户端和组件开发者实现. 将来的协议当然可能涉及以上提到的这些主题.&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
本文描述了由Jabber现有的多用户聊天服务提供的最小功能集. 为了向后兼容性起见, 本文使用原来的&amp;quot;groupchat 1.0&amp;quot;协议作为基本功能, 包括以下这些:&lt;br /&gt;
&lt;br /&gt;
* 每个房间被标识为 &amp;lt;room@service&amp;gt; (例如, &amp;lt;jdev@conference.jabber.org&amp;gt;), 这里 &amp;quot;room&amp;quot; 是房间的名称而 &amp;quot;service&amp;quot; 是多用户聊天服务运行所在的主机名.&lt;br /&gt;
&lt;br /&gt;
* 在一个房间里每个房客被标识为 &amp;lt;room@service/nick&amp;gt;, 这里 &amp;quot;nick&amp;quot; 是这个房客在这个房间里的昵称,定义于刚加入这个房间的时候，也可以在房客驻留改房间期间修改.&lt;br /&gt;
&lt;br /&gt;
* 一个用户通过发送出席信息给 &amp;lt;room@service/nick&amp;gt; 来加入一个房间（也就是成为房客）.&lt;br /&gt;
&lt;br /&gt;
* 在多用户聊天房间里发送的消息使用特殊的类型&amp;quot;groupchat&amp;quot;并且被寻址于房间本身 (room@service), 然后反映给所有房客.&lt;br /&gt;
&lt;br /&gt;
* 通过发送出席信息给 &amp;lt;room@service/newnick&amp;gt;，一个房客可以改变他或她的房间昵称以及在房间中的可用性状态 .&lt;br /&gt;
&lt;br /&gt;
* 通过发送一个类型为&amp;quot;unavailable&amp;quot;的出席信息给当前的&amp;lt;room@service/nick&amp;gt;，一个房客可以退出房间.&lt;br /&gt;
&lt;br /&gt;
本文追加的特性和功能包括以下这些:&lt;br /&gt;
&lt;br /&gt;
# 本地会话日志(不需要房间内的机器人)&lt;br /&gt;
# 允许用户申请房间成员&lt;br /&gt;
# 在一个非匿名房间里, 允许房客可以察看(另)一个房客的全JID&lt;br /&gt;
# 在一个半匿名房间里, 允许主持人可以察看一个房客的全JID&lt;br /&gt;
# 允许只有主持人修改房间主题&lt;br /&gt;
# 允许主持人从房间里踢出与会者和游客&lt;br /&gt;
# 在一个被主持的房间里,主持人可以授予和撤销发言权(也就是说, 发言的权力), 并且管理发言权列表&lt;br /&gt;
# 允许管理员授权和取消主持人权力, 并且管理主持人列表&lt;br /&gt;
# 允许管理员在房间禁止用户, 并管理黑名单&lt;br /&gt;
# 允许管理员授予和撤销成员权力, 并且管理一个仅限成员的房间的成员列表&lt;br /&gt;
# 允许所有者限制房客的数量&lt;br /&gt;
# 允许所有者指定其他的所有者(们)&lt;br /&gt;
# 允许所有者授予或撤销管理特权, 并管理管理员列表&lt;br /&gt;
# 允许所有者销毁房间&lt;br /&gt;
&lt;br /&gt;
另外, 本文提供了协议元素用于支持以下房间类型:&lt;br /&gt;
&lt;br /&gt;
# 公共的或隐藏的&lt;br /&gt;
# 持久的或临时的&lt;br /&gt;
# 密码保护的或不安全的&lt;br /&gt;
# 仅限成员的或开放的&lt;br /&gt;
# 主持的或非主持的&lt;br /&gt;
# 非匿名的或半匿名的&lt;br /&gt;
&lt;br /&gt;
为了实现这些需求, 本扩展协议需要满足 'http://jabber.org/protocol/muc' 名字空间(以及 在主名字空间URI加上 #owner, #admin, 和 #user 片断).&lt;br /&gt;
&lt;br /&gt;
==术语==&lt;br /&gt;
&lt;br /&gt;
===通用术语===&lt;br /&gt;
&lt;br /&gt;
Affiliation(岗位) -- 一个长期存在的和房间之间的联系或连接; 可能的岗位有 &amp;quot;owner&amp;quot;(所有者), &amp;quot;admin&amp;quot;(管理者), &amp;quot;member&amp;quot;(成员), 以及 &amp;quot;outcast&amp;quot;(被排斥者) (当然也可能没有岗位); 岗位(affiliation)和角色(role)是有区别的. 一个岗位跨越了用户对一个房间的访问期间.&lt;br /&gt;
&lt;br /&gt;
Ban(禁止) -- 从一个房间移除一个用户以使这个用户不能够再进入这个房间 (直到这个禁令被废除为止). 一个被禁止的用户的岗位(affiliation)为 &amp;quot;outcast&amp;quot;(被排斥者).&lt;br /&gt;
&lt;br /&gt;
Bare JID(纯JID) -- 一个用户的标识符 &amp;lt;user@host&amp;gt;, 不同于任何已有会话或资源的上下文, 与之相对的是全JID和房间JID.&lt;br /&gt;
&lt;br /&gt;
Full JID(全JID) -- 一个在线用户的标识符 &amp;lt;user@host/resource&amp;gt; , 不同于一个房间的上下文; 与之相对的是纯JID和房间JID.&lt;br /&gt;
&lt;br /&gt;
GC -- 最小的 &amp;quot;groupchat 1.0&amp;quot; 协议[7], Jabber社区于1999年开发; MUC 向后兼容GC.&lt;br /&gt;
&lt;br /&gt;
History(历史) -- 有限数量的消息节, 由当前讨论的上下文提供发送给一个新的房客.&lt;br /&gt;
&lt;br /&gt;
Invitation(邀请) -- 从一个用户发出的特殊消息给另一个用户, 邀请对方加入房间.; the invitation can be sent directly (see Direct MUC Invitations [8]) or mediated through the room (as described under Inviting Another User to a Room).&lt;br /&gt;
&lt;br /&gt;
IRC -- Internet Relay Chat.&lt;br /&gt;
&lt;br /&gt;
Kick(踢人) -- 临时从一个房间移除一个与会者或游客; 这个用户任何时候都可以再次进入这个房间. 一个被踢的用户的角色是&amp;quot;none&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Logging(记录) -- 存储发生在一个房间的讨论内容用于公开发布到房间上下文之外的地方.&lt;br /&gt;
&lt;br /&gt;
Member(成员) -- 一个用户在一个仅限会员的房间内处于&amp;quot;white list&amp;quot;(白名单)内，或已经注册到一个公开的房间. 一个成员的岗位是&amp;quot;member&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Moderator(主持人) -- 一个房间角色,通常和房间的管理有关但是这个角色可以被赋予非管理员; 可以踢人, 可以授予和撤销发言权, 等等. 一个主持人的角色是&amp;quot;moderator&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
MUC -- 本文所定义的基于文本会议的多用户聊天协议.&lt;br /&gt;
&lt;br /&gt;
Occupant(房客) -- 一个房间里的任何Jabber用户 (这是一个 &amp;quot;抽象类&amp;quot; 并且不对应任何特定的角色).&lt;br /&gt;
&lt;br /&gt;
Occupant JID(房客JID) -- 在一个房间上下文中的一个房客，以 &amp;lt;room@service/nick&amp;gt; 来标识; 与之相对的是纯JID和全JID.&lt;br /&gt;
&lt;br /&gt;
Outcast(被排斥者) -- 一个被某个房间禁止的用户. 一个被排斥者的岗位是 &amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Participant(与会者) -- 一个没有管理权限的房客; 在一个被主持的房间里, 参与者更多地被定义为有发言权的 (与之相反的是游客). 一个与会者的角色是&amp;quot;participant&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Private Message(私有消息) -- 从一个房客直接发给另一个房间JID的消息(不是房间本身广播给所有房客的消息).&lt;br /&gt;
&lt;br /&gt;
Role(角色) -- 在一个房间里的一个临时的地位或者权限级别, 对于这个房间中的用户的长期岗位来说是唯一的; 可能的角色有 &amp;quot;moderator&amp;quot;（主持人）, &amp;quot;participant&amp;quot;(与会者), 和 &amp;quot;visitor&amp;quot;(游客) (也可能没有预定义的角色). 一个角色仅仅存在于一个房客访问一个房间的期间.&lt;br /&gt;
&lt;br /&gt;
Room(房间) -- 一个虚拟的地方, Jabber用户象征性地加入它, 来和其他用户一起参与一个实时的基于文本的会议.&lt;br /&gt;
&lt;br /&gt;
Room Administrator(房间管理员) -- 一个由房间所有者授权的用户, 可以执行管理功能, 如禁止用户等等; 无论如何, 不允许改变定义的房间特性. 一个管理员的岗位是&amp;quot;admin&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
Room ID(房间ID) -- 一个房间JID的节点标识符部分, 它可以是不透明的因而对人类用户没有什么含义(见  语法的商业规则Business Rules for syntax); 与之相对的是房间名.&lt;br /&gt;
&lt;br /&gt;
Room JID(房间JID) -- 房间地址，如 &amp;lt;room@service&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Room Name(房间名) -- 一个用户友好的, 自然语言的房间名字, 由房间所有者配置并在服务查询中展示; 与之相对的是房间ID.&lt;br /&gt;
&lt;br /&gt;
Room Nickname(房间昵称) -- 房间JID的资源标识符部分(见语法的商业规则); 这是一个房客在这个房间中所呈现的&amp;quot;友好的名字&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Room Owner(房间所有者) -- 建立某个房间的Jabber用户或一个被房间创建者或所有者指派拥有所有者权限(如果允许的话)的Jabber用户; 它被允许改变定义好的房间特性, 也可以执行全部的管理功能. 一个所有者的岗位为&amp;quot;owner&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Room Roster(房间名册) -- 一个房间中的所有房客在一个Jabber客户端的展现.&lt;br /&gt;
&lt;br /&gt;
Server(服务器) -- 一个Jabber服务器，可以关联或不关联一个基于文本的会议服务.&lt;br /&gt;
&lt;br /&gt;
Service(服务) -- 一个主机, 提供基于文本的会议的能力; 通常但不必须是一个Jabber服务器的子域(例如, conference.jabber.org).&lt;br /&gt;
&lt;br /&gt;
Subject(主题) -- 一个房间的临时讨论标题.&lt;br /&gt;
&lt;br /&gt;
Visit(访问) -- 一个房间的一个用户的&amp;quot;session&amp;quot;(会话), 当用户进入这个房间时开始(也就是说, 成为一个房客) , 结束于用户离开房间之时.&lt;br /&gt;
&lt;br /&gt;
Visitor(游客) -- 在一个被主持的房间里的一个没有发言权的房客(相反则是一个与会者). 一个游客的角色是&amp;quot;visitor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Voice(发言权) -- 在一个被主持的房间里, 发送消息给全部房客的权限.&lt;br /&gt;
&lt;br /&gt;
===房间类型===&lt;br /&gt;
&lt;br /&gt;
Hidden Room(隐藏房间) -- 一个无法被任何用户以普通方法如搜索和服务查询来发现的房间; 反义词: 公开(public)房间.&lt;br /&gt;
&lt;br /&gt;
Members-Only Room(仅限会员的房间) -- 如果一个用户不在成员列表中则无法加入的一个房间; 反义词: 开放(open)房间.&lt;br /&gt;
&lt;br /&gt;
Moderated Room(被主持的房间) -- 只有有&amp;quot;发言权&amp;quot;的用户才可以发送消息给所有房客的房间; 反义词: 非主持的(Unmoderated)房间.&lt;br /&gt;
&lt;br /&gt;
Non-Anonymous Room(非匿名房间) -- 一个房客的全JID会暴露给所有其他房客的房间, 尽管房客可以选择任何期望的房间昵称; 相对的是半匿名(Semi-Anonymous)房间.&lt;br /&gt;
&lt;br /&gt;
Open Room(开放房间) -- 任何人可以加入而不需要在成员列表中的房间; 反义词: 仅限会员的房间.&lt;br /&gt;
&lt;br /&gt;
Password-Protected Room(密码保护房间) -- 一个用户必须提供正确密码才能加入的房间; 反义词: 非保密房间.&lt;br /&gt;
&lt;br /&gt;
Persistent Room(持久房间) -- 如果最后一个房客退出也不会被销毁的房间; 反义词: 临时房间.&lt;br /&gt;
&lt;br /&gt;
Public Room(公开房间) -- 用户可以通过普通方法如搜索和服务查询来发现的房间; 反义词: 隐藏房间.&lt;br /&gt;
&lt;br /&gt;
Semi-Anonymous Room(半匿名房间) -- 一个房客的全JID只能被房间管理员发现的房间; 相对的是非匿名(Non-Anonymous)房间.&lt;br /&gt;
&lt;br /&gt;
Temporary Room(临时房间) -- 如果最后一个房客退出就会被销毁的房间; 反义词: 持久房间.&lt;br /&gt;
&lt;br /&gt;
Unmoderated Room(非主持的房间) -- 任何房客都被允许发送消息给所有房客的房间; 反义词: 被主持的房间.&lt;br /&gt;
&lt;br /&gt;
Unsecured Room(非保密房间) -- 任何人不需要提供密码就可以进入的房间; 反义词: 密码保护房间.&lt;br /&gt;
&lt;br /&gt;
===登场人物===&lt;br /&gt;
&lt;br /&gt;
本文的大部分例子使用了莎士比亚的《麦克白》中第四幕第一场开头女巫在黑洞中开会的场景，在这里使用&amp;quot;coven@chat.shakespeare.lit&amp;quot;代表聊天室. 人物如下:&lt;br /&gt;
&lt;br /&gt;
'''表1: 剧中人'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!Room Nickname !!Full JID!!Affiliation&lt;br /&gt;
|-&lt;br /&gt;
|firstwitch ||crone1@shakespeare.lit/desktop ||Owner&lt;br /&gt;
|-&lt;br /&gt;
|secondwitch ||wiccarocks@shakespeare.lit/laptop ||Admin&lt;br /&gt;
|-&lt;br /&gt;
|thirdwitch ||hag66@shakespeare.lit/pda ||None&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==角色(Roles)，岗位(Affiliations)和权限(Privileges)==&lt;br /&gt;
&lt;br /&gt;
A user might be allowed to perform any number of actions in a room, from joining or sending a message to changing configuration options or destroying the room altogether. We call each permitted action a &amp;quot;privilege&amp;quot;. There are two ways we might structure privileges:&lt;br /&gt;
&lt;br /&gt;
1. Define each privilege atomically and explicitly define each user's particular privileges; this is flexible but can be confusing to manage.&lt;br /&gt;
&lt;br /&gt;
2. Define bundles of privileges that are generally applicable and assign a user-friendly &amp;quot;shortcut&amp;quot; to each bundle (e.g., &amp;quot;moderator&amp;quot; or &amp;quot;admin&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
MUC使用第2种方式。&lt;br /&gt;
&lt;br /&gt;
有两个尺度我们可以用来衡量一个用户的连接或在一个房间的地位. 一个是用户和一个房间的长期的联系 -- 例如, 用户的状态是一个所有者或一个被排斥者. 另一个是当用户驻留于一个聊天室的时候的角色 -- 例如, 一个房客的地位是主持人,有权踢出游客和与会者. 这两个尺度各自都是唯一的, 因为一个岗位是跨越访问的, 而一个角色只存在于一次访问期间. 另外, 在角色和岗位之间没有一对一的对应关系; 例如, 某个不从属于某房间的人可能成为一个(临时的)主持人, 一个成员可能在一个被主持的房间中是一个与会者或游客者. 这些概念以下全面解释.&lt;br /&gt;
&lt;br /&gt;
===角色===&lt;br /&gt;
&lt;br /&gt;
以下是已定义的角色:&lt;br /&gt;
&lt;br /&gt;
'''表2: 角色'''&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!名称 !!支持&lt;br /&gt;
|-&lt;br /&gt;
| 主持人Moderator   ||必需的 &lt;br /&gt;
|-&lt;br /&gt;
| 无None       ||缺少角色&lt;br /&gt;
|-&lt;br /&gt;
| 与会者Participant   ||必需的&lt;br /&gt;
|-&lt;br /&gt;
| 游客Visitor     ||推荐的&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
角色是临时的,它不一定要在用户对房间的访问中持久化,它可以(MAY)在一个房客访问房间期间改变. 一个实现可以(MAY)在一次访问期间持久化角色并且应该(SHOULD)在被主持的房间这样做 (因为在游客和与会者之间,唯一性对一个被主持的房间是很关键的).&lt;br /&gt;
&lt;br /&gt;
在角色和岗位之间没有一对一的映射(例如, 一个成员可以是一个与会者或一个游客).&lt;br /&gt;
&lt;br /&gt;
在房间会话中,一个主持人是最有权力的房客, 它能在某种程度走上管理房间的其他房客的角色. 一个与会者的权力小于一个主持人, 尽管他或她有权发言. 在一个被主持的房间会话中游客是一个更受限制的角色, 因为访问者不允许发送消息给所有房客.&lt;br /&gt;
&lt;br /&gt;
角色的授予,撤销, 和维护是基于房客的房间昵称或全JID,而不是纯JID. 和这些角色相关的权限，还有角色改变触发的动作, 定义在下文中.&lt;br /&gt;
&lt;br /&gt;
所有在房间中生成或反射的出席信息中关于角色的信息必须(MUST)被发送,从而发送给房客们.&lt;br /&gt;
&lt;br /&gt;
====权限====&lt;br /&gt;
&lt;br /&gt;
大部分情况下, 角色存在于一个层次中. 例如, 一个与会者可以做任何游客能做的事, 而一个主持人可以做任何与会者能做的事. 每个角色拥有下一级角色所没有的权限; 这些权限定义于下表作为缺省值(一个实现可以(MAY)提供配置选项来重载这些缺省值).&lt;br /&gt;
&lt;br /&gt;
'''表3: 和角色相关的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!权限 !!无 !!游客 !!与会者 !!主持人&lt;br /&gt;
|-&lt;br /&gt;
|在房间中出席 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|接收消息 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|接收房客出席信息 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|出席信息广播到房间 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|改变可用性状态 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|改变房间昵称 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|发送私人消息 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|邀请其他用户 ||否 ||是* ||是* ||是&lt;br /&gt;
|-&lt;br /&gt;
|发送消息给所有人 ||否 ||否** ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|修改标题 ||否 ||否* ||是* ||是&lt;br /&gt;
|-&lt;br /&gt;
|踢出与会者和游客 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|授予发言权 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|撤销发言权 ||否 ||否 ||否 ||是***&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 缺省; 设定配置时可以(MAY)修改这个权限.&lt;br /&gt;
&lt;br /&gt;
** 一个实现可以(MAY)在非主持的房间里缺省地授予发言权给游客.&lt;br /&gt;
&lt;br /&gt;
*** 主持人不能(MUST NOT)从一个管理员或所有者收回发言权.&lt;br /&gt;
&lt;br /&gt;
====默认角色====&lt;br /&gt;
&lt;br /&gt;
服务必须（SHOULD）根据用户的岗位信息来设置房客在房间里的默认角色（没有与岗位（“outcast”）关联的默认角色，因为outcast用户不允许进入房间）。下表对与每个岗位关联的默认角色进行了总结。&lt;br /&gt;
&lt;br /&gt;
表4: 基于岗位的默认角色&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!Room Type !!None !!Member !!Admin !!Owner&lt;br /&gt;
|-&lt;br /&gt;
|Moderated ||Visitor ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Unmoderated ||Participant ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Members-Only ||N/A * ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Open	||Participant ||Participant ||Moderator ||Moderator&lt;br /&gt;
|}&lt;br /&gt;
* Entry is not permitted.&lt;br /&gt;
&lt;br /&gt;
====变更角色====&lt;br /&gt;
&lt;br /&gt;
一个房客的角色变更方法是定义好的. 有时候房客自己的动作导致变更 (例如, 加入或退出房间), 反之有时候由主持人,管理员或所有者的动作导致变更. 如果一个房客的角色改变了, 一个 MUC 服务实现必须(MUST)变更这个房客的角色来反映这个变更并且传达这个变更给所有房客. 角色的变更和它们触发的动作定义于下表.&lt;br /&gt;
&lt;br /&gt;
'''表4: 角色状态表'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!&amp;gt; !!无 !!游客 !!与会者 !!主持人&lt;br /&gt;
|-&lt;br /&gt;
|无 ||-- ||进入被主持的房间 ||进入非主持的房间 ||管理员或所有者进入房间&lt;br /&gt;
|-&lt;br /&gt;
|游客 ||退出房间或被主持人踢出房间 ||-- ||主持人授予发言权 ||管理员或所有者授予主持人权限&lt;br /&gt;
|-&lt;br /&gt;
|与会者 ||退出房间或被主持人踢出房间 ||主持人撤销发言权	||--  ||管理员或所有者授予主持人权限 &lt;br /&gt;
|-&lt;br /&gt;
|主持人	||退出房间 ||管理员或所有者改变角色成为游客* ||管理员或所有者改变角色成为与会者或撤销主持人权限* ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 一个主持人不能(MUST NOT)从一个岗位等于或高于主持人的房客那里收回主持人权限.&lt;br /&gt;
&lt;br /&gt;
注意: 特定的角色一般暗含特定的权限. 例如, 一个管理员或所有者自动成为一个主持人, 所以如果一个房客被授予管理员地位那么这个房客事实上将被授予主持人权限; 类似的, 当一个房客成为一个被主持的房间的成员, 这个房客自动拥有一个与会者的角色. 无论如何, 失去管理员地位并不足以意味这个房客不再是主持人 (因为只要是与会者就可能成为一个主持人). 因此, 当一个房客被授予特定的岗位的时候所拥有的角色是固定的, 反之当一个房客失去一个特定的岗位时它的角色是不确定的并取决于(服务的)实现. 因为一个客户端无法预料是否在撤销某个岗位之后这个角色成为什么, 如果它不想同时移除管理员/所有者权限和主持人角色, 那么除了岗位变更之外它还必须特意请求角色变更.&lt;br /&gt;
&lt;br /&gt;
===岗位===&lt;br /&gt;
&lt;br /&gt;
已定义了以下岗位:&lt;br /&gt;
&lt;br /&gt;
# 所有者&lt;br /&gt;
# 管理员&lt;br /&gt;
# 成员&lt;br /&gt;
# 被排斥者&lt;br /&gt;
# 无 (缺少岗位)&lt;br /&gt;
&lt;br /&gt;
必须支持&amp;quot;所有者&amp;quot;这个岗位,推荐支持&amp;quot;管理员&amp;quot;,&amp;quot;成员&amp;quot;,&amp;quot;被排斥者&amp;quot;的岗位.（&amp;quot;无&amp;quot;表示缺少岗位)&lt;br /&gt;
&lt;br /&gt;
这些岗位是长时间的跨越一个用户对这个房间的访问期间的并且不受房间里事件的影响. 而且, 这些岗位和一个房客在房间中的角色之间没有一对一的映射关系. 岗位被授予,撤销, 和维护都是基于这个用户的纯 JID.&lt;br /&gt;
&lt;br /&gt;
如果一个没有已定义的岗位的用户进入一个房间, 这个用户的岗位被定义为&amp;quot;无&amp;quot;; 无论如何, 这个岗位不能跨越(多次的)访问 (也就是说, 一个服务不会跨越访问维护一个 &amp;quot;无 列表&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;quot;成员&amp;quot;岗位为房间所有者或管理员提供了一个方法来指定一个&amp;quot;白名单&amp;quot;,其中的用户被允许加入一个仅供会员的房间. 当一个成员加入了一个仅供会员的房间, 他或她的岗位不会改变, 无论他或她的角色是什么. 成员岗位也为用户提供一个方法来高效地注册一个开放的房间并在某种方式意义上保持和那个房间的联系(例如可能在房间里预留那个用户的昵称).&lt;br /&gt;
&lt;br /&gt;
一个被排斥者就是一个被从房间踢出来并且不允许进入那个房间的用户.&lt;br /&gt;
&lt;br /&gt;
关于岗位的信息必须(MUST)由房间生成或反射到所有的出席信息节之中发送给房客们.&lt;br /&gt;
&lt;br /&gt;
====权限====&lt;br /&gt;
&lt;br /&gt;
大部分情况下, 岗位存在一个层次结构. 例如, 一个所有者可以做任何管理员能做的事情, 而一个管理员可以做任何成员能做的事情. 每个岗位拥有其下一级岗位所没有的权限; 这些权限定义在下表中.&lt;br /&gt;
&lt;br /&gt;
'''表5: 和岗位相关的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!权限 !!Outcast(被排斥者) !!None(无) !!Member(成员) !!Admin(管理员) !!Owner(所有者)&lt;br /&gt;
|-&lt;br /&gt;
|进入房间 ||否 ||是* ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|注册一个开放的房间 ||否 ||是 ||N/A ||N/A ||N/A&lt;br /&gt;
|-&lt;br /&gt;
|接收成员列表 ||否 ||否** ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|加入一个仅限会员的房间 ||否 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|禁止成员并把用户的岗位删除	||否 ||否 ||否 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑成员列表 ||否 ||否 ||否 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑主持人列表 ||否 ||否 ||否 ||是** ||是**&lt;br /&gt;
|-&lt;br /&gt;
|编辑管理员列表 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑所有者列表 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|变更房间定义 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|销毁房间	||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 作为缺省值, 一个无岗位的用户进入一个被主持的房间的角色是一个游客, 而进入一个开放的房间的角色是一个与会者. 一个成员进入一个房间的角色是与会者. 一个管理员或所有者进入房间的角色是一个主持人.&lt;br /&gt;
&lt;br /&gt;
** 一个管理员或所有者不能(MUST NOT)撤销另一个管理员或所有者的权限.&lt;br /&gt;
&lt;br /&gt;
====变更岗位====&lt;br /&gt;
&lt;br /&gt;
一个用户的岗位变更方法已经定义得很完善. 有时用户自己的动作导致这些变更(例如, 注册为一个房间的新成员), 反之有时候一个管理员或所有者的动作导致了这些变更. 如果一个用户的岗位改变了, 一个MUC服务实现必须(MUST)变更这个用户的岗位来反射这一变更并通知所有房客. 岗位变更和他们触发的动作定义在下表中.&lt;br /&gt;
&lt;br /&gt;
'''表6: 岗位状态表'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|  ||被排斥者(Outcast) ||无(None) ||成员(Member) ||管理员(Admin) ||所有者(Owner)&lt;br /&gt;
|-&lt;br /&gt;
|被排斥者(Outcast) ||-- ||管理员或所有者移除屏蔽 ||管理员或所有者增加用户到成员列表 ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|无(None) ||管理员或所有者使用屏蔽 ||-- ||管理员或所有者增加用户到成员列表, 或用户注册一个成员(如果允许) ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|成员(Member) ||管理员或所有者使用屏蔽 ||管理员或所有者变更岗位为&amp;quot;none&amp;quot; ||-- ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|管理员(Admin) ||所有者使用屏蔽 ||所有者变更岗位为&amp;quot;none&amp;quot; ||所有者变更岗位为&amp;quot;member&amp;quot; ||-- ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|所有者(Owner) ||所有者使用屏蔽 ||所有者变更岗位为&amp;quot;none&amp;quot; ||所有者变更岗位为&amp;quot;member&amp;quot; ||所有者变更岗位为&amp;quot;admin&amp;quot; ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==实体用例==&lt;br /&gt;
&lt;br /&gt;
一个MUC实现必须(MUST)支持[http://xmpp.org/extensions/xep-0030.html 服务发现] [[XEP-0045#附录G:备注|7]].&lt;br /&gt;
&lt;br /&gt;
===MUC的发现组件支持===&lt;br /&gt;
&lt;br /&gt;
一个Jabber实体可能希望发现是否一个服务实现了多用户聊天协议; 为了达到这个目的, 它发送一个服务发现信息(&amp;quot;disco#info&amp;quot;)查询给这组件的JID:&lt;br /&gt;
&lt;br /&gt;
'''例子 1. 用户通过Disco查询聊天服务是否支持MUC'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco1'&lt;br /&gt;
    to='macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须(MUST)返回它的的身份和它所支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 2. 服务返回Disco Info结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='Macbeth Chat Service'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 因为MUC是旧的&amp;quot;groupchat 1.0&amp;quot;协议的超集, 一个MUC服务不应该(SHOULD NOT)返回一个&amp;lt;feature var='gc-1.0'/&amp;gt;条目在一个disco#info结果中.&lt;br /&gt;
&lt;br /&gt;
===发现房间===&lt;br /&gt;
&lt;br /&gt;
发现服务条目(&amp;quot;disco#items&amp;quot;)协议使得一个用户可以向一个服务查询相关的条目列表, 在一个聊天服务中这包含这个服务所承载的所有特定房间的集合.&lt;br /&gt;
&lt;br /&gt;
'''例子 3. 用户向聊天服务查询房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco2'&lt;br /&gt;
    to='macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务应该(SHOULD)返回它承载的所有房间的列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 4. 服务返回Disco Item结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='heath@macbeth.shakespeare.lit'&lt;br /&gt;
          name='A Lonely Heath'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
          name='A Dark Cave'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='forres@macbeth.shakespeare.lit'&lt;br /&gt;
          name='The Palace'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='inverness@macbeth.shakespeare.lit'&lt;br /&gt;
          name='Macbeth&amp;amp;apos;s Castle'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果全部房间的列表太大(详见[[XEP-0030]]), 服务可以(MAY)只返回部分的房间列表.如果这样做了, 它应该 SHOULD 包含一个 &amp;lt;set/&amp;gt; 元素 (定义在 [http://xmpp.org/extensions/xep-0059.html Result Set Management] [[XEP-0045#附录G:备注|8]]) 以表明这个列表不是全部的结果集.&lt;br /&gt;
&lt;br /&gt;
'''例子 5. 服务返回Disco Item结果的部分列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='rooms.shakespeare.lit'&lt;br /&gt;
    id='disco-rsm-1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='alls-well-that-ends-well@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='as-you-like-it@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='cleopatra@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='comedy-of-errors@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='coriolanus@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='cymbeline@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hamlet@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fourth-one@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fourth-two@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fifth@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;set xmlns='http://jabber.org/protocol/rsm'&amp;gt;&lt;br /&gt;
      &amp;lt;first index='0'&amp;gt;alls-well-that-ends-well@rooms.shakespeare.lit&amp;lt;/first&amp;gt;&lt;br /&gt;
      &amp;lt;last&amp;gt;henry-the-fifth@rooms.shakespeare.lit&amp;lt;/last&amp;gt;&lt;br /&gt;
      &amp;lt;count&amp;gt;37&amp;lt;/count&amp;gt;&lt;br /&gt;
    &amp;lt;/set&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===查询房间信息===&lt;br /&gt;
&lt;br /&gt;
使用 disco#info 协议, 一个用户也可以查询一个特定房间的详情. 为了在进入房间之间确定这个房间的隐私和安全配置用户应该(SHOULD)这样做(详见[[XEP-0045#安全事项|安全事项]]).&lt;br /&gt;
&lt;br /&gt;
'''例子 6. 用户查询特定聊天室的信息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco3'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间必须(MUST)返回它的标识并且应该(SHOULD)返回它支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 7. 房间返回查询信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco3'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='A Dark Cave'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_passwordprotected'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_hidden'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_temporary'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_open'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_unmoderated'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_nonanonymous'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 因为 MUC 是旧的 &amp;quot;groupchat 1.0&amp;quot; 协议的超集, 一个 MUC 房间不应该(SHOULD NOT)在一个disco#info结果中返回&amp;lt;feature var='gc-1.0'/&amp;gt;条目. 房间应该(SHOULD)返回它支持的实质的有意义的特性, 例如密码保护和房间主持(这些特性被完整地列入了特性注册, 由[http://xmpp.org/registrar/ XMPP Registrar]维护; 也见于本文的[[XEP-0045#registrar|XMPP注册]] 章节).&lt;br /&gt;
&lt;br /&gt;
一个聊天室可以(MAY)使用[http://xmpp.org/extensions/xep-0128.html 服务查询扩展] [[XEP-0045#附录G:备注|9]]在它的disco#info应答中返回更详细的信息, 通过包含一个隐含的FORM_TYPE属性值&amp;quot;http://jabber.org/protocol/muc#roominfo&amp;quot;来标识. 这些信息可能包括关于一个房间的更详细的描述, 当前的房间标题, 以及这个房间当前的房客数量:&lt;br /&gt;
&lt;br /&gt;
'''例子 8. 房间返回扩展的查询信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco3a'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='A Dark Cave'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_passwordprotected'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_hidden'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_temporary'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_open'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_unmoderated'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_nonanonymous'/&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_description' label='Description'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_changesubject' label='Whether Occupants May Change the Subject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_contactjid' label='Contact Addresses'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;crone1@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_subject' label='Subject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Spells&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_occupants' label='Number of occupants'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;3&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_lang' label='Language of discussion'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_logs' label='URL for discussion logs'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://www.shakespeare.lit/chatlogs/darkcave/&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_pubsub' label='Associated pubsub node'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;xmpp:pubsub.shakespeare.lit?node=chatrooms/darkcave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
某些扩展的房间信息可能是动态生成的(例如, 讨论记录的URL地址, 它可能取决于服务器那一层的配置); 反之另一些信息则可能基于房间那一层的配置,任何定义在[[XEP-0045#附录G:备注|muc#roomconfig FORM_TYPE]] 里的字段都可以用于扩展服务发现的字段(如上文所示的 muc#roomconfig_changesubject 字段).&lt;br /&gt;
&lt;br /&gt;
注意: 前述 'http://jabber.org/protocol/muc#roominfo' FORM_TYPE的扩展服务发现字段将来还可以扩充(通过本文的[[XEP-0045#附录G:备注|字段标准化]]章节描述的机制).&lt;br /&gt;
&lt;br /&gt;
===查询房间条目===&lt;br /&gt;
&lt;br /&gt;
一个用户也可以(MAY)向一个特定的聊天室查询和它相关的条目:&lt;br /&gt;
&lt;br /&gt;
'''例子 9. 用户查询和一个特定聊天室相关的条目'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个实现可以(MAY)返回现有房客的列表(如果那信息是可公开的), 或不返回列表(如果那信息是私有的).&lt;br /&gt;
&lt;br /&gt;
'''例子 10. 房间返回查询条目结果(条目是公开的)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit/firstwitch'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit/secondwitch'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 这些 &amp;lt;item/&amp;gt; 元素由 disco#items 名字空间限定, 而不是 muc 名字空间; 这意味着他们不能拥有 'affiliation' 或 'role' 属性, 例如.&lt;br /&gt;
&lt;br /&gt;
'''例子 11. 房间返回空的查询条目结果(条目是私有的)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===查询一个房间的房客===&lt;br /&gt;
&lt;br /&gt;
如果一个非房客试图发送一个查询请求给一个&amp;lt;room@service/nick&amp;gt;类型的地址, 一个 MUC 服务应该(SHOULD)返回这个请求给这个实体并指明一个&amp;lt;bad-request/&amp;gt;错误条件. 如果一个房客发送这样一个请求, 服务可以(MAY)把它传递给指定的接收者; 详见本文的 [[XEP-0045#实现注意事项|实现注意事项]]章节.&lt;br /&gt;
&lt;br /&gt;
===发现客户端对MUC的支持===&lt;br /&gt;
&lt;br /&gt;
一个 Jabber 用户可能想发现这个用户的某个联系人是否支持多用户聊天协议. 这可以使用服务发现(协议)来完成.&lt;br /&gt;
&lt;br /&gt;
'''例子 12. 用户查询联系人对于 MUC 的支持'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco5'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
客户端应该(SHOULD)返回它的标识和它支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 13. 联系人返回发现信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='disco5'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='client'&lt;br /&gt;
        type='pc'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个用户也可能查询一个联系人在哪个房间. 这可以通过特定服务发现节点 'http://jabber.org/protocol/muc#rooms' 查询联系人的全JID(&amp;lt;user@host/resource&amp;gt;)来完成 :&lt;br /&gt;
&lt;br /&gt;
'''例子 14. 用户在当前房间查询联系人'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='rooms1'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#rooms'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 15. 联系人返回房间查询结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='rooms1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#rooms'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='characters@conference.shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可选的, 联系人可以(MAY)把它的房间昵称作为'name'属性的值返回:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
          name='secondwitch'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==房客用例==&lt;br /&gt;
&lt;br /&gt;
在一个多用户聊天环境中主要的行为者是房客, 它可以被认为存在于一个多用户聊天室&amp;quot;之内&amp;quot;并且参与那个房间的讨论 (在本协议中, 与会者和游客&amp;quot;仅仅&amp;quot;被认为是房客, 因为他们不拥有管理员权限). 为了更加清晰起见, 本文中的协议元素中涉及到驻留者的用例分为以下三类:&lt;br /&gt;
&lt;br /&gt;
# 现存于 &amp;quot;groupchat 1.0&amp;quot; 协议的最小功能集&lt;br /&gt;
# 对于 &amp;quot;groupchat 1.0&amp;quot; 协议直接的应用, 如处理一些和新房间类型有关的错误&lt;br /&gt;
# 用来处理&amp;quot;groupchat 1.0&amp;quot;协议未涉及的功能的额外的协议元素(房间邀请, 房间密码, 和房间角色及岗位相关的扩展出席信息); 在'http://jabber.org/protocol/muc#user'名字空间&lt;br /&gt;
&lt;br /&gt;
注意: 这里所有客户端生成的例子是从服务的角度来展示的, 所以所有由服务收到的节都包含一个'from'属性来表达发送者的全JID(这个from属性是由一个通用的Jabber路由或会话管理者加入的). 另外, 通常的表示请求已被完成的 IQ 结果节(如 [[RFC 3920]] [10]中所要求的)未显示在这里.&lt;br /&gt;
&lt;br /&gt;
===进入一个房间===&lt;br /&gt;
&lt;br /&gt;
====Groupchat 1.0协议====&lt;br /&gt;
&lt;br /&gt;
为了参加一个多用户聊天室的讨论, 一个Jabber用户必须(MUST)首先进入一个房间成为一个房客. 在旧的&amp;quot;groupchat 1.0&amp;quot;协议中, 这是通过发送出席信息&amp;lt;room@service/nick&amp;gt;来实现的, 这里&amp;quot;room&amp;quot;是房间的 ID, &amp;quot;service&amp;quot; 是聊天服务的主机名, &amp;quot;nick&amp;quot; 是这个用户在这房间里预期的昵称:&lt;br /&gt;
&lt;br /&gt;
'''例子 16. Jabber用户进入一个房间(Groupchat 1.0)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit/thirdwitch'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子中, 一个全JID为&amp;quot;hag66@shakespeare.lit/pda&amp;quot;的用户请求用昵称&amp;quot;thirdwitch&amp;quot;进入位于&amp;quot;macbeth.shakespeare.lit&amp;quot;聊天服务的房间&amp;quot;darkcave&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
如果用户未指定一个房间昵称, 服务应该(SHOULD)返回一个&amp;lt;jid-malformed/&amp;gt;错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 17. Jabber用户进入一个房间(Groupchat 1.0)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error code='400' type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;jid-malformed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====基本MUC协议====&lt;br /&gt;
&lt;br /&gt;
兼容的多用户聊天服务必须（MUST）接受知道&amp;quot;groupchat 1.0&amp;quot; (GC)协议或multi-user chat (MUC)协议的任何客户端发出上述请求进入会议室; 无论如何, MUC 客户端应该(SHOULD)声明他们的有能力支持 MUC 协议, 方法是在出席信息节里面包含一个空的 &amp;lt;x/&amp;gt; 元素, 满足名字空间 'http://jabber.org/protocol/muc'  (注意不需要 '#user' 部分):&lt;br /&gt;
&lt;br /&gt;
'''例子 18. Jabber用户准备进入一个房间(Multi-User Chat)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from=&amp;quot;hag66@shakespeare.lit/pda&amp;quot;&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 如果发生了一个和加入房间有关的错误, 服务应该 SHOULD 返回一个包含 MUC 子元素 (i.e., &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;) 的 &amp;lt;presence/&amp;gt; 节，其 type 为 &amp;quot;error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
在尝试进入房间之间, 一个兼容MUC的客户端应该(SHOULD)首先查询它的保留的房间昵称 (如果有的话), 接下来的协议本文中的 [[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]] 章节对此作了定义.&lt;br /&gt;
&lt;br /&gt;
====出席信息广播====&lt;br /&gt;
&lt;br /&gt;
如果服务能够添加用户到房间, 它必须(MUST)从所有现存的房客的房间JID发送出席信息给新的房客的全JID, 包括扩展的关于角色的出席信息, 一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;moderator&amp;quot;, &amp;quot;participant&amp;quot;, 或&amp;quot;visitor&amp;quot;, 这个子元素的'affiliation'属性值设为&amp;quot;owner&amp;quot;, &amp;quot;admin&amp;quot;, &amp;quot;member&amp;quot;, 或 &amp;quot;none&amp;quot; 中的一个:&lt;br /&gt;
&lt;br /&gt;
'''例子 19. 服务从现有的房客发送出席信息给新的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个示例中, 用户已从前一个例子进入房间, 有两个人已经在房间里: 一个是昵称为&amp;quot;firstwitch&amp;quot;的(房间拥有者), 另一个是昵称为&amp;quot;secondwitch&amp;quot;的(房间管理员).&lt;br /&gt;
&lt;br /&gt;
服务也必须(MUST)从新进入的房客的房间JID向所有房客的全JID发送出席信息(含新房客):&lt;br /&gt;
&lt;br /&gt;
'''例子 20. 服务发送新房客的出席信息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
在这个例子里, 初始的房间出席信息从新房客(thirdwitch)发送给所有房客, 包括这个新房客自己. 看看上面最后一个节, 由房间以房客的名义发送给用户自己的出席信息,应该 SHOULD 包含一个 110 状态码，这样用户就知道这个出席信息来自于作为房客的那个他自己.&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 重写新房客的房间昵称 (例如, 如果房间昵称被锁定). 如果服务不接受新房客请求的房间昵称，而是分配一个新的房间昵称, 它必须 MUST 包含一个 &amp;quot;210&amp;quot; 状态码在发送给这个新房客的出席信息广播里.&lt;br /&gt;
&lt;br /&gt;
'''例子 21. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
注意: 发送给新房客的出席信息的顺序是很重要的. 服务必须 MUST 首先发送现有房客的完整列表给这个新房客,然后只发送新房客自己的出席信息给新房客. 这有助于客户端知道什么时候它收到了完整的房间名册( &amp;quot;room roster&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
发送出席信息广播之后(并且只在这之后), 服务可以发送讨论历史, 即时消息, 出席信息更新, 以及其他房间内的流量.&lt;br /&gt;
&lt;br /&gt;
====缺省角色====&lt;br /&gt;
&lt;br /&gt;
下表总结了初始缺省的角色，一个服务应该根据用户的岗位来设置它们(没有和 被排斥者 &amp;quot;outcast&amp;quot; 岗位相关的角色, 因为这些用户不允许进入房间).&lt;br /&gt;
&lt;br /&gt;
'''表7: 基于岗位的初始角色'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!房间类型 !!无 !!成员 !!管理员 !!所有者&lt;br /&gt;
|-&lt;br /&gt;
|被主持的 ||游客 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|非主持的 ||与会者 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|仅限会员的 ||N/A * ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|开放的 ||与会者 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 实体不被允许.&lt;br /&gt;
&lt;br /&gt;
====非匿名房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是非匿名的, 服务必须 MUST 发送新房客的全JID给所有房客,使用满足 'http://jabber.org/protocol/muc#user' 名字空间的扩展出席信息,其中带有 &amp;lt;x/&amp;gt; 元素并包含一个 &amp;lt;item/&amp;gt; 子元素,其 'jid' 属性值为这个房客的全JID:&lt;br /&gt;
&lt;br /&gt;
'''例子 22. 服务发送全JID给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这个用户正在进入一个非匿名房间(即, 它如上所示,向所有房客通报每个房客的全JID), 服务应该 SHOULD 允许该用户加入本房间,但是必须 MUST 同时警告该用户本房间是非匿名的. 应该 SHOULD 在房间发送给这个新房客的初始出席信息种包含状态码 &amp;quot;100&amp;quot; 来实现这一点:&lt;br /&gt;
&lt;br /&gt;
'''例子 23. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 也可以 MAY 发送一个 &amp;quot;groupchat&amp;quot; 类型的消息给新房客来达到上述目的,这个消息应该包含一个 &amp;lt;x/&amp;gt; 子元素,并拥有 &amp;lt;status/&amp;gt; 子元素,并且其'code'属性值为&amp;quot;100&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 24. 服务警告新房客(该房间)非匿名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;This room is not anonymous.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
附带的状态码协助客户端展示它们自己的通知消息 (例如, 和用户所在地方有关的信息).&lt;br /&gt;
&lt;br /&gt;
====半匿名房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是半匿名的, 服务必须 MUST 如上文所述从新房客发送出席信息给所有房客, 但是必须 MUST 只在发给&amp;quot;主持人&amp;quot;的时候发送新房客的全JID,而非主持人则不发(全JID).&lt;br /&gt;
&lt;br /&gt;
(注意: 所有随后的例子中，涉及的&amp;lt;item/&amp;gt;元素都带有'jid'属性, 即使这个信息在半匿名房间里不被发送给非主持人.)&lt;br /&gt;
&lt;br /&gt;
====密码保护房间====&lt;br /&gt;
&lt;br /&gt;
如果房间要求密码验证而用户不能提供(或密码错误), 服务必须 MUST 拒绝访问这个房间并且通知该用户它们是未被授权的; 具体方法是返回一个类型为&amp;quot;error&amp;quot;的出席信息节并标明 &amp;lt;not-authorized/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 25. 服务拒绝访问,因为(用户)未提供密码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
密码应该 SHOULD 通过进入房间时发送的出席信息节来提供, 包含在满足 'http://jabber.org/protocol/muc' 名字空间的 &amp;lt;x/&amp;gt; 元素的&amp;lt;password/&amp;gt; 子元素里. 密码以明码方式发送; 目前不支持其它验证方法, 而且任何这类的验证或授权方法都将会定义在一个独立的协议里(参见本文的[[XEP-0045#安全事项|安全事项]]章节).&lt;br /&gt;
&lt;br /&gt;
'''例子 26. 用户进入房间时提供密码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====仅限会员房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限会员的,但用户不是(该房间的)成员, 服务必须 MUST 拒绝访问这个房间并通知用户它们不被允许进入房间; 具体方法是返回一个&amp;quot;error&amp;quot;类型的出席信息节，并包含一个 &amp;lt;registration-required/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 27. 服务拒绝访问，因为用户不在成员列表中'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;registration-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====被禁止的用户====&lt;br /&gt;
&lt;br /&gt;
如果用户已经被房间禁止(即, 其岗位为被排斥者 &amp;quot;outcast&amp;quot;), 服务必须 MUST 拒绝访问这个房间并通知用户他(她)被禁止了; 具体方法是返回一个出席信息节,类型为&amp;quot;error&amp;quot;，标明 &amp;lt;forbidden/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 28. 服务拒绝访问，因为用户被禁止了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====昵称冲突====&lt;br /&gt;
&lt;br /&gt;
如果房间里已经有别的用户使用了准备进入房间的新用户预期的昵称(或如果这个昵称被保留给另一个成员列表里面的用户), 服务必须 MUST 拒绝访问这个房间并通知用户这个冲突; 具体方法是返回一个出席信息节,类型为&amp;quot;error&amp;quot;，标明 &amp;lt;conflict/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 29. 服务拒绝访问，因为昵称冲突'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 如果现有房客的纯 JID &amp;lt;localpart@domain.tld&amp;gt; 和准备进入房间的用户的纯 JID 相同, 那么服务应该 SHOULD 允许这个用户的进入, 所以这个用户就有两个(或更多) 房间内的会话 &amp;quot;sessions&amp;quot; 使用同一个房间昵称, 每一个对应一个资源. 如果一个服务允许相同纯JID可以同时存在多个房客并使用同一个房间的房间昵称, 它应该 SHOULD 路由房间内的消息给该用户的所有资源并允许用户的所有资源发送消息给房间; 视实现而定，服务来决定如何适当的处理从用户的资源发送的出席信息以及如何路由私有消息到所有或某个资源(基于出席信息优先级或其他机制).&lt;br /&gt;
&lt;br /&gt;
如何确定昵称冲突取决于实现(例如, 该服务是否应用于一个特定的惯例, 一个 stringprep 规则如 Resourceprep 或 Nodeprep, 等等).&lt;br /&gt;
&lt;br /&gt;
====最大用户数====&lt;br /&gt;
&lt;br /&gt;
如果房间达到它的最大房客数量, 服务应该 SHOULD 拒绝访问这个房间并通知该用户这个限制; 方法是返回一个出席信息节，类型为&amp;quot;error&amp;quot;，标明 &amp;lt;service-unavailable/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 30. 服务通知用户该房间已达到房客数量极限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='wait'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 房间可以踢出空闲用户(&amp;quot;idle user&amp;quot;)以腾出空间.&lt;br /&gt;
&lt;br /&gt;
如果房间的房客数量已达到最大值但是一个房间管理员或所有者试图进入，该房间应该允许管理员或所有者加入，为了使得额外的房客达到一个合理的数目，该数量可以 MAY 做成可配置的。&lt;br /&gt;
&lt;br /&gt;
====锁住的房间====&lt;br /&gt;
&lt;br /&gt;
如果一个用户尝试进入一个房间而该房间是锁住的 &amp;quot;locked&amp;quot; (即, 在房间创建者提供初始的配置之前以及也就是在房间正式存在之前), 服务必须 MUST 拒绝进入并返回一个 &amp;lt;item-not-found/&amp;gt; 错误给该用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 31. 服务拒绝访问，因为房间不存在'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====不存在的房间====&lt;br /&gt;
&lt;br /&gt;
如果用户准备进入房间时，该房间已经不存在了, 服务应该 SHOULD 建立它; 无论如何, 这不是必需的, 因为一个实现或部署可以 MAY 选择限制建立房间的权限. 详见本文的[[XEP-0045#新建房间|新建房间]]章节.&lt;br /&gt;
&lt;br /&gt;
====房间记录====&lt;br /&gt;
&lt;br /&gt;
如果用户进入一个房间，该房间的讨论是被记录到一个公开的存档里面(经常可以通过HTTP访问的), 服务应该 SHOULD 允许该用户加入该房间但是必须 MUST 同时警告该用户讨论已被记录. 方法是应该 SHOULD 在房间发送给该新房客的初始出席信息中包含一个状态码 &amp;quot;170&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 32. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='170'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====讨论历史====&lt;br /&gt;
&lt;br /&gt;
如上发送完初始出席信息之后, 一个房间可以 MAY 发送讨论历史给这个新房客. (在完成按照本文[[XEP-0045#出席信息广播|出席信息广播]]章节规定的发送房间出席信息之前，该房间不能 MUST NOT 发送任何讨论历史.) 是否这个历史要被发送, 以及这个历史里面包含多少条消息, 将由聊天服务实现或特定的部署来决定.&lt;br /&gt;
&lt;br /&gt;
'''例子 33. 讨论历史的发送'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2002-10-13T23:58:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2002-10-13T23:58:43Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries 'Tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='hag66@shakespeare.lit/pda'&lt;br /&gt;
     stamp='2002-10-13T23:58:49Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
讨论历史消息必须 MUST 标为[http://xmpp.org/extensions/xep-0203.html Delayed Delivery] [[XEP-0045#附录G:备注|11]]信息，满足'urn:xmpp:delay' 名字空间，以表明它们是被延迟发送的并且标明它们最初发出的时间. (注意: 'urn:xmpp:delay' 名字空间定义在 XEP-0203 里面，取代了旧的定义在 [http://xmpp.org/extensions/xep-0091.html Legacy Delayed Delivery] [[XEP-0045#附录G:备注|12]] 里的 'jabber:x:delay' 名字空间 ; XEP-0091状态更改为已过时之前, 实现应该 SHOULD 包含两种日期时间(datetime)格式.). 在非匿名房间里，'from'属性应该 SHOULD 是原始发送者的全JID, 但不能 MUST NOT 在半匿名房间里(在那里'from'属性应该 SHOULD 设置为房间本身的JID). 服务应该 SHOULD 在进入该房间之后，发送任何即时(&amp;quot;live&amp;quot;)消息之前，发送完所有讨论历史消息.&lt;br /&gt;
&lt;br /&gt;
====管理讨论历史====&lt;br /&gt;
&lt;br /&gt;
用户可能 MAY 希望管理进入房间时(由房间)提供的讨论历史(可能因为用户带宽比较低或正在使用迷你客户端). 他必须 MUST 在加入房间时发出的初始出席信息节里包含一个 &amp;lt;history/&amp;gt; 子元素. 这个元素有四个可用的属性:&lt;br /&gt;
&lt;br /&gt;
'''表8: 历史管理属性'''&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!属性 !!数据类型 !!含义&lt;br /&gt;
|-&lt;br /&gt;
| maxchars   ||int    ||限制历史中的字符总数为&amp;quot;X&amp;quot; (这里的字符数量是全部 XML 节的字符数, 不只是它们的 XML 字符数据). &lt;br /&gt;
|-&lt;br /&gt;
| maxstanzas    ||int    ||限制历史中的消息总数为&amp;quot;X&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| seconds   ||int   ||仅发送最后 &amp;quot;X&amp;quot; 秒收到的消息.&lt;br /&gt;
|-&lt;br /&gt;
| since     ||dateTime     ||仅发送从指定日期时间 datetime 之后收到的消息 (这个datatime必须 MUST 符合[http://xmpp.org/extensions/xep-0082.html XMPP Date and Time Profiles] [[XEP-0045#附录G:备注|13]] 定义的DateTime 规则，).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 发送满足以上条件组合的最小数量的消息, 还要顾及服务级别和房间级别的缺省设置. 服务必须 MUST 只发送完整的消息节(即, 它不能 MUST not 按特定字符数把历史从字面上截断, 但是必须 MUST 发送最大数量的完整节,这使得字符数小于或等于 'maxchars' 属性的值). 如果客户端不希望收到历史, 它必须 MUST 把'maxchars' 属性值设为&amp;quot;0&amp;quot; (zero).&lt;br /&gt;
&lt;br /&gt;
以下例子展示如何使用这个协议.&lt;br /&gt;
&lt;br /&gt;
'''例子 34. 用户请求在历史中限制消息数量'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history maxstanzas='20'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 35. 用户请求最后三分钟的历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history seconds='180'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 36. 用户请求从Unix时代到现在的所有历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history since='1970-01-01T00:00:00Z'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务绝对不应该 SHOULD NOT 返回从Unix时代开始到现在的所有消息, 而应该 SHOULD 基于服务或房间的缺省值返回适当的有限数量的历史给用户.&lt;br /&gt;
&lt;br /&gt;
'''例子 37. 用户请求不发送历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history maxchars='0'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===退出一个房间===&lt;br /&gt;
&lt;br /&gt;
为了退出一个多用户聊天房间, 一个房客发送一个类型为&amp;quot;unavailable&amp;quot;的出席信息节给正在使用这个房间的 &amp;lt;room@service/nick&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
'''例子 38. 房客退出一个房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着从要离开的房客的房间JID发送&amp;quot;unavailable&amp;quot;类型的出席信息节给这个要离开的房客的全JID们以及留在房间的房客们:&lt;br /&gt;
&lt;br /&gt;
'''例子 39. 服务发送和离开的房客有关的出席信息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
由房间反射的类型为&amp;quot;unavailable&amp;quot;的出席信息节必须 MUST 包含扩展的关于角色和岗位的出席信息; 'role'属性值应该 SHOULD 被设为 &amp;quot;none&amp;quot; 以表示这个人不再是一个房客了.&lt;br /&gt;
&lt;br /&gt;
房客可以 MAY 在出席信息节包含一个常规的 &amp;lt;status/&amp;gt; 信息; 这使房客能在必要的情况下提供一个自定的退出消息:&lt;br /&gt;
&lt;br /&gt;
'''例子 40. 自定的退出消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
常规的出席信息节生成规则定义在 [[RFC3921|XMPP IM]] [[XEP-0045#附录G;备注|14]], 所以如果用户发送一个一般的不可用出席信息节, 用户的服务器将广播那个节到 &amp;lt;room@service/nick&amp;gt; ，而该用户之前曾经发送过直接出席信息给这个&amp;lt;room@service/nick&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
有可能一个用户不能正常地通过直接发送不可用信息给一个房间来退出该房间. 如果该用户没有发送不可用出席信息就下线了, 用户的服务器负责代替该用户发送不可用出席信息 (依据 RFC 3921). 如果该用户的服务器下线或该用户的服务器和该用户连接的MUC服务失去连接(例如, 在联邦通信), 这个MUC服务负责监视它收到的错误信息节以确定该用户是否下线. 如果该MUC服务确定该用户已下线, 它必须 must 当成该用户自己发送了不可用信息一样地处理这个用户.&lt;br /&gt;
&lt;br /&gt;
注意: 如果房间不是持久的并且该房客是最后一个退出的, 服务负责销毁这个房间.&lt;br /&gt;
&lt;br /&gt;
===更改昵称===&lt;br /&gt;
&lt;br /&gt;
多用户聊天室的一个常用功能是一个房客能修改自己在房间里的昵称. 在 MUC 里这需要发送一个更新出席信息给房间, 具体来说是在相同的房间里发送出席信息给一个新的房间JID (变更的只是这个房间JID的资源).&lt;br /&gt;
&lt;br /&gt;
'''例子 41. 房客修改昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务接着发送两个出席信息节给每个房客的全JID(包括修改自己昵称的房客本身), 一个是类型为&amp;quot;unavailable&amp;quot;的用于旧的昵称另一个指明新昵称可用了.&lt;br /&gt;
&lt;br /&gt;
这个不可用出席信息必须 MUST 在一个满足'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 子元素里面包含以下扩展的出席信息 :&lt;br /&gt;
&lt;br /&gt;
* 新昵称(在这个例子中, nick='oldhag')&lt;br /&gt;
* 一个状态码 303&lt;br /&gt;
&lt;br /&gt;
这使接受者能从旧昵称关联到新昵称.&lt;br /&gt;
&lt;br /&gt;
'''例子 42. 服务更新昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户尝试修改他或她的房间昵称,但这个昵称已经被其他用户使用了 (或者这个昵称是被这房间的其他用户岗位保留的, 例如, 一个成员或者所有者), 服务必须 MUST 拒绝这次昵称修改并通知该用户这一冲突; 也就是返回一个类型为 &amp;quot;error&amp;quot; 的出席信息节指明 &amp;lt;conflict/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 43. 服务拒绝昵称修改，因为昵称冲突'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 如果现有房客的纯JID &amp;lt;localpart@domain.tld&amp;gt; 和尝试变更昵称的房客的纯JID相同, 那么服务可以 MAY 允许昵称变更. 详见本文的[[XEP-0045#昵称冲突|昵称冲突]]章节.&lt;br /&gt;
&lt;br /&gt;
如果该用户尝试变更自己的昵称但是房间昵称被锁定了(&amp;quot;locked down&amp;quot;), 服务必须 MUST 拒绝这个昵称变更请求并返回一个&amp;quot;error&amp;quot;类型的出席信息节，指明一个 &amp;lt;not-acceptable/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 44. 服务拒绝昵称变更，因为房间昵称被锁定'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户应该 SHOULD 接着发现它的保留昵称，如本文的 [[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]]章节所述.&lt;br /&gt;
&lt;br /&gt;
===更改可用性状态===&lt;br /&gt;
&lt;br /&gt;
在一个多用户聊天系统里例如IRC, 一个常用的修改某人房间昵称的行为也意味着变更某人的可用性(例如, 变更某人的房间昵称为&amp;quot;thirdwitch|away&amp;quot;). 在Jabber里面, 可用性当然是通过出席信息 (中 &amp;lt;show/&amp;gt; 和 &amp;lt;status/&amp;gt; 元素)的变更来通知的, 这能提供重要的上下文给聊天室. 一个房客通过发送更新的出席信息给它自己的&amp;lt;room@service/nick&amp;gt;来改变他在房间内的可用性状态.&lt;br /&gt;
&lt;br /&gt;
'''例子 45. 房客变更可用性状态'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'&amp;gt;&lt;br /&gt;
  &amp;lt;show&amp;gt;xa&amp;lt;/show&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务然后从该房客发送一个出席信息节来修改他或她的出席信息给每个房客的全JID, 包含扩展的出席信息，包括这个房客的角色和全JID(给那些有权知道的人):&lt;br /&gt;
&lt;br /&gt;
'''例子 46. 服务传递修改的出席信息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;show&amp;gt;xa&amp;lt;/show&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===邀请其他用户进入一个房间===&lt;br /&gt;
====直接邀请====&lt;br /&gt;
&lt;br /&gt;
一个办法是发送一个直接的邀请(而不是由房间本身来间接邀请),定义在[http://xmpp.org/extensions/xep-0249.html Direct MUC Invitations] [[XEP-0045#附录G:备注|15]]. 直接发送邀请有助于适应被邀请者那一边的通信阻塞(对方可能拒绝和和不在好友名单中的实体通信).&lt;br /&gt;
&lt;br /&gt;
====间接邀请====&lt;br /&gt;
&lt;br /&gt;
邀请别的用户到一个房间成为房客是很有用的. 为了做到这一点, 一个 MUC 客户端必须 MUST 发送以下格式的 XML 给 &amp;lt;room@service&amp;gt; 本身 (原因(reason)是可选的 OPTIONAL 而消息(message)的类型必须 MUST 是显式或隐式的&amp;quot;normal&amp;quot;类型):&lt;br /&gt;
&lt;br /&gt;
'''例子 47. 房客通过房间发送一个邀请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;room@service&amp;gt; 本身必须 MUST 接着增加一个 'from' 地址到 &amp;lt;invite/&amp;gt; 元素，其值为邀请者的纯JID, 全JID, 或房间JID，并发送邀请给 'to' 地址所指明的被邀请者(为了旧的客户端，服务可以 MAY 包含一个消息主体&amp;quot;message body&amp;quot;解释这个邀请或包含一个原因&amp;quot;reason&amp;quot;(子元素); 另外, 房间应该 SHOULD 增加 password 如果该房间是密码保护的):&lt;br /&gt;
&lt;br /&gt;
'''例子 48. 房间代表邀请者发送邀请给被邀请者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限成员的, 服务可以 MAY 同时把这个被邀请者加入成员列表. (注意: 在仅限成员的房间里邀请的权力应该 SHOULD 由房间管理员限定; 如果一个没有权限的成员修改成员列表试图邀请别的用户, 服务应该 SHOULD 返回一个 &amp;lt;forbidden/&amp;gt; 错误给该房客; 详见本文的[[XEP-0045#修改成员列表|修改成员列表]]章节.)&lt;br /&gt;
&lt;br /&gt;
如果邀请者提供了一个不存在的JID, 房间应该 SHOULD 返回一个 &amp;lt;item-not-found/&amp;gt; 错误给邀请者.&lt;br /&gt;
&lt;br /&gt;
被邀请者可以 MAY 选择正式地拒绝 (反之则忽略) 邀请; 这是发送者希望看到的正式的通知. 为了拒绝这个邀请, 被邀请者必须 MUST 发送以下格式的消息给 &amp;lt;room@service&amp;gt; 本身:&lt;br /&gt;
&lt;br /&gt;
'''例子 49. 被邀请者谢绝邀请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='hecate@shakespeare.lit/broom'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;decline to='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Sorry, I'm too busy right now.&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/decline&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 50. 房间通知邀请者邀请被拒绝了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;decline from='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Sorry, I'm too busy right now.&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/decline&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能(有人)想知道为什么被邀请者不直接发送拒绝消息给访问者. 主要原因是特定的实现可能 MAY 选择让邀请基于房间JIDs而不是纯JIDs (所以, 例如, 一个房客可能从一个房间邀请某人到另一个房间而不需要知道这个人的纯JID). 因而服务必须 MUST 同时处理邀请和拒绝.&lt;br /&gt;
&lt;br /&gt;
===把一对一聊天转为多用户会议===&lt;br /&gt;
&lt;br /&gt;
有时候人们需要把一个一对一的聊天转成一个多用户的会议. 以下例子展示了这个流程.&lt;br /&gt;
&lt;br /&gt;
首先, 两个用户开始一个一对一聊天.&lt;br /&gt;
&lt;br /&gt;
'''例子 51. 一个一对一聊天'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在第一个用户决定加入第三个人到这个讨论, 所以她 (或, 更准确地说, 她的客户端) 做以下事情:&lt;br /&gt;
&lt;br /&gt;
# 新建一个多用户聊天室&lt;br /&gt;
# 可选地发送一对一聊天的历史到房间&lt;br /&gt;
# 发送一个邀请给第二个人和第三个人, 包含一个 &amp;lt;continue/&amp;gt; 元素 (可选地包含一个 'thread' 属性).&lt;br /&gt;
&lt;br /&gt;
注意: 新房间应该 SHOULD 是非匿名的, 可以 MAY 是一个即时房间(定义于本文的[[XEP-0045#新建即时房间|新建即时房间]]章节), 也可以 MAY 有一个从服务接收的唯一房间名(定义于本文的[[XEP-0045#请求唯一的房间名|请求唯一的房间名]]章节.&lt;br /&gt;
&lt;br /&gt;
注意: 如果这个一对一的聊天消息包含了一个 &amp;lt;thread/&amp;gt; 元素, 这个新建房间的人应该 SHOULD 在历史消息中包含这个 ThreadID, 在邀请中把这个 ThreadID 的值赋予 &amp;lt;continue/&amp;gt; 元素的 'thread' 属性, 并把这 ThreadID 包含在任何新的消息中发送到房间. ThreadIDs 的使用是推荐的 RECOMMENDED ，因为它帮助提供一对一聊天和多用户聊天的连续性.&lt;br /&gt;
&lt;br /&gt;
'''例子 52. 继续讨论 I: 用户新建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 53. 继续讨论 II: 所有者发送历史到房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2004-09-29T01:54:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2004-09-29T01:55:21Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 使用 Delayed Delivery 协议使房间创建者能够从他一对一聊天历史指明每个消息的日期时间 datetime (通过 'stamp' 属性), 以及每个消息的原始发送者的 JID (通过'from' 属性). 房间创建者应该 SHOULD 在邀请额外的用户到房间之前发送完整的一对一聊天历史, 并且也应该 SHOULD 把第二个人加入该房间之前和第一个人在一对一聊天界面中出现的任何消息当成历史来发送; 如果这个一对一历史特别的大, 发送的客户端可能希望在数秒内发送这个历史而不是一次性发送所有历史(以to 避免触发频率限制). 服务不应该 SHOULD NOT 在从房间所有者接收的历史消息之前添加它自己的延迟元素&amp;quot;delay elements&amp;quot; (见本文的[[XEP-0045#讨论历史|讨论历史]]章节) .&lt;br /&gt;
&lt;br /&gt;
'''例子 54. 继续讨论 III: 所有者发送邀请(们), 包含 Continue 标志'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 当邀请者的客户端一知道和它一对一聊天的那个人的全JID之后, 它就应该 SHOULD 在邀请中包含这个全JID (而不是纯JID).&lt;br /&gt;
&lt;br /&gt;
邀请被递送到被邀请者:&lt;br /&gt;
&lt;br /&gt;
'''例子 55. 邀请被递送'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
    to='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当客户端被 &amp;lt;wiccarocks@shakespeare.lit/laptop&amp;gt; 用来接收邀请, 它应该 SHOULD 自动加入或提示用户是否加入 (取决于用户的选项配置) 并且随后无缝地把现有的一对一聊天窗口转到一个多用户会议的窗口:&lt;br /&gt;
&lt;br /&gt;
'''例子 56. 被邀请者接受邀请, 加入房间, 并接收出席信息和历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/secondwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2004-09-29T01:54:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2004-09-29T01:55:21Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 事实上,这些消息从 &amp;lt;room@service&amp;gt; 本身而不是 &amp;lt;room@service/nick&amp;gt; 发出，告诉这些接收的客户端这些消息是优先的聊天历史, 因为任何来自房客的消息的 'from' 地址应该等于发送者的房间JID.&lt;br /&gt;
&lt;br /&gt;
===房客修改房间标题===&lt;br /&gt;
&lt;br /&gt;
如果房间配置允许, 一个房客可以 MAY 被允许修改一个房间的主题. 详见本文的[[XEP-0045#修改房间主题|修改房间主题]]章节.&lt;br /&gt;
&lt;br /&gt;
===发送私有消息===&lt;br /&gt;
&lt;br /&gt;
因为每个房客有一个唯一的房间JID, 一个房客可以 MAY 发送一个私有消息 &amp;quot;private message&amp;quot; 给选定的房客，即通过服务发送一个消息给那房客的房间JID. 这个消息类型应该 SHOULD 是 &amp;quot;chat&amp;quot; 并且不能 MUST NOT 是 &amp;quot;groupchat&amp;quot;, 但是可以 MAY 不表明 (即, 一个常规&amp;quot;normal&amp;quot;消息). 这个权力应该 SHOULD 被任何房客允许 (甚至在一个被主持的房间里的游客).&lt;br /&gt;
&lt;br /&gt;
'''例子 57. 房客发送私有消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务负责把'from'地址改为发送者的房间JID并递送这个消息到预期的接收者的全JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 58. 接收者接收私有消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者尝试发送一个类型为 &amp;quot;groupchat&amp;quot; 的私有消息给特定的房客, 服务必须 MUST 拒绝递送这个消息 (因为接收者的客户端期望的房间内的消息类型为&amp;quot;groupchat&amp;quot;) 并且返回一个 &amp;lt;bad-request/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 59. 房客尝试发送类型为&amp;quot;Groupchat&amp;quot;的私有消息给特定的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者尝试发送一个私有消息给一个不存在的房间JID, 服务必须 MUST 返回一个 &amp;lt;item-not-found/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
如果发送者不是预期的接收者正在访问的那个房间的房客, 服务必须 MUST 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
===发送消息给所有房客===&lt;br /&gt;
&lt;br /&gt;
房客发送一个消息给所有房间内的房客的方法，是发送一个类型为 &amp;quot;groupchat&amp;quot; 的消息到 &amp;lt;room@service&amp;gt; 本身 (服务可以 MAY 忽略或拒绝类型不是 &amp;quot;groupchat&amp;quot; 的消息). 在一个被主持的房间, 这个权力限于角色为与会者或更高的房客拥有.&lt;br /&gt;
&lt;br /&gt;
'''例子 60. 房客发送一个消息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者在这个房间有发言权 (在被主持的房间里缺省是这样期望), 服务必须 MUST 修改发送者的 'from' 属性成为房间JID并反射这个消息到每个房客的全JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 61. 服务反射消息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者是个游客 即, 在一个被主持的房间里没有发言权), 服务可以 MAY 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者并且不能 MUST NOT 反射这个消息给所有房客. 如果发送者不是该房间的房客, 服务应该 SHOULD 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给发送者并且不应该 SHOULD NOT 反射这个消息给所有房客; 这个规则的唯一的例外是，一个实现可以 MAY 允许用户们拥有特定的权限 (例如, 一个房间拥有者, 房间管理员, 或服务级别的管理员) 发送消息到这个房间，即使那些用户不是房客.&lt;br /&gt;
&lt;br /&gt;
===注册到房间===&lt;br /&gt;
&lt;br /&gt;
一个实现可以 MAY 允许一个无岗位的用户(在一个被主持的房间里, 通常是一个与会者) 注册一个房间从而成为该房间的一个成员 (反之, 一个实现也可以 MAY 限制这个权力并且只允许房间管理员添加新的成员). 特别是, 不在成员列表的人是无法加入一个仅限会员的房间的, 所以为了加入这样一个房间，实体需要申请会籍.&lt;br /&gt;
&lt;br /&gt;
如果允许, 这个功能应该 SHOULD 这样被实现。让用户使用 'jabber:iq:register' 名字空间[[XEP-0077|带内注册]] [[XEP-0045#附录G:备注|16]]提出注册申请给房间,:&lt;br /&gt;
&lt;br /&gt;
'''例子 62. 用户提出注册申请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='reg1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果用户提出的注册申请不被允许注册该房间 (例如, 因为那个权限被限制了), 该房间必须 MUST 返回一个 &amp;lt;not-allowed/&amp;gt; 错误给该用户. 如果该用户已经注册过了, 房间必须 MUST 返回一个类型为&amp;quot;result&amp;quot;的IQ节并包含一个空的&amp;lt;register/&amp;gt;元素(定义于'''XEP-0077'''). 如果该房间不存在, 服务必须 MUST 返回一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
否则, 房间必须 MUST 接着返回一个数据表单&amp;quot;Data Form&amp;quot;给该用户 (定义于[[XEP-0004|数据表单]] [[XEP-0045#附录G:备注|17]]). 注册需要的信息可以 MAY 根据实现和部署的不同而不同并且没有完全定义在本文中 (例如, 本文根据 'http://jabber.org/protocol/muc#register' 名字空间采用的注册字段  FORM_TYPE 可能将来会根据[[XEP-0045#字段标准化|字段标准化]]章节里描述的得到补充，). 以下是一个典型的例子:&lt;br /&gt;
&lt;br /&gt;
'''例子 63. 服务返回注册表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To register on the web, visit http://shakespeare.lit/&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Dark Cave Registration&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
        Please provide the following information&lt;br /&gt;
        to register with this room.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Given Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_first'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Family Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_last'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Desired Nickname'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_roomnick'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Your URL'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_url'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Email Address'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_email'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='FAQ Entry'&lt;br /&gt;
          type='text-multi'&lt;br /&gt;
          var='muc#register_faqentry'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户应该 SHOULD 接着提交这个表单:&lt;br /&gt;
&lt;br /&gt;
'''例子 64. 用户提交注册表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_first'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Brunhilde&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_last'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Entwhistle-Throckmorton&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_roomnick'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_url'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://witchesonline/~hag66/&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_email'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hag66@witchesonline&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_faqentry'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Just another witch.&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果期望的房间昵称已经被那个房间保留, 房间必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 65. 房间返回冲突错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该房间或服务不支持注册, 它必须 MUST 返回一个 &amp;lt;service-unavailable/&amp;gt; 错误给用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 66. 房间返回服务不可用错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果用户没有提交合法的数据表格, 房间必须 MUST 返回一个 &amp;lt;bad-request/&amp;gt; 错误给用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 67. 房间返回&amp;quot;服务错误的请求&amp;quot;错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
否则, 该房间必须 MUST 通知用户注册请求被成功地接收到了:&lt;br /&gt;
&lt;br /&gt;
'''例子 68. 房间通知用户注册请求已经被处理了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户提交表单之后, 服务可以 MAY 向一个房间 管理员/所有者 请求批准该申请 (参见本文的[[XEP-0045#批准注册申请|批准注册申请]]章节) 或也可以 MAY 立刻把该用户的岗位从&amp;quot;none&amp;quot;变更为&amp;quot;member&amp;quot;来添加此用户到成员列表. 如果服务变更了该用户的岗位并且该用户在房间里, 它必须 MUST 从这个用户发送更新的出席信息给所有房客, 声明岗位的变更，这个更新的出席信息应包含一个满足 'http://jabber.org/protocol/muc#user' 名字空间 &amp;lt;x/&amp;gt; 元素并包含一个'affiliation' 属性值设为&amp;quot;member&amp;quot;的 &amp;lt;item/&amp;gt; 子元素.&lt;br /&gt;
&lt;br /&gt;
'''例子 69. 服务发送成员变更通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个用户已经注册到一个房间, 该房间可以 MAY 选择限制这个用户在那个房间仅能使用已注册的昵称. 如果它这样做, 当用户尝试以不同于该用户之前已注册的房间昵称来加入该房间 (这使房间锁定&amp;quot;lock down&amp;quot;房间昵称以保证房客身份的一致性)的时候，它应该 SHOULD 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给该用户.&lt;br /&gt;
&lt;br /&gt;
===获取成员列表===&lt;br /&gt;
&lt;br /&gt;
根据房间配置如果允许的话, 一个房客可以 MAY 被允许接收房间成员的列表. 详见本文的[[XEP-0045#修改成员列表|修改成员列表]]章节.&lt;br /&gt;
&lt;br /&gt;
===发现保留的房间昵称===&lt;br /&gt;
&lt;br /&gt;
一个用户可以 MAY 有一个保留的房间昵称, 例如通过显式的房间注册, 数据库集成, 或昵称锁定 &amp;quot;lockdown&amp;quot;. 用户应该 SHOULD 在尝试进入该房间之前发现自己的保留昵称. 这可以通过发送一个发现服务信息请求并指定一个服务发现节点&amp;quot;x-roomuser-item&amp;quot;给房间JID来做到.&lt;br /&gt;
&lt;br /&gt;
'''例子 70. 用户请求保留的昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='getnick1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='x-roomuser-item'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
对一个多用户聊天服务来说，对上述的服务发现节点的支持是可选的 OPTIONAL . 如果房间或服务不支持上述的服务发现节点, 它必须 MUST 返回一个 &amp;lt;feature-not-implemented/&amp;gt; 错误给用户. 如果它支持这个特性并且该用户有一个已注册的昵称, 它必须 MUST 返回这个昵称给这个用户，方法是发送一个服务发现的&amp;lt;identity/&amp;gt;元素，其'name'属性值为这个昵称 (此处 category/type 应该 SHOULD 是 &amp;quot;conference/text&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
'''例子 71. 房间返回昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='getnick1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='x-roomuser-item'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='thirdwitch'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户没有已注册的昵称, 房间必须 MUST 返回一个空的服务发现 &amp;lt;query/&amp;gt; 元素 (根据 '''XEP-0030''').&lt;br /&gt;
&lt;br /&gt;
即使一个用户已经注册了一个房间昵称, 服务应该 SHOULD 允许该用户在加入该房间时指定一个不同的昵称 (例如, 为了从不同的客户端资源加入), 尽管该服务可以 MAY 选择通过一个 &amp;lt;not-acceptable/&amp;gt; 错误来锁定 &amp;quot;lock down&amp;quot; 昵称并拒绝该用户 . 如果该用户的客户端在加入该房间之后发送上述请求，服务不能 MUST NOT 返回一个错误给该用户, 而应该 SHOULD 返回上文所述.&lt;br /&gt;
&lt;br /&gt;
如果另一个用户尝试以第一个用户保留的房间昵称来加入房间, 服务必须 MUST 拒绝第二个用户并返回一个前文所述的 &amp;lt;conflict/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
===申请发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里游客是不能发言的 (即, 发送一个消息给所有房客). 为了申请发言权, 一个游客应该 SHOULD 发送包含一个数据表格的 &amp;lt;message/&amp;gt; 节给房间本身, 这个数据表格仅仅是一个 'muc#role' 字段，值为 &amp;quot;participant&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 72. 房客申请发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='hag66@shakespeare.lit/pda'&lt;br /&gt;
         to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Requested role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务接着应该 SHOULD 转发这个请求给房间主持人(们) ，定义于本文的[[XEP-0045#批准发言权申请|批准发言权申请]].&lt;br /&gt;
&lt;br /&gt;
==主持人用例==&lt;br /&gt;
&lt;br /&gt;
一个主持人有权在房间里执行特定的动作 (例如, 变更某些房客的角色) 但无权变更岗位的持久信息 (它只能被管理员或所有者) 或定义关于这个房间的信息. 具体哪些动作可由主持人执行，取决于配置. 无论如何, 对于 MUC 框架来说, 主持人被规定有权执行以下动作:&lt;br /&gt;
&lt;br /&gt;
# 在一个半匿名的房间里发现一个房客的全JID(如上文所述缺省会发生)&lt;br /&gt;
# 修改主题&lt;br /&gt;
# 从该房间踢出一个与会者或游客&lt;br /&gt;
# 在一个被主持的房间里授予或撤销发言权&lt;br /&gt;
# 在一个被主持的房间里修改拥有发言权的房客列表&lt;br /&gt;
&lt;br /&gt;
这些特性将通过一个基于 &amp;lt;iq/&amp;gt; 元素的 请求/应答 交换来实现，这个IQ元素包含一个满足 'http://jabber.org/protocol/muc#admin' 名字空间的子元素. 以下例子展示这个协议和实现如何互动达到期望的功能. (以下除非显式地提及, 任何接下来的管理请求必须 MUST 被拒绝,如果该请求的'from'地址 &amp;lt;user@host&amp;gt; 和主持人的纯JID不符的话; 在这种情况下, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误.)&lt;br /&gt;
&lt;br /&gt;
===修改房间主题===&lt;br /&gt;
&lt;br /&gt;
多用户聊天室的一个常用特性是变更房间主题的能力. 缺省地, 一个房间里只有角色为主持人 &amp;quot;moderator&amp;quot; 的用户应该 SHOULD 被允许变更主题 (尽管这应该 SHOULD 是可配置的, 结果是如果需要的话，仅仅与会者或甚至游客都被允许修改主题). 主题变更是通过发送一个类型为 &amp;quot;groupchat&amp;quot; 的消息给 &amp;lt;room@service&amp;gt;来实现的, 在这里 &amp;lt;message/&amp;gt; 必须 MUST 包含一个 &amp;lt;subject/&amp;gt; 元素以指定新的主题，但不应该 SHOULD NOT 包含其他元素 (例如, 不应该有 &amp;lt;body/&amp;gt; 元素或 &amp;lt;thread/&amp;gt; 元素).&lt;br /&gt;
&lt;br /&gt;
'''例子 73. 主持人变更主题'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个 MUC 服务接收到这样一个消息, 它必须 MUST 以发送这个变更主题消息的那个用户的房间JID作为'from'地址来反射这个消息给所有其他房客:&lt;br /&gt;
&lt;br /&gt;
'''例子 74. 服务通知所有房客主题变更'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 当一个新的房客加入房间时，该房间应该 SHOULD 在被发送的讨论历史中包含最后的主题变更.&lt;br /&gt;
&lt;br /&gt;
一个接收到这类信息的 MUC 客户端可以 MAY 选择显示一个房间内的消息, 如下:&lt;br /&gt;
&lt;br /&gt;
'''例子 75. 客户端显式房间主题变更消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
* secondwitch has changed the subject to: Fire Burn and Cauldron Bubble!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一些没有适当权限的人尝试变更房间主题, 服务必须 MUST 返回一个 &amp;quot;error&amp;quot; 类型的消息指明一个 &amp;lt;forbidden/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 76. 服务返回未被授权变更主题的错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
为了移除现有的主题而不是提供一个新主题 (即, 设置主题为空), 客户端应该发送一个空的 &amp;lt;subject/&amp;gt; 元素 (即,  &amp;quot;&amp;lt;subject/&amp;gt;&amp;quot; 或 &amp;quot;&amp;lt;subject&amp;gt;&amp;lt;/subject&amp;gt;&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 77. 主持人设置空的主题'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===踢出房客===&lt;br /&gt;
&lt;br /&gt;
主持人有权从一个房间踢出特定种类的房客 (哪些房客是可被踢的 &amp;quot;kickable&amp;quot; 取决于服务规定, 房间配置, 以及主持人的岗位 -- 见下文). 踢人通常基于房客的房间昵称来执行 (尽管可以 MAY 基于全JID) 并且完全是通过把与会者或游客的角色设为 &amp;quot;none&amp;quot; 来实现的.&lt;br /&gt;
&lt;br /&gt;
'''例子 78. 主持人踢出房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='fluellen@shakespeare.lit/pda'&lt;br /&gt;
    id='kick1'&lt;br /&gt;
    to='harfleur@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='pistol' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Avaunt, you cullion!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 移除被踢的用户，通过发送一个类型为 &amp;quot;unavailable&amp;quot; 的出席信息节给每个被踢的房客, 这个出席信息应在其扩展出席信息中包含状态码 307 , 或(可选地)包含 reason 子元素(如果提供了) 以及踢人的执行者的纯JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 79. 服务移除被踢的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='harfleur@henryv.shakespeare.lit/pistol'&lt;br /&gt;
    to='pistol@shakespeare.lit/harfleur'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='fluellen@shakespeare.lit'/&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Avaunt, you cullion!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='307'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
包含状态码可使客户端能够提交他们自己的通知消息 (例如, 适当的用户位置的信息). 可选的包含原因 reason 元素以及执行者 actor 使得被踢的用户能理解为什么他或她被踢了, 以及被踢的用户可以找谁去理论. [[XEP-0045#附录G:备注|18]]&lt;br /&gt;
&lt;br /&gt;
移除被踢的房客(们)之后, 服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 80. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='harfleur@henryv.shakespeare.lit'&lt;br /&gt;
    id='kick1'&lt;br /&gt;
    to='fluellen@shakespeare.lit/pda'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
通知主持人之后, 服务必须 MUST 接着通知剩余的房客那个被踢的房客已经不在房间里了,即从被踢者的房间昵称(&amp;lt;room@service/nick&amp;gt;)发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给所有剩余的房客 (就像房客自愿退出房间时所做的一样), 包含状态码 status 以及可选的原因 reason 和执行者 actor.&lt;br /&gt;
&lt;br /&gt;
'''例子 81. 服务通知剩余的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='harfleur@henryv.shakespeare.lit/pistol'&lt;br /&gt;
    to='gower@shakespeare.lit/cell'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='307'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个用户不能被比自己岗位低的主持人踢出. 所以, 如果一个身为与会者的主持人尝试踢出一个管理员，或一个身为与会者的主持人或管理员尝试踢出一个所有者, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 82. 服务对于尝试踢出更高岗位的用户返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='kicktest'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='firstwitch' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Be gone!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个主持人尝试踢出他自己, 服务可以 MAY 拒绝这个请求并返回一个 &amp;lt;conflict/&amp;gt; 错误给发送者. (尽管这个踢出自己的行为可能看起来怪异, 它在 IRC 里很常见，用于在房间里为某人的行为道歉.)&lt;br /&gt;
&lt;br /&gt;
===授予游客发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里, 主持人可能希望管理房间内谁有水没有发言权 &amp;quot;voice&amp;quot; (即, 发送消息给所有房客的能力). 发言权的授予是基于游客的房间昵称来的, 服务将从内部把这个房间昵称转成游客的全JID. 主持人通过把游客的角色变更为与会者 &amp;quot;participant&amp;quot;来给一个游客授予权限.&lt;br /&gt;
&lt;br /&gt;
'''例子 83. 主持人授予权限给一个游客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 84. 主持人授予权限给一个游客(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 85. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个人的&amp;lt;room@service/nick&amp;gt;发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'role'属性值为&amp;quot;participant&amp;quot;，指明添加了发言权.&lt;br /&gt;
&lt;br /&gt;
'''例子 86. 服务发送发言权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销与会者发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里, 主持人可能希望撤销一个与会者发言的权力,主持人通过把与会者的角色变更为游客 &amp;quot;visitor&amp;quot;来撤销一个游客的发言权:&lt;br /&gt;
&lt;br /&gt;
'''例子 87. 主持人撤销一个与会者的发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 88. 主持人撤销一个与会者的发言权(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='visitor'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 89. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个人的&amp;lt;room@service/nick&amp;gt;发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'role'属性值为&amp;quot;visitor&amp;quot;，指明移除了发言权.&lt;br /&gt;
&lt;br /&gt;
'''例子 90. 服务通知失去发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个主持人不能 MUST NOT 从一个岗位等于或高于主持人岗位的用户撤销发言权. 另外, 服务不能 MUST NOT 允许一个管理员或所有者的发言权被任何人撤销. 如果一个主持人尝试撤销这些人的发言权, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 的错误给发送者(通过以下的违规条目):&lt;br /&gt;
&lt;br /&gt;
'''例子 91. 服务对于尝试从管理员，所有者或更高岗位的用户撤销权限返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voicetest'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='secondwitch' role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改发言权列表===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里主持人可能希望管理发言权列表. 为了达到这个目的, 主持人首先查询房间所有角色为'participant'的房客列表来请求发言权列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 92. 主持人请求发言权列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='voice3'&lt;br /&gt;
    to='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回发言权列表给主持人; 每个条目必须 MUST 包含 'nick' 和 'role' 属性并且应该 SHOULD 包含 'affiliation' 和 'jid' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 93. 服务发送发言权列表给主持人'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voice3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='polonius@hamlet/castle'&lt;br /&gt;
          nick='Polo'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='horatio@hamlet/castle'&lt;br /&gt;
          nick='horotoro'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
主持人可以 MAY 接着修改发言权列表. 为了达到这个目的, 主持人必须 MUST 发送变更了的条目 (即, 只有 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'nick' 属性和 'role' 属性 (通常设置值为 &amp;quot;participant&amp;quot; 或 &amp;quot;visitor&amp;quot;) 但是不应该 SHOULD NOT 包含 'jid' 属性并且不能 MUST NOT 包含 'affiliation' 属性 (它用于管理如所有者那样的岗位而不是与会者那样的角色):&lt;br /&gt;
&lt;br /&gt;
'''例子 94. 主持人发送修改的发言权列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='voice4'&lt;br /&gt;
    to='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='Hecate'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='rosencrantz'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy fellow.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='guildenstern'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy fellow.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 95. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着为任何受影响的人发送更新的出席信息给所有房客, 如前文的用例所述，发送适当的扩展出席信息来指明发言权的变更.&lt;br /&gt;
&lt;br /&gt;
大家知道, 不能撤销一个房间所有者或管理员的发言权, 也不能撤销比发出请求的主持人岗位高的用户的发言权. 如果一个房间管理员尝试通过修改发言权列表来撤销这类用户的发言权, 服务必须 MUST 拒绝请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 96. 服务返回错误给试图撤销管理员，所有者或比发送者岗位更高的用户的发言权的发送者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voicetest'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===批准发言权申请===&lt;br /&gt;
&lt;br /&gt;
在本文的[[XEP-0045#申请发言权|申请发言权]]章节提到, 当服务接受到一个来自房客的请求，它应该 SHOULD 转发那个请求给房间的主持人(们). 为了达到这个目的, 服务应该 SHOULD 发送一个 &amp;lt;message/&amp;gt; 节给房间主持人(们), 这里 &amp;lt;message/&amp;gt; 节包含一个数据表格data form来批准或拒绝这个申请, 如下所示.&lt;br /&gt;
&lt;br /&gt;
'''例子 97. 申请批准发言权表格''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='crone1@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Voice request&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To approve this request for voice, select &lt;br /&gt;
      the &amp;amp;quot;Grant voice to this person?&amp;amp;quot;&lt;br /&gt;
      checkbox and click OK. To skip this request, &lt;br /&gt;
      click the cancel button.&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Requested role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#jid'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='User ID'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@shakespeare.lit/pda&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#roomnick'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Room Nickname'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#request_allow'&lt;br /&gt;
           type='boolean'&lt;br /&gt;
           label='Grant voice to this person?'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
为了批准这个申请, 主持人将提交此表格:&lt;br /&gt;
&lt;br /&gt;
'''例子 98. 批准发言权申请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='crone1@shakespeare.lit/pda'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#jid'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@shakespeare.lit/pda&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#roomnick'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#request_allow'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果主持人批准了这个发言权申请, 服务将授予发言权给该房客并发送一个出席信息更新，如本文[[XEP-0045#授予游客发言权|授予游客发言权]]章节所述.&lt;br /&gt;
&lt;br /&gt;
==管理员用例==&lt;br /&gt;
&lt;br /&gt;
一个房间管理员有权修改用户岗位的持久信息 (例如, 通过禁止用户) 并授予和撤销主持人权限, 但是无权修改房间的定义, 那是唯一属于房间所有者(们)的权力. 具体哪些动作是管理员可以执行的则取决于配置. 无论如何, 在 MUC 框架中的用途, 规定房间管理员最少拥有执行以下操作的权限:&lt;br /&gt;
&lt;br /&gt;
# 在房间里禁止一个用户&lt;br /&gt;
# 在房间里修改黑名单&lt;br /&gt;
# 授予或撤销成员资格&lt;br /&gt;
# 修改成员列表&lt;br /&gt;
# 授予或撤销主持人权力&lt;br /&gt;
# 修改主持人列表&lt;br /&gt;
&lt;br /&gt;
这些特性将由一个 请求/应答 request/response 式的交换来实现，使用 &amp;lt;iq/&amp;gt; 元素，包含满足 'http://jabber.org/protocol/muc#admin' 名字空间的子元素. 以下例子展示协议如何与实现互动以得到期望的功能. (以下除非显示地声明, 如果发送方的'from'地址中的&amp;lt;user@host&amp;gt;和任何房间管理员的纯JID都不同，接下来的任何管理请求必须 MUST 被拒绝; 这种情况下, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误.)&lt;br /&gt;
&lt;br /&gt;
===禁止用户===&lt;br /&gt;
&lt;br /&gt;
在房间里一个管理员或所有者可以禁止一个或多个用户. 这动作必须 MUST 基于房客的纯JID来执行. 为了禁止一个用户, 管理员必须 MUST 把该用户的岗位改为&amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 99. 管理员禁止用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 100. 管理员禁止用户(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把那个纯JID添加到黑名单, 应该 SHOULD 把被排斥者的昵称从已注册的昵称列表中移除, 并且必须 MUST 通知管理员或所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 101. 服务通知管理员或所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也移除任何还在房间中的被禁止的用户，通过发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给每个被禁止的房客, 在扩展的出席信息中包含一个状态码 301 , 可选地带上 reason (如果服务提供的话) 以及执行这个禁止动作的用户的纯JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 102. 服务移除被禁止的用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='southampton@henryv.shakespeare.lit/cambridge'&lt;br /&gt;
    to='earlofcambridge@shakespeare.lit/stabber'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='kinghenryv@shakespeare.lit'/&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='301'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
包含状态码可使客户端能够提交他们自己的通知消息 (例如, 适当的用户位置的信息). 可选的包含原因 reason 元素以及执行者 actor 使得被踢的用户能理解为什么他或她被踢了, 以及被踢的用户可以找谁去理论.&lt;br /&gt;
&lt;br /&gt;
通知主持人之后, 服务必须 MUST 接着通知剩余的房客那个被禁止的房客已经不在房间里了,即从被禁止用户发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给所有剩余的房客 (就像房客自愿退出房间时所做的一样), 包含状态码 status 以及可选的原因 reason 和执行者 actor. &lt;br /&gt;
&lt;br /&gt;
'''例子 103. 服务通知剩余的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    type='unavailable'&lt;br /&gt;
    from='southampton@henryv.shakespeare.lit/cambridge'&lt;br /&gt;
    to='exeter@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit/stabber'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='301'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
就像[[XEP-0045#踢出房客|踢出房客]]一样, 一个用户不能被自己岗位低的管理员禁止. 所以, 如果一个管理员尝试禁止一个所有者， 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者: &lt;br /&gt;
&lt;br /&gt;
'''例子 104. 服务对尝试禁止更高岗位用户返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个管理员或所有者尝试禁止他自己, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;conflict/&amp;gt; 错误给发送者. (注意:这和踢出自己时推荐的服务行为不同, 踢自己的行为服务是允许的.)&lt;br /&gt;
&lt;br /&gt;
===修改黑名单===&lt;br /&gt;
&lt;br /&gt;
房间管理员可能希望修改黑名单. 注意: 黑名单总是基于用户的纯JID. 要修改黑名单, 管理员首先向房间查询所有岗位为'outcast'的用户以得到黑名单.&lt;br /&gt;
&lt;br /&gt;
'''例子 105. 管理员请求黑名单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban2'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回黑名单给管理员; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性但不应该 SHOULD NOT 包含 'nick' 和 'role' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 106. 服务发送黑名单给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban2'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改黑名单. 为此, 管理员必须 MUST 发送变更的条目 (即, 仅是 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'affiliation' 属性 (通常设为&amp;quot;outcast&amp;quot;来禁止或&amp;quot;none&amp;quot;来取消禁止) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用来管理角色，例如与会者，而不是被排斥者岗位); 另外, reason 和 actor 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 107. 管理员发送修改的黑名单给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban3'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&amp;gt;&lt;br /&gt;
          jid='lordscroop@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='sirthomasgrey@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更新黑名单之后, 服务必须 MUST 通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 108. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban3'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着移除受影响的房客 (如果他们在房间里) 并从他们发送更新的出席信息 (包含适当的状态码) 给所有剩余的房客，如 &amp;quot;禁止用户&amp;quot; 用例所述. (服务应该 SHOULD 也移除从保留房间昵称列表中移除每个被禁止的用户的保留昵称, 如果必要.)&lt;br /&gt;
&lt;br /&gt;
当一个实体被一个房间禁止, 实现应该 SHOULD 按以下顺序匹配 JIDs (这些匹配规则和'''RFC 3921'''中定义的隐私列表的匹配规则是相同的):&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;user@domain/resource&amp;gt; (仅匹配特定的资源)&lt;br /&gt;
# &amp;lt;user@domain&amp;gt; (匹配任何资源)&lt;br /&gt;
# &amp;lt;domain/resource&amp;gt; (仅匹配特定资源)&lt;br /&gt;
# &amp;lt;domain&amp;gt; (匹配域名本身, 就像任何 user@domain 或 domain/resource 一样)&lt;br /&gt;
&lt;br /&gt;
一些管理员可能希望在一个 MUC 服务中的所有房间里禁止所有和特定域名相关的用户. 这个功能是一个服务级的特性，所以超过了本文的范围, 它定义在 '''XEP-0133'''里.&lt;br /&gt;
&lt;br /&gt;
===授予成员资格===&lt;br /&gt;
&lt;br /&gt;
管理员可以授予成员资格给一个用户; 方法是把用户的岗位改为 &amp;quot;member&amp;quot; (通常如果用户在房间里，基于昵称，如果用户不在房间里，则基于纯JID; 在这两种情况下如果提供了昵称, 那么这个昵称就是用户在这个房间的缺省昵称，如果实现支持那个功能的话):&lt;br /&gt;
&lt;br /&gt;
'''例子 109. 管理员授予成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 110. 管理员授予成员资格(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把这个用户添加到成员列表，然后通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 111. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;member&amp;quot;，指明授予了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 112. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间里, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 在这个消息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;member&amp;quot;，指明授予了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 113. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销成员资格===&lt;br /&gt;
&lt;br /&gt;
一个管理员可能想撤销一个用户的成员资格; 通过把该用户的岗位改为&amp;quot;none&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 114. 管理员撤销成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 115. 管理员撤销成员资格(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 从成员列表中移除该用户然后通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 116. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个用户的名义发送更新的出席信息节给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;none&amp;quot;，指明失去了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 117. 服务通知失去成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限会员的, 服务必须 MUST 从房间移除这个用户, 包含一个状态码 321 来指明用户被移除是因为岗位变更, 并通知所有剩余的房客:&lt;br /&gt;
&lt;br /&gt;
'''例子 118. 服务移除非会员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='321'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='321'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改成员列表===&lt;br /&gt;
&lt;br /&gt;
在一个仅限会员的房间的上下文里, 成员列表本质上是一个允许人们加入房间的白名单 &amp;quot;whitelist&amp;quot;. 任何不是成员的人等于是被禁止加入该房间, 即使他们的岗位不是&amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
在一个开放房间的上下文里, 成员列表只是一个注册了这个房间的用户 (纯JID和保留的昵称) 的列表. 这些用户可以出现在一个房间名册里, 有他们自己的保留房间昵称, 在搜索结果或类似FAQ里被返回给(查询者).&lt;br /&gt;
&lt;br /&gt;
推荐 RECOMMENDED 在仅限会员的房间里只让房间管理员拥有修改成员列表的权力. 为此, 管理员首先请求成员列表，通过查询房间里所有岗位为&amp;quot;member&amp;quot;的用户来实现:&lt;br /&gt;
&lt;br /&gt;
'''例子 119. 管理员请求成员列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 在一个仅限会员的房间里，服务也应该 SHOULD 返回成员列表给任何房客; 即, 当一个房间的成员请求房间列表时，它不应该 SHOULD NOT 生成一个 &amp;lt;forbidden/&amp;gt; 错误. 这个功能可帮助客户端展示所有现有的成员，即使他们中的一些人不在房间里, 例如. 帮助成员确定是否另一个用户应该被邀请. 服务也应该 SHOULD 允许任何成员接收成员列表，即使还不是一个房客（译注：即未进入房间）.&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回全部的成员列表给管理员，遵循 'http://jabber.org/protocol/muc#admin' 名字空间; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，每个正在房间里的成员可以 MAY 包含 'nick' 和 'role' 属性.&lt;br /&gt;
&lt;br /&gt;
'''例子 120. 服务发送成员列表给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member3'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改成员列表. 为此, 管理员必须 MUST 发送变更的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'affiliation' 属性(通常值设为 &amp;quot;member&amp;quot; 或 &amp;quot;none&amp;quot;) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，并且不能 MUST NOT 包含 'role' 属性(它是用来管理角色的，例如与会者，而不是成员的岗位):&lt;br /&gt;
&lt;br /&gt;
'''例子 121. 管理员发送修改的成员列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 修改成员列表然后通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 122. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 变更任何受影响的用户的岗位. 如果该用户已经从成员列表中移除了, 服务必须 MUST 把该用户的岗位从 &amp;quot;member&amp;quot; 变更为 &amp;quot;none&amp;quot;. 如果该用户已经被加入到成员列表, 服务必须 MUST 把该用户的岗位改成 &amp;quot;member&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
如果一个被移除的成员正在一个仅限会员的房间, 服务应该 SHOULD 踢出这个房客，如前文所述，通过把被移除的成员的角色改成 &amp;quot;none&amp;quot; 并发送适当的出席信息给这个被移除的成员来实现. 无论是否被移除的那个用户在或不在一个仅限会员的房间里, 服务必须 MUST 随后拒绝这个用户的进入.&lt;br /&gt;
&lt;br /&gt;
对所有的房间类型来说, 服务必须 MUST 以这个用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'affiliation'属性值设为&amp;quot;none&amp;quot;,以指明这个岗位的变更.&lt;br /&gt;
&lt;br /&gt;
'''例子 123. 服务发送失去成员资格的通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 服务必须 SHOULD 发送一个邀请给任何已加入到仅限会员的房间里的成员名单中的用户，如果该用户目前在该房间还没有岗位, 例如作为一个管理员或所有者(这类用户在定义时不在房间里; 同时要注意这个例子里使用了一个密码password而不是原因reason -- 这两个子元素都是可选的 OPTIONAL):&lt;br /&gt;
&lt;br /&gt;
'''例子 124. 房间发送邀请给新成员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
因为只有管理员们和所有者们应该 SHOULD 被允许修改成员列表, 一个实现可以 MAY 提供一个配置选项，在仅限会员的房间里开放邀请权限给任何成员. 这种情况下, 任何被发送的邀请都应该 SHOULD 自动触发被邀请者加入成员列表. 无论如何, 如果邀请权限被限于管理员们，而普通成员尝试发送邀请, 服务必须 MUST 拒绝这个邀请的的请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 125. 服务在普通成员尝试邀请其他人加入仅限会员的房间时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从开放房间发送的邀请不能 MUST NOT 触发被邀请者加入成员列表.&lt;br /&gt;
&lt;br /&gt;
如果一个用户被加入一个开放房间的成员列表并且该用户在该房间内, 服务必须 MUST 以该用户的名义发送更新的出席信息给所有房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'affiliation'属性值设为&amp;quot;member&amp;quot;,以指明这个岗位的变更.&lt;br /&gt;
&lt;br /&gt;
'''例子 126. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/hecate'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===授予主持人权限===&lt;br /&gt;
&lt;br /&gt;
管理员可能想授予主持人权限给一个与会者或游客; 通过把用户的角色改为 &amp;quot;moderator&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 127. 管理员授予主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 128. 管理员授予主持人权限(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='moderator'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 添加这个用户到主持人列表然后通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 129. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以该用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;moderator&amp;quot;,以指明添加了主持人权限.&lt;br /&gt;
&lt;br /&gt;
'''例子 130. 服务发送主持人权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销主持人权限===&lt;br /&gt;
&lt;br /&gt;
管理员可能想撤销用户的主持人权限. 一个管理员只可以 MAY 撤销岗位为&amp;quot;member&amp;quot; 或 &amp;quot;none&amp;quot; (也就是, 非管理员和所有者)的用户的主持人权限. 权限的撤销是通过把用户的角色改为 &amp;quot;participant&amp;quot;实现的:&lt;br /&gt;
&lt;br /&gt;
'''例子 131. 管理员撤销主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 132. 管理员撤销主持人权限(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 从主持人列表移除这个用户然后通知管理员成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 133. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以该用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user'  名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;participant&amp;quot;,以指明移除了主持人权限. &lt;br /&gt;
&lt;br /&gt;
'''例子 134. 服务通知失去了主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
大家知道, 管理员不 MUST NOT 被允许从岗位为 &amp;quot;owner&amp;quot; 或 &amp;quot;admin&amp;quot;的用户撤销主持人权限. 如果一个管理员尝试撤销这类用户的权限, 服务必须MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 135. 服务在用户尝试撤销管理员或所有者的主持人权限时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='modtest'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='secondwitch' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改主持人列表===&lt;br /&gt;
&lt;br /&gt;
管理员可能希望修改主持人列表. 为此, 管理员首先通过请求房间内所有角色为'moderator'的用户来请求主持人列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 136. 管理员请求主持人列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回主持人列表给管理员; 每个条目必须 MUST 包含 'jid', 'nick', 'role' 属性并应该 SHOULD 包含 'affiliation' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 137. 服务发送主持人列表给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod3'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改主持人列表. 为此, 管理员必须 MUST发送修改的条目(即, 仅&amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'jid' 属性和'role' 属性(通常值设为 &amp;quot;member&amp;quot; 或 &amp;quot;participant&amp;quot;) 但不应该 SHOULD NOT 包含 'nick' 属性并且不能 MUST NOT 包含 'affiliation' 属性(它被用于管理类似管理员这样的岗位而不是主持人这样的角色):&lt;br /&gt;
&lt;br /&gt;
'''例子 138. 管理员发送修改了的主持人列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 修改主持人列表并通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 139. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 随后以所有受影响的用户发送更新的出席信息给所有的房客, 支出主持人权限的变更，通过发送前面用例所述的适当的扩展出席信息.&lt;br /&gt;
&lt;br /&gt;
显然, 房间所有者或房间管理员的主持人权限不能被撤销. 如果一个房间管理员尝试通过修改主持人列表来撤销这类用户的主持人权限, 服务必须 MUST 拒绝请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 140. 服务在用户尝试撤销管理员或所有者的主持人权限时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='modtest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===批准注册申请===&lt;br /&gt;
&lt;br /&gt;
如果一个服务不自动接受注册到房间的请求, 它可以 MAY 为房间管理员提供一个方法来批准或拒绝来自 Jabber 的注册请求(替代方案是, 它可能提供一个 web 接口或一些其他管理工具). 对这个服务来说，最简单的办法就是，当接收到注册请求时发送一个 &amp;lt;message/&amp;gt; 节给房间管理员(们), 这里的&amp;lt;message/&amp;gt; 节包含一个数据表格 Data Form asking 用来询问管理员是否批准用户的注册申请. 推荐 RECOMMENDED 以下数据表格 Data Form，但是实现可以 MAY 使用完全不同的表格, 或or 在下面的表格基础上补充字段.&lt;br /&gt;
&lt;br /&gt;
'''例子 141. 注册申请批准表格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='crone1@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Registration request&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To approve this registration request, select the&lt;br /&gt;
      &amp;amp;quot;Allow this person to register with the room?&amp;amp;quot;&lt;br /&gt;
      checkbox and click OK. To skip this request, click the &lt;br /&gt;
      cancel button.&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_first'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Given Name'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Brunhilde&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_last'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Family Name&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Entwhistle-Throckmorton&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_roomnick'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Desired Nickname&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_url'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;User URL&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;http://witchesonline/~hag66/&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_email'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Email Address&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@witchesonline&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_faqentry'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;FAQ Entry&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Just another witch.&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_allow'&lt;br /&gt;
           type='boolean'&lt;br /&gt;
           label='Allow this person to register with the room?'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果管理员批准了注册申请, 服务将把该用户注册到房间.&lt;br /&gt;
&lt;br /&gt;
更多高级的批准机制(例如, 使用特定命令[http://xmpp.org/extensions/xep-0050.html Ad-Hoc Commands] [[XEP-0045#附录G:备注|19]]来接收注册申请列表,就像 [http://xmpp.org/extensions/xep-0060.html Publish-Subscribe] [[XEP-0045#附录G:备注|20]]里所做的一样) 超出了本文的范围.&lt;br /&gt;
&lt;br /&gt;
==所有者用例==&lt;br /&gt;
&lt;br /&gt;
每个房间必须 MUST 至少有一个所有者, 而所有者(或一个成功者)在一个房间的生命周期里是这个房间长期存在的属性(例如, 所有者在退出一个持久性的房间时不会失去所有权). 本文假定(初始的) 房间所有者是那个新建了该房间的用户并且有一个房间所有者有权修改房间配置选项的定义，例如房间类型. 理想情况下, 房间所有者不仅能指定房间类型(密码保护的, 仅限会员的, 等等) 而且包括如本文的 [XEP-0045#需求|需求]章节所述的房间特定属性. 另外, 如果所有者能指定其他所有者们的JID也是不错的, 但那将取决于具体实现.&lt;br /&gt;
&lt;br /&gt;
为了让配置选项更加广泛提供必要的伸缩性, 房间配置将使用 Data Forms ('''XEP-0004'''), 通过使用由 'http://jabber.org/protocol/muc' 名字空间触发. 也就是, 如果一个实体在它请求加入房间的 join/request 里不包含 MUC 名字空间, 那么服务将立刻新建房间，在新建房间之前不等待通过数据表格进行配置(这保证了和旧的&amp;quot;groupchat 1.0&amp;quot;协议的向后兼容); 无论如何, 如果房间的 join/create 请求包含了 MUC 扩展, 那么服务在新建和解锁该房间之前将通过数据表格请求配置.&lt;br /&gt;
&lt;br /&gt;
注意: 以下展示的配置选项列出了本文的需求章节的所有特性和房间类型; 无论如何, 实际的配置选项和表格布局将取决于实现和具体的布署. 而且, 这些只是例子，不代表这些就是房间可以拥有的所有允许或需要的配置选项. 一个特定的实现或布署可以 MAY 选择提供额外的配置选项(敏感词过滤, 设置房间的缺省语言, 消息记录, 等等), 这就是为什么在这里使用 'jabber:x:data' 协议是很有价值的.&lt;br /&gt;
&lt;br /&gt;
===新建房间===&lt;br /&gt;
====一般注意事项====&lt;br /&gt;
&lt;br /&gt;
新建房间的权限可以 MAY 限制在特定的用户群或可以 MAY 保留给一个服务级别的管理员. 如果访问被拒绝而一个用户试图新建一个房间, 服务必须MUST 返回一个 &amp;lt;not-allowed/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 142. 服务通知用户不能新建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果访问不限制, 服务必须 MUST 允许用户按以下步骤新建房间.&lt;br /&gt;
&lt;br /&gt;
从房间创建的视角来看, 本质上有两种房间:&lt;br /&gt;
&lt;br /&gt;
* 即时房间&amp;quot;Instant rooms&amp;quot; -- 可以立刻访问并基于某些缺省配置自动创建.&lt;br /&gt;
* 保留房间&amp;quot;Reserved rooms&amp;quot; -- 在任何人访问之前由房间配置者手动创建.&lt;br /&gt;
&lt;br /&gt;
新建和配置这些房间的流程如下:&lt;br /&gt;
&lt;br /&gt;
# 用户必须 MUST 发送出席信息到 &amp;lt;room@service/nick&amp;gt; 并声明他或她对MUC协议的支持，通过包含一个扩展的出席信息,并包含在一个空的满足'http://jabber.org/protocol/muc'名字空间的 &amp;lt;x/&amp;gt; 子元素里(注意这里不包含 '#owner' 或 '#user' 后缀).&lt;br /&gt;
# 如果用户被允许新建房间并且房间还不存在, 服务必须 MUST 根据一些缺省配置新建此房间, 指定请求的用户成为初始的房间拥有者, 并增加这个拥有者到该房间但不允许任何别的用户进入该房间(有效地锁定 &amp;quot;locking&amp;quot;该房间). 从房间发送由所有者收到的初始的出席信息节必须 MUST 包含扩展的出席信息以指出该用户的状态为一个所有者并承认房间已经被创建了(通过状态码 201) 并等待配置.&lt;br /&gt;
# 如果初始的房间所有者想新建和配置一个保留房间, 房间所有者必须 MUST 接着请求一个配置，通过发送类型为&amp;quot;get&amp;quot;的IQ节并包含一个空的满足'http://jabber.org/protocol/muc#owner'名字空间的&amp;lt;query/&amp;gt;元素给该房间 ,然后完成第4和第5步. 如果房间所有者喜欢新建一个即时房间, 该房间所有者必须 MUST 发送一个遵循'http://jabber.org/protocol/muc#owner'名字空间的 query 元素并包含一个遵循 'jabber:x:data' 名字空间的空的类型为 &amp;quot;submit&amp;quot; 的 &amp;lt;x/&amp;gt; 元素, 然后跳到第6步.&lt;br /&gt;
# 如果房间所有者请求了一个配置表格, 服务必须 MUST 发送一个包含配置表格并遵循 'jabber:x:data'名字空间的 IQ 给房间拥有者. 如果没有配置选项可用, 房间必须 MUST 返回一个空的 query 元素给房间所有者.&lt;br /&gt;
# 初始的房间所有者应该 SHOULD 为该房间提供一个开始的配置(或接受缺省配置)，通过发送&amp;quot;set&amp;quot;类型并包含完整的配置表格的 IQ . 另外, 房间所有者可以 MAY 取消配置过程. (实现可以 MAY 设置一个初始化配置的超时, 这样如果房间所有者再给定的超时时间内不配置房间, 房间所有者就被假定已经接受了缺省得配置或取消了配置过程.)&lt;br /&gt;
# 一旦服务从初始房间所有者接收了完整的配置表格(或接收到了一个即时房间的请求), 服务必须 MUST 解锁 &amp;quot;unlock&amp;quot; 这个房间 (即, 允许其他用户进入此房间) 并发送&amp;quot;result&amp;quot;类型的 IQ  给房间所有者. 如果服务接收到了取消（指令）, 它必须 MUST 销毁这个房间.&lt;br /&gt;
&lt;br /&gt;
以下例子展示了这个协议流程.&lt;br /&gt;
&lt;br /&gt;
首先, Jabber用户必须 MUST 发送出席信息给房间, 包含空的 &amp;lt;x/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc' 名字空间(当他寻求进入一个房间时也发送和这同样的节).&lt;br /&gt;
&lt;br /&gt;
'''例子 143. Jabber用户新建一个房间并声明对多用户聊天的支持'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该房间不存在, 服务应该 SHOULD 新建这个房间(取决于关于新建房间的本地策略), 指定发出请求的用户的纯JID成为所有者, 添加这个所有者到房间, 并通过发送以下格式的出席信息节承认房间新建成功:&lt;br /&gt;
&lt;br /&gt;
'''例子 144. 服务承认房间新建成功'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='201'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接收到该房间已经创建的通知之后, 房间所有者需要决定是否接受缺省的房间配置(即, 新建一个即时房间 &amp;quot;instant room&amp;quot;) 还是做一些不同于缺省房间设置的配置 (即, 新建一个保留房间&amp;quot;reserved room&amp;quot;). 完成这两个用例的协议流程展示如下.&lt;br /&gt;
&lt;br /&gt;
注意: 如果如上的发送到一个不存在的房间里的出席信息节没有包含一个遵循 'http://jabber.org/protocol/muc'名字空间的 &amp;lt;x/&amp;gt; 元素, 服务应该SHOULD 立刻新建一个缺省的房间(即, 它必须 MUST 假定客户端支持 &amp;quot;groupchat 1.0&amp;quot; 而不是 Multi-User Chat, 所以在等待房间创建者决定是创建即时房间还是保留房间的时候,它不能 MUST NOT 锁定这个房间).&lt;br /&gt;
&lt;br /&gt;
====新建即时房间====&lt;br /&gt;
&lt;br /&gt;
如果初始的房间所有者想接受缺省的房间配置(即, 新建一个即时房间&amp;quot;instant room&amp;quot;), 房间所有者必须 MUST 拒绝初始配置表格,通过发送一个 IQ set 给 &amp;lt;room@service&amp;gt; 本身,包含一个遵循'http://jabber.org/protocol/muc#owner'名字空间的 &amp;lt;query/&amp;gt; 元素, 这里 &amp;lt;query/&amp;gt; 的唯一子元素是一个空的遵循'jabber:x:data'名字空间的 &amp;lt;x/&amp;gt; 元素并且拥有一个 'type'属性值为 &amp;quot;submit&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 145. 所有者请求即时房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着解锁该房间并允许其他实体加入它.&lt;br /&gt;
&lt;br /&gt;
====新建保留房间====&lt;br /&gt;
&lt;br /&gt;
如果初始的房间所有者想新建并配置一个保留房间, 这个房间所有者必须 MUST 请求初始配置表格,通过发送一个 IQ get 给 &amp;lt;room@service&amp;gt; 本身,包含一个空的遵循 'http://jabber.org/protocol/muc#owner' 名字空间的 &amp;lt;query/&amp;gt; 元素 :&lt;br /&gt;
&lt;br /&gt;
'''例子 146. 所有者请求配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间还不存在, 服务必须 MUST 返回一个初始的房间配置表单给该用户. (注意: 以下例子展示一个配置选项的典型例子. 已登记用于房间创建和配置的所有 x:data 字段列表由 XMPP Registrar 维护; 参见本文的 [[XEP-0045#XMPP注册项事项|XMPP注册项事项]] 章节.)&lt;br /&gt;
&lt;br /&gt;
'''例子 147. 服务发送配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Configuration for &amp;quot;darkcave&amp;quot; Room&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
          Your room darkcave@macbeth has been created!&lt;br /&gt;
          The default configuration is as follows:&lt;br /&gt;
            - No logging&lt;br /&gt;
            - No moderation&lt;br /&gt;
            - Up to 20 occupants&lt;br /&gt;
            - No password required&lt;br /&gt;
            - No invitation required&lt;br /&gt;
            - Room is not persistent&lt;br /&gt;
            - Only admins may change the subject&lt;br /&gt;
            - Presence broadcasted for all users&lt;br /&gt;
          To accept the default configuration, click OK. To&lt;br /&gt;
          select a different configuration, please complete&lt;br /&gt;
          this form.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural-Language Room Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomname'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Short Description of Room'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomdesc'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural Language for Room Discussions'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_lang'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Enable Public Logging?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Change Subject?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Invite Others?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Maximum Number of Occupants'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='10'&amp;gt;&amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='20'&amp;gt;&amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='30'&amp;gt;&amp;lt;value&amp;gt;30&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='50'&amp;gt;&amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='100'&amp;gt;&amp;lt;value&amp;gt;100&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='None'&amp;gt;&amp;lt;value&amp;gt;none&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles for which Presence is Broadcast'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_presencebroadcast'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles and Affiliations that May Retrieve Member List'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_getmemberlist'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Publicly Searchable?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Persistent?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Moderated?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Members-Only?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password Required to Enter?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          If a password is required to enter this room,&lt;br /&gt;
          you must specify the password below.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password'&lt;br /&gt;
          type='text-private'&lt;br /&gt;
          var='muc#roomconfig_roomsecret'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Who May Discover Real JIDs?'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderators Only'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Anyone'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;anyone&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional people who have&lt;br /&gt;
          administrative privileges in the room. Please&lt;br /&gt;
          provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Admins'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomadmins'/&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional owners for this&lt;br /&gt;
          room. Please provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Owners'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomowners'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: _whois 配置选项指定该房间是非匿名的(值为 &amp;quot;anyone&amp;quot;), 半匿名的(值为&amp;quot;moderators&amp;quot;), 还是全匿名的(值为&amp;quot;none&amp;quot;, 不显示在这).&lt;br /&gt;
&lt;br /&gt;
如果没有配置选项可用, 服务必须 MUST 返回空的 query 元素给房间所有者:&lt;br /&gt;
&lt;br /&gt;
'''例子 148. 服务通知所有者没有配置可用'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间所有者应该 SHOULD 接着填好表单并提交给服务.&lt;br /&gt;
&lt;br /&gt;
'''例子 149. 所有者提交配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomname'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;A Dark Cave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomdesc'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomsecret'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;cauldronburn&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomadmins'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;wiccarocks@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hecate@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间创建成功, 服务必须 MUST 通知新的房间所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 150. 服务通知新房间所有者成功'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果因为指定的房间配置违反了一个或多个服务策略而导致房间创建失败 (例如, 因为密码保护房间的密码为空), 服务必须 MUST 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
'''例子 151. 服务通知所有者请求的配置选项不被接受'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一方面, 房间所有者可以 MAY 取消配置过程:&lt;br /&gt;
&lt;br /&gt;
'''例子 152. 所有者取消初始的配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='cancel'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间所有者取消了初始的房间配置, 服务应该 SHOULD 销毁房间, 确保发送不可用出席信息给房间所有者 (详见 &amp;quot;销毁房间&amp;quot; 用例).&lt;br /&gt;
&lt;br /&gt;
如果房间所有者在提交表单之前因为任何原因下线了(例如, 失去连接), 服务将接收到一个类型为 &amp;quot;unavailable&amp;quot; 的出席信息节，从所有者到所有者的 &amp;lt;room@service/nick&amp;gt; 或到 &amp;lt;room@service&amp;gt; (或两者). 服务必须 MUST 接着销毁这个房间, 发送一个 &amp;quot;unavailable&amp;quot; 类型的出席信息节，从房间到所有者，包含一个 &amp;lt;destroy/&amp;gt; 元素以及 reason (子元素)(如果提供了) ，参见本文的 [[XEP-0045#销毁房间|销毁房间]]章节.&lt;br /&gt;
&lt;br /&gt;
====申请唯一房间名====&lt;br /&gt;
&lt;br /&gt;
在一些场合 (例如, 当 [[XEP-0045#把一对一聊天转为多用户会议|把一对一聊天转为会议]]), 房间创建者可能想在尝试新建房间之前请求一个唯一的房间名 (例如, 避免可能的房间冲突). 为此, 服务可以 MAY 如本章所述支持这个特性. (如果服务支持这个特性, 它必须 MUST 在对服务发现信息请求应答时返回一个 &amp;quot;http://jabber.org/protocol/muc#unique&amp;quot; 特性.)&lt;br /&gt;
&lt;br /&gt;
房间创建者通过发送一个 IQ-get 给服务本身来请求唯一房间名, 这个IQ节中包含一个空的 &amp;lt;unique/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc#unique' 名字空间:&lt;br /&gt;
&lt;br /&gt;
'''例子 153. 实体请求唯一房间名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='unique1'&lt;br /&gt;
    to='chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;unique xmlns='http://jabber.org/protocol/muc#unique'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果服务支持这个特性, 它应该 SHOULD 以 XML 字符数据的方式返回一个唯一房间名，包含一个 &amp;lt;unique/&amp;gt; 元素 (但不创建该房间):&lt;br /&gt;
&lt;br /&gt;
'''例子 154. 服务返回唯一房间名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='chat.shakespeare.lit'&lt;br /&gt;
    id='unique1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;unique xmlns='http://jabber.org/protocol/muc#unique'&amp;gt;&lt;br /&gt;
    6d9423a55f499b29ad20bf7b2bdea4f4b885ead1&lt;br /&gt;
  &amp;lt;/unique&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 拒绝返回一个唯一房间名给一个没有资格创建房间的实体, 或那些发送请求唯一房间名过多次数的实体, 等等.&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 使用算法保证房间名的创建在服务上下文中是唯一的 (例如, 对发出请求的JID,datetime,和random salt的SHA-1 哈希运算).&lt;br /&gt;
&lt;br /&gt;
房间创建者将接着使用 XML 字符数据 &amp;lt;unique/&amp;gt; 元素作为它请求的房间JID的节点标识符(ID):&lt;br /&gt;
&lt;br /&gt;
'''例子 155. 所有者以唯一名创建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence &lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='6d9423a55f499b29ad20bf7b2bdea4f4b885ead1@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===随后的房间配置===&lt;br /&gt;
&lt;br /&gt;
在指定房间的初始配置之后的任何时间, 房间所有者可能想修改房间配置. 为此, 房间所有者必须 MUST 向房间发出一个新的配置表单请求,通过发送一个 IQ 到 &amp;lt;room@service&amp;gt; ，包含一个空的 &amp;lt;query/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc#owner' 名字空间.&lt;br /&gt;
&lt;br /&gt;
'''例子 156. 所有者请求配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='config1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 157. 服务禁止非所有者的访问配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='configures'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 服务必须 MUST 以当前使用的选项组作为缺省值发送一个配置表单给房间所有者:&lt;br /&gt;
&lt;br /&gt;
'''例子 158. 服务发送配置表单给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='config1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Configuration for &amp;quot;darkcave&amp;quot; Room&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
        Complete this form to make changes to&lt;br /&gt;
        the configuration of your room.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural-Language Room Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomname'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;A Dark Cave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Short Description of Room'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomdesc'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Enable Public Logging?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Change Subject?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Invite Others?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Maximum Number of Occupants'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='10'&amp;gt;&amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='20'&amp;gt;&amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='30'&amp;gt;&amp;lt;value&amp;gt;30&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='50'&amp;gt;&amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='100'&amp;gt;&amp;lt;value&amp;gt;100&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='None'&amp;gt;&amp;lt;value&amp;gt;none&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles for which Presence is Broadcast'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_presencebroadcast'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles and Affiliations that May Retrieve Member List'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_getmemberlist'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Publicly Searchable?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Persistent?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Moderated?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Members Only?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password Required for Entry?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          If a password is required to enter this room,&lt;br /&gt;
          you must specify the password below.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password'&lt;br /&gt;
          type='text-private'&lt;br /&gt;
          var='muc#roomconfig_roomsecret'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;cauldronburn&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Who May Discover Real JIDs?'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderators Only'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Anyone'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;anyone&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional people who have&lt;br /&gt;
          administrative privileges in the room. Please&lt;br /&gt;
          provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Admins'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomadmins'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;wiccarocks@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hecate@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional owners for this&lt;br /&gt;
          room. Please provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Owners'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomowners'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有配置选项可用, 服务必须 MUST 返回一个空的 query 元素给房间所有者，如前面的用例所示.&lt;br /&gt;
&lt;br /&gt;
该房间所有者应该 SHOULD 接着以更新的配置信息提交表单.&lt;br /&gt;
&lt;br /&gt;
另外, 房间所有者可以 MAY 取消这次配置过程:&lt;br /&gt;
&lt;br /&gt;
'''例子 159. 所有者取消随后的配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='config2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='cancel'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间所有者取消随后的配置, 服务必须 MUST 让该房间的配置保持和房间所有者请求这次配置之前一样.&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个房间管理员失去管理权限，而这个管理员正在房间里, 该房间必须 MUST 为那个管理员发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;member&amp;quot; 或 'role' 属性值为 &amp;quot;participant&amp;quot; 或 &amp;quot;visitor&amp;quot; ，以适当地表达岗位级别和房间类型:&lt;br /&gt;
&lt;br /&gt;
'''例子 160. 服务通知失去管理员岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个用户获得管理员权限，而这个用户正在房间里, 房间必须 MUST 为那个用户发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 或 'role' 属性值为 &amp;quot;admin&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
'''例子 161. 服务通知所有用户有人获得管理员岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个房间所有者失去所有者权限，而这个所有者正在房间里, 该房间必须 MUST 为那个所有者发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 或 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 162. 服务通知失去所有者岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有其他所有者，服务不能 MUST NOT 允许一个所有者撤销他或她自己的所有权; 如果一个所有者企图这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给这个所有者. 然而, 如果有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有者权限.&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个用户获得所有者权限，而这个用户正在房间里, 房间必须 MUST 为那个用户发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; 或 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 163. 服务通知所有用户有人获得所有者权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致房间类型变成仅限会员，但还有非成员在房间里, 服务必须 MUST 从房间移除任何非成员，并在发送给那些剩余的房客的 '不可用' 出席信息节里包含状态码 322.&lt;br /&gt;
&lt;br /&gt;
====配置变更通知====&lt;br /&gt;
&lt;br /&gt;
当一个房间的配置变更会对房间的隐私和安全策略产生影响时，该房间必须 MUST 发送通知给所有房客. 这个通知将包括一个 &amp;lt;message/&amp;gt; 节，包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 元素,  &amp;lt;x/&amp;gt; 元素则只有一个 &amp;lt;status/&amp;gt; 子元素，其 'code' 属性为一个适当的值. 这是例子:&lt;br /&gt;
&lt;br /&gt;
'''例子 164. 配置状态码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
         type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;status code='170'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间配置中和隐私相关的策略变更导致生成这些状态码，如下:&lt;br /&gt;
&lt;br /&gt;
* 如果房间日志功能可用了, 状态码 170.&lt;br /&gt;
* 如果房间日志现在禁止了, 状态码 171.&lt;br /&gt;
* 如果房间现在是非匿名的了, 状态码 172.&lt;br /&gt;
* 如果房间现在是半匿名的了, 状态码 173.&lt;br /&gt;
* 如果房间现在是全匿名的了, 状态码 174.&lt;br /&gt;
&lt;br /&gt;
对更多其他配置变更, 房间应该 SHOULD 发送状态码 104 这样感兴趣的房客如果想要的话可以接受到更新的房间配置.&lt;br /&gt;
&lt;br /&gt;
===授予所有者权限===&lt;br /&gt;
&lt;br /&gt;
如果实现允许, 一个所有者可以 MAY 授予所有权给其他用户; 只要把用户的岗位改成&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 165. 所有者授予所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 166. 所有者授予所有权(饱含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把用户添加到所有者列表并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 167. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已授予所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
'''例子 168. 服务发送所有权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/hecate'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已授予所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; . &lt;br /&gt;
&lt;br /&gt;
'''例子 169. 服务发送所有权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销所有者权限===&lt;br /&gt;
&lt;br /&gt;
实现可以 MAY 允许一个所有者撤销其他用户的所有权; 只要把用户的岗位改成非&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 170. 所有者撤销所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt;元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 171. 所有者撤销所有权(包含一个原因)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有其它所有者，服务不能 MUST NOT 允许一个所有者撤销他或她自己的所有权; 如果一个所有者尝试这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该所有者. 然而, 如果有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有权.&lt;br /&gt;
&lt;br /&gt;
如果一个实现不允许所有者撤销另一个用户的所有权, 实现必须 MUST 返回一个 &amp;lt;not-authorized/&amp;gt; 错误给做出这个请求的所有者.&lt;br /&gt;
&lt;br /&gt;
注意: 允许一个所有者移除其它用户的所有权能给房间管理一个折衷的控制模式; 所以这个特性是可选的 OPTIONAL, 并且鼓励实现支持通过一个只有拥有服务范围管理权限的用户使用的接口来移除所有者.&lt;br /&gt;
&lt;br /&gt;
其它情况下, 服务必须 MUST 把用户从所有者列表移除并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 172. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;owner&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值:&lt;br /&gt;
&lt;br /&gt;
'''例子 173. 服务通知失去所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;owner&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
'''例子 174. 服务发送失去所有权通知给所有房客 '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改所有者列表===&lt;br /&gt;
&lt;br /&gt;
如果实现允许, 一个房间所有者可能想修改所有者列表. 为此, 所有者首先请求所有者列表，通过向房间请求所有岗位为 'owner'的用户.&lt;br /&gt;
&lt;br /&gt;
'''例子 175. 所有者请求所有者列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='owner3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 接着返回所有者列表给所有者; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，对任何正是一名房客（也就是正在房间里）的所有者可以 MAY 包含 'nick' 和 'role' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 176. 服务发送所有者列表给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='crone1@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
所有者可以 MAY 接着修改所有者列表. 为此, 所有者必须 MUST 发送修改的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; [[XEP-0045#附录G:备注|21]]每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用于管理参与者之类的角色，而不是所有者之类的岗位):&lt;br /&gt;
&lt;br /&gt;
'''例子 177. 所有者发送修改过的所有者列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='owner4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
只有所有者被允许修改所有者列表. 如果一个非所有者试图察看或修改所有者列表, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 178. 服务对于非所有者试图修改所有者列表返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='ownertest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' &lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有别的所有者，服务不能 MUST NOT 允许一个所有者撤销自己的所有权; 如果一个所有者尝试这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该所有者. 然而, 如果有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有权. &lt;br /&gt;
&lt;br /&gt;
其它情况下, 服务必须 MUST 修改所有者列表并通知所有者成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 179. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也为任何因前述所有者列表修改而导致的岗位变化而发送出席信息通知.&lt;br /&gt;
&lt;br /&gt;
===授予管理员权限===&lt;br /&gt;
&lt;br /&gt;
一个所有者可以授予管理员权限给一个成员或无岗位的用户; 只要把用户的岗位改成&amp;quot;admin&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 180. 所有者授予管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL. &lt;br /&gt;
&lt;br /&gt;
'''例子 181. 所有者授予管理员权限(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把用户添加到管理员列表并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 182. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已授予管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值. &lt;br /&gt;
&lt;br /&gt;
'''例子 183. 服务发送管理员权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已授予管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 184. 服务发送管理员权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销管理员权限===&lt;br /&gt;
&lt;br /&gt;
一个所有者可能想撤销一个用户的管理员权限; 只要把用户的岗位改成非&amp;quot;admin&amp;quot;和非&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 185. 所有者撤销管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt;元素是可选的 OPTIONAL. &lt;br /&gt;
&lt;br /&gt;
'''例子 186. 所有者撤销管理员权限(包含一个原因)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把该用户从管理员列表移除并接着通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 187. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已失去管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非&amp;quot;admin&amp;quot;非&amp;quot;owner&amp;quot;, 并且 'role' 属性值为根据岗位和房间类型确定的适当的值: &lt;br /&gt;
&lt;br /&gt;
'''例子 188. 服务通知失去管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;admin&amp;quot; . &lt;br /&gt;
&lt;br /&gt;
'''例子 189. 服务通知失去管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改管理员列表===&lt;br /&gt;
&lt;br /&gt;
一个房间所有者可能想修改管理员列表. 为此, 所有者首先请求管理员列表，通过向房间请求所有岗位为 'admin'的用户. &lt;br /&gt;
&lt;br /&gt;
'''例子 190. 所有者请求管理员列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/desktopaffiliation&lt;br /&gt;
    id='admin3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 接着返回管理员列表给所有者; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，对任何正是一名房客（也就是正在房间里）的管理员可以 MAY 包含 'nick' 和 'role' 属性: &lt;br /&gt;
&lt;br /&gt;
'''例子 191. 服务发送管理员列表给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          nick='secondwitch'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
所有者可以 MAY 接着修改管理员列表. 为此, 所有者必须 MUST 发送修改的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; [[XEP-0045#附录G:备注|22]] 每个条目必须 MUST 包含 'affiliation'属性(通常值为 &amp;quot;admin&amp;quot; 或 &amp;quot;none&amp;quot;) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用于管理参与者之类的角色，而不是管理员之类的岗位): &lt;br /&gt;
&lt;br /&gt;
'''例子 192. 所有者发送修改的管理员列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='admin4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
只有所有者被允许修改管理员列表. 如果一个非所有者试图察看或修改所有者列表, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者: &lt;br /&gt;
&lt;br /&gt;
'''例子 193. 服务对于非所有者试图修改管理员列表返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admintest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin' &lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 修改管理员列表并通知所有者成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 194. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也为任何因前述管理员列表修改而导致的岗位变化而发送出席信息通知.&lt;br /&gt;
&lt;br /&gt;
===销毁房间===&lt;br /&gt;
&lt;br /&gt;
房间所有者必须 MUST 能够销毁一个房间, 特别是如果这个房间不是持久房间的时候. 流程如下:&lt;br /&gt;
&lt;br /&gt;
# 房间所有者请求销毁房间, 如果必要的话指出一个原因 reason 和一个备用场地.&lt;br /&gt;
# 该房间移除所有房客(包含适当的关于备用场地和被移除的原因的信息) 并销毁房间, 即使它被定义为持久房间.&lt;br /&gt;
&lt;br /&gt;
不像前述的, 本文不指定一个MUC服务实现收到一个销毁房间请求之后将会如何做. 例如, 如果房间定义为持久地, 一个实现可以 MAY 选择锁定房间I，这样它不能被重用, 把加入该房间的请求重定向到替代场地, 或邀请当前的参与者到新的房间; 无论如何, 这些行为是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
为了销毁一个房间, 房间所有者必须 MUST 发送一个 IQ set 指令到要销毁的房间的地址. 这个 &amp;lt;iq/&amp;gt; 节将包含一个遵循 'http://jabber.org/protocol/muc#owner' 名字空间的 &amp;lt;query/&amp;gt; 元素，它将包含一个 &amp;lt;destroy/&amp;gt; 元素. 替代场地的地址可以 MAY 用这个 &amp;lt;destroy/&amp;gt; 元素的 'jid' 属性来提供. 一个密码保护的替代场地可以 MAY 通过 &amp;lt;destroy/&amp;gt; 元素的 &amp;lt;password/&amp;gt; 子元素的 XML 字符数据来提供. 摧毁房间的原因可以 MAY 通过 &amp;lt;destroy/&amp;gt; 元素的 &amp;lt;reason/&amp;gt; 子元素的 XML 字符数据来提供.&lt;br /&gt;
&lt;br /&gt;
以下例子展示了协议发送和接收的元素:&lt;br /&gt;
&lt;br /&gt;
'''例子 195. 所有者提交房间摧毁请求'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='begone'&lt;br /&gt;
    to='heath@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务负责移除所有房客. 它不应该 SHOULD NOT 广播类型为&amp;quot;unavailable&amp;quot;的出席信息节给所有房客, 只需要发送一个&amp;quot;unavailable&amp;quot;类型的出席信息节给每个房客，这样该用户知道他或她已经从房间移除了. 如果所有者的扩展出席信息指定了一个替代场地的 JID 以及房间销毁的原因, 这个出席信息节必须 MUST 包含那些信息.&lt;br /&gt;
&lt;br /&gt;
'''例子 196. 服务移除每个房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 197. 服务通知所有者成功销毁房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='begone'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果在一个销毁请求中接收到的'from'地址的 &amp;lt;user@host&amp;gt; 和一个房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 198. 服务拒绝由非所有者提交的销毁请求'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='destroytest'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==错误和状态码==&lt;br /&gt;
===错误码===&lt;br /&gt;
&lt;br /&gt;
和'http://jabber.org/protocol/muc#user' 名字空间相关的错误码相当简单, 总结于下表之中. 关于传统的错误码到XMPP格式的错误之间的映射的详细信息, 参见 [http://xmpp.org/extensions/xep-0086.html 错误条件映射] [[XEP-0045#附录G:备注|23]]; 实现应该 SHOULD 支持传统和XMPP错误处理两者.&lt;br /&gt;
&lt;br /&gt;
'''表9: http://jabber.org/protocol/muc#user 名字空间的错误码'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!码 !!类型 !!元素 !!上下文 !!目的&lt;br /&gt;
|-&lt;br /&gt;
|401 ||Error ||Presence  ||进入一个房间 ||通知用户需要密码&lt;br /&gt;
|-&lt;br /&gt;
|403 ||Error ||Presence  ||进入一个房间 ||通知用户他或她被房间禁止了&lt;br /&gt;
|-&lt;br /&gt;
|404 ||Error ||Presence  ||进入一个房间 ||通知用户房间不存在&lt;br /&gt;
|-&lt;br /&gt;
|405 ||Error ||Presence  ||进入一个房间 ||通知用户限制创建房间&lt;br /&gt;
|-&lt;br /&gt;
|406 ||Error ||Presence  ||进入一个房间 ||通知用户必须使用保留的房间昵称&lt;br /&gt;
|-&lt;br /&gt;
|407 ||Error ||Presence  ||进入一个房间 ||通知用户他或她不在成员列表中&lt;br /&gt;
|-&lt;br /&gt;
|409 ||Error ||Presence  ||进入一个房间 ||通知用户他或她的房间昵称正在使用或被别的用户注册了&lt;br /&gt;
|-&lt;br /&gt;
|503 ||Error ||Presence  ||进入一个房间 ||通知用户已经达到最大用户数&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
本文不规定和上述错误条件相关的文本字符串(即, XMPP &amp;lt;text/&amp;gt; 元素值).&lt;br /&gt;
&lt;br /&gt;
===状态码===&lt;br /&gt;
&lt;br /&gt;
多用户聊天的使用一个 &amp;lt;status/&amp;gt; 元素(特指, &amp;lt;status/&amp;gt; 元素的的 'code' 属性  ) 来传达关于用户在一个房间里的状态的信息. 随着时间的推移, 状态码的数量已经增加了很多, 而新的状态码继续被作者申请. 所以, 这些状态码现在记录在一个由XMPP登记处维护的注册表里. 细节可参考本文的 [[XEP-0045#状态码注册表|状态码注册表]].&lt;br /&gt;
&lt;br /&gt;
注意: 通常, MUC 状态码倾向于沿用[http://tools.ietf.org/html/rfc2616 RFC 2616] [[XEP-0045#附录G:备注|24]] 和 [http://tools.ietf.org/html/rfc1893 RFC 1893] [[XEP-0045#附录G:备注|25]] (1xx 码表示信息, 2xx 码说明情况良好可继续, 3xx 码指定重定向被踢或被禁止的用户, x3x 码指系统状态, x7x 码指安全或策略事务, 等等) 里面的状态码的 &amp;quot;抽象&amp;quot;含义.&lt;br /&gt;
&lt;br /&gt;
注意: 如果今天来定义 MUC 协议, 它将指定一个更有弹性的, XML-友好的 途径而不是硬编码的状态数字; 然而, 现在修改状态汇报系统带来的痛苦将远大于好处, 这是为什么状态码数字保持使用至今. 本文的未来版本可能定义一个更 类XMPP 的途径来表示状态条件, 保留状态码数字但是给它们补充更多的描述性的子元素,就像 '''RFC 3920 '''里那样.&lt;br /&gt;
&lt;br /&gt;
==国际化事项==&lt;br /&gt;
&lt;br /&gt;
如 '''RFC 3920''' 中所定义的, XMPP 实体 (包括 MUC 房间和 MUC 服务) 应该 SHOULD 遵守任何给定的节提供的 'xml:lang' 属性. 然而, 群聊消息的同声翻译超出了本文的范围.&lt;br /&gt;
&lt;br /&gt;
这里定义的状态和错误码允许一个客户端实现展示一个本地化的界面; 然而, 任何给定语言社区的本地化文本字符串的定义超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
尽管这里的很多数据表单字段的标签显示为英文, MUC 客户端应该 SHOULD 把这些字段展示为本地化的文本而不是英文文本.&lt;br /&gt;
&lt;br /&gt;
==安全事项==&lt;br /&gt;
===用户验证和授权===&lt;br /&gt;
&lt;br /&gt;
本文没有定义或要求比明文密码更安全的房间准入验证或授权方法. 然而, 这些潜在的风险可能使用 '''RFC 3920''' 描述的通过使用 TLS 和 SASL 加密通道来减轻.&lt;br /&gt;
&lt;br /&gt;
===端到端加密===&lt;br /&gt;
&lt;br /&gt;
这里没有定义没有端到端消息或会话加密方法. 用户不应该 SHOULD NOT 相信一个服务能保持通过房间发送的任何文本的安全.&lt;br /&gt;
&lt;br /&gt;
===隐私===&lt;br /&gt;
&lt;br /&gt;
取决于房间配置, 一个房间可以公开地记录房间里发生的所有讨论. 服务必须 MUST 警告用户该房间是公开记录的，通过在该用户的初始出席信息中返回一个状态码 &amp;quot;170&amp;quot; , 并且如果房间讨论被记录 (用户的客户端也应该 SHOULD 在允许用户进入之前查询房间的配置，以&amp;quot;预先发现&amp;quot;房间是否被记录)，该用户的客户端也必须 MUST 警告用户. 如果房间的配置随后修改成允许房间记录(当房间发送状态码 170 时客户端将发现)，客户端也必须 MUST 警告用户 . 注意: 房间内的历史和公开房间记录是不同的, 并且很自然的一个房间不能有效地阻止房客独立维护的自有的房间记录, 它可能被公开; 用户应该 SHOULD 谨慎操作并认识到任何房间讨论可能被有效地公开.&lt;br /&gt;
&lt;br /&gt;
===匿名===&lt;br /&gt;
&lt;br /&gt;
取决于房间配置, 一个房间可以 MAY 暴光每个房客的真实 JID 给其他房客 (如果该房间是非匿名的) 并且将几乎肯定地暴光每个房客的真实 JID 给该房间的所有者和管理员(如果该房间不是全匿名的).服务必须 MUST 警告用户真实 JIDs 在房间被暴光，通过在该用户的初始出席信息中包含状态码 &amp;quot;100&amp;quot; , 并且用户的客户端必须 MUST 警告该用户 (一个用户的客户端应该 SHOULD 也在允许用户进入房间之前查询房间配置以 &amp;quot;预先发现&amp;quot; 是否真实 JIDs 会在房间中暴光). 如果房间配置随后从半匿名或全匿名修改成非匿名(当房间发送状态码 172 时客户端将发现) ，客户端必须 MUST 也警告用户，如果房间的配置随后从全匿名改成半匿名时(当房间发送状态码 173 时客户端将发现)，客户端也应该 SHOULD 警告用户.&lt;br /&gt;
&lt;br /&gt;
===拒绝服务===&lt;br /&gt;
&lt;br /&gt;
公开的 MUC 房间能承受一定数量的攻击, 大部分能减少拒绝服务攻击. 这些攻击包括但不限于:&lt;br /&gt;
&lt;br /&gt;
# 向房间里塞进大量的非法房客从而阻止合法用户加入房间.&lt;br /&gt;
# 发送侮辱性的消息接着在被踢或被禁止之前离开房间; 这些侮辱性的消息包含但不限于，大量消息以阻止参与者正常跟踪会话线索或房间历史, 对参与者的人身攻击 (特别是房间管理员和主持人), 攻击性的文字, 以及垃圾网站链接.&lt;br /&gt;
# 高频率的制造出席信息变更.&lt;br /&gt;
# 使用过长的昵称导致无法看到完整的发言.&lt;br /&gt;
# 辱骂房间管理员或其他房间房客.&lt;br /&gt;
# 在一个服务里注册很多昵称然后禁止这些昵称的使用.&lt;br /&gt;
# 模仿别的房客的昵称(例如, 通过在尾部增加一个空格或看起来相似的字符串), 然后以那个房间昵称发送消息用于欺骗房客.&lt;br /&gt;
&lt;br /&gt;
这些攻击可能被减轻不能完全被阻止，通过灵活地使用管理员操作。例如禁止用户, 有管理员权限的自动的房间机器人出席信息, 智能内容过滤的实现, 检查连接的用户的 IP 地址(在分布式的系统里不一定能实现), 应用发言规则到出席信息以及消息, 使用比Resourceprep profile of stringprep更严格的规则匹配房间昵称, 等等. 然而, 经验表明无法完全阻止这类攻击.&lt;br /&gt;
&lt;br /&gt;
===其它事项===&lt;br /&gt;
&lt;br /&gt;
关于延迟递送符号的列入和流程的更多安全事项参见 '''XEP-0203'''.&lt;br /&gt;
&lt;br /&gt;
==IANA事项==&lt;br /&gt;
&lt;br /&gt;
本文档与[http://www.iana.org/ 互联网编号分配授权机构] [[XEP-0045#附录G:备注|26]]无关。&lt;br /&gt;
&lt;br /&gt;
==XMPP登记事项==&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/registrar/ XMPP登记处] [[XEP-0045#附录G:备注|27]]在它的登记处包含了以下信息.&lt;br /&gt;
&lt;br /&gt;
===协议名字空间===&lt;br /&gt;
&lt;br /&gt;
XMPP登记处在它的协议名字空间注册表里包含了以下 MUC相关的名字空间:&lt;br /&gt;
&lt;br /&gt;
* http://jabber.org/protocol/muc&lt;br /&gt;
* http://jabber.org/protocol/muc#admin&lt;br /&gt;
* http://jabber.org/protocol/muc#owner&lt;br /&gt;
* http://jabber.org/protocol/muc#user&lt;br /&gt;
&lt;br /&gt;
===服务发现种类/类型===&lt;br /&gt;
&lt;br /&gt;
一个多用户聊天服务或房间在服务发现里是用 &amp;quot;conference&amp;quot; 种类categary 和 &amp;quot;text&amp;quot; 类型type 来标识的.&lt;br /&gt;
&lt;br /&gt;
===服务发现特性===&lt;br /&gt;
&lt;br /&gt;
有很多和MUC相关的服务或房间相关的特性可以被&amp;quot;服务发现&amp;quot;来发现. 这里面最基本的是 'http://jabber.org/protocol/muc' 名字空间. 另外, 一个MUC房间应该 SHOULD 提供关于它实现的特定房间特性的信息, 例如密码保护和房间主持.&lt;br /&gt;
&lt;br /&gt;
'''注册提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#register FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#roomconfig FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#roominfo FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_hidden&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Hidden room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_membersonly&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Members-only room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_moderated&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Moderated room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_nonanonymous&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Non-anonymous room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_open&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Open room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_passwordprotected&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Password-protected room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_persistent&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Persistent room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_public&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Public room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_rooms&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;List of MUC rooms (each as a separate item)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_semianonymous&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Semi-anonymous room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_temporary&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Temporary room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_unmoderated&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Unmoderated room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_unsecured&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Unsecured room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===知名服务发现节点===&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'http://jabber.org/protocol/muc#rooms' 允许发现一个用户是哪个房间的房客.&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'x-roomuser-item' 允许一个用户从房间外发现自己的已注册房间昵称.&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'http://jabber.org/protocol/muc#traffic' 允许发现通过一个房间能发送哪些名字空间的通讯(参见本文允许的 [[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
&lt;br /&gt;
===字段标准化===&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/extensions/xep-0068.html 数据表单的字段标准化] [[XEP-0045#附录G:备注|28]] 定义了用于遵循特定名字空间的数据表单的字段标准化的过程. 在 MUC 里面, 使用了四种这类表单: 房间注册 ( &amp;quot;muc#register&amp;quot; FORM_TYPE), 请求发言权和批准请求 (&amp;quot;muc#request&amp;quot;), 房间配置 (&amp;quot;muc#roomconfig&amp;quot;), 以及用于房间信息的服务发现扩展 (&amp;quot;muc#roominfo&amp;quot;). 这些保留的字段定义如下.&lt;br /&gt;
&lt;br /&gt;
====muc#register FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling user registration with a&lt;br /&gt;
    Multi-User Chat (MUC) room or admin approval&lt;br /&gt;
    of user registration requests.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field &lt;br /&gt;
     var='muc#register_allow'&lt;br /&gt;
     type='boolean'&lt;br /&gt;
     label='Allow this person to register with the room?'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_email'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Email Address'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_faqentry'&lt;br /&gt;
      type='text-multi'&lt;br /&gt;
      label='FAQ Entry'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_first'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Given Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_last'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Family Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_roomnick'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Desired Nickname'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_url'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Your URL'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#request FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling voice requests in a &lt;br /&gt;
    Multi-User Chat (MUC) room or admin&lt;br /&gt;
    approval of such requests.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#role'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='Requested role'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#jid'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='User ID'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#roomnick'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='Room Nickname'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#request_allow'&lt;br /&gt;
         type='boolean'&lt;br /&gt;
         label='Whether to grant voice'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#roomconfig FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling creation and configuration of&lt;br /&gt;
    a Multi-User Chat (MUC) room.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_allowinvites'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Occupants to Invite Others'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_changesubject'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Occupants to Change Subject'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_enablelogging'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Enable Public Logging of Room Conversations'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_getmemberlist'&lt;br /&gt;
      type='list-multi'&lt;br /&gt;
      label='Roles and Affiliations that May Retrieve Member List'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_lang'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural Language for Room Discussions'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_pubsub'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='XMPP URI of Associated Publish-Subcribe Node'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_maxusers'&lt;br /&gt;
      type='list-single'&lt;br /&gt;
      label='Maximum Number of Room Occupants'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_membersonly'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether an Make Room Members-Only'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_moderatedroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Make Room Moderated'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_passwordprotectedroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether a Password is Required to Enter'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_persistentroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Make Room Persistent'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_presencebroadcast'&lt;br /&gt;
      type='list-multi'&lt;br /&gt;
      label='Roles for which Presence is Broadcast'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_publicroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Public Searching for Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomadmins'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Full List of Room Admins'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomdesc'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Short Description of Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomname'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural-Language Room Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomowners'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Full List of Room Owners'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomsecret'&lt;br /&gt;
      type='text-private'&lt;br /&gt;
      label='The Room Password'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_whois'&lt;br /&gt;
      type='list-single'&lt;br /&gt;
      label='Affiliations that May Discover Real JIDs of Occupants'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#roominfo FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling the communication of extended service discovery&lt;br /&gt;
    information about a Multi-User Chat (MUC) room.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_contactjid'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Contact Addresses (normally, room owner or owners)'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_description'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Short Description of Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_lang'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural Language for Room Discussions'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_ldapgroup'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='An associated LDAP group that defines room membership; &lt;br /&gt;
             this should be an LDAP Distinguished Name according to an&lt;br /&gt;
             implementation-specific or deployment-specific definition&lt;br /&gt;
             of a group.'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_logs'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='URL for Archived Discussion Logs'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_occupants'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Current Number of Occupants in Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_subject'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Current Subject or Discussion Topic in Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_subjectmod'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='The room subject can be modified by participants'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===状态码登记处===&lt;br /&gt;
====过程====&lt;br /&gt;
&lt;br /&gt;
XMPP注册员为遵循 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;status/&amp;gt; 元素的 'code' 属性维护注册表中的值 .&lt;br /&gt;
&lt;br /&gt;
为了提交新值给这个注册表, 注册人将按以下格式定义一个XML段并把它包含在相关的XMPP扩展协议中，或者发到&amp;lt;registrar@xmpp.org&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;the three-digit code number&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;the stanza type of which it is a child (message or presence)&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;the use case or situation in which the status is used&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;a natural-language description of the meaning&amp;lt;/purpose&amp;gt;&lt;br /&gt;
  &amp;lt;child&amp;gt;the descriptive child element (reserved for future use)&amp;lt;/child&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注册人可一次注册多个状态码，每个状态码包含在独立的&amp;lt;statuscode/&amp;gt;元素中。&lt;br /&gt;
&lt;br /&gt;
====初始提交====&lt;br /&gt;
&lt;br /&gt;
作为本文的一部分, 以下状态码已被注册了:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;100&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message or presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that any occupant is allowed to see the user's full JID&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;101&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message (out of band)&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Affiliation change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that his or her affiliation changed while not in the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;102&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room now shows unavailable members&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;103&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room now does not show unavailable members&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;104&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;&lt;br /&gt;
    Inform occupants that a non-privacy-related room configuration change has occurred&lt;br /&gt;
  &amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;110&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Any room presence&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that presence refers to one of its own room occupants&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;170&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message or initial presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room logging is now enabled&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;171&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room logging is now disabled&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;172&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now non-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;173&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now semi-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;174&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now fully-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;201&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that a new room has been created&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;210&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that service has assigned or modified occupant's roomnick&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;301&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she has been banned from the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;303&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Exiting a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform all occupants of new room nickname&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;307&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she has been kicked from the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;321&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because of an affiliation change&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;322&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because the room has been changed to members-only and the user &lt;br /&gt;
    is not a member&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;332&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because of a system shutdown&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===URI查询类型===&lt;br /&gt;
&lt;br /&gt;
作为由[http://www.xmpp.org/extensions/xep-0147.html XMPP URI Query Components] [[XEP-00450#附录G:备注|29]]授权的机构，XMPP注册员维护着一个用于 XMPP URIs 的查询和键-值对的注册表（见&amp;lt;[http://www.xmpp.org/registrar/querytypes.html http://www.xmpp.org/registrar/querytypes.html]&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
====join====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;join&amp;quot; 查询类型被注册为一个 MUC相关的动作, 伴随一个可选的键 &amp;quot;password&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 199. Join动作: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?join&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
应用必须 MUST 要么展示一个界面允许用户提供一个房间昵称，要么基于配置好的选项或昵称发现来获取这个房间昵称.&lt;br /&gt;
&lt;br /&gt;
'''例子 200. Join动作: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
join 动作可以 MAY 为这房间包含一个密码. 自然的, 对一个包含了房间密码的 URI 的访问必须 MUST 得到适当的控制.&lt;br /&gt;
&lt;br /&gt;
'''例子 201. Join动作包含密码: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?join;password=cauldronburn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 202. Join动作包含密码: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下提交注册 &amp;quot;join&amp;quot; 查询类型.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;querytype&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;join&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;proto&amp;gt;http://jabber.org/protocol/muc&amp;lt;/proto&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;enables joining a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;keys&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;password&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the password required to enter a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
  &amp;lt;/keys&amp;gt;&lt;br /&gt;
&amp;lt;/querytype&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====invite====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;invite&amp;quot; 查询类型被注册为一个 MUC相关的动作, 伴随一个可选的键 &amp;quot;jid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 203. Invite动作: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果加入中的用户还未在房间里, 应用必须 MUST 发送两个节: 第一个加入房间，第二个邀请另一个人. 如果加入中的用户已经在房间里, 应用将只发送邀请节.&lt;br /&gt;
&lt;br /&gt;
'''例子 204. Invite动作: 结果节(s)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
URI 可以包含多个邀请:&lt;br /&gt;
&lt;br /&gt;
'''例子 205. Invite动作包含多个邀请: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit;jid=bard@shakespeare.lit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 206. Invite动作包含多个邀请: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
URI 也可以包含一个密码:&lt;br /&gt;
&lt;br /&gt;
'''例子 207. Invite动作包含密码: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit;password=cauldronburn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果加入中的用户还未在房间里, 应用必须 MUST 发送两个节: 第一个加入房间，第二个邀请另一个人. 如果加入中的用户已经在房间里, 应用将只发送邀请节.&lt;br /&gt;
&lt;br /&gt;
'''例子 208. Invite动作包含密码: 结果节(s)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下提交注册 &amp;quot;invite&amp;quot; 查询类型.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;querytype&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;invite&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;proto&amp;gt;http://jabber.org/protocol/muc&amp;lt;/proto&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;enables simultaneously joining a groupchat room and inviting others&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;keys&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;jid&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the Jabber ID of the invitee&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;password&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the password required to enter a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
  &amp;lt;/keys&amp;gt;&lt;br /&gt;
&amp;lt;/querytype&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==商业规则==&lt;br /&gt;
===Addresses===&lt;br /&gt;
&lt;br /&gt;
为了提供关于从房间JIDs抓获的地址的一致性, Room IDs 必须 MUST 遵循 Stringprep 的 Nodeprep 规范并且 Room Nicknames 必须 MUST 符合 Stringprep (这些都定义在 '''RFC 3920''') 的 Resourceprep 规范. 尽管在 '''RFC 3920''' 中没有显式的说明 , 一个 Room JID 的 Room ID (node) 和 Room Nickname (resource) 部分都必须 MUST 长度不为零. 另外, 一个 MUC 服务不能 MUST NOT 允许空的或不可见的房间昵称 Room Nicknames (即, 房间昵称Room Nicknames 只包含一个或多个空格).&lt;br /&gt;
&lt;br /&gt;
取决于服务实现，是否更多地限制房间昵称 (例如, 通过应用情景例程, stringprep的Nodeprep规范, 或其他限制).&lt;br /&gt;
&lt;br /&gt;
===Message===&lt;br /&gt;
&lt;br /&gt;
# 如果一个房客想发送一个消息给所有其他房客, MUC 客户端必须 MUST 把 'type' 属性值设为 &amp;quot;groupchat&amp;quot;. 服务可以 MAY 忽略不正确的消息类型, 或用 &amp;lt;bad-request/&amp;gt; 错误弹回.&lt;br /&gt;
# 如果一个MUC服务从一个角色为&amp;quot;none&amp;quot;的Jabber用户收到一个发送给该房间的消息或给某个房客的消息, 服务不能 MUST NOT 递送这个消息并应该 SHOULD 返回给这个消息给发送者并伴随一个 &amp;lt;forbidden/&amp;gt; 错误.&lt;br /&gt;
# 如果一个MUC服务 接收到一个发送给不存在的或尚未解锁的房间的消息, 服务应该 SHOULD 返回这个消息给发送者并伴随一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
# 一个MUC服务应该 SHOULD 不做修改地传递扩展的消息 (例如, 一个消息主体的 XHTML 版本) 给房客; 然而, 一个 MUC 服务可以 MAY 不允许消息的特定扩展(参见本文的[[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
# 一个MUC客户端可以 MAY 生成扩展以满足 [http://xmpp.org/extensions/xep-0022.html 消息事件] [[XEP-0045#附录G:备注|30]] 或 [http://xmpp.org/extensions/xep-0085.html 聊天状态通知] [[XEP-0045#附录G:备注|31]] 规范; 然而, 一个 MUC 服务可以 MAY 不允许这些扩展 (参见本文的[[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
&lt;br /&gt;
===Presence===&lt;br /&gt;
&lt;br /&gt;
# 一个房间必须 MUST 安静地忽略从一个角色为&amp;quot;none&amp;quot;的用户发来的不可用出席信息信息.&lt;br /&gt;
# 只有MUC服务自身应该 SHOULD 生成关于角色，岗位，全JIDs或遵循 'http://jabber.org/protocol/muc#user' 名字空间的状态码的扩展的出席信息 (基于服务所知道的关于房客的信息, 例如, 角色, 或由一个主持人或房间管理员的动作所产生的结果). 一个客户端不应该 SHOULD NOT 推定生成这类信息. 如果一个 MUC 服务从一个房客接收到这类扩展的出席信息, 它不能 MUST NOT 反射它给其他房客们. (一个客户端可以 MAY 为了提供一个密码而生成遵循 'http://jabber.org/protocol/muc#user' 名字空间的扩展的出席信息, 但自然的这是不反射给其他房客的.)&lt;br /&gt;
# 一个MUC服务应该 SHOULD 允许所有其他出席信息通过, 尽管它可以 MAY 选择阻塞扩展的出席信息; 参见本文的 [[XEP-0045#允许的通讯|允许的通讯]]章节.&lt;br /&gt;
# 为了适当地通知房客角色和岗位, 并使之更易于Jabber客户端跟踪房间里所有用户的当前状态, MUC服务实现必须 MUST 在所有出席信息节里提供关于角色和岗位的扩展的出席信息, 包括一个用户因为任何原因退出该房间时被发送的类型为&amp;quot;unavailable&amp;quot;的出席信息节.&lt;br /&gt;
# 如果一个权限被撤销, 服务必须 MUST 通知这件事，通过发送一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 元素并包含一个 &amp;lt;item/&amp;gt; 子元素，该&amp;lt;item/&amp;gt; 子元素的 'role' 和/或 'affiliation' 属性值的设定指明是去了有关的权限. 所有将来的为这个房客发出的出席信息节必须 MUST 包含这个更新的角色和岗位, 直到除非它们再次改变.&lt;br /&gt;
# 一个MUC服务必须 MUST 发送扩展的出席信息给一个客户端，即使客户端在进入该房间时没有发送一个空的遵循 'http://jabber.org/protocol/muc' 名字空间的 &amp;lt;x/&amp;gt; 元素 ; 自然的, 一个客户端必须 MUST 忽略这类信息，如果它不懂得它的话(根据 '''RFC 3920''').&lt;br /&gt;
# 在 muc#user 名字空间中被发送的关于角色和岗位的扩展的出席信息必须 MUST 包含全JID (不是纯JID) 作为 'jid' 属性的值.&lt;br /&gt;
# 如果想要，一个客户端可以 MAY 发送一个客户化的退出消息 (就像 IRC 频道里经常出现的那样) ，通过在退出时被发送的&amp;quot;unavailable&amp;quot;类型的出席信息节里包含一个 &amp;lt;status/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
===IQ===&lt;br /&gt;
&lt;br /&gt;
# MUC被设计用于分享消息和出席信息, 而不是 IQs. 一个被发送的到房间本身JID的 IQ 由房间本身来处理并且不反射给所有房客.&lt;br /&gt;
# 如果一个房客想在一个非匿名房间发送一个 IQ 节给其他用户, 发送者应该 SHOULD 直接发送请求给接收者的纯JID或全JID, 而不是试图通过房间发送请求(即, 通过接收者的房间JID).&lt;br /&gt;
# 如果一个房客想在一个半匿名房间发送一个 IQ 节给其他用户, 发送者能直接发送这个节给接受者的房间JID并且服务可以 MAY 转发这个节给接收者的真实JID. 然而, 任何时候一个MUC服务不能 MUST NOT 泄露这个发送者的真实JID给接收者, 也不能泄露接收者的真实JID给发送者.&lt;br /&gt;
# 一个MUC客户端必须 MUST 在IQ set 中的遵循 'http://jabber.org/protocol/muc#admin' &amp;lt;item/&amp;gt; 子元素中只发送 'affiliation' 属性或 'role' 属性; 如果一个主持人, 管理员, 或所有者试图在相同的IQ set中修改相同条目的岗位或角色, 服务必须 MUST 返回一个 &amp;lt;bad-request/&amp;gt; 错误给发送者. 无论如何, 一个MUC服务可以 MAY 基于一个岗位的变更来修改一个角色，从而可以 MAY 发送出席信息更新，同时包含一个修改的角色和一个修改的岗位.&lt;br /&gt;
# 在关于角色的 IQ sets中, 一个MUC客户端必须 MUST 只包含 'nick' 属性; 在关于角色的 IQ results中, 一个 MUC 服务必须 MUST 包含 'nick', 'role', 'affiliation', 和'jid' 属性 (值为后来设置的用户的全JID).&lt;br /&gt;
# 在关于岗位的 IQ sets中, 一个MUC客户端必须 MUST 只包含 'jid' 属性(值为纯JID); 在关于岗位的 IQ results中, 一个MUC服务不能 MUST NOT 包含 'role' 属性, 必须MUST 包含 'affiliation' 属性和 'jid' 属性 (值为纯JID), 并且应该 SHOULD 包含 'nick' 属性 (除非岗位为 &amp;quot;outcast&amp;quot;, 以为被排斥者不应该 SHOULD NOT 有保留的房间昵称).&lt;br /&gt;
&lt;br /&gt;
==实现注意事项==&lt;br /&gt;
&lt;br /&gt;
以下方针有助于客户端和组件开发者建立 MUC 实现.&lt;br /&gt;
&lt;br /&gt;
===服务端===&lt;br /&gt;
&lt;br /&gt;
# 在处理一个被主持的房间里游客发送的消息时, 一个MUC服务可以 MAY 通过一个主持人让每个消息排队等待批准并且可以 MAY 通知发送者消息正在等待批准; 然而, 这一行为是可选的 OPTIONAL, 并且一个消息批准协议的定义 (例如, 使用'''XEP-0004'''定义的数据表单) 超出了本文的范围.&lt;br /&gt;
# 对于一个 MUC 服务来说，在特定事件发生时提供房间内的消息是很常见的, 例如当标题变更时, 当一个房客加入或退出时, 或当一个房间被销毁时. 这类消息完全是可选的 OPTIONAL 并且留给实现或布署来决定, 但如果使用了，则必须 MUST 是从房间JID本身(&amp;lt;room@service&amp;gt;) 而不是从一个特定的房客(&amp;lt;room@service/nick&amp;gt;)发送的类型为 &amp;quot;groupchat&amp;quot; 类型的消息. 无论如何, 通常接收的客户端倾向于基于房间的事件以及MUC提供的特定状态码来生成类似的消息(例如, 用户加入或退出) ; 这将帮助确保这类消息的正确的本地化.&lt;br /&gt;
# 出于礼貌, 一个MUC服务可以 MAY 发送一个房间外的 &amp;lt;message/&amp;gt; 给一个被踢的或被禁止的房客, 并且可以 MAY 广播一个房间内的 &amp;lt;message/&amp;gt; 给所有剩余的房客通知他们该房客已被该房间踢出或禁止. 无论如何, 这类消息是可选的 OPTIONAL, 并且事实上是多余的，因为接收的客户端生成这类消息所必需的信息已经通过MUC服务发送的出席信息节(特别是状态码)得到了.&lt;br /&gt;
# 出于礼貌, 如果一个用户的岗位变更了而该用户不在房间里，一个MUC服务可以MAY发送一个房间外的 &amp;lt;message/&amp;gt; ; 这消息应该 SHOULD 被从房间发送给该用户的纯JID, 可以 MAY 包含一个 &amp;lt;body/&amp;gt; 元素描述岗位变更, 并且必须 MUST 包含一个状态码 101.&lt;br /&gt;
# 没有需求要一个MUC服务将为旧的&amp;quot;groupchat 1.0&amp;quot;用户提供特别的治疗, 例如包含等价于扩展的遵循 'http://jabber.org/protocol/muc#user' 名字空间的出席信息的消息.&lt;br /&gt;
# 房间类型可以 MAY 被配置成任何组合. 一个MUC服务可以 MAY 支持或允许任何想要的房间类型或它们的组合.&lt;br /&gt;
# 一个MUC服务可以 MAY 限制在初始配置完成之后配置选项展示给一个所有者的次数, 例如因为特定的选项除非重启服务无法生效.&lt;br /&gt;
# 一个MUC服务可以 MAY 提供一个接口给房间创建和配置(例如, 以一个特定的Jabber表单或一个网页), 这样表面上房间所有者是一个应用而不是一个自然人用户.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择让一个特定的房间内资源提供接口给管理功能 (例如, 一个 &amp;quot;user&amp;quot; 名的机器人 &amp;quot;ChatBot&amp;quot;), 房客们可以和它直接互动, 从而允许管理员在一个私有消息里键入命令参数 '/command parameter' 给那个机器人 &amp;quot;user&amp;quot;. 显然这种服务要求服务在房间创建时添加一个 'ChatBot' 用户到房间, 并且阻止任何房客在该房间使用房间昵称 'ChatBot' . 这可能在一些实现或布署中比较难以保证. 任何情况下, 任何这类接口是可选的 OPTIONAL.&lt;br /&gt;
# 如果服务接收到它之前发送给该用户的节相关的递送类错误，一个MUC服务应该 SHOULD 移除一个用户; 递送相关的错误即 &amp;lt;gone/&amp;gt;, &amp;lt;item-not-found/&amp;gt;, &amp;lt;recipient-unavailable/&amp;gt;, &amp;lt;redirect/&amp;gt;, &amp;lt;remote-server-not-found/&amp;gt;, 和 &amp;lt;remote-server-timeout/&amp;gt;.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择在反射出席信息变更给一个房间的房客们之前，抛弃附加在&amp;lt;presence/&amp;gt; 节上的扩展的出席信息. 也就是, 一个实现可以 MAY 选择只反射该出席信息节的 &amp;lt;show/&amp;gt;, &amp;lt;status/&amp;gt;, 和 &amp;lt;priority/&amp;gt; 子元素，如 'jabber:client' 名字空间描述的 XML 架构之中, 结果导致那个在扩展的名字空间中的出席信息变更 &amp;quot;changes&amp;quot; (例如, gabber:x:music:info) 不被传递给房客. 如果一个服务禁止特定的扩展名字空间, 它应该 SHOULD 在本文 [[XEP-0045#允许的通讯|允许的通讯]]章节描述的知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 提供一个允许的通讯的描述.&lt;br /&gt;
# 一个MUC服务可以 MAY 在反射消息给一个房间的房客之前选择抛弃附加在 &amp;lt;message/&amp;gt; 节的扩展信息. 一个这类扩展信息的例子是轻量级文本标记，定义于 [http://xmpp.org/extensions/xep-0071.html XHTML-IM]  [XEP-0045#附录G:备注|32]]. 如果一个服务禁止特定的扩展名字空间, 它应该 SHOULD 在本文 [[XEP-0045#允许的通讯|允许的通讯]]章节描述的知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 提供一个允许的通讯的描述.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择锁定 &amp;quot;lock down&amp;quot; 房间昵称 (例如, 硬编码房间昵称给该房客的纯JID). 如果这么干, 该服务必须 MUST 把被锁定的昵称看作一个保留的房间昵称并且必须 MUST 支持本文[[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]]章节定义的协议.&lt;br /&gt;
&lt;br /&gt;
====允许的通讯====&lt;br /&gt;
&lt;br /&gt;
大家知道, 一个服务 (更准确地说, 一个正确配置的房间)可以 MAY 抛弃一些或所有的扩展的附加在从发送者通过房间反射给所有房客的 &amp;lt;message/&amp;gt; 和 &amp;lt;presence/&amp;gt; 节的名字空间. 如果房间这么干, 它应该 SHOULD 允许发送者通过发送 disco#info 查询知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 来发现允许的扩展的列表, 在结果中返回支持的名字空间每个用一个 &amp;lt;feature/&amp;gt; 元素表示. 如果该房间不允许任何扩展的名字空间, 它必须 MUST 如 '''XEP-0030''' 所述返回一个空的 query . 如果该房间不支持 &amp;quot;#traffic&amp;quot; 节点, 它必须 MUST 返回一个 &amp;lt;feature-not-implemented/&amp;gt; 错误应答给查询发送到 'http://jabber.org/protocol/muc#traffic' 节点的查询.&lt;br /&gt;
&lt;br /&gt;
以下例子展示一个只允许 'http://jabber.org/protocol/xhtml-im' 和 'http://jabber.org/protocol/rosterx' 名字空间的房间, 而不包括其他的名字空间.&lt;br /&gt;
&lt;br /&gt;
'''例子 209. 用户查询服务关于允许的名字空间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 210. 服务返回允许的名字空间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/xhtml-im'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/rosterx'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个服务不抛弃任何名字空间或不实现这个特性, 它必须 MUST 返回一个 &amp;lt;service-unavailable/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 211. 服务返回服务不可用错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===客户端===&lt;br /&gt;
&lt;br /&gt;
# Jabber客户端可以 MAY 展示房间角色，通过在一个房间名册里为每个角色显示特定的群. 这将使房客清楚图形化的知道哪个房客是主持人, 参与者, 和游客. 无论如何, 这样一个展示是可选的 OPTIONAL.&lt;br /&gt;
# Jabber客户端可以 MAY 实现多样化的界面以提供快捷方式 &amp;quot;shortcuts&amp;quot; 给功能，例如修改某人昵称, 踢人或禁止用户, 发现一个房客的全JID, 或修改主题. 一个选项包含了类IRC 的命令例如 '/nick', '/kick', '/ban', 和 '/whois'; 另一个是使用户能用鼠标右击房间名册里的项目. 所有这些界面形式是可选的 OPTIONAL. 然而, 为方便起见, 下面提供了一个 IRC 命令到 MUC 协议的映射.&lt;br /&gt;
&lt;br /&gt;
====IRC命令映射====&lt;br /&gt;
&lt;br /&gt;
IRC 客户端使用大量常用的快捷方式 &amp;quot;shortcut&amp;quot; 命令，以一个斜杠开始, 例如 '/nick' and '/ban'. 下表提供一个 类IRC 命令到 MUC 协议的映射, 用于希望支持类似功能的 Jabber 客户端.&lt;br /&gt;
&lt;br /&gt;
'''表10: IRC命令映射'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!命令 !!功能 !!MUC协议&lt;br /&gt;
|-&lt;br /&gt;
|/ban &amp;lt;roomnick&amp;gt; [comment] ||在房间里以房间昵称禁止用户(客户端翻译房间昵称为纯JID) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;iq id='someid'&lt;br /&gt;
    to='room@service'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='bare-jid-of-user'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/invite &amp;lt;jid&amp;gt; [comment] ||以JID邀请用户到此房间 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='jid'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
|/join &amp;lt;roomname&amp;gt; [pass] ||在服务里加入房间(房间昵称同本房间内的昵称) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/nick'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;pass&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/kick &amp;lt;roomnick&amp;gt; [comment] ||以房间昵称从房间里踢人 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;iq id='someid'&lt;br /&gt;
    to='room@service'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='roomnick' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|/msg &amp;lt;roomnick&amp;gt; &amp;lt;foo&amp;gt; ||发送私有消息&amp;quot;foo&amp;quot;给房间昵称 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service/nick' type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;foo&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/nick &amp;lt;newnick&amp;gt; ||变更在此房间内的昵称为&amp;quot;newnick&amp;quot; ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/newnick'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/part [comment] ||退出本房间(一些 IRC 客户端也支持 /leave) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/nick'&lt;br /&gt;
          type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;comment&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/topic &amp;lt;foo&amp;gt; ||变更此房间主题为&amp;quot;foo&amp;quot; ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service' type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;foo&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 因为 MUC 房间昵称遵循stringprep的Resourceprep脚本, 它们被允许包含一个空格字符, 而 IRC 昵称不允许. 尽管一个给定的客户端可以 MAY 支持引用字符串用于这个目的 (导致命令类似 '/ban &amp;quot;king lear&amp;quot; insanity is no defense'), 最常见的引用字符(类似 &amp;quot; 和 ') 也是被Resourceprep允许的 , 从而导致增加了复杂性和包含空格和引号的房间昵称中引号的潜在问题. 所以不建议 NOT RECOMMENDED Jabber客户端支持包含了空格符的房间昵称的类IRC的快捷方式命令.&lt;br /&gt;
&lt;br /&gt;
注意: 很多Jabber客户端也实现了 '/me ' 命令，如 [http://xmpp.org/extensions/xep-0245.html The /me Command] [[XEP-0045#附录G:备注|33]] 所述. 这个命令不会导致任何 MUC 或 IRC 协议的动作所以不显式在上表中.&lt;br /&gt;
&lt;br /&gt;
==XML架构==&lt;br /&gt;
===http://jabber.org/protocol/muc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='x'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='history' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='history'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='maxchars' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='maxstanzas' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='seconds' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='since' type='xs:dateTime' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#user===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#user'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#user'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='x'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:choice minOccurs='0' maxOccurs='unbounded'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='decline' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='destroy' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='invite' minOccurs='0' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='item' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='status' minOccurs='0' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='decline'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='destroy'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='invite'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='item'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='actor' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='continue' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='affiliation' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='admin'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='member'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='outcast'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='owner'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='nick' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='role' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='moderator'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='participant'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='visitor'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='actor'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='jid' type='xs:string' use='required'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='continue'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='thread' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='status'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='code' use='required'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:int'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:minInclusive value='100'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:maxInclusive value='999'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='reason' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#admin===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#admin'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#admin'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='query'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='item' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='item'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='actor' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='affiliation' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='admin'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='member'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='outcast'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='owner'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='nick' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='role' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='moderator'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='participant'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='visitor'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='actor'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='jid' type='xs:string' use='required'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='reason' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#owner===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#owner'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#owner'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:import &lt;br /&gt;
      namespace='jabber:x:data'&lt;br /&gt;
      schemaLocation='http://www.xmpp.org/schemas/x-data.xsd'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='query'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:choice xmlns:xdata='jabber:x:data' minOccurs='0'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='xdata:x'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='destroy'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='destroy'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='reason' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#unique===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#unique'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#unique'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='unique' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==鸣谢==&lt;br /&gt;
&lt;br /&gt;
作者感谢以下个人，为他们很多对于本协议草案的帮助性的评论: David Sutton, Peter Millard, Joe Hildebrand, Craig Kaes, Alexey Shchepin, David Waite, Jean-Louis Seguineau, Jacek Konieczny, Gaston Dombiak, 以及其他在 jdev@conference.jabber.org 会议室和在 Standards 邮件列表里的人.&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
&lt;br /&gt;
系列：[http://xmpp.org/extensions/ XEP]&lt;br /&gt;
&lt;br /&gt;
序号：0045&lt;br /&gt;
&lt;br /&gt;
发布者：[http://xmpp.org/xsf/ XMPP标准基金会]&lt;br /&gt;
&lt;br /&gt;
状态：[http://xmpp.org/extensions/xep-0001.html#states-Draft 草案 ]&lt;br /&gt;
&lt;br /&gt;
类型：[http://www.xmpp.org/extensions/xep-0001.html#types-Standards%20Track 标准跟踪]&lt;br /&gt;
&lt;br /&gt;
版本：1.24&lt;br /&gt;
&lt;br /&gt;
最后更新：2008-07-16&lt;br /&gt;
&lt;br /&gt;
批准机构：[http://xmpp.org/council/ XMPP理事会]&lt;br /&gt;
&lt;br /&gt;
依赖标准：XMPP Core, XMPP IM, XEP-0004, XEP-0030, XEP-0068, XEP-0082, XEP-0128&lt;br /&gt;
&lt;br /&gt;
替代标准：无&lt;br /&gt;
&lt;br /&gt;
被替代标准：无&lt;br /&gt;
&lt;br /&gt;
缩略名：muc&lt;br /&gt;
&lt;br /&gt;
muc名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#admin名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-admin.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#owner名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-owner.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#unique名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-unique.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#user名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-user.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注册表: &amp;lt;http://www.xmpp.org/registrar/muc.html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原文控制： [http://svn.xmpp.org:18080/browse/XMPP/trunk/extensions/xep-0045.xml HTML] [http://svn.xmpp.org:18080//changelog/~rss/XMPP/trunk/extensions/xep-0045.xml/rss.xml RSS]&lt;br /&gt;
&lt;br /&gt;
本文的其它格式： [http://xmpp.org/extensions/xep-0045.xml XML] [http://xmpp.org/extensions/xep-0045.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
URI: https://stpeter.im/&lt;br /&gt;
&lt;br /&gt;
{{Template:XEP附录CDEF}}&lt;br /&gt;
&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
&lt;br /&gt;
# RFC 1459: Internet Relay Chat &amp;lt;http://tools.ietf.org/html/rfc1459&amp;gt;.&lt;br /&gt;
# RFC 2810: Internet Relay Chat: Architecture &amp;lt;http://tools.ietf.org/html/rfc2810&amp;gt;.&lt;br /&gt;
# RFC 2811: Internet Relay Chat: Channel Management &amp;lt;http://tools.ietf.org/html/rfc2811&amp;gt;.&lt;br /&gt;
# RFC 2812: Internet Relay Chat: Client Protocol &amp;lt;http://tools.ietf.org/html/rfc2812&amp;gt;.&lt;br /&gt;
# RFC 2813: Internet Relay Chat: Server Protocol &amp;lt;http://tools.ietf.org/html/rfc2813&amp;gt;.&lt;br /&gt;
# XEP-0133: Service Administration &amp;lt;http://xmpp.org/extensions/xep-0133.html&amp;gt;.&lt;br /&gt;
# XEP-0030: Service Discovery &amp;lt;http://xmpp.org/extensions/xep-0030.html&amp;gt;.&lt;br /&gt;
# XEP-0059: Result Set Management &amp;lt;http://xmpp.org/extensions/xep-0059.html&amp;gt;.&lt;br /&gt;
# XEP-0128: Service Discovery Extensions &amp;lt;http://xmpp.org/extensions/xep-0128.html&amp;gt;.&lt;br /&gt;
# RFC 3920: 可扩展的消息和出席信息协议 (XMPP): Core &amp;lt;http://tools.ietf.org/html/rfc3920&amp;gt;.&lt;br /&gt;
# XEP-0203: Delayed Delivery &amp;lt;http://xmpp.org/extensions/xep-0203.html&amp;gt;.&lt;br /&gt;
# XEP-0091: Legacy Delayed Delivery &amp;lt;http://xmpp.org/extensions/xep-0091.html&amp;gt;.&lt;br /&gt;
# XEP-0082: XMPP Date and Time Profiles &amp;lt;http://xmpp.org/extensions/xep-0082.html&amp;gt;.&lt;br /&gt;
# RFC 3921: 可扩展的消息和出席信息协议 (XMPP): Instant Messaging and Presence &amp;lt;http://tools.ietf.org/html/rfc3921&amp;gt;.&lt;br /&gt;
# XEP-0249: Direct MUC Invitations &amp;lt;http://xmpp.org/extensions/xep-0249.html&amp;gt;.&lt;br /&gt;
# XEP-0077: In-Band Registration &amp;lt;http://xmpp.org/extensions/xep-0077.html&amp;gt;.&lt;br /&gt;
# XEP-0004: Data Forms &amp;lt;http://xmpp.org/extensions/xep-0004.html&amp;gt;.&lt;br /&gt;
# 一些评论者抱怨公开房间的所有者和管理员存在潜在的滥用; 很不幸的, 能力越大责任越大.&lt;br /&gt;
# XEP-0050: Ad-Hoc Commands &amp;lt;http://xmpp.org/extensions/xep-0050.html&amp;gt;.&lt;br /&gt;
# XEP-0060: Publish-Subscribe &amp;lt;http://xmpp.org/extensions/xep-0060.html&amp;gt;.&lt;br /&gt;
# 这和房间配置的行为不同, 这里 'muc#roomconfig_roomowners' 字段指定房间所有者的完整列表, 不是delta.&lt;br /&gt;
# 这和房间配置的行为不同, 这里 'muc#roomconfig_roomadmins' 字段指定房间管理眼的完整列表, 不是delta.&lt;br /&gt;
# XEP-0086: Error Condition Mappings &amp;lt;http://xmpp.org/extensions/xep-0086.html&amp;gt;.&lt;br /&gt;
# RFC 2616: Hypertext Transport Protocol -- HTTP/1.1 &amp;lt;http://tools.ietf.org/html/rfc2616&amp;gt;.&lt;br /&gt;
# RFC 1893: Enhanced Mail System Status Codes &amp;lt;http://tools.ietf.org/html/rfc1893&amp;gt;.&lt;br /&gt;
# 互联网编号分配机构 (IANA) 是用于互联网协议的唯一性参数值分配的核心协调者, 例如号码和URI计划. 更多信息, 见 &amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
# XMPP登记员 XMPP Registrar 维护着一个保留的协议名字空间以及用于由XMPP标准基金会批准的XMPP扩展协议的上下文参数的注册项的列表. 更多信息, 见 &amp;lt;http://xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
# XEP-0068: Field Data Standardization for Data Forms &amp;lt;http://xmpp.org/extensions/xep-0068.html&amp;gt;.&lt;br /&gt;
# XEP-0147: XMPP URI Query Components &amp;lt;http://xmpp.org/extensions/xep-0147.html&amp;gt;.&lt;br /&gt;
# XEP-0022: Message Events &amp;lt;http://xmpp.org/extensions/xep-0022.html&amp;gt;.&lt;br /&gt;
# XEP-0085: Chat State Notifications &amp;lt;http://xmpp.org/extensions/xep-0085.html&amp;gt;.&lt;br /&gt;
# XEP-0071: XHTML-IM &amp;lt;http://xmpp.org/extensions/xep-0071.html&amp;gt;.&lt;br /&gt;
# XEP-0245: The /me Command &amp;lt;http://xmpp.org/extensions/xep-0245.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===附录H: 修订历史===&lt;br /&gt;
&lt;br /&gt;
注意: 本协议的旧版本可能在 http://xmpp.org/extensions/attic/ 还可用&lt;br /&gt;
&lt;br /&gt;
'''版本 1.24 (2008-07-16)'''&lt;br /&gt;
&lt;br /&gt;
增加了更多原因reason元素的例子; 移除了关于黑名单包含的昵称部分; 增加了拒绝服务注意事项.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.23 (2008-01-14)'''&lt;br /&gt;
&lt;br /&gt;
* 定义了 getmemberlist 房间配置选项&lt;br /&gt;
* 增加了直接邀请协议&lt;br /&gt;
* 修正了当房间满的时候房间承认所有者/管理员的逻辑&lt;br /&gt;
* 定义了和LDAP群关联的服务发现扩展字段&lt;br /&gt;
* 指定了房间配置字段能被列入扩展的房间信息之中&lt;br /&gt;
* 指定了消息格式用于用户不在房间时的岗位变更&lt;br /&gt;
* 增加了例子展示结果集管理&lt;br /&gt;
* 推荐出席信息错误中包含的MUC子元素&lt;br /&gt;
* 为一对一聊天和多用户聊天的连续性描述了ThreadID的使用, 包括在邀请中为 continue 元素定义 thread 属性.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.22 (2007-04-10)'''&lt;br /&gt;
&lt;br /&gt;
更新了延迟消息递送以反映 XEP-0203 演化到草案和 XEP-0091 的过时.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.21 (2006-09-13)'''&lt;br /&gt;
&lt;br /&gt;
* 澄清了MUC扩展的介入，在房间加入/创建请求触发数据表单流但没有MUC扩展可导致自动房间创建以向后兼容旧的 groupchat 1.0 协议.&lt;br /&gt;
* 指定昵称变更时如果昵称被锁定则返回 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
* 要求客户端在进入房间之前发现房间配置并指定相关的安全事项, 包括使用隐私相关的状态码 170, 171, 172, 173, 和 174.&lt;br /&gt;
* 指定在房间配置选项不能被执行或违反服务策略时使用 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
* 强制要求房间昵称不能只包含空格.&lt;br /&gt;
* 移除所有服务发现用例到专用章节.&lt;br /&gt;
* 修改 urn:xmpp:delay 支持从 SHOULD 改为 MUST.&lt;br /&gt;
* 澄清 _whois 房间配置选项定义房间类型.&lt;br /&gt;
* 定义 XEP-0128 房间信息字段用于讨论记录, 关联的 pubsub 节点, 以及联系人 JID.&lt;br /&gt;
* 指出修改角色到主持人导致岗位变更为管理员或所有者成为推荐的, 而不是必需的.&lt;br /&gt;
* 增加了国际化事项中关于数据表单的本地化的部分.&lt;br /&gt;
* 指出实现可以持久化角色括月整个访问并且应该在被主持的房间里这样做.&lt;br /&gt;
* 增加了协议和服务发现特性用于在新建房间之前请求唯一的房间名.&lt;br /&gt;
* 更多澄清保留的房间昵称和昵称锁定的性质.&lt;br /&gt;
* 定义数据表单用于请求发言权和批准发言申请.&lt;br /&gt;
* 增加了多个邀请的例子用于XMPP URI.&lt;br /&gt;
* 澄清了出席信息，讨论历史的顺序, 等等.&lt;br /&gt;
* 增加了状态码用于房客拥有的房间昵称, 服务修改的房间昵称, 并警告房间讨论被公开记录.&lt;br /&gt;
* 澄清关于房间记录和非匿名房间的隐私和匿名事项.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.20 (2005-09-08)'''&lt;br /&gt;
&lt;br /&gt;
同意了踢人和禁止用户的能力, 并定义了一个用户不能被一个比自己岗位低的主持人或管理员踢或禁止.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.19 (2005-04-21)'''&lt;br /&gt;
&lt;br /&gt;
定义了怎样发送并发多邀请; 纠正了一些和岗位变更状态一致性的错误; 修改了消息事件禁令表单从 MUST NOT 到 SHOULD NOT; 修正了和 #traffic disco 节点相关的错误处理; 允许了 &amp;lt;password/&amp;gt; 作为&amp;lt;destroy/&amp;gt;的一个子元素; 修改了最大用户数错误从 &amp;lt;not-allowed/&amp;gt; 到 &amp;lt;service-unavailable/&amp;gt;; 指定了 maxchars 属性的字符数是指完整的 XML 节; 为 FORM_TYPEs;增加了 disco 特性 为状态码定义了注册表; 为遵守协议分开了新建即时房间的用例; 调整了 XML 架构以反映之前的修改; 重写了绪论; 澄清了小的文本错误.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
Version 1.18 (2004-11-02)&lt;br /&gt;
&lt;br /&gt;
Corrected several errors in the affiliation state chart and in the examples (wrong FORM_TYPE values); mentioned /me command.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.17 (2004-10-04)&lt;br /&gt;
&lt;br /&gt;
Added text about allowable extension namespaces and related service discovery mechanisms; specified well-known service discovery nodes; added conformance terms to clarify some descriptions; modified affiliation state chart to allow more flexible state changes; per list dicussion, added ability to convert a one-to-one chat into a conference, including sending of history; specified error to use when max users limit is reached; specified form for admin approval of user registration requests and modified FORM_TYPE from http://jabber.org/protocol/muc#user to http://jabber.org/protocol/muc#register; modified FORM_TYPE for room configuration from http://jabber.org/protocol/muc#owner to http://jabber.org/protocol/muc#roomconfig.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.16 (2004-06-30)&lt;br /&gt;
&lt;br /&gt;
Added example and registry submission for service discovery extension.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.15 (2004-06-24)&lt;br /&gt;
&lt;br /&gt;
Removed jabber:iq:browse references; clarified order of presence stanzas sent to new occupant on entering room; specified format of in-room messages (type='groupchat', from='room@service'); clarified allowable attributes in various list-related operations; made admin/owner revocation text and examples consistent with state chart; clarified ownership revocation conflict scenarios; changed the 'muc#roomconfig_inviteonly' field to 'muc#roomconfig_membersonly'; changed attribute order in examples to match XML canonicalization rules; corrected several errors in the schemas.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.14 (2004-05-03)&lt;br /&gt;
&lt;br /&gt;
Corrected discovery of registered roomnicks; added note about error to return if nicks are locked down.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.13 (2004-03-31)&lt;br /&gt;
&lt;br /&gt;
Fixed an error in the muc#user schema.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.12 (2004-03-01)&lt;br /&gt;
&lt;br /&gt;
Corrected a few errors in the examples; added IQ results in order to clarify workflows.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.11 (2004-02-05)&lt;br /&gt;
&lt;br /&gt;
Clarified JID matching rules (same as for privacy lists in XMPP IM).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.10 (2004-01-07)&lt;br /&gt;
&lt;br /&gt;
Added XMPP error handling; fully specified all conformance terms.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.9 (2003-12-14)&lt;br /&gt;
&lt;br /&gt;
Removed protocol for requesting voice in a moderated room (should be performed using Ad-Hoc Commands).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.8 (2003-12-04)&lt;br /&gt;
&lt;br /&gt;
Added protocol for requesting voice in a moderated room; added (informational) mapping of IRC commands to MUC protocols.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.7 (2003-10-21)&lt;br /&gt;
&lt;br /&gt;
Added room configuration option for restricting presence broadcast to certain roles.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.6 (2003-10-03)&lt;br /&gt;
&lt;br /&gt;
Added history management protocol on entering a room.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.5 (2003-09-11)&lt;br /&gt;
&lt;br /&gt;
Specified that ban occurs by JID, not roomnick; allowed privileged users to send messages to the room even if not present in the room; added note that service should remove occupant if a delivery-related stanza error occurs; enabled user to disco the room in order to discover registered roomnick; specified that &amp;quot;banning&amp;quot; by domain or regex is a service-level configuration matter and therefore out of scope for MUC; specified that role should be decremented as appropriate if affiliation is lowered; added some clarifying text to room creation workflow; added implementation note about sending an out-of-band message if a user's affiliation changes while the user is not in the room; fixed stringprep references (room nicks use Resourceprep); clarified relationship between Room ID (i.e., node identifier of Room JID, which may be opaque) and natural-language Room Name; specified Field Standardization profile per XEP-0068; defined XMPP Registrar submissions; added schema locations.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.4 (2003-02-16)&lt;br /&gt;
&lt;br /&gt;
Added XML schemas.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.3 (2003-02-11)&lt;br /&gt;
&lt;br /&gt;
Added reference to nodeprep Internet-Draft.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.2 (2003-01-30)&lt;br /&gt;
&lt;br /&gt;
Commented out revision history prior to version 1.0 (too long); clarified business rules regarding when nicks, full JIDs, and bare JIDs are used in reference to roles and affiliations; consistently specified that extended presence information in the muc#user namespace must include the full JID as the value of the 'jid' attribute in all cases; cleaned up text and examples throughout; added open issue regarding syntax of room nicknames.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.1 (2002-12-16)&lt;br /&gt;
&lt;br /&gt;
Added protocol for declining an invitation; replaced &amp;lt;created/&amp;gt; element with status code 201; modified the destroy room protocol so that &amp;lt;destroy/&amp;gt; is a child of &amp;lt;query/&amp;gt;; clarified usage of 'nick' attribute when adding members; prohibited use of message events.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.0 (2002-11-21)&lt;br /&gt;
&lt;br /&gt;
Per a vote of the Jabber Council, revision 0.23 was advanced to Draft on 2002-11-21. (For earlier revision history, refer to XML source.)&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.23 (2002-11-06)&lt;br /&gt;
&lt;br /&gt;
Added examples for disco#items queries sent to a room; prohibited 'type' attribute on invite messages sent from client to room; added dependencies on browse and disco; changed 'room user' to 'occupant'; fixed many small errors throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.22 (2002-11-04)&lt;br /&gt;
&lt;br /&gt;
Added example for disco#items; added support for cancellation of room configuration using type='cancel' from XEP-0004; noted 403 error for invites sent by non-admins in members-only room.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.21 (2002-11-01)&lt;br /&gt;
&lt;br /&gt;
Clarified several small ambiguities; made &amp;lt;body/&amp;gt; optional on invites sent from the service to the invitee; added error scenarios for changing nickname and for destroying the room; specified that the service must return the full member list for a members-only room (not only the members in the room); updated the disco examples to track protocol changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.20 (2002-10-29)&lt;br /&gt;
&lt;br /&gt;
Specified that messages sent to change the room subject must be of type &amp;quot;groupchat&amp;quot;; updated the legal notice to conform to the XSF IPR policy.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.19 (2002-10-28)&lt;br /&gt;
&lt;br /&gt;
Added ability to create an instant room within MUC (not by using gc-1.0 protocol); cleaned up disco examples.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.18 (2002-10-27)&lt;br /&gt;
&lt;br /&gt;
Added experimental support for disco; added sections for security, IANA, and JANA considerations; corrected typographical errors; cleaned up some DocBook formatting.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.17 (2002-10-23)&lt;br /&gt;
&lt;br /&gt;
Added the optional &amp;lt;actor/&amp;gt; element (with 'jid' attribute) to &amp;lt;item/&amp;gt; elements inside presence stanzas of type &amp;quot;unavailable&amp;quot; that are sent to users who are kicked or banned, as well as within IQs for tracking purposes; reverted all list editing use cases (ban, voice, member, moderator, admin, owner) to use of MUC format rather than 'jabber:x:data' namespace; added several guidelines regarding generation and handling of XML stanzas; cleaned up the change room subject use case; changed several ambiguous uses of 'would', 'can', and 'will' to 'should', 'may', or 'must'; fixed several small errors in the text, examples, and DTDs.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.16 (2002-10-20)&lt;br /&gt;
&lt;br /&gt;
Added the &amp;lt;item/&amp;gt; element to presence stanzas of type &amp;quot;unavailable&amp;quot; in order to improve the tracking of user states in the room; consolidated &amp;lt;invitee/&amp;gt; and &amp;lt;invitor/&amp;gt; elements into an &amp;lt;invite/&amp;gt; element with 'from' and 'to' attributes; made &amp;lt;reason/&amp;gt; element always a child of &amp;lt;item/&amp;gt; or &amp;lt;invite/&amp;gt; in the muc#user namespace; moved the alternate room location in room destruction to a 'jid' attribute of the &amp;lt;alt/&amp;gt; element; further specified several error messages; disallowed simultaneous modifications of both affiliations and roles by a moderator or admin; added several more rules regarding handling of XML stanzas; added use cases for granting and revoking administrative privileges; adjusted DTD to track all changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.15 (2002-10-18)&lt;br /&gt;
&lt;br /&gt;
Fully incorporated the change to affiliations + roles; moved a number of admin use cases to a new section for moderator use cases; added participant use case for requesting membership; added admin use cases for adding members, removing members, granting and revoking moderator privileges, and modifying the moderator list; organized the sections in a more logical manner.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.14 (2002-10-17)&lt;br /&gt;
&lt;br /&gt;
Significantly modified the privileges model by distinguishing between in-room &amp;quot;roles&amp;quot; and long-lived &amp;quot;affiliations&amp;quot;; specified the privileges of the various roles and affiliations; included state transition charts for both roles and affiliations; removed use of MUC protocol for editing ban, voice, and admin lists (but not for the actions of banning users and granting/revoking voice); added delivery rule regarding IQ stanzas; changed kick so that the action is based on changing the role to &amp;quot;none&amp;quot;.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.13 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Corrected the change nickname examples (newnick sent on unavailable, no nick sent on available).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.12 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Removed SHA1 passwords; specified that room shall add passwords on invitations to password-protected rooms (not supplied by invitor).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.11 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Changed 'participant' to 'room user' and 'discussant' to 'participant'; clarified presence rule about client generation of extended presence information; added role of 'none'.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.10 (2002-10-15)&lt;br /&gt;
&lt;br /&gt;
Fixed extended presence on entering or creating a room (plain '...muc' with no fragment); harmonized #user with #admin regarding the use of the &amp;lt;item/&amp;gt; element and associated attributes (jid, nick, etc.), and added 'role' attribute; modified management of voice, ban, admin, and member lists to use &amp;lt;query/&amp;gt; wrapper and new &amp;lt;item/&amp;gt; structure; changed the 'member' role to 'discussant', added 'outcast' role for banned users, and added new 'member' role to enable management of member lists; changed invitation-only rooms to members-only rooms and made appropriate adjustments to apply member lists to both members-only rooms and open rooms; modified nickname change protocol slightly to send the old nickname in the unavailable presence and the new nickname in the available presence; removed prohibition on members-only rooms that are password-protected; removed the &amp;lt;query/&amp;gt; wrapper for the &amp;lt;destroy/&amp;gt; element; updated the DTDs.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.9 (2002-10-13)&lt;br /&gt;
&lt;br /&gt;
Added extended presence ('...#user') on entering a room for MUC clients; changed namespace on room creation request to '...#owner'; added a service discovery example using jabber:iq:browse; added information about discussion history; made small fixes to several examples; further defined the presence rules; transferred all implementation notes to a dedicated section; added a Terminology section.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.8 (2002-10-10)&lt;br /&gt;
&lt;br /&gt;
Made further changes to the room creation workflow (finally correct); removed feature discovery use case (this needs to be addressed by a real service discovery protocol!); added ability for room owners to edit the admin list; removed &amp;lt;body/&amp;gt; from invitations generated by the service; removed messages sent to kicked and banned users (handled by unavailable presence with status code); added a number of implementation notes; converted all examples to Shakespeare style.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.6 (2002-10-09)&lt;br /&gt;
&lt;br /&gt;
Fixed the room creation workflow; changed some terminology (&amp;quot;join&amp;quot; to &amp;quot;enter&amp;quot; and &amp;quot;leave&amp;quot; to &amp;quot;exit&amp;quot;).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.5 (2002-10-08)&lt;br /&gt;
&lt;br /&gt;
Specified and improved the handling of invitation-only rooms. In particular, added the ability for room admins to edit the invitation list and added a configuration option that limits the ability to send invitations to room admins only.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.4 (2002-10-07)&lt;br /&gt;
&lt;br /&gt;
Changed namespaces from http://jabber.org/protocol/muc/owner etc. to http://jabber.org/protocol/muc#owner etc. per Jabber Council discussion.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.3 (2002-10-07)&lt;br /&gt;
&lt;br /&gt;
Changed namespaces to HTTP URIs; left role handling up to the implementation; further clarified presence rules.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.2 (2002-10-06)&lt;br /&gt;
&lt;br /&gt;
Disallowed kicking, banning, and revoking voice with respect to room admins and room owners; replaced &amp;lt;x/&amp;gt; with &amp;lt;query/&amp;gt; in the Discovering Room Features and Destroying a Room use cases; corrected some small errors and made many clarifications throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.1 (2002-10-04)&lt;br /&gt;
&lt;br /&gt;
Removed &amp;lt;whois/&amp;gt; command (unnecessary since participants with appropriate privileges receive the full JID of all participants in presence stanzas); completed many small fixes throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7 (2002-10-03)&lt;br /&gt;
&lt;br /&gt;
More clearly delineated participant roles and defined the hierarchy thereof (owner, admin, member, visitor); replaced &amp;lt;voice/&amp;gt; element in extended presence with &amp;lt;item role='member'/&amp;gt;; changed initial room configuration to use IQ rather than message; adjusted presence rules (especially regarding extended presence information); cleaned up examples throughout; updated DTD to track changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.6 (2002-09-21)&lt;br /&gt;
&lt;br /&gt;
More clearly defined the scope; removed fully anonymous rooms; changed meaning of semi-anonymous rooms and of non-anonymous rooms; added mechanism for notification of full JIDs in non-anonymous rooms; replaced the &amp;lt;admin/&amp;gt; element in extended presence with a &amp;lt;role/&amp;gt; element (more extensible); changed room passwords to cleartext; added status codes for various messages received from the service; added lists of valid error and status codes associated with the 'http://jabber.org/protocol/muc#user' namespace; added a &amp;lt;reason/&amp;gt; element for invitations; made kick and ban reasons child elements rather than attributes; replaced stopgap feature discovery mechanism with jabber:iq:negotiate; added extended presence element to room creation request and clarified the room creation process; specified presence reflection rules; added method for destroying a room; adjusted DTDs to track all changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.5.1 (2002-09-20)&lt;br /&gt;
&lt;br /&gt;
Added DTDs; changed feature discovery to use &amp;lt;x/&amp;gt; element rather than query and made service response come in IQ result; fixed reference to JID spec; changed 'grant' to 'add' and 'revoke' to 'remove' for consistency in the item attributes; made several other small changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.5 (2002-09-19)&lt;br /&gt;
&lt;br /&gt;
Changed the kick, ban, and voice protocols; added a few more configuration options; specified the restrictions for roomnicks; and added a stopgap service discovery protocol.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.4 (2002-09-18)&lt;br /&gt;
&lt;br /&gt;
Changed all non-GC-1.0 use cases to jabber:gc:* namespaces or jabber:x:data; added use cases for ban list management and room moderation; added protocol for sending notice of admin and voice privileges in presence; cleaned up text and many examples.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.3 (2002-09-17)&lt;br /&gt;
&lt;br /&gt;
Changed admin use cases; cleaned up participant and owner use cases.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.2 (2002-09-12)&lt;br /&gt;
&lt;br /&gt;
Broke content out into three actors (participant, owner, and admin) and added more detail to owner and admin use cases.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.1 (2002-09-09)&lt;br /&gt;
&lt;br /&gt;
Initial version.&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
END&lt;/div&gt;</summary>
		<author><name>Zyhserry</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0045</id>
		<title>XEP-0045</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0045"/>
				<updated>2014-01-02T06:00:37Z</updated>
		
		<summary type="html">&lt;p&gt;Zyhserry: /* 服务端 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0045.html XEP-0045]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0045: 多用户聊天'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本文定义了一个XMPP协议扩展用于多用户文本会议.即多个XMPP可以在一个房间或频道互相交流信息, 类似互联网中继聊天系统(IRC).还有标准聊天室功能如聊天室的主题和邀请，本协议定义了一个强有力的房间控制模型，包括能够踢和禁止用户，任命主持人和管理员，要求会员或密码才能加入房间，等等。&lt;br /&gt;
&lt;br /&gt;
作者:	Peter Saint-Andre&lt;br /&gt;
&lt;br /&gt;
XMPP扩展协议的版权(1999-2008)归XMPP标准化基金会(XSF)所有&lt;br /&gt;
&lt;br /&gt;
版权:	© 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0045#法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.24&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2008-07-16&lt;br /&gt;
&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个草案标准.对本协议的执行是被鼓励的,也适于部署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
传统上, 即时消息被视为由一对一的聊天构成而不是多对多聊天(即所谓&amp;quot;群聊&amp;quot;或&amp;quot;文本会议&amp;quot;). 群聊功能常见于一些系统如 Internet Relay Chat (IRC) 和 流行的IM服务所提供的聊天室功能. Jabber社区早在1999年开发和实施了一个基本的群聊协议. 这个 &amp;quot;groupchat 1.0&amp;quot; 协议为聊天室提供了一个最小功能集但是范围很有限. 本协议(多用户聊天或简称MUC)建立在向后兼容旧的&amp;quot;groupchat 1.0&amp;quot;协议的基础上但是提供高级功能如邀请, 房间主持和管理, 以及专门的房间类型.&lt;br /&gt;
&lt;br /&gt;
==范围==&lt;br /&gt;
&lt;br /&gt;
本文着重于和配置,参与以及管理一个独立的基于文本的会议室相关的通用需求. 这里所指出的需求是应用于单个房间级别的并且是&amp;quot;通用的&amp;quot;, 某种意义上它们是在Jabber社区广泛讨论的或在现有的Jabber之外的基于文本的会议环境(例如, 定义在 [http://tools.ietf.org/html/rfc1459 RFC 1459] [[XEP-0045#附录G:备注|1]]中的Internet Relay Chat 和它的继承者: [http://tools.ietf.org/html/rfc2810 RFC 2810] [[XEP-0045#附录G:备注|2]], [http://tools.ietf.org/html/rfc2811 RFC 2811] [[XEP-0045#附录G:备注|3]], [http://tools.ietf.org/html/rfc2812 RFC 2812] [[XEP-0045#附录G:备注|4]], [http://tools.ietf.org/html/rfc2813 RFC 2813] [[XEP-0045#附录G:备注|5]])中已经存在的.&lt;br /&gt;
&lt;br /&gt;
本文明确地不涉及以下需求:&lt;br /&gt;
&lt;br /&gt;
* 房间之间的关系(例如, 房间的层次结构)&lt;br /&gt;
&lt;br /&gt;
* 多用户聊天服务的管理(例如, 管理跨越整个服务级别的权限或注册一个全局可用的房间昵称)；这些用例定义在[http://xmpp.org/extensions/xep-0133.html Service Administration] [[XEP-0045#附录G:备注|6]]&lt;br /&gt;
&lt;br /&gt;
* 个别消息的主持&lt;br /&gt;
&lt;br /&gt;
* 通过房间发送的消息的加密&lt;br /&gt;
&lt;br /&gt;
* 高级特性, 如附加文件给一个房间, 集成白板, 以及和语音或视频聊天服务的接口&lt;br /&gt;
&lt;br /&gt;
* MUC部署和外来的聊天系统(例如, 和IRC网关或现有的其他IM系统)之间的交互&lt;br /&gt;
&lt;br /&gt;
* 在多个MUC部署之间进行镜像或复制&lt;br /&gt;
&lt;br /&gt;
这一受限的范围并非蔑视这些都很有用的主题; 无论如何, 这意味着本文专注于讨论和介绍一个易于理解的协议能够被类似的Jabber客户端和组件开发者实现. 将来的协议当然可能涉及以上提到的这些主题.&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
本文描述了由Jabber现有的多用户聊天服务提供的最小功能集. 为了向后兼容性起见, 本文使用原来的&amp;quot;groupchat 1.0&amp;quot;协议作为基本功能, 包括以下这些:&lt;br /&gt;
&lt;br /&gt;
* 每个房间被标识为 &amp;lt;room@service&amp;gt; (例如, &amp;lt;jdev@conference.jabber.org&amp;gt;), 这里 &amp;quot;room&amp;quot; 是房间的名称而 &amp;quot;service&amp;quot; 是多用户聊天服务运行所在的主机名.&lt;br /&gt;
&lt;br /&gt;
* 在一个房间里每个房客被标识为 &amp;lt;room@service/nick&amp;gt;, 这里 &amp;quot;nick&amp;quot; 是这个房客在这个房间里的昵称,定义于刚加入这个房间的时候，也可以在房客驻留改房间期间修改.&lt;br /&gt;
&lt;br /&gt;
* 一个用户通过发送出席信息给 &amp;lt;room@service/nick&amp;gt; 来加入一个房间（也就是成为房客）.&lt;br /&gt;
&lt;br /&gt;
* 在多用户聊天房间里发送的消息使用特殊的类型&amp;quot;groupchat&amp;quot;并且被寻址于房间本身 (room@service), 然后反映给所有房客.&lt;br /&gt;
&lt;br /&gt;
* 通过发送出席信息给 &amp;lt;room@service/newnick&amp;gt;，一个房客可以改变他或她的房间昵称以及在房间中的可用性状态 .&lt;br /&gt;
&lt;br /&gt;
* 通过发送一个类型为&amp;quot;unavailable&amp;quot;的出席信息给当前的&amp;lt;room@service/nick&amp;gt;，一个房客可以退出房间.&lt;br /&gt;
&lt;br /&gt;
本文追加的特性和功能包括以下这些:&lt;br /&gt;
&lt;br /&gt;
# 本地会话日志(不需要房间内的机器人)&lt;br /&gt;
# 允许用户申请房间成员&lt;br /&gt;
# 在一个非匿名房间里, 允许房客可以察看(另)一个房客的全JID&lt;br /&gt;
# 在一个半匿名房间里, 允许主持人可以察看一个房客的全JID&lt;br /&gt;
# 允许只有主持人修改房间主题&lt;br /&gt;
# 允许主持人从房间里踢出与会者和游客&lt;br /&gt;
# 在一个被主持的房间里,主持人可以授予和撤销发言权(也就是说, 发言的权力), 并且管理发言权列表&lt;br /&gt;
# 允许管理员授权和取消主持人权力, 并且管理主持人列表&lt;br /&gt;
# 允许管理员在房间禁止用户, 并管理黑名单&lt;br /&gt;
# 允许管理员授予和撤销成员权力, 并且管理一个仅限成员的房间的成员列表&lt;br /&gt;
# 允许所有者限制房客的数量&lt;br /&gt;
# 允许所有者指定其他的所有者(们)&lt;br /&gt;
# 允许所有者授予或撤销管理特权, 并管理管理员列表&lt;br /&gt;
# 允许所有者销毁房间&lt;br /&gt;
&lt;br /&gt;
另外, 本文提供了协议元素用于支持以下房间类型:&lt;br /&gt;
&lt;br /&gt;
# 公共的或隐藏的&lt;br /&gt;
# 持久的或临时的&lt;br /&gt;
# 密码保护的或不安全的&lt;br /&gt;
# 仅限成员的或开放的&lt;br /&gt;
# 主持的或非主持的&lt;br /&gt;
# 非匿名的或半匿名的&lt;br /&gt;
&lt;br /&gt;
为了实现这些需求, 本扩展协议需要满足 'http://jabber.org/protocol/muc' 名字空间(以及 在主名字空间URI加上 #owner, #admin, 和 #user 片断).&lt;br /&gt;
&lt;br /&gt;
==术语==&lt;br /&gt;
&lt;br /&gt;
===通用术语===&lt;br /&gt;
&lt;br /&gt;
Affiliation(岗位) -- 一个长期存在的和房间之间的联系或连接; 可能的岗位有 &amp;quot;owner&amp;quot;(所有者), &amp;quot;admin&amp;quot;(管理者), &amp;quot;member&amp;quot;(成员), 以及 &amp;quot;outcast&amp;quot;(被排斥者) (当然也可能没有岗位); 岗位(affiliation)和角色(role)是有区别的. 一个岗位跨越了用户对一个房间的访问期间.&lt;br /&gt;
&lt;br /&gt;
Ban(禁止) -- 从一个房间移除一个用户以使这个用户不能够再进入这个房间 (直到这个禁令被废除为止). 一个被禁止的用户的岗位(affiliation)为 &amp;quot;outcast&amp;quot;(被排斥者).&lt;br /&gt;
&lt;br /&gt;
Bare JID(纯JID) -- 一个用户的标识符 &amp;lt;user@host&amp;gt;, 不同于任何已有会话或资源的上下文, 与之相对的是全JID和房间JID.&lt;br /&gt;
&lt;br /&gt;
Full JID(全JID) -- 一个在线用户的标识符 &amp;lt;user@host/resource&amp;gt; , 不同于一个房间的上下文; 与之相对的是纯JID和房间JID.&lt;br /&gt;
&lt;br /&gt;
GC -- 最小的 &amp;quot;groupchat 1.0&amp;quot; 协议[7], Jabber社区于1999年开发; MUC 向后兼容GC.&lt;br /&gt;
&lt;br /&gt;
History(历史) -- 有限数量的消息节, 由当前讨论的上下文提供发送给一个新的房客.&lt;br /&gt;
&lt;br /&gt;
Invitation(邀请) -- 从一个用户发出的特殊消息给另一个用户, 邀请对方加入房间.; the invitation can be sent directly (see Direct MUC Invitations [8]) or mediated through the room (as described under Inviting Another User to a Room).&lt;br /&gt;
&lt;br /&gt;
IRC -- Internet Relay Chat.&lt;br /&gt;
&lt;br /&gt;
Kick(踢人) -- 临时从一个房间移除一个与会者或游客; 这个用户任何时候都可以再次进入这个房间. 一个被踢的用户的角色是&amp;quot;none&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Logging(记录) -- 存储发生在一个房间的讨论内容用于公开发布到房间上下文之外的地方.&lt;br /&gt;
&lt;br /&gt;
Member(成员) -- 一个用户在一个仅限会员的房间内处于&amp;quot;white list&amp;quot;(白名单)内，或已经注册到一个公开的房间. 一个成员的岗位是&amp;quot;member&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Moderator(主持人) -- 一个房间角色,通常和房间的管理有关但是这个角色可以被赋予非管理员; 可以踢人, 可以授予和撤销发言权, 等等. 一个主持人的角色是&amp;quot;moderator&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
MUC -- 本文所定义的基于文本会议的多用户聊天协议.&lt;br /&gt;
&lt;br /&gt;
Occupant(房客) -- 一个房间里的任何Jabber用户 (这是一个 &amp;quot;抽象类&amp;quot; 并且不对应任何特定的角色).&lt;br /&gt;
&lt;br /&gt;
Occupant JID(房客JID) -- 在一个房间上下文中的一个房客，以 &amp;lt;room@service/nick&amp;gt; 来标识; 与之相对的是纯JID和全JID.&lt;br /&gt;
&lt;br /&gt;
Outcast(被排斥者) -- 一个被某个房间禁止的用户. 一个被排斥者的岗位是 &amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Participant(与会者) -- 一个没有管理权限的房客; 在一个被主持的房间里, 参与者更多地被定义为有发言权的 (与之相反的是游客). 一个与会者的角色是&amp;quot;participant&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Private Message(私有消息) -- 从一个房客直接发给另一个房间JID的消息(不是房间本身广播给所有房客的消息).&lt;br /&gt;
&lt;br /&gt;
Role(角色) -- 在一个房间里的一个临时的地位或者权限级别, 对于这个房间中的用户的长期岗位来说是唯一的; 可能的角色有 &amp;quot;moderator&amp;quot;（主持人）, &amp;quot;participant&amp;quot;(与会者), 和 &amp;quot;visitor&amp;quot;(游客) (也可能没有预定义的角色). 一个角色仅仅存在于一个房客访问一个房间的期间.&lt;br /&gt;
&lt;br /&gt;
Room(房间) -- 一个虚拟的地方, Jabber用户象征性地加入它, 来和其他用户一起参与一个实时的基于文本的会议.&lt;br /&gt;
&lt;br /&gt;
Room Administrator(房间管理员) -- 一个由房间所有者授权的用户, 可以执行管理功能, 如禁止用户等等; 无论如何, 不允许改变定义的房间特性. 一个管理员的岗位是&amp;quot;admin&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
Room ID(房间ID) -- 一个房间JID的节点标识符部分, 它可以是不透明的因而对人类用户没有什么含义(见  语法的商业规则Business Rules for syntax); 与之相对的是房间名.&lt;br /&gt;
&lt;br /&gt;
Room JID(房间JID) -- 房间地址，如 &amp;lt;room@service&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Room Name(房间名) -- 一个用户友好的, 自然语言的房间名字, 由房间所有者配置并在服务查询中展示; 与之相对的是房间ID.&lt;br /&gt;
&lt;br /&gt;
Room Nickname(房间昵称) -- 房间JID的资源标识符部分(见语法的商业规则); 这是一个房客在这个房间中所呈现的&amp;quot;友好的名字&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Room Owner(房间所有者) -- 建立某个房间的Jabber用户或一个被房间创建者或所有者指派拥有所有者权限(如果允许的话)的Jabber用户; 它被允许改变定义好的房间特性, 也可以执行全部的管理功能. 一个所有者的岗位为&amp;quot;owner&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Room Roster(房间名册) -- 一个房间中的所有房客在一个Jabber客户端的展现.&lt;br /&gt;
&lt;br /&gt;
Server(服务器) -- 一个Jabber服务器，可以关联或不关联一个基于文本的会议服务.&lt;br /&gt;
&lt;br /&gt;
Service(服务) -- 一个主机, 提供基于文本的会议的能力; 通常但不必须是一个Jabber服务器的子域(例如, conference.jabber.org).&lt;br /&gt;
&lt;br /&gt;
Subject(主题) -- 一个房间的临时讨论标题.&lt;br /&gt;
&lt;br /&gt;
Visit(访问) -- 一个房间的一个用户的&amp;quot;session&amp;quot;(会话), 当用户进入这个房间时开始(也就是说, 成为一个房客) , 结束于用户离开房间之时.&lt;br /&gt;
&lt;br /&gt;
Visitor(游客) -- 在一个被主持的房间里的一个没有发言权的房客(相反则是一个与会者). 一个游客的角色是&amp;quot;visitor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Voice(发言权) -- 在一个被主持的房间里, 发送消息给全部房客的权限.&lt;br /&gt;
&lt;br /&gt;
===房间类型===&lt;br /&gt;
&lt;br /&gt;
Hidden Room(隐藏房间) -- 一个无法被任何用户以普通方法如搜索和服务查询来发现的房间; 反义词: 公开(public)房间.&lt;br /&gt;
&lt;br /&gt;
Members-Only Room(仅限会员的房间) -- 如果一个用户不在成员列表中则无法加入的一个房间; 反义词: 开放(open)房间.&lt;br /&gt;
&lt;br /&gt;
Moderated Room(被主持的房间) -- 只有有&amp;quot;发言权&amp;quot;的用户才可以发送消息给所有房客的房间; 反义词: 非主持的(Unmoderated)房间.&lt;br /&gt;
&lt;br /&gt;
Non-Anonymous Room(非匿名房间) -- 一个房客的全JID会暴露给所有其他房客的房间, 尽管房客可以选择任何期望的房间昵称; 相对的是半匿名(Semi-Anonymous)房间.&lt;br /&gt;
&lt;br /&gt;
Open Room(开放房间) -- 任何人可以加入而不需要在成员列表中的房间; 反义词: 仅限会员的房间.&lt;br /&gt;
&lt;br /&gt;
Password-Protected Room(密码保护房间) -- 一个用户必须提供正确密码才能加入的房间; 反义词: 非保密房间.&lt;br /&gt;
&lt;br /&gt;
Persistent Room(持久房间) -- 如果最后一个房客退出也不会被销毁的房间; 反义词: 临时房间.&lt;br /&gt;
&lt;br /&gt;
Public Room(公开房间) -- 用户可以通过普通方法如搜索和服务查询来发现的房间; 反义词: 隐藏房间.&lt;br /&gt;
&lt;br /&gt;
Semi-Anonymous Room(半匿名房间) -- 一个房客的全JID只能被房间管理员发现的房间; 相对的是非匿名(Non-Anonymous)房间.&lt;br /&gt;
&lt;br /&gt;
Temporary Room(临时房间) -- 如果最后一个房客退出就会被销毁的房间; 反义词: 持久房间.&lt;br /&gt;
&lt;br /&gt;
Unmoderated Room(非主持的房间) -- 任何房客都被允许发送消息给所有房客的房间; 反义词: 被主持的房间.&lt;br /&gt;
&lt;br /&gt;
Unsecured Room(非保密房间) -- 任何人不需要提供密码就可以进入的房间; 反义词: 密码保护房间.&lt;br /&gt;
&lt;br /&gt;
===登场人物===&lt;br /&gt;
&lt;br /&gt;
本文的大部分例子使用了莎士比亚的《麦克白》中第四幕第一场开头女巫在黑洞中开会的场景，在这里使用&amp;quot;coven@chat.shakespeare.lit&amp;quot;代表聊天室. 人物如下:&lt;br /&gt;
&lt;br /&gt;
'''表1: 剧中人'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!Room Nickname !!Full JID!!Affiliation&lt;br /&gt;
|-&lt;br /&gt;
|firstwitch ||crone1@shakespeare.lit/desktop ||Owner&lt;br /&gt;
|-&lt;br /&gt;
|secondwitch ||wiccarocks@shakespeare.lit/laptop ||Admin&lt;br /&gt;
|-&lt;br /&gt;
|thirdwitch ||hag66@shakespeare.lit/pda ||None&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==角色(Roles)，岗位(Affiliations)和权限(Privileges)==&lt;br /&gt;
&lt;br /&gt;
A user might be allowed to perform any number of actions in a room, from joining or sending a message to changing configuration options or destroying the room altogether. We call each permitted action a &amp;quot;privilege&amp;quot;. There are two ways we might structure privileges:&lt;br /&gt;
&lt;br /&gt;
1. Define each privilege atomically and explicitly define each user's particular privileges; this is flexible but can be confusing to manage.&lt;br /&gt;
&lt;br /&gt;
2. Define bundles of privileges that are generally applicable and assign a user-friendly &amp;quot;shortcut&amp;quot; to each bundle (e.g., &amp;quot;moderator&amp;quot; or &amp;quot;admin&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
MUC使用第2种方式。&lt;br /&gt;
&lt;br /&gt;
有两个尺度我们可以用来衡量一个用户的连接或在一个房间的地位. 一个是用户和一个房间的长期的联系 -- 例如, 用户的状态是一个所有者或一个被排斥者. 另一个是当用户驻留于一个聊天室的时候的角色 -- 例如, 一个房客的地位是主持人,有权踢出游客和与会者. 这两个尺度各自都是唯一的, 因为一个岗位是跨越访问的, 而一个角色只存在于一次访问期间. 另外, 在角色和岗位之间没有一对一的对应关系; 例如, 某个不从属于某房间的人可能成为一个(临时的)主持人, 一个成员可能在一个被主持的房间中是一个与会者或游客者. 这些概念以下全面解释.&lt;br /&gt;
&lt;br /&gt;
===角色===&lt;br /&gt;
&lt;br /&gt;
以下是已定义的角色:&lt;br /&gt;
&lt;br /&gt;
'''表2: 角色'''&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!名称 !!支持&lt;br /&gt;
|-&lt;br /&gt;
| 主持人Moderator   ||必需的 &lt;br /&gt;
|-&lt;br /&gt;
| 无None       ||缺少角色&lt;br /&gt;
|-&lt;br /&gt;
| 与会者Participant   ||必需的&lt;br /&gt;
|-&lt;br /&gt;
| 游客Visitor     ||推荐的&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
角色是临时的,它不一定要在用户对房间的访问中持久化,它可以(MAY)在一个房客访问房间期间改变. 一个实现可以(MAY)在一次访问期间持久化角色并且应该(SHOULD)在被主持的房间这样做 (因为在游客和与会者之间,唯一性对一个被主持的房间是很关键的).&lt;br /&gt;
&lt;br /&gt;
在角色和岗位之间没有一对一的映射(例如, 一个成员可以是一个与会者或一个游客).&lt;br /&gt;
&lt;br /&gt;
在房间会话中,一个主持人是最有权力的房客, 它能在某种程度走上管理房间的其他房客的角色. 一个与会者的权力小于一个主持人, 尽管他或她有权发言. 在一个被主持的房间会话中游客是一个更受限制的角色, 因为访问者不允许发送消息给所有房客.&lt;br /&gt;
&lt;br /&gt;
角色的授予,撤销, 和维护是基于房客的房间昵称或全JID,而不是纯JID. 和这些角色相关的权限，还有角色改变触发的动作, 定义在下文中.&lt;br /&gt;
&lt;br /&gt;
所有在房间中生成或反射的出席信息中关于角色的信息必须(MUST)被发送,从而发送给房客们.&lt;br /&gt;
&lt;br /&gt;
====权限====&lt;br /&gt;
&lt;br /&gt;
大部分情况下, 角色存在于一个层次中. 例如, 一个与会者可以做任何游客能做的事, 而一个主持人可以做任何与会者能做的事. 每个角色拥有下一级角色所没有的权限; 这些权限定义于下表作为缺省值(一个实现可以(MAY)提供配置选项来重载这些缺省值).&lt;br /&gt;
&lt;br /&gt;
'''表3: 和角色相关的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!权限 !!无 !!游客 !!与会者 !!主持人&lt;br /&gt;
|-&lt;br /&gt;
|在房间中出席 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|接收消息 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|接收房客出席信息 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|出席信息广播到房间 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|改变可用性状态 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|改变房间昵称 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|发送私人消息 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|邀请其他用户 ||否 ||是* ||是* ||是&lt;br /&gt;
|-&lt;br /&gt;
|发送消息给所有人 ||否 ||否** ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|修改标题 ||否 ||否* ||是* ||是&lt;br /&gt;
|-&lt;br /&gt;
|踢出与会者和游客 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|授予发言权 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|撤销发言权 ||否 ||否 ||否 ||是***&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 缺省; 设定配置时可以(MAY)修改这个权限.&lt;br /&gt;
&lt;br /&gt;
** 一个实现可以(MAY)在非主持的房间里缺省地授予发言权给游客.&lt;br /&gt;
&lt;br /&gt;
*** 主持人不能(MUST NOT)从一个管理员或所有者收回发言权.&lt;br /&gt;
&lt;br /&gt;
====默认角色====&lt;br /&gt;
&lt;br /&gt;
服务必须（SHOULD）根据用户的岗位信息来设置房客在房间里的默认角色（没有与岗位（“outcast”）关联的默认角色，因为outcast用户不允许进入房间）。下表对与每个岗位关联的默认角色进行了总结。&lt;br /&gt;
&lt;br /&gt;
表4: 基于岗位的默认角色&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!Room Type !!None !!Member !!Admin !!Owner&lt;br /&gt;
|-&lt;br /&gt;
|Moderated ||Visitor ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Unmoderated ||Participant ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Members-Only ||N/A * ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Open	||Participant ||Participant ||Moderator ||Moderator&lt;br /&gt;
|}&lt;br /&gt;
* Entry is not permitted.&lt;br /&gt;
&lt;br /&gt;
====变更角色====&lt;br /&gt;
&lt;br /&gt;
一个房客的角色变更方法是定义好的. 有时候房客自己的动作导致变更 (例如, 加入或退出房间), 反之有时候由主持人,管理员或所有者的动作导致变更. 如果一个房客的角色改变了, 一个 MUC 服务实现必须(MUST)变更这个房客的角色来反映这个变更并且传达这个变更给所有房客. 角色的变更和它们触发的动作定义于下表.&lt;br /&gt;
&lt;br /&gt;
'''表4: 角色状态表'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!&amp;gt; !!无 !!游客 !!与会者 !!主持人&lt;br /&gt;
|-&lt;br /&gt;
|无 ||-- ||进入被主持的房间 ||进入非主持的房间 ||管理员或所有者进入房间&lt;br /&gt;
|-&lt;br /&gt;
|游客 ||退出房间或被主持人踢出房间 ||-- ||主持人授予发言权 ||管理员或所有者授予主持人权限&lt;br /&gt;
|-&lt;br /&gt;
|与会者 ||退出房间或被主持人踢出房间 ||主持人撤销发言权	||--  ||管理员或所有者授予主持人权限 &lt;br /&gt;
|-&lt;br /&gt;
|主持人	||退出房间 ||管理员或所有者改变角色成为游客* ||管理员或所有者改变角色成为与会者或撤销主持人权限* ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 一个主持人不能(MUST NOT)从一个岗位等于或高于主持人的房客那里收回主持人权限.&lt;br /&gt;
&lt;br /&gt;
注意: 特定的角色一般暗含特定的权限. 例如, 一个管理员或所有者自动成为一个主持人, 所以如果一个房客被授予管理员地位那么这个房客事实上将被授予主持人权限; 类似的, 当一个房客成为一个被主持的房间的成员, 这个房客自动拥有一个与会者的角色. 无论如何, 失去管理员地位并不足以意味这个房客不再是主持人 (因为只要是与会者就可能成为一个主持人). 因此, 当一个房客被授予特定的岗位的时候所拥有的角色是固定的, 反之当一个房客失去一个特定的岗位时它的角色是不确定的并取决于(服务的)实现. 因为一个客户端无法预料是否在撤销某个岗位之后这个角色成为什么, 如果它不想同时移除管理员/所有者权限和主持人角色, 那么除了岗位变更之外它还必须特意请求角色变更.&lt;br /&gt;
&lt;br /&gt;
===岗位===&lt;br /&gt;
&lt;br /&gt;
已定义了以下岗位:&lt;br /&gt;
&lt;br /&gt;
# 所有者&lt;br /&gt;
# 管理员&lt;br /&gt;
# 成员&lt;br /&gt;
# 被排斥者&lt;br /&gt;
# 无 (缺少岗位)&lt;br /&gt;
&lt;br /&gt;
必须支持&amp;quot;所有者&amp;quot;这个岗位,推荐支持&amp;quot;管理员&amp;quot;,&amp;quot;成员&amp;quot;,&amp;quot;被排斥者&amp;quot;的岗位.（&amp;quot;无&amp;quot;表示缺少岗位)&lt;br /&gt;
&lt;br /&gt;
这些岗位是长时间的跨越一个用户对这个房间的访问期间的并且不受房间里事件的影响. 而且, 这些岗位和一个房客在房间中的角色之间没有一对一的映射关系. 岗位被授予,撤销, 和维护都是基于这个用户的纯 JID.&lt;br /&gt;
&lt;br /&gt;
如果一个没有已定义的岗位的用户进入一个房间, 这个用户的岗位被定义为&amp;quot;无&amp;quot;; 无论如何, 这个岗位不能跨越(多次的)访问 (也就是说, 一个服务不会跨越访问维护一个 &amp;quot;无 列表&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;quot;成员&amp;quot;岗位为房间所有者或管理员提供了一个方法来指定一个&amp;quot;白名单&amp;quot;,其中的用户被允许加入一个仅供会员的房间. 当一个成员加入了一个仅供会员的房间, 他或她的岗位不会改变, 无论他或她的角色是什么. 成员岗位也为用户提供一个方法来高效地注册一个开放的房间并在某种方式意义上保持和那个房间的联系(例如可能在房间里预留那个用户的昵称).&lt;br /&gt;
&lt;br /&gt;
一个被排斥者就是一个被从房间踢出来并且不允许进入那个房间的用户.&lt;br /&gt;
&lt;br /&gt;
关于岗位的信息必须(MUST)由房间生成或反射到所有的出席信息节之中发送给房客们.&lt;br /&gt;
&lt;br /&gt;
====权限====&lt;br /&gt;
&lt;br /&gt;
大部分情况下, 岗位存在一个层次结构. 例如, 一个所有者可以做任何管理员能做的事情, 而一个管理员可以做任何成员能做的事情. 每个岗位拥有其下一级岗位所没有的权限; 这些权限定义在下表中.&lt;br /&gt;
&lt;br /&gt;
'''表5: 和岗位相关的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!权限 !!Outcast(被排斥者) !!None(无) !!Member(成员) !!Admin(管理员) !!Owner(所有者)&lt;br /&gt;
|-&lt;br /&gt;
|进入房间 ||否 ||是* ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|注册一个开放的房间 ||否 ||是 ||N/A ||N/A ||N/A&lt;br /&gt;
|-&lt;br /&gt;
|接收成员列表 ||否 ||否** ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|加入一个仅限会员的房间 ||否 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|禁止成员并把用户的岗位删除	||否 ||否 ||否 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑成员列表 ||否 ||否 ||否 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑主持人列表 ||否 ||否 ||否 ||是** ||是**&lt;br /&gt;
|-&lt;br /&gt;
|编辑管理员列表 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑所有者列表 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|变更房间定义 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|销毁房间	||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 作为缺省值, 一个无岗位的用户进入一个被主持的房间的角色是一个游客, 而进入一个开放的房间的角色是一个与会者. 一个成员进入一个房间的角色是与会者. 一个管理员或所有者进入房间的角色是一个主持人.&lt;br /&gt;
&lt;br /&gt;
** 一个管理员或所有者不能(MUST NOT)撤销另一个管理员或所有者的权限.&lt;br /&gt;
&lt;br /&gt;
====变更岗位====&lt;br /&gt;
&lt;br /&gt;
一个用户的岗位变更方法已经定义得很完善. 有时用户自己的动作导致这些变更(例如, 注册为一个房间的新成员), 反之有时候一个管理员或所有者的动作导致了这些变更. 如果一个用户的岗位改变了, 一个MUC服务实现必须(MUST)变更这个用户的岗位来反射这一变更并通知所有房客. 岗位变更和他们触发的动作定义在下表中.&lt;br /&gt;
&lt;br /&gt;
'''表6: 岗位状态表'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|  ||被排斥者(Outcast) ||无(None) ||成员(Member) ||管理员(Admin) ||所有者(Owner)&lt;br /&gt;
|-&lt;br /&gt;
|被排斥者(Outcast) ||-- ||管理员或所有者移除屏蔽 ||管理员或所有者增加用户到成员列表 ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|无(None) ||管理员或所有者使用屏蔽 ||-- ||管理员或所有者增加用户到成员列表, 或用户注册一个成员(如果允许) ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|成员(Member) ||管理员或所有者使用屏蔽 ||管理员或所有者变更岗位为&amp;quot;none&amp;quot; ||-- ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|管理员(Admin) ||所有者使用屏蔽 ||所有者变更岗位为&amp;quot;none&amp;quot; ||所有者变更岗位为&amp;quot;member&amp;quot; ||-- ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|所有者(Owner) ||所有者使用屏蔽 ||所有者变更岗位为&amp;quot;none&amp;quot; ||所有者变更岗位为&amp;quot;member&amp;quot; ||所有者变更岗位为&amp;quot;admin&amp;quot; ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==实体用例==&lt;br /&gt;
&lt;br /&gt;
一个MUC实现必须(MUST)支持[http://xmpp.org/extensions/xep-0030.html 服务发现] [[XEP-0045#附录G:备注|7]].&lt;br /&gt;
&lt;br /&gt;
===MUC的发现组件支持===&lt;br /&gt;
&lt;br /&gt;
一个Jabber实体可能希望发现是否一个服务实现了多用户聊天协议; 为了达到这个目的, 它发送一个服务发现信息(&amp;quot;disco#info&amp;quot;)查询给这组件的JID:&lt;br /&gt;
&lt;br /&gt;
'''例子 1. 用户通过Disco查询聊天服务是否支持MUC'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco1'&lt;br /&gt;
    to='macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须(MUST)返回它的的身份和它所支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 2. 服务返回Disco Info结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='Macbeth Chat Service'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 因为MUC是旧的&amp;quot;groupchat 1.0&amp;quot;协议的超集, 一个MUC服务不应该(SHOULD NOT)返回一个&amp;lt;feature var='gc-1.0'/&amp;gt;条目在一个disco#info结果中.&lt;br /&gt;
&lt;br /&gt;
===发现房间===&lt;br /&gt;
&lt;br /&gt;
发现服务条目(&amp;quot;disco#items&amp;quot;)协议使得一个用户可以向一个服务查询相关的条目列表, 在一个聊天服务中这包含这个服务所承载的所有特定房间的集合.&lt;br /&gt;
&lt;br /&gt;
'''例子 3. 用户向聊天服务查询房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco2'&lt;br /&gt;
    to='macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务应该(SHOULD)返回它承载的所有房间的列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 4. 服务返回Disco Item结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='heath@macbeth.shakespeare.lit'&lt;br /&gt;
          name='A Lonely Heath'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
          name='A Dark Cave'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='forres@macbeth.shakespeare.lit'&lt;br /&gt;
          name='The Palace'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='inverness@macbeth.shakespeare.lit'&lt;br /&gt;
          name='Macbeth&amp;amp;apos;s Castle'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果全部房间的列表太大(详见[[XEP-0030]]), 服务可以(MAY)只返回部分的房间列表.如果这样做了, 它应该 SHOULD 包含一个 &amp;lt;set/&amp;gt; 元素 (定义在 [http://xmpp.org/extensions/xep-0059.html Result Set Management] [[XEP-0045#附录G:备注|8]]) 以表明这个列表不是全部的结果集.&lt;br /&gt;
&lt;br /&gt;
'''例子 5. 服务返回Disco Item结果的部分列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='rooms.shakespeare.lit'&lt;br /&gt;
    id='disco-rsm-1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='alls-well-that-ends-well@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='as-you-like-it@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='cleopatra@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='comedy-of-errors@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='coriolanus@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='cymbeline@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hamlet@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fourth-one@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fourth-two@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fifth@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;set xmlns='http://jabber.org/protocol/rsm'&amp;gt;&lt;br /&gt;
      &amp;lt;first index='0'&amp;gt;alls-well-that-ends-well@rooms.shakespeare.lit&amp;lt;/first&amp;gt;&lt;br /&gt;
      &amp;lt;last&amp;gt;henry-the-fifth@rooms.shakespeare.lit&amp;lt;/last&amp;gt;&lt;br /&gt;
      &amp;lt;count&amp;gt;37&amp;lt;/count&amp;gt;&lt;br /&gt;
    &amp;lt;/set&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===查询房间信息===&lt;br /&gt;
&lt;br /&gt;
使用 disco#info 协议, 一个用户也可以查询一个特定房间的详情. 为了在进入房间之间确定这个房间的隐私和安全配置用户应该(SHOULD)这样做(详见[[XEP-0045#安全事项|安全事项]]).&lt;br /&gt;
&lt;br /&gt;
'''例子 6. 用户查询特定聊天室的信息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco3'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间必须(MUST)返回它的标识并且应该(SHOULD)返回它支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 7. 房间返回查询信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco3'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='A Dark Cave'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_passwordprotected'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_hidden'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_temporary'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_open'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_unmoderated'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_nonanonymous'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 因为 MUC 是旧的 &amp;quot;groupchat 1.0&amp;quot; 协议的超集, 一个 MUC 房间不应该(SHOULD NOT)在一个disco#info结果中返回&amp;lt;feature var='gc-1.0'/&amp;gt;条目. 房间应该(SHOULD)返回它支持的实质的有意义的特性, 例如密码保护和房间主持(这些特性被完整地列入了特性注册, 由[http://xmpp.org/registrar/ XMPP Registrar]维护; 也见于本文的[[XEP-0045#registrar|XMPP注册]] 章节).&lt;br /&gt;
&lt;br /&gt;
一个聊天室可以(MAY)使用[http://xmpp.org/extensions/xep-0128.html 服务查询扩展] [[XEP-0045#附录G:备注|9]]在它的disco#info应答中返回更详细的信息, 通过包含一个隐含的FORM_TYPE属性值&amp;quot;http://jabber.org/protocol/muc#roominfo&amp;quot;来标识. 这些信息可能包括关于一个房间的更详细的描述, 当前的房间标题, 以及这个房间当前的房客数量:&lt;br /&gt;
&lt;br /&gt;
'''例子 8. 房间返回扩展的查询信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco3a'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='A Dark Cave'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_passwordprotected'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_hidden'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_temporary'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_open'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_unmoderated'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_nonanonymous'/&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_description' label='Description'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_changesubject' label='Whether Occupants May Change the Subject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_contactjid' label='Contact Addresses'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;crone1@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_subject' label='Subject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Spells&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_occupants' label='Number of occupants'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;3&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_lang' label='Language of discussion'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_logs' label='URL for discussion logs'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://www.shakespeare.lit/chatlogs/darkcave/&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_pubsub' label='Associated pubsub node'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;xmpp:pubsub.shakespeare.lit?node=chatrooms/darkcave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
某些扩展的房间信息可能是动态生成的(例如, 讨论记录的URL地址, 它可能取决于服务器那一层的配置); 反之另一些信息则可能基于房间那一层的配置,任何定义在[[XEP-0045#附录G:备注|muc#roomconfig FORM_TYPE]] 里的字段都可以用于扩展服务发现的字段(如上文所示的 muc#roomconfig_changesubject 字段).&lt;br /&gt;
&lt;br /&gt;
注意: 前述 'http://jabber.org/protocol/muc#roominfo' FORM_TYPE的扩展服务发现字段将来还可以扩充(通过本文的[[XEP-0045#附录G:备注|字段标准化]]章节描述的机制).&lt;br /&gt;
&lt;br /&gt;
===查询房间条目===&lt;br /&gt;
&lt;br /&gt;
一个用户也可以(MAY)向一个特定的聊天室查询和它相关的条目:&lt;br /&gt;
&lt;br /&gt;
'''例子 9. 用户查询和一个特定聊天室相关的条目'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个实现可以(MAY)返回现有房客的列表(如果那信息是可公开的), 或不返回列表(如果那信息是私有的).&lt;br /&gt;
&lt;br /&gt;
'''例子 10. 房间返回查询条目结果(条目是公开的)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit/firstwitch'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit/secondwitch'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 这些 &amp;lt;item/&amp;gt; 元素由 disco#items 名字空间限定, 而不是 muc 名字空间; 这意味着他们不能拥有 'affiliation' 或 'role' 属性, 例如.&lt;br /&gt;
&lt;br /&gt;
'''例子 11. 房间返回空的查询条目结果(条目是私有的)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===查询一个房间的房客===&lt;br /&gt;
&lt;br /&gt;
如果一个非房客试图发送一个查询请求给一个&amp;lt;room@service/nick&amp;gt;类型的地址, 一个 MUC 服务应该(SHOULD)返回这个请求给这个实体并指明一个&amp;lt;bad-request/&amp;gt;错误条件. 如果一个房客发送这样一个请求, 服务可以(MAY)把它传递给指定的接收者; 详见本文的 [[XEP-0045#实现注意事项|实现注意事项]]章节.&lt;br /&gt;
&lt;br /&gt;
===发现客户端对MUC的支持===&lt;br /&gt;
&lt;br /&gt;
一个 Jabber 用户可能想发现这个用户的某个联系人是否支持多用户聊天协议. 这可以使用服务发现(协议)来完成.&lt;br /&gt;
&lt;br /&gt;
'''例子 12. 用户查询联系人对于 MUC 的支持'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco5'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
客户端应该(SHOULD)返回它的标识和它支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 13. 联系人返回发现信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='disco5'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='client'&lt;br /&gt;
        type='pc'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个用户也可能查询一个联系人在哪个房间. 这可以通过特定服务发现节点 'http://jabber.org/protocol/muc#rooms' 查询联系人的全JID(&amp;lt;user@host/resource&amp;gt;)来完成 :&lt;br /&gt;
&lt;br /&gt;
'''例子 14. 用户在当前房间查询联系人'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='rooms1'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#rooms'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 15. 联系人返回房间查询结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='rooms1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#rooms'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='characters@conference.shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可选的, 联系人可以(MAY)把它的房间昵称作为'name'属性的值返回:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
          name='secondwitch'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==房客用例==&lt;br /&gt;
&lt;br /&gt;
在一个多用户聊天环境中主要的行为者是房客, 它可以被认为存在于一个多用户聊天室&amp;quot;之内&amp;quot;并且参与那个房间的讨论 (在本协议中, 与会者和游客&amp;quot;仅仅&amp;quot;被认为是房客, 因为他们不拥有管理员权限). 为了更加清晰起见, 本文中的协议元素中涉及到驻留者的用例分为以下三类:&lt;br /&gt;
&lt;br /&gt;
# 现存于 &amp;quot;groupchat 1.0&amp;quot; 协议的最小功能集&lt;br /&gt;
# 对于 &amp;quot;groupchat 1.0&amp;quot; 协议直接的应用, 如处理一些和新房间类型有关的错误&lt;br /&gt;
# 用来处理&amp;quot;groupchat 1.0&amp;quot;协议未涉及的功能的额外的协议元素(房间邀请, 房间密码, 和房间角色及岗位相关的扩展出席信息); 在'http://jabber.org/protocol/muc#user'名字空间&lt;br /&gt;
&lt;br /&gt;
注意: 这里所有客户端生成的例子是从服务的角度来展示的, 所以所有由服务收到的节都包含一个'from'属性来表达发送者的全JID(这个from属性是由一个通用的Jabber路由或会话管理者加入的). 另外, 通常的表示请求已被完成的 IQ 结果节(如 [[RFC 3920]] [10]中所要求的)未显示在这里.&lt;br /&gt;
&lt;br /&gt;
===进入一个房间===&lt;br /&gt;
&lt;br /&gt;
====Groupchat 1.0协议====&lt;br /&gt;
&lt;br /&gt;
为了参加一个多用户聊天室的讨论, 一个Jabber用户必须(MUST)首先进入一个房间成为一个房客. 在旧的&amp;quot;groupchat 1.0&amp;quot;协议中, 这是通过发送出席信息&amp;lt;room@service/nick&amp;gt;来实现的, 这里&amp;quot;room&amp;quot;是房间的 ID, &amp;quot;service&amp;quot; 是聊天服务的主机名, &amp;quot;nick&amp;quot; 是这个用户在这房间里预期的昵称:&lt;br /&gt;
&lt;br /&gt;
'''例子 16. Jabber用户进入一个房间(Groupchat 1.0)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit/thirdwitch'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子中, 一个全JID为&amp;quot;hag66@shakespeare.lit/pda&amp;quot;的用户请求用昵称&amp;quot;thirdwitch&amp;quot;进入位于&amp;quot;macbeth.shakespeare.lit&amp;quot;聊天服务的房间&amp;quot;darkcave&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
如果用户未指定一个房间昵称, 服务应该(SHOULD)返回一个&amp;lt;jid-malformed/&amp;gt;错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 17. Jabber用户进入一个房间(Groupchat 1.0)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error code='400' type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;jid-malformed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====基本MUC协议====&lt;br /&gt;
&lt;br /&gt;
兼容的多用户聊天服务必须（MUST）接受知道&amp;quot;groupchat 1.0&amp;quot; (GC)协议或multi-user chat (MUC)协议的任何客户端发出上述请求进入会议室; 无论如何, MUC 客户端应该(SHOULD)声明他们的有能力支持 MUC 协议, 方法是在出席信息节里面包含一个空的 &amp;lt;x/&amp;gt; 元素, 满足名字空间 'http://jabber.org/protocol/muc'  (注意不需要 '#user' 部分):&lt;br /&gt;
&lt;br /&gt;
'''例子 18. Jabber用户准备进入一个房间(Multi-User Chat)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from=&amp;quot;hag66@shakespeare.lit/pda&amp;quot;&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 如果发生了一个和加入房间有关的错误, 服务应该 SHOULD 返回一个包含 MUC 子元素 (i.e., &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;) 的 &amp;lt;presence/&amp;gt; 节，其 type 为 &amp;quot;error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
在尝试进入房间之间, 一个兼容MUC的客户端应该(SHOULD)首先查询它的保留的房间昵称 (如果有的话), 接下来的协议本文中的 [[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]] 章节对此作了定义.&lt;br /&gt;
&lt;br /&gt;
====出席信息广播====&lt;br /&gt;
&lt;br /&gt;
如果服务能够添加用户到房间, 它必须(MUST)从所有现存的房客的房间JID发送出席信息给新的房客的全JID, 包括扩展的关于角色的出席信息, 一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;moderator&amp;quot;, &amp;quot;participant&amp;quot;, 或&amp;quot;visitor&amp;quot;, 这个子元素的'affiliation'属性值设为&amp;quot;owner&amp;quot;, &amp;quot;admin&amp;quot;, &amp;quot;member&amp;quot;, 或 &amp;quot;none&amp;quot; 中的一个:&lt;br /&gt;
&lt;br /&gt;
'''例子 19. 服务从现有的房客发送出席信息给新的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个示例中, 用户已从前一个例子进入房间, 有两个人已经在房间里: 一个是昵称为&amp;quot;firstwitch&amp;quot;的(房间拥有者), 另一个是昵称为&amp;quot;secondwitch&amp;quot;的(房间管理员).&lt;br /&gt;
&lt;br /&gt;
服务也必须(MUST)从新进入的房客的房间JID向所有房客的全JID发送出席信息(含新房客):&lt;br /&gt;
&lt;br /&gt;
'''例子 20. 服务发送新房客的出席信息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
在这个例子里, 初始的房间出席信息从新房客(thirdwitch)发送给所有房客, 包括这个新房客自己. 看看上面最后一个节, 由房间以房客的名义发送给用户自己的出席信息,应该 SHOULD 包含一个 110 状态码，这样用户就知道这个出席信息来自于作为房客的那个他自己.&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 重写新房客的房间昵称 (例如, 如果房间昵称被锁定). 如果服务不接受新房客请求的房间昵称，而是分配一个新的房间昵称, 它必须 MUST 包含一个 &amp;quot;210&amp;quot; 状态码在发送给这个新房客的出席信息广播里.&lt;br /&gt;
&lt;br /&gt;
'''例子 21. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
注意: 发送给新房客的出席信息的顺序是很重要的. 服务必须 MUST 首先发送现有房客的完整列表给这个新房客,然后只发送新房客自己的出席信息给新房客. 这有助于客户端知道什么时候它收到了完整的房间名册( &amp;quot;room roster&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
发送出席信息广播之后(并且只在这之后), 服务可以发送讨论历史, 即时消息, 出席信息更新, 以及其他房间内的流量.&lt;br /&gt;
&lt;br /&gt;
====缺省角色====&lt;br /&gt;
&lt;br /&gt;
下表总结了初始缺省的角色，一个服务应该根据用户的岗位来设置它们(没有和 被排斥者 &amp;quot;outcast&amp;quot; 岗位相关的角色, 因为这些用户不允许进入房间).&lt;br /&gt;
&lt;br /&gt;
'''表7: 基于岗位的初始角色'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!房间类型 !!无 !!成员 !!管理员 !!所有者&lt;br /&gt;
|-&lt;br /&gt;
|被主持的 ||游客 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|非主持的 ||与会者 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|仅限会员的 ||N/A * ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|开放的 ||与会者 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 实体不被允许.&lt;br /&gt;
&lt;br /&gt;
====非匿名房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是非匿名的, 服务必须 MUST 发送新房客的全JID给所有房客,使用满足 'http://jabber.org/protocol/muc#user' 名字空间的扩展出席信息,其中带有 &amp;lt;x/&amp;gt; 元素并包含一个 &amp;lt;item/&amp;gt; 子元素,其 'jid' 属性值为这个房客的全JID:&lt;br /&gt;
&lt;br /&gt;
'''例子 22. 服务发送全JID给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这个用户正在进入一个非匿名房间(即, 它如上所示,向所有房客通报每个房客的全JID), 服务应该 SHOULD 允许该用户加入本房间,但是必须 MUST 同时警告该用户本房间是非匿名的. 应该 SHOULD 在房间发送给这个新房客的初始出席信息种包含状态码 &amp;quot;100&amp;quot; 来实现这一点:&lt;br /&gt;
&lt;br /&gt;
'''例子 23. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 也可以 MAY 发送一个 &amp;quot;groupchat&amp;quot; 类型的消息给新房客来达到上述目的,这个消息应该包含一个 &amp;lt;x/&amp;gt; 子元素,并拥有 &amp;lt;status/&amp;gt; 子元素,并且其'code'属性值为&amp;quot;100&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 24. 服务警告新房客(该房间)非匿名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;This room is not anonymous.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
附带的状态码协助客户端展示它们自己的通知消息 (例如, 和用户所在地方有关的信息).&lt;br /&gt;
&lt;br /&gt;
====半匿名房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是半匿名的, 服务必须 MUST 如上文所述从新房客发送出席信息给所有房客, 但是必须 MUST 只在发给&amp;quot;主持人&amp;quot;的时候发送新房客的全JID,而非主持人则不发(全JID).&lt;br /&gt;
&lt;br /&gt;
(注意: 所有随后的例子中，涉及的&amp;lt;item/&amp;gt;元素都带有'jid'属性, 即使这个信息在半匿名房间里不被发送给非主持人.)&lt;br /&gt;
&lt;br /&gt;
====密码保护房间====&lt;br /&gt;
&lt;br /&gt;
如果房间要求密码验证而用户不能提供(或密码错误), 服务必须 MUST 拒绝访问这个房间并且通知该用户它们是未被授权的; 具体方法是返回一个类型为&amp;quot;error&amp;quot;的出席信息节并标明 &amp;lt;not-authorized/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 25. 服务拒绝访问,因为(用户)未提供密码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
密码应该 SHOULD 通过进入房间时发送的出席信息节来提供, 包含在满足 'http://jabber.org/protocol/muc' 名字空间的 &amp;lt;x/&amp;gt; 元素的&amp;lt;password/&amp;gt; 子元素里. 密码以明码方式发送; 目前不支持其它验证方法, 而且任何这类的验证或授权方法都将会定义在一个独立的协议里(参见本文的[[XEP-0045#安全事项|安全事项]]章节).&lt;br /&gt;
&lt;br /&gt;
'''例子 26. 用户进入房间时提供密码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====仅限会员房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限会员的,但用户不是(该房间的)成员, 服务必须 MUST 拒绝访问这个房间并通知用户它们不被允许进入房间; 具体方法是返回一个&amp;quot;error&amp;quot;类型的出席信息节，并包含一个 &amp;lt;registration-required/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 27. 服务拒绝访问，因为用户不在成员列表中'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;registration-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====被禁止的用户====&lt;br /&gt;
&lt;br /&gt;
如果用户已经被房间禁止(即, 其岗位为被排斥者 &amp;quot;outcast&amp;quot;), 服务必须 MUST 拒绝访问这个房间并通知用户他(她)被禁止了; 具体方法是返回一个出席信息节,类型为&amp;quot;error&amp;quot;，标明 &amp;lt;forbidden/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 28. 服务拒绝访问，因为用户被禁止了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====昵称冲突====&lt;br /&gt;
&lt;br /&gt;
如果房间里已经有别的用户使用了准备进入房间的新用户预期的昵称(或如果这个昵称被保留给另一个成员列表里面的用户), 服务必须 MUST 拒绝访问这个房间并通知用户这个冲突; 具体方法是返回一个出席信息节,类型为&amp;quot;error&amp;quot;，标明 &amp;lt;conflict/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 29. 服务拒绝访问，因为昵称冲突'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 如果现有房客的纯 JID &amp;lt;localpart@domain.tld&amp;gt; 和准备进入房间的用户的纯 JID 相同, 那么服务应该 SHOULD 允许这个用户的进入, 所以这个用户就有两个(或更多) 房间内的会话 &amp;quot;sessions&amp;quot; 使用同一个房间昵称, 每一个对应一个资源. 如果一个服务允许相同纯JID可以同时存在多个房客并使用同一个房间的房间昵称, 它应该 SHOULD 路由房间内的消息给该用户的所有资源并允许用户的所有资源发送消息给房间; 视实现而定，服务来决定如何适当的处理从用户的资源发送的出席信息以及如何路由私有消息到所有或某个资源(基于出席信息优先级或其他机制).&lt;br /&gt;
&lt;br /&gt;
如何确定昵称冲突取决于实现(例如, 该服务是否应用于一个特定的惯例, 一个 stringprep 规则如 Resourceprep 或 Nodeprep, 等等).&lt;br /&gt;
&lt;br /&gt;
====最大用户数====&lt;br /&gt;
&lt;br /&gt;
如果房间达到它的最大房客数量, 服务应该 SHOULD 拒绝访问这个房间并通知该用户这个限制; 方法是返回一个出席信息节，类型为&amp;quot;error&amp;quot;，标明 &amp;lt;service-unavailable/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 30. 服务通知用户该房间已达到房客数量极限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='wait'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 房间可以踢出空闲用户(&amp;quot;idle user&amp;quot;)以腾出空间.&lt;br /&gt;
&lt;br /&gt;
如果房间的房客数量已达到最大值但是一个房间管理员或所有者试图进入，该房间应该允许管理员或所有者加入，为了使得额外的房客达到一个合理的数目，该数量可以 MAY 做成可配置的。&lt;br /&gt;
&lt;br /&gt;
====锁住的房间====&lt;br /&gt;
&lt;br /&gt;
如果一个用户尝试进入一个房间而该房间是锁住的 &amp;quot;locked&amp;quot; (即, 在房间创建者提供初始的配置之前以及也就是在房间正式存在之前), 服务必须 MUST 拒绝进入并返回一个 &amp;lt;item-not-found/&amp;gt; 错误给该用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 31. 服务拒绝访问，因为房间不存在'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====不存在的房间====&lt;br /&gt;
&lt;br /&gt;
如果用户准备进入房间时，该房间已经不存在了, 服务应该 SHOULD 建立它; 无论如何, 这不是必需的, 因为一个实现或部署可以 MAY 选择限制建立房间的权限. 详见本文的[[XEP-0045#新建房间|新建房间]]章节.&lt;br /&gt;
&lt;br /&gt;
====房间记录====&lt;br /&gt;
&lt;br /&gt;
如果用户进入一个房间，该房间的讨论是被记录到一个公开的存档里面(经常可以通过HTTP访问的), 服务应该 SHOULD 允许该用户加入该房间但是必须 MUST 同时警告该用户讨论已被记录. 方法是应该 SHOULD 在房间发送给该新房客的初始出席信息中包含一个状态码 &amp;quot;170&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 32. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='170'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====讨论历史====&lt;br /&gt;
&lt;br /&gt;
如上发送完初始出席信息之后, 一个房间可以 MAY 发送讨论历史给这个新房客. (在完成按照本文[[XEP-0045#出席信息广播|出席信息广播]]章节规定的发送房间出席信息之前，该房间不能 MUST NOT 发送任何讨论历史.) 是否这个历史要被发送, 以及这个历史里面包含多少条消息, 将由聊天服务实现或特定的部署来决定.&lt;br /&gt;
&lt;br /&gt;
'''例子 33. 讨论历史的发送'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2002-10-13T23:58:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2002-10-13T23:58:43Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries 'Tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='hag66@shakespeare.lit/pda'&lt;br /&gt;
     stamp='2002-10-13T23:58:49Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
讨论历史消息必须 MUST 标为[http://xmpp.org/extensions/xep-0203.html Delayed Delivery] [[XEP-0045#附录G:备注|11]]信息，满足'urn:xmpp:delay' 名字空间，以表明它们是被延迟发送的并且标明它们最初发出的时间. (注意: 'urn:xmpp:delay' 名字空间定义在 XEP-0203 里面，取代了旧的定义在 [http://xmpp.org/extensions/xep-0091.html Legacy Delayed Delivery] [[XEP-0045#附录G:备注|12]] 里的 'jabber:x:delay' 名字空间 ; XEP-0091状态更改为已过时之前, 实现应该 SHOULD 包含两种日期时间(datetime)格式.). 在非匿名房间里，'from'属性应该 SHOULD 是原始发送者的全JID, 但不能 MUST NOT 在半匿名房间里(在那里'from'属性应该 SHOULD 设置为房间本身的JID). 服务应该 SHOULD 在进入该房间之后，发送任何即时(&amp;quot;live&amp;quot;)消息之前，发送完所有讨论历史消息.&lt;br /&gt;
&lt;br /&gt;
====管理讨论历史====&lt;br /&gt;
&lt;br /&gt;
用户可能 MAY 希望管理进入房间时(由房间)提供的讨论历史(可能因为用户带宽比较低或正在使用迷你客户端). 他必须 MUST 在加入房间时发出的初始出席信息节里包含一个 &amp;lt;history/&amp;gt; 子元素. 这个元素有四个可用的属性:&lt;br /&gt;
&lt;br /&gt;
'''表8: 历史管理属性'''&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!属性 !!数据类型 !!含义&lt;br /&gt;
|-&lt;br /&gt;
| maxchars   ||int    ||限制历史中的字符总数为&amp;quot;X&amp;quot; (这里的字符数量是全部 XML 节的字符数, 不只是它们的 XML 字符数据). &lt;br /&gt;
|-&lt;br /&gt;
| maxstanzas    ||int    ||限制历史中的消息总数为&amp;quot;X&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| seconds   ||int   ||仅发送最后 &amp;quot;X&amp;quot; 秒收到的消息.&lt;br /&gt;
|-&lt;br /&gt;
| since     ||dateTime     ||仅发送从指定日期时间 datetime 之后收到的消息 (这个datatime必须 MUST 符合[http://xmpp.org/extensions/xep-0082.html XMPP Date and Time Profiles] [[XEP-0045#附录G:备注|13]] 定义的DateTime 规则，).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 发送满足以上条件组合的最小数量的消息, 还要顾及服务级别和房间级别的缺省设置. 服务必须 MUST 只发送完整的消息节(即, 它不能 MUST not 按特定字符数把历史从字面上截断, 但是必须 MUST 发送最大数量的完整节,这使得字符数小于或等于 'maxchars' 属性的值). 如果客户端不希望收到历史, 它必须 MUST 把'maxchars' 属性值设为&amp;quot;0&amp;quot; (zero).&lt;br /&gt;
&lt;br /&gt;
以下例子展示如何使用这个协议.&lt;br /&gt;
&lt;br /&gt;
'''例子 34. 用户请求在历史中限制消息数量'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history maxstanzas='20'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 35. 用户请求最后三分钟的历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history seconds='180'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 36. 用户请求从Unix时代到现在的所有历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history since='1970-01-01T00:00:00Z'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务绝对不应该 SHOULD NOT 返回从Unix时代开始到现在的所有消息, 而应该 SHOULD 基于服务或房间的缺省值返回适当的有限数量的历史给用户.&lt;br /&gt;
&lt;br /&gt;
'''例子 37. 用户请求不发送历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history maxchars='0'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===退出一个房间===&lt;br /&gt;
&lt;br /&gt;
为了退出一个多用户聊天房间, 一个房客发送一个类型为&amp;quot;unavailable&amp;quot;的出席信息节给正在使用这个房间的 &amp;lt;room@service/nick&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
'''例子 38. 房客退出一个房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着从要离开的房客的房间JID发送&amp;quot;unavailable&amp;quot;类型的出席信息节给这个要离开的房客的全JID们以及留在房间的房客们:&lt;br /&gt;
&lt;br /&gt;
'''例子 39. 服务发送和离开的房客有关的出席信息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
由房间反射的类型为&amp;quot;unavailable&amp;quot;的出席信息节必须 MUST 包含扩展的关于角色和岗位的出席信息; 'role'属性值应该 SHOULD 被设为 &amp;quot;none&amp;quot; 以表示这个人不再是一个房客了.&lt;br /&gt;
&lt;br /&gt;
房客可以 MAY 在出席信息节包含一个常规的 &amp;lt;status/&amp;gt; 信息; 这使房客能在必要的情况下提供一个自定的退出消息:&lt;br /&gt;
&lt;br /&gt;
'''例子 40. 自定的退出消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
常规的出席信息节生成规则定义在 [[RFC3921|XMPP IM]] [[XEP-0045#附录G;备注|14]], 所以如果用户发送一个一般的不可用出席信息节, 用户的服务器将广播那个节到 &amp;lt;room@service/nick&amp;gt; ，而该用户之前曾经发送过直接出席信息给这个&amp;lt;room@service/nick&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
有可能一个用户不能正常地通过直接发送不可用信息给一个房间来退出该房间. 如果该用户没有发送不可用出席信息就下线了, 用户的服务器负责代替该用户发送不可用出席信息 (依据 RFC 3921). 如果该用户的服务器下线或该用户的服务器和该用户连接的MUC服务失去连接(例如, 在联邦通信), 这个MUC服务负责监视它收到的错误信息节以确定该用户是否下线. 如果该MUC服务确定该用户已下线, 它必须 must 当成该用户自己发送了不可用信息一样地处理这个用户.&lt;br /&gt;
&lt;br /&gt;
注意: 如果房间不是持久的并且该房客是最后一个退出的, 服务负责销毁这个房间.&lt;br /&gt;
&lt;br /&gt;
===更改昵称===&lt;br /&gt;
&lt;br /&gt;
多用户聊天室的一个常用功能是一个房客能修改自己在房间里的昵称. 在 MUC 里这需要发送一个更新出席信息给房间, 具体来说是在相同的房间里发送出席信息给一个新的房间JID (变更的只是这个房间JID的资源).&lt;br /&gt;
&lt;br /&gt;
'''例子 41. 房客修改昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务接着发送两个出席信息节给每个房客的全JID(包括修改自己昵称的房客本身), 一个是类型为&amp;quot;unavailable&amp;quot;的用于旧的昵称另一个指明新昵称可用了.&lt;br /&gt;
&lt;br /&gt;
这个不可用出席信息必须 MUST 在一个满足'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 子元素里面包含以下扩展的出席信息 :&lt;br /&gt;
&lt;br /&gt;
* 新昵称(在这个例子中, nick='oldhag')&lt;br /&gt;
* 一个状态码 303&lt;br /&gt;
&lt;br /&gt;
这使接受者能从旧昵称关联到新昵称.&lt;br /&gt;
&lt;br /&gt;
'''例子 42. 服务更新昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户尝试修改他或她的房间昵称,但这个昵称已经被其他用户使用了 (或者这个昵称是被这房间的其他用户岗位保留的, 例如, 一个成员或者所有者), 服务必须 MUST 拒绝这次昵称修改并通知该用户这一冲突; 也就是返回一个类型为 &amp;quot;error&amp;quot; 的出席信息节指明 &amp;lt;conflict/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 43. 服务拒绝昵称修改，因为昵称冲突'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 如果现有房客的纯JID &amp;lt;localpart@domain.tld&amp;gt; 和尝试变更昵称的房客的纯JID相同, 那么服务可以 MAY 允许昵称变更. 详见本文的[[XEP-0045#昵称冲突|昵称冲突]]章节.&lt;br /&gt;
&lt;br /&gt;
如果该用户尝试变更自己的昵称但是房间昵称被锁定了(&amp;quot;locked down&amp;quot;), 服务必须 MUST 拒绝这个昵称变更请求并返回一个&amp;quot;error&amp;quot;类型的出席信息节，指明一个 &amp;lt;not-acceptable/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 44. 服务拒绝昵称变更，因为房间昵称被锁定'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户应该 SHOULD 接着发现它的保留昵称，如本文的 [[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]]章节所述.&lt;br /&gt;
&lt;br /&gt;
===更改可用性状态===&lt;br /&gt;
&lt;br /&gt;
在一个多用户聊天系统里例如IRC, 一个常用的修改某人房间昵称的行为也意味着变更某人的可用性(例如, 变更某人的房间昵称为&amp;quot;thirdwitch|away&amp;quot;). 在Jabber里面, 可用性当然是通过出席信息 (中 &amp;lt;show/&amp;gt; 和 &amp;lt;status/&amp;gt; 元素)的变更来通知的, 这能提供重要的上下文给聊天室. 一个房客通过发送更新的出席信息给它自己的&amp;lt;room@service/nick&amp;gt;来改变他在房间内的可用性状态.&lt;br /&gt;
&lt;br /&gt;
'''例子 45. 房客变更可用性状态'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'&amp;gt;&lt;br /&gt;
  &amp;lt;show&amp;gt;xa&amp;lt;/show&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务然后从该房客发送一个出席信息节来修改他或她的出席信息给每个房客的全JID, 包含扩展的出席信息，包括这个房客的角色和全JID(给那些有权知道的人):&lt;br /&gt;
&lt;br /&gt;
'''例子 46. 服务传递修改的出席信息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;show&amp;gt;xa&amp;lt;/show&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===邀请其他用户进入一个房间===&lt;br /&gt;
====直接邀请====&lt;br /&gt;
&lt;br /&gt;
一个办法是发送一个直接的邀请(而不是由房间本身来间接邀请),定义在[http://xmpp.org/extensions/xep-0249.html Direct MUC Invitations] [[XEP-0045#附录G:备注|15]]. 直接发送邀请有助于适应被邀请者那一边的通信阻塞(对方可能拒绝和和不在好友名单中的实体通信).&lt;br /&gt;
&lt;br /&gt;
====间接邀请====&lt;br /&gt;
&lt;br /&gt;
邀请别的用户到一个房间成为房客是很有用的. 为了做到这一点, 一个 MUC 客户端必须 MUST 发送以下格式的 XML 给 &amp;lt;room@service&amp;gt; 本身 (原因(reason)是可选的 OPTIONAL 而消息(message)的类型必须 MUST 是显式或隐式的&amp;quot;normal&amp;quot;类型):&lt;br /&gt;
&lt;br /&gt;
'''例子 47. 房客通过房间发送一个邀请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;room@service&amp;gt; 本身必须 MUST 接着增加一个 'from' 地址到 &amp;lt;invite/&amp;gt; 元素，其值为邀请者的纯JID, 全JID, 或房间JID，并发送邀请给 'to' 地址所指明的被邀请者(为了旧的客户端，服务可以 MAY 包含一个消息主体&amp;quot;message body&amp;quot;解释这个邀请或包含一个原因&amp;quot;reason&amp;quot;(子元素); 另外, 房间应该 SHOULD 增加 password 如果该房间是密码保护的):&lt;br /&gt;
&lt;br /&gt;
'''例子 48. 房间代表邀请者发送邀请给被邀请者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限成员的, 服务可以 MAY 同时把这个被邀请者加入成员列表. (注意: 在仅限成员的房间里邀请的权力应该 SHOULD 由房间管理员限定; 如果一个没有权限的成员修改成员列表试图邀请别的用户, 服务应该 SHOULD 返回一个 &amp;lt;forbidden/&amp;gt; 错误给该房客; 详见本文的[[XEP-0045#修改成员列表|修改成员列表]]章节.)&lt;br /&gt;
&lt;br /&gt;
如果邀请者提供了一个不存在的JID, 房间应该 SHOULD 返回一个 &amp;lt;item-not-found/&amp;gt; 错误给邀请者.&lt;br /&gt;
&lt;br /&gt;
被邀请者可以 MAY 选择正式地拒绝 (反之则忽略) 邀请; 这是发送者希望看到的正式的通知. 为了拒绝这个邀请, 被邀请者必须 MUST 发送以下格式的消息给 &amp;lt;room@service&amp;gt; 本身:&lt;br /&gt;
&lt;br /&gt;
'''例子 49. 被邀请者谢绝邀请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='hecate@shakespeare.lit/broom'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;decline to='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Sorry, I'm too busy right now.&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/decline&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 50. 房间通知邀请者邀请被拒绝了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;decline from='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Sorry, I'm too busy right now.&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/decline&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能(有人)想知道为什么被邀请者不直接发送拒绝消息给访问者. 主要原因是特定的实现可能 MAY 选择让邀请基于房间JIDs而不是纯JIDs (所以, 例如, 一个房客可能从一个房间邀请某人到另一个房间而不需要知道这个人的纯JID). 因而服务必须 MUST 同时处理邀请和拒绝.&lt;br /&gt;
&lt;br /&gt;
===把一对一聊天转为多用户会议===&lt;br /&gt;
&lt;br /&gt;
有时候人们需要把一个一对一的聊天转成一个多用户的会议. 以下例子展示了这个流程.&lt;br /&gt;
&lt;br /&gt;
首先, 两个用户开始一个一对一聊天.&lt;br /&gt;
&lt;br /&gt;
'''例子 51. 一个一对一聊天'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在第一个用户决定加入第三个人到这个讨论, 所以她 (或, 更准确地说, 她的客户端) 做以下事情:&lt;br /&gt;
&lt;br /&gt;
# 新建一个多用户聊天室&lt;br /&gt;
# 可选地发送一对一聊天的历史到房间&lt;br /&gt;
# 发送一个邀请给第二个人和第三个人, 包含一个 &amp;lt;continue/&amp;gt; 元素 (可选地包含一个 'thread' 属性).&lt;br /&gt;
&lt;br /&gt;
注意: 新房间应该 SHOULD 是非匿名的, 可以 MAY 是一个即时房间(定义于本文的[[XEP-0045#新建即时房间|新建即时房间]]章节), 也可以 MAY 有一个从服务接收的唯一房间名(定义于本文的[[XEP-0045#请求唯一的房间名|请求唯一的房间名]]章节.&lt;br /&gt;
&lt;br /&gt;
注意: 如果这个一对一的聊天消息包含了一个 &amp;lt;thread/&amp;gt; 元素, 这个新建房间的人应该 SHOULD 在历史消息中包含这个 ThreadID, 在邀请中把这个 ThreadID 的值赋予 &amp;lt;continue/&amp;gt; 元素的 'thread' 属性, 并把这 ThreadID 包含在任何新的消息中发送到房间. ThreadIDs 的使用是推荐的 RECOMMENDED ，因为它帮助提供一对一聊天和多用户聊天的连续性.&lt;br /&gt;
&lt;br /&gt;
'''例子 52. 继续讨论 I: 用户新建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 53. 继续讨论 II: 所有者发送历史到房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2004-09-29T01:54:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2004-09-29T01:55:21Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 使用 Delayed Delivery 协议使房间创建者能够从他一对一聊天历史指明每个消息的日期时间 datetime (通过 'stamp' 属性), 以及每个消息的原始发送者的 JID (通过'from' 属性). 房间创建者应该 SHOULD 在邀请额外的用户到房间之前发送完整的一对一聊天历史, 并且也应该 SHOULD 把第二个人加入该房间之前和第一个人在一对一聊天界面中出现的任何消息当成历史来发送; 如果这个一对一历史特别的大, 发送的客户端可能希望在数秒内发送这个历史而不是一次性发送所有历史(以to 避免触发频率限制). 服务不应该 SHOULD NOT 在从房间所有者接收的历史消息之前添加它自己的延迟元素&amp;quot;delay elements&amp;quot; (见本文的[[XEP-0045#讨论历史|讨论历史]]章节) .&lt;br /&gt;
&lt;br /&gt;
'''例子 54. 继续讨论 III: 所有者发送邀请(们), 包含 Continue 标志'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 当邀请者的客户端一知道和它一对一聊天的那个人的全JID之后, 它就应该 SHOULD 在邀请中包含这个全JID (而不是纯JID).&lt;br /&gt;
&lt;br /&gt;
邀请被递送到被邀请者:&lt;br /&gt;
&lt;br /&gt;
'''例子 55. 邀请被递送'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
    to='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当客户端被 &amp;lt;wiccarocks@shakespeare.lit/laptop&amp;gt; 用来接收邀请, 它应该 SHOULD 自动加入或提示用户是否加入 (取决于用户的选项配置) 并且随后无缝地把现有的一对一聊天窗口转到一个多用户会议的窗口:&lt;br /&gt;
&lt;br /&gt;
'''例子 56. 被邀请者接受邀请, 加入房间, 并接收出席信息和历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/secondwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2004-09-29T01:54:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2004-09-29T01:55:21Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 事实上,这些消息从 &amp;lt;room@service&amp;gt; 本身而不是 &amp;lt;room@service/nick&amp;gt; 发出，告诉这些接收的客户端这些消息是优先的聊天历史, 因为任何来自房客的消息的 'from' 地址应该等于发送者的房间JID.&lt;br /&gt;
&lt;br /&gt;
===房客修改房间标题===&lt;br /&gt;
&lt;br /&gt;
如果房间配置允许, 一个房客可以 MAY 被允许修改一个房间的主题. 详见本文的[[XEP-0045#修改房间主题|修改房间主题]]章节.&lt;br /&gt;
&lt;br /&gt;
===发送私有消息===&lt;br /&gt;
&lt;br /&gt;
因为每个房客有一个唯一的房间JID, 一个房客可以 MAY 发送一个私有消息 &amp;quot;private message&amp;quot; 给选定的房客，即通过服务发送一个消息给那房客的房间JID. 这个消息类型应该 SHOULD 是 &amp;quot;chat&amp;quot; 并且不能 MUST NOT 是 &amp;quot;groupchat&amp;quot;, 但是可以 MAY 不表明 (即, 一个常规&amp;quot;normal&amp;quot;消息). 这个权力应该 SHOULD 被任何房客允许 (甚至在一个被主持的房间里的游客).&lt;br /&gt;
&lt;br /&gt;
'''例子 57. 房客发送私有消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务负责把'from'地址改为发送者的房间JID并递送这个消息到预期的接收者的全JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 58. 接收者接收私有消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者尝试发送一个类型为 &amp;quot;groupchat&amp;quot; 的私有消息给特定的房客, 服务必须 MUST 拒绝递送这个消息 (因为接收者的客户端期望的房间内的消息类型为&amp;quot;groupchat&amp;quot;) 并且返回一个 &amp;lt;bad-request/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 59. 房客尝试发送类型为&amp;quot;Groupchat&amp;quot;的私有消息给特定的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者尝试发送一个私有消息给一个不存在的房间JID, 服务必须 MUST 返回一个 &amp;lt;item-not-found/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
如果发送者不是预期的接收者正在访问的那个房间的房客, 服务必须 MUST 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
===发送消息给所有房客===&lt;br /&gt;
&lt;br /&gt;
房客发送一个消息给所有房间内的房客的方法，是发送一个类型为 &amp;quot;groupchat&amp;quot; 的消息到 &amp;lt;room@service&amp;gt; 本身 (服务可以 MAY 忽略或拒绝类型不是 &amp;quot;groupchat&amp;quot; 的消息). 在一个被主持的房间, 这个权力限于角色为与会者或更高的房客拥有.&lt;br /&gt;
&lt;br /&gt;
'''例子 60. 房客发送一个消息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者在这个房间有发言权 (在被主持的房间里缺省是这样期望), 服务必须 MUST 修改发送者的 'from' 属性成为房间JID并反射这个消息到每个房客的全JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 61. 服务反射消息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者是个游客 即, 在一个被主持的房间里没有发言权), 服务可以 MAY 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者并且不能 MUST NOT 反射这个消息给所有房客. 如果发送者不是该房间的房客, 服务应该 SHOULD 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给发送者并且不应该 SHOULD NOT 反射这个消息给所有房客; 这个规则的唯一的例外是，一个实现可以 MAY 允许用户们拥有特定的权限 (例如, 一个房间拥有者, 房间管理员, 或服务级别的管理员) 发送消息到这个房间，即使那些用户不是房客.&lt;br /&gt;
&lt;br /&gt;
===注册到房间===&lt;br /&gt;
&lt;br /&gt;
一个实现可以 MAY 允许一个无岗位的用户(在一个被主持的房间里, 通常是一个与会者) 注册一个房间从而成为该房间的一个成员 (反之, 一个实现也可以 MAY 限制这个权力并且只允许房间管理员添加新的成员). 特别是, 不在成员列表的人是无法加入一个仅限会员的房间的, 所以为了加入这样一个房间，实体需要申请会籍.&lt;br /&gt;
&lt;br /&gt;
如果允许, 这个功能应该 SHOULD 这样被实现。让用户使用 'jabber:iq:register' 名字空间[[XEP-0077|带内注册]] [[XEP-0045#附录G:备注|16]]提出注册申请给房间,:&lt;br /&gt;
&lt;br /&gt;
'''例子 62. 用户提出注册申请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='reg1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果用户提出的注册申请不被允许注册该房间 (例如, 因为那个权限被限制了), 该房间必须 MUST 返回一个 &amp;lt;not-allowed/&amp;gt; 错误给该用户. 如果该用户已经注册过了, 房间必须 MUST 返回一个类型为&amp;quot;result&amp;quot;的IQ节并包含一个空的&amp;lt;register/&amp;gt;元素(定义于'''XEP-0077'''). 如果该房间不存在, 服务必须 MUST 返回一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
否则, 房间必须 MUST 接着返回一个数据表单&amp;quot;Data Form&amp;quot;给该用户 (定义于[[XEP-0004|数据表单]] [[XEP-0045#附录G:备注|17]]). 注册需要的信息可以 MAY 根据实现和部署的不同而不同并且没有完全定义在本文中 (例如, 本文根据 'http://jabber.org/protocol/muc#register' 名字空间采用的注册字段  FORM_TYPE 可能将来会根据[[XEP-0045#字段标准化|字段标准化]]章节里描述的得到补充，). 以下是一个典型的例子:&lt;br /&gt;
&lt;br /&gt;
'''例子 63. 服务返回注册表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To register on the web, visit http://shakespeare.lit/&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Dark Cave Registration&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
        Please provide the following information&lt;br /&gt;
        to register with this room.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Given Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_first'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Family Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_last'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Desired Nickname'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_roomnick'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Your URL'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_url'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Email Address'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_email'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='FAQ Entry'&lt;br /&gt;
          type='text-multi'&lt;br /&gt;
          var='muc#register_faqentry'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户应该 SHOULD 接着提交这个表单:&lt;br /&gt;
&lt;br /&gt;
'''例子 64. 用户提交注册表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_first'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Brunhilde&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_last'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Entwhistle-Throckmorton&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_roomnick'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_url'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://witchesonline/~hag66/&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_email'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hag66@witchesonline&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_faqentry'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Just another witch.&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果期望的房间昵称已经被那个房间保留, 房间必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 65. 房间返回冲突错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该房间或服务不支持注册, 它必须 MUST 返回一个 &amp;lt;service-unavailable/&amp;gt; 错误给用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 66. 房间返回服务不可用错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果用户没有提交合法的数据表格, 房间必须 MUST 返回一个 &amp;lt;bad-request/&amp;gt; 错误给用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 67. 房间返回&amp;quot;服务错误的请求&amp;quot;错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
否则, 该房间必须 MUST 通知用户注册请求被成功地接收到了:&lt;br /&gt;
&lt;br /&gt;
'''例子 68. 房间通知用户注册请求已经被处理了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户提交表单之后, 服务可以 MAY 向一个房间 管理员/所有者 请求批准该申请 (参见本文的[[XEP-0045#批准注册申请|批准注册申请]]章节) 或也可以 MAY 立刻把该用户的岗位从&amp;quot;none&amp;quot;变更为&amp;quot;member&amp;quot;来添加此用户到成员列表. 如果服务变更了该用户的岗位并且该用户在房间里, 它必须 MUST 从这个用户发送更新的出席信息给所有房客, 声明岗位的变更，这个更新的出席信息应包含一个满足 'http://jabber.org/protocol/muc#user' 名字空间 &amp;lt;x/&amp;gt; 元素并包含一个'affiliation' 属性值设为&amp;quot;member&amp;quot;的 &amp;lt;item/&amp;gt; 子元素.&lt;br /&gt;
&lt;br /&gt;
'''例子 69. 服务发送成员变更通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个用户已经注册到一个房间, 该房间可以 MAY 选择限制这个用户在那个房间仅能使用已注册的昵称. 如果它这样做, 当用户尝试以不同于该用户之前已注册的房间昵称来加入该房间 (这使房间锁定&amp;quot;lock down&amp;quot;房间昵称以保证房客身份的一致性)的时候，它应该 SHOULD 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给该用户.&lt;br /&gt;
&lt;br /&gt;
===获取成员列表===&lt;br /&gt;
&lt;br /&gt;
根据房间配置如果允许的话, 一个房客可以 MAY 被允许接收房间成员的列表. 详见本文的[[XEP-0045#修改成员列表|修改成员列表]]章节.&lt;br /&gt;
&lt;br /&gt;
===发现保留的房间昵称===&lt;br /&gt;
&lt;br /&gt;
一个用户可以 MAY 有一个保留的房间昵称, 例如通过显式的房间注册, 数据库集成, 或昵称锁定 &amp;quot;lockdown&amp;quot;. 用户应该 SHOULD 在尝试进入该房间之前发现自己的保留昵称. 这可以通过发送一个发现服务信息请求并指定一个服务发现节点&amp;quot;x-roomuser-item&amp;quot;给房间JID来做到.&lt;br /&gt;
&lt;br /&gt;
'''例子 70. 用户请求保留的昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='getnick1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='x-roomuser-item'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
对一个多用户聊天服务来说，对上述的服务发现节点的支持是可选的 OPTIONAL . 如果房间或服务不支持上述的服务发现节点, 它必须 MUST 返回一个 &amp;lt;feature-not-implemented/&amp;gt; 错误给用户. 如果它支持这个特性并且该用户有一个已注册的昵称, 它必须 MUST 返回这个昵称给这个用户，方法是发送一个服务发现的&amp;lt;identity/&amp;gt;元素，其'name'属性值为这个昵称 (此处 category/type 应该 SHOULD 是 &amp;quot;conference/text&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
'''例子 71. 房间返回昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='getnick1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='x-roomuser-item'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='thirdwitch'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户没有已注册的昵称, 房间必须 MUST 返回一个空的服务发现 &amp;lt;query/&amp;gt; 元素 (根据 '''XEP-0030''').&lt;br /&gt;
&lt;br /&gt;
即使一个用户已经注册了一个房间昵称, 服务应该 SHOULD 允许该用户在加入该房间时指定一个不同的昵称 (例如, 为了从不同的客户端资源加入), 尽管该服务可以 MAY 选择通过一个 &amp;lt;not-acceptable/&amp;gt; 错误来锁定 &amp;quot;lock down&amp;quot; 昵称并拒绝该用户 . 如果该用户的客户端在加入该房间之后发送上述请求，服务不能 MUST NOT 返回一个错误给该用户, 而应该 SHOULD 返回上文所述.&lt;br /&gt;
&lt;br /&gt;
如果另一个用户尝试以第一个用户保留的房间昵称来加入房间, 服务必须 MUST 拒绝第二个用户并返回一个前文所述的 &amp;lt;conflict/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
===申请发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里游客是不能发言的 (即, 发送一个消息给所有房客). 为了申请发言权, 一个游客应该 SHOULD 发送包含一个数据表格的 &amp;lt;message/&amp;gt; 节给房间本身, 这个数据表格仅仅是一个 'muc#role' 字段，值为 &amp;quot;participant&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 72. 房客申请发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='hag66@shakespeare.lit/pda'&lt;br /&gt;
         to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Requested role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务接着应该 SHOULD 转发这个请求给房间主持人(们) ，定义于本文的[[XEP-0045#批准发言权申请|批准发言权申请]].&lt;br /&gt;
&lt;br /&gt;
==主持人用例==&lt;br /&gt;
&lt;br /&gt;
一个主持人有权在房间里执行特定的动作 (例如, 变更某些房客的角色) 但无权变更岗位的持久信息 (它只能被管理员或所有者) 或定义关于这个房间的信息. 具体哪些动作可由主持人执行，取决于配置. 无论如何, 对于 MUC 框架来说, 主持人被规定有权执行以下动作:&lt;br /&gt;
&lt;br /&gt;
# 在一个半匿名的房间里发现一个房客的全JID(如上文所述缺省会发生)&lt;br /&gt;
# 修改主题&lt;br /&gt;
# 从该房间踢出一个与会者或游客&lt;br /&gt;
# 在一个被主持的房间里授予或撤销发言权&lt;br /&gt;
# 在一个被主持的房间里修改拥有发言权的房客列表&lt;br /&gt;
&lt;br /&gt;
这些特性将通过一个基于 &amp;lt;iq/&amp;gt; 元素的 请求/应答 交换来实现，这个IQ元素包含一个满足 'http://jabber.org/protocol/muc#admin' 名字空间的子元素. 以下例子展示这个协议和实现如何互动达到期望的功能. (以下除非显式地提及, 任何接下来的管理请求必须 MUST 被拒绝,如果该请求的'from'地址 &amp;lt;user@host&amp;gt; 和主持人的纯JID不符的话; 在这种情况下, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误.)&lt;br /&gt;
&lt;br /&gt;
===修改房间主题===&lt;br /&gt;
&lt;br /&gt;
多用户聊天室的一个常用特性是变更房间主题的能力. 缺省地, 一个房间里只有角色为主持人 &amp;quot;moderator&amp;quot; 的用户应该 SHOULD 被允许变更主题 (尽管这应该 SHOULD 是可配置的, 结果是如果需要的话，仅仅与会者或甚至游客都被允许修改主题). 主题变更是通过发送一个类型为 &amp;quot;groupchat&amp;quot; 的消息给 &amp;lt;room@service&amp;gt;来实现的, 在这里 &amp;lt;message/&amp;gt; 必须 MUST 包含一个 &amp;lt;subject/&amp;gt; 元素以指定新的主题，但不应该 SHOULD NOT 包含其他元素 (例如, 不应该有 &amp;lt;body/&amp;gt; 元素或 &amp;lt;thread/&amp;gt; 元素).&lt;br /&gt;
&lt;br /&gt;
'''例子 73. 主持人变更主题'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个 MUC 服务接收到这样一个消息, 它必须 MUST 以发送这个变更主题消息的那个用户的房间JID作为'from'地址来反射这个消息给所有其他房客:&lt;br /&gt;
&lt;br /&gt;
'''例子 74. 服务通知所有房客主题变更'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 当一个新的房客加入房间时，该房间应该 SHOULD 在被发送的讨论历史中包含最后的主题变更.&lt;br /&gt;
&lt;br /&gt;
一个接收到这类信息的 MUC 客户端可以 MAY 选择显示一个房间内的消息, 如下:&lt;br /&gt;
&lt;br /&gt;
'''例子 75. 客户端显式房间主题变更消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
* secondwitch has changed the subject to: Fire Burn and Cauldron Bubble!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一些没有适当权限的人尝试变更房间主题, 服务必须 MUST 返回一个 &amp;quot;error&amp;quot; 类型的消息指明一个 &amp;lt;forbidden/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 76. 服务返回未被授权变更主题的错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
为了移除现有的主题而不是提供一个新主题 (即, 设置主题为空), 客户端应该发送一个空的 &amp;lt;subject/&amp;gt; 元素 (即,  &amp;quot;&amp;lt;subject/&amp;gt;&amp;quot; 或 &amp;quot;&amp;lt;subject&amp;gt;&amp;lt;/subject&amp;gt;&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 77. 主持人设置空的主题'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===踢出房客===&lt;br /&gt;
&lt;br /&gt;
主持人有权从一个房间踢出特定种类的房客 (哪些房客是可被踢的 &amp;quot;kickable&amp;quot; 取决于服务规定, 房间配置, 以及主持人的岗位 -- 见下文). 踢人通常基于房客的房间昵称来执行 (尽管可以 MAY 基于全JID) 并且完全是通过把与会者或游客的角色设为 &amp;quot;none&amp;quot; 来实现的.&lt;br /&gt;
&lt;br /&gt;
'''例子 78. 主持人踢出房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='fluellen@shakespeare.lit/pda'&lt;br /&gt;
    id='kick1'&lt;br /&gt;
    to='harfleur@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='pistol' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Avaunt, you cullion!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 移除被踢的用户，通过发送一个类型为 &amp;quot;unavailable&amp;quot; 的出席信息节给每个被踢的房客, 这个出席信息应在其扩展出席信息中包含状态码 307 , 或(可选地)包含 reason 子元素(如果提供了) 以及踢人的执行者的纯JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 79. 服务移除被踢的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='harfleur@henryv.shakespeare.lit/pistol'&lt;br /&gt;
    to='pistol@shakespeare.lit/harfleur'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='fluellen@shakespeare.lit'/&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Avaunt, you cullion!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='307'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
包含状态码可使客户端能够提交他们自己的通知消息 (例如, 适当的用户位置的信息). 可选的包含原因 reason 元素以及执行者 actor 使得被踢的用户能理解为什么他或她被踢了, 以及被踢的用户可以找谁去理论. [[XEP-0045#附录G:备注|18]]&lt;br /&gt;
&lt;br /&gt;
移除被踢的房客(们)之后, 服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 80. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='harfleur@henryv.shakespeare.lit'&lt;br /&gt;
    id='kick1'&lt;br /&gt;
    to='fluellen@shakespeare.lit/pda'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
通知主持人之后, 服务必须 MUST 接着通知剩余的房客那个被踢的房客已经不在房间里了,即从被踢者的房间昵称(&amp;lt;room@service/nick&amp;gt;)发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给所有剩余的房客 (就像房客自愿退出房间时所做的一样), 包含状态码 status 以及可选的原因 reason 和执行者 actor.&lt;br /&gt;
&lt;br /&gt;
'''例子 81. 服务通知剩余的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='harfleur@henryv.shakespeare.lit/pistol'&lt;br /&gt;
    to='gower@shakespeare.lit/cell'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='307'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个用户不能被比自己岗位低的主持人踢出. 所以, 如果一个身为与会者的主持人尝试踢出一个管理员，或一个身为与会者的主持人或管理员尝试踢出一个所有者, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 82. 服务对于尝试踢出更高岗位的用户返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='kicktest'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='firstwitch' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Be gone!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个主持人尝试踢出他自己, 服务可以 MAY 拒绝这个请求并返回一个 &amp;lt;conflict/&amp;gt; 错误给发送者. (尽管这个踢出自己的行为可能看起来怪异, 它在 IRC 里很常见，用于在房间里为某人的行为道歉.)&lt;br /&gt;
&lt;br /&gt;
===授予游客发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里, 主持人可能希望管理房间内谁有水没有发言权 &amp;quot;voice&amp;quot; (即, 发送消息给所有房客的能力). 发言权的授予是基于游客的房间昵称来的, 服务将从内部把这个房间昵称转成游客的全JID. 主持人通过把游客的角色变更为与会者 &amp;quot;participant&amp;quot;来给一个游客授予权限.&lt;br /&gt;
&lt;br /&gt;
'''例子 83. 主持人授予权限给一个游客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 84. 主持人授予权限给一个游客(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 85. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个人的&amp;lt;room@service/nick&amp;gt;发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'role'属性值为&amp;quot;participant&amp;quot;，指明添加了发言权.&lt;br /&gt;
&lt;br /&gt;
'''例子 86. 服务发送发言权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销与会者发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里, 主持人可能希望撤销一个与会者发言的权力,主持人通过把与会者的角色变更为游客 &amp;quot;visitor&amp;quot;来撤销一个游客的发言权:&lt;br /&gt;
&lt;br /&gt;
'''例子 87. 主持人撤销一个与会者的发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 88. 主持人撤销一个与会者的发言权(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='visitor'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 89. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个人的&amp;lt;room@service/nick&amp;gt;发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'role'属性值为&amp;quot;visitor&amp;quot;，指明移除了发言权.&lt;br /&gt;
&lt;br /&gt;
'''例子 90. 服务通知失去发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个主持人不能 MUST NOT 从一个岗位等于或高于主持人岗位的用户撤销发言权. 另外, 服务不能 MUST NOT 允许一个管理员或所有者的发言权被任何人撤销. 如果一个主持人尝试撤销这些人的发言权, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 的错误给发送者(通过以下的违规条目):&lt;br /&gt;
&lt;br /&gt;
'''例子 91. 服务对于尝试从管理员，所有者或更高岗位的用户撤销权限返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voicetest'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='secondwitch' role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改发言权列表===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里主持人可能希望管理发言权列表. 为了达到这个目的, 主持人首先查询房间所有角色为'participant'的房客列表来请求发言权列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 92. 主持人请求发言权列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='voice3'&lt;br /&gt;
    to='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回发言权列表给主持人; 每个条目必须 MUST 包含 'nick' 和 'role' 属性并且应该 SHOULD 包含 'affiliation' 和 'jid' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 93. 服务发送发言权列表给主持人'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voice3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='polonius@hamlet/castle'&lt;br /&gt;
          nick='Polo'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='horatio@hamlet/castle'&lt;br /&gt;
          nick='horotoro'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
主持人可以 MAY 接着修改发言权列表. 为了达到这个目的, 主持人必须 MUST 发送变更了的条目 (即, 只有 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'nick' 属性和 'role' 属性 (通常设置值为 &amp;quot;participant&amp;quot; 或 &amp;quot;visitor&amp;quot;) 但是不应该 SHOULD NOT 包含 'jid' 属性并且不能 MUST NOT 包含 'affiliation' 属性 (它用于管理如所有者那样的岗位而不是与会者那样的角色):&lt;br /&gt;
&lt;br /&gt;
'''例子 94. 主持人发送修改的发言权列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='voice4'&lt;br /&gt;
    to='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='Hecate'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='rosencrantz'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy fellow.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='guildenstern'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy fellow.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 95. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着为任何受影响的人发送更新的出席信息给所有房客, 如前文的用例所述，发送适当的扩展出席信息来指明发言权的变更.&lt;br /&gt;
&lt;br /&gt;
大家知道, 不能撤销一个房间所有者或管理员的发言权, 也不能撤销比发出请求的主持人岗位高的用户的发言权. 如果一个房间管理员尝试通过修改发言权列表来撤销这类用户的发言权, 服务必须 MUST 拒绝请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 96. 服务返回错误给试图撤销管理员，所有者或比发送者岗位更高的用户的发言权的发送者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voicetest'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===批准发言权申请===&lt;br /&gt;
&lt;br /&gt;
在本文的[[XEP-0045#申请发言权|申请发言权]]章节提到, 当服务接受到一个来自房客的请求，它应该 SHOULD 转发那个请求给房间的主持人(们). 为了达到这个目的, 服务应该 SHOULD 发送一个 &amp;lt;message/&amp;gt; 节给房间主持人(们), 这里 &amp;lt;message/&amp;gt; 节包含一个数据表格data form来批准或拒绝这个申请, 如下所示.&lt;br /&gt;
&lt;br /&gt;
'''例子 97. 申请批准发言权表格''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='crone1@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Voice request&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To approve this request for voice, select &lt;br /&gt;
      the &amp;amp;quot;Grant voice to this person?&amp;amp;quot;&lt;br /&gt;
      checkbox and click OK. To skip this request, &lt;br /&gt;
      click the cancel button.&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Requested role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#jid'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='User ID'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@shakespeare.lit/pda&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#roomnick'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Room Nickname'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#request_allow'&lt;br /&gt;
           type='boolean'&lt;br /&gt;
           label='Grant voice to this person?'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
为了批准这个申请, 主持人将提交此表格:&lt;br /&gt;
&lt;br /&gt;
'''例子 98. 批准发言权申请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='crone1@shakespeare.lit/pda'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#jid'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@shakespeare.lit/pda&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#roomnick'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#request_allow'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果主持人批准了这个发言权申请, 服务将授予发言权给该房客并发送一个出席信息更新，如本文[[XEP-0045#授予游客发言权|授予游客发言权]]章节所述.&lt;br /&gt;
&lt;br /&gt;
==管理员用例==&lt;br /&gt;
&lt;br /&gt;
一个房间管理员有权修改用户岗位的持久信息 (例如, 通过禁止用户) 并授予和撤销主持人权限, 但是无权修改房间的定义, 那是唯一属于房间所有者(们)的权力. 具体哪些动作是管理员可以执行的则取决于配置. 无论如何, 在 MUC 框架中的用途, 规定房间管理员最少拥有执行以下操作的权限:&lt;br /&gt;
&lt;br /&gt;
# 在房间里禁止一个用户&lt;br /&gt;
# 在房间里修改黑名单&lt;br /&gt;
# 授予或撤销成员资格&lt;br /&gt;
# 修改成员列表&lt;br /&gt;
# 授予或撤销主持人权力&lt;br /&gt;
# 修改主持人列表&lt;br /&gt;
&lt;br /&gt;
这些特性将由一个 请求/应答 request/response 式的交换来实现，使用 &amp;lt;iq/&amp;gt; 元素，包含满足 'http://jabber.org/protocol/muc#admin' 名字空间的子元素. 以下例子展示协议如何与实现互动以得到期望的功能. (以下除非显示地声明, 如果发送方的'from'地址中的&amp;lt;user@host&amp;gt;和任何房间管理员的纯JID都不同，接下来的任何管理请求必须 MUST 被拒绝; 这种情况下, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误.)&lt;br /&gt;
&lt;br /&gt;
===禁止用户===&lt;br /&gt;
&lt;br /&gt;
在房间里一个管理员或所有者可以禁止一个或多个用户. 这动作必须 MUST 基于房客的纯JID来执行. 为了禁止一个用户, 管理员必须 MUST 把该用户的岗位改为&amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 99. 管理员禁止用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 100. 管理员禁止用户(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把那个纯JID添加到黑名单, 应该 SHOULD 把被排斥者的昵称从已注册的昵称列表中移除, 并且必须 MUST 通知管理员或所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 101. 服务通知管理员或所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也移除任何还在房间中的被禁止的用户，通过发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给每个被禁止的房客, 在扩展的出席信息中包含一个状态码 301 , 可选地带上 reason (如果服务提供的话) 以及执行这个禁止动作的用户的纯JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 102. 服务移除被禁止的用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='southampton@henryv.shakespeare.lit/cambridge'&lt;br /&gt;
    to='earlofcambridge@shakespeare.lit/stabber'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='kinghenryv@shakespeare.lit'/&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='301'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
包含状态码可使客户端能够提交他们自己的通知消息 (例如, 适当的用户位置的信息). 可选的包含原因 reason 元素以及执行者 actor 使得被踢的用户能理解为什么他或她被踢了, 以及被踢的用户可以找谁去理论.&lt;br /&gt;
&lt;br /&gt;
通知主持人之后, 服务必须 MUST 接着通知剩余的房客那个被禁止的房客已经不在房间里了,即从被禁止用户发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给所有剩余的房客 (就像房客自愿退出房间时所做的一样), 包含状态码 status 以及可选的原因 reason 和执行者 actor. &lt;br /&gt;
&lt;br /&gt;
'''例子 103. 服务通知剩余的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    type='unavailable'&lt;br /&gt;
    from='southampton@henryv.shakespeare.lit/cambridge'&lt;br /&gt;
    to='exeter@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit/stabber'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='301'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
就像[[XEP-0045#踢出房客|踢出房客]]一样, 一个用户不能被自己岗位低的管理员禁止. 所以, 如果一个管理员尝试禁止一个所有者， 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者: &lt;br /&gt;
&lt;br /&gt;
'''例子 104. 服务对尝试禁止更高岗位用户返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个管理员或所有者尝试禁止他自己, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;conflict/&amp;gt; 错误给发送者. (注意:这和踢出自己时推荐的服务行为不同, 踢自己的行为服务是允许的.)&lt;br /&gt;
&lt;br /&gt;
===修改黑名单===&lt;br /&gt;
&lt;br /&gt;
房间管理员可能希望修改黑名单. 注意: 黑名单总是基于用户的纯JID. 要修改黑名单, 管理员首先向房间查询所有岗位为'outcast'的用户以得到黑名单.&lt;br /&gt;
&lt;br /&gt;
'''例子 105. 管理员请求黑名单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban2'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回黑名单给管理员; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性但不应该 SHOULD NOT 包含 'nick' 和 'role' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 106. 服务发送黑名单给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban2'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改黑名单. 为此, 管理员必须 MUST 发送变更的条目 (即, 仅是 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'affiliation' 属性 (通常设为&amp;quot;outcast&amp;quot;来禁止或&amp;quot;none&amp;quot;来取消禁止) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用来管理角色，例如与会者，而不是被排斥者岗位); 另外, reason 和 actor 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 107. 管理员发送修改的黑名单给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban3'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&amp;gt;&lt;br /&gt;
          jid='lordscroop@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='sirthomasgrey@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更新黑名单之后, 服务必须 MUST 通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 108. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban3'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着移除受影响的房客 (如果他们在房间里) 并从他们发送更新的出席信息 (包含适当的状态码) 给所有剩余的房客，如 &amp;quot;禁止用户&amp;quot; 用例所述. (服务应该 SHOULD 也移除从保留房间昵称列表中移除每个被禁止的用户的保留昵称, 如果必要.)&lt;br /&gt;
&lt;br /&gt;
当一个实体被一个房间禁止, 实现应该 SHOULD 按以下顺序匹配 JIDs (这些匹配规则和'''RFC 3921'''中定义的隐私列表的匹配规则是相同的):&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;user@domain/resource&amp;gt; (仅匹配特定的资源)&lt;br /&gt;
# &amp;lt;user@domain&amp;gt; (匹配任何资源)&lt;br /&gt;
# &amp;lt;domain/resource&amp;gt; (仅匹配特定资源)&lt;br /&gt;
# &amp;lt;domain&amp;gt; (匹配域名本身, 就像任何 user@domain 或 domain/resource 一样)&lt;br /&gt;
&lt;br /&gt;
一些管理员可能希望在一个 MUC 服务中的所有房间里禁止所有和特定域名相关的用户. 这个功能是一个服务级的特性，所以超过了本文的范围, 它定义在 '''XEP-0133'''里.&lt;br /&gt;
&lt;br /&gt;
===授予成员资格===&lt;br /&gt;
&lt;br /&gt;
管理员可以授予成员资格给一个用户; 方法是把用户的岗位改为 &amp;quot;member&amp;quot; (通常如果用户在房间里，基于昵称，如果用户不在房间里，则基于纯JID; 在这两种情况下如果提供了昵称, 那么这个昵称就是用户在这个房间的缺省昵称，如果实现支持那个功能的话):&lt;br /&gt;
&lt;br /&gt;
'''例子 109. 管理员授予成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 110. 管理员授予成员资格(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把这个用户添加到成员列表，然后通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 111. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;member&amp;quot;，指明授予了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 112. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间里, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 在这个消息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;member&amp;quot;，指明授予了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 113. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销成员资格===&lt;br /&gt;
&lt;br /&gt;
一个管理员可能想撤销一个用户的成员资格; 通过把该用户的岗位改为&amp;quot;none&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 114. 管理员撤销成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 115. 管理员撤销成员资格(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 从成员列表中移除该用户然后通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 116. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个用户的名义发送更新的出席信息节给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;none&amp;quot;，指明失去了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 117. 服务通知失去成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限会员的, 服务必须 MUST 从房间移除这个用户, 包含一个状态码 321 来指明用户被移除是因为岗位变更, 并通知所有剩余的房客:&lt;br /&gt;
&lt;br /&gt;
'''例子 118. 服务移除非会员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='321'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='321'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改成员列表===&lt;br /&gt;
&lt;br /&gt;
在一个仅限会员的房间的上下文里, 成员列表本质上是一个允许人们加入房间的白名单 &amp;quot;whitelist&amp;quot;. 任何不是成员的人等于是被禁止加入该房间, 即使他们的岗位不是&amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
在一个开放房间的上下文里, 成员列表只是一个注册了这个房间的用户 (纯JID和保留的昵称) 的列表. 这些用户可以出现在一个房间名册里, 有他们自己的保留房间昵称, 在搜索结果或类似FAQ里被返回给(查询者).&lt;br /&gt;
&lt;br /&gt;
推荐 RECOMMENDED 在仅限会员的房间里只让房间管理员拥有修改成员列表的权力. 为此, 管理员首先请求成员列表，通过查询房间里所有岗位为&amp;quot;member&amp;quot;的用户来实现:&lt;br /&gt;
&lt;br /&gt;
'''例子 119. 管理员请求成员列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 在一个仅限会员的房间里，服务也应该 SHOULD 返回成员列表给任何房客; 即, 当一个房间的成员请求房间列表时，它不应该 SHOULD NOT 生成一个 &amp;lt;forbidden/&amp;gt; 错误. 这个功能可帮助客户端展示所有现有的成员，即使他们中的一些人不在房间里, 例如. 帮助成员确定是否另一个用户应该被邀请. 服务也应该 SHOULD 允许任何成员接收成员列表，即使还不是一个房客（译注：即未进入房间）.&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回全部的成员列表给管理员，遵循 'http://jabber.org/protocol/muc#admin' 名字空间; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，每个正在房间里的成员可以 MAY 包含 'nick' 和 'role' 属性.&lt;br /&gt;
&lt;br /&gt;
'''例子 120. 服务发送成员列表给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member3'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改成员列表. 为此, 管理员必须 MUST 发送变更的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'affiliation' 属性(通常值设为 &amp;quot;member&amp;quot; 或 &amp;quot;none&amp;quot;) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，并且不能 MUST NOT 包含 'role' 属性(它是用来管理角色的，例如与会者，而不是成员的岗位):&lt;br /&gt;
&lt;br /&gt;
'''例子 121. 管理员发送修改的成员列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 修改成员列表然后通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 122. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 变更任何受影响的用户的岗位. 如果该用户已经从成员列表中移除了, 服务必须 MUST 把该用户的岗位从 &amp;quot;member&amp;quot; 变更为 &amp;quot;none&amp;quot;. 如果该用户已经被加入到成员列表, 服务必须 MUST 把该用户的岗位改成 &amp;quot;member&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
如果一个被移除的成员正在一个仅限会员的房间, 服务应该 SHOULD 踢出这个房客，如前文所述，通过把被移除的成员的角色改成 &amp;quot;none&amp;quot; 并发送适当的出席信息给这个被移除的成员来实现. 无论是否被移除的那个用户在或不在一个仅限会员的房间里, 服务必须 MUST 随后拒绝这个用户的进入.&lt;br /&gt;
&lt;br /&gt;
对所有的房间类型来说, 服务必须 MUST 以这个用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'affiliation'属性值设为&amp;quot;none&amp;quot;,以指明这个岗位的变更.&lt;br /&gt;
&lt;br /&gt;
'''例子 123. 服务发送失去成员资格的通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 服务必须 SHOULD 发送一个邀请给任何已加入到仅限会员的房间里的成员名单中的用户，如果该用户目前在该房间还没有岗位, 例如作为一个管理员或所有者(这类用户在定义时不在房间里; 同时要注意这个例子里使用了一个密码password而不是原因reason -- 这两个子元素都是可选的 OPTIONAL):&lt;br /&gt;
&lt;br /&gt;
'''例子 124. 房间发送邀请给新成员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
因为只有管理员们和所有者们应该 SHOULD 被允许修改成员列表, 一个实现可以 MAY 提供一个配置选项，在仅限会员的房间里开放邀请权限给任何成员. 这种情况下, 任何被发送的邀请都应该 SHOULD 自动触发被邀请者加入成员列表. 无论如何, 如果邀请权限被限于管理员们，而普通成员尝试发送邀请, 服务必须 MUST 拒绝这个邀请的的请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 125. 服务在普通成员尝试邀请其他人加入仅限会员的房间时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从开放房间发送的邀请不能 MUST NOT 触发被邀请者加入成员列表.&lt;br /&gt;
&lt;br /&gt;
如果一个用户被加入一个开放房间的成员列表并且该用户在该房间内, 服务必须 MUST 以该用户的名义发送更新的出席信息给所有房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'affiliation'属性值设为&amp;quot;member&amp;quot;,以指明这个岗位的变更.&lt;br /&gt;
&lt;br /&gt;
'''例子 126. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/hecate'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===授予主持人权限===&lt;br /&gt;
&lt;br /&gt;
管理员可能想授予主持人权限给一个与会者或游客; 通过把用户的角色改为 &amp;quot;moderator&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 127. 管理员授予主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 128. 管理员授予主持人权限(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='moderator'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 添加这个用户到主持人列表然后通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 129. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以该用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;moderator&amp;quot;,以指明添加了主持人权限.&lt;br /&gt;
&lt;br /&gt;
'''例子 130. 服务发送主持人权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销主持人权限===&lt;br /&gt;
&lt;br /&gt;
管理员可能想撤销用户的主持人权限. 一个管理员只可以 MAY 撤销岗位为&amp;quot;member&amp;quot; 或 &amp;quot;none&amp;quot; (也就是, 非管理员和所有者)的用户的主持人权限. 权限的撤销是通过把用户的角色改为 &amp;quot;participant&amp;quot;实现的:&lt;br /&gt;
&lt;br /&gt;
'''例子 131. 管理员撤销主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 132. 管理员撤销主持人权限(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 从主持人列表移除这个用户然后通知管理员成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 133. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以该用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user'  名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;participant&amp;quot;,以指明移除了主持人权限. &lt;br /&gt;
&lt;br /&gt;
'''例子 134. 服务通知失去了主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
大家知道, 管理员不 MUST NOT 被允许从岗位为 &amp;quot;owner&amp;quot; 或 &amp;quot;admin&amp;quot;的用户撤销主持人权限. 如果一个管理员尝试撤销这类用户的权限, 服务必须MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 135. 服务在用户尝试撤销管理员或所有者的主持人权限时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='modtest'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='secondwitch' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改主持人列表===&lt;br /&gt;
&lt;br /&gt;
管理员可能希望修改主持人列表. 为此, 管理员首先通过请求房间内所有角色为'moderator'的用户来请求主持人列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 136. 管理员请求主持人列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回主持人列表给管理员; 每个条目必须 MUST 包含 'jid', 'nick', 'role' 属性并应该 SHOULD 包含 'affiliation' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 137. 服务发送主持人列表给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod3'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改主持人列表. 为此, 管理员必须 MUST发送修改的条目(即, 仅&amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'jid' 属性和'role' 属性(通常值设为 &amp;quot;member&amp;quot; 或 &amp;quot;participant&amp;quot;) 但不应该 SHOULD NOT 包含 'nick' 属性并且不能 MUST NOT 包含 'affiliation' 属性(它被用于管理类似管理员这样的岗位而不是主持人这样的角色):&lt;br /&gt;
&lt;br /&gt;
'''例子 138. 管理员发送修改了的主持人列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 修改主持人列表并通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 139. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 随后以所有受影响的用户发送更新的出席信息给所有的房客, 支出主持人权限的变更，通过发送前面用例所述的适当的扩展出席信息.&lt;br /&gt;
&lt;br /&gt;
显然, 房间所有者或房间管理员的主持人权限不能被撤销. 如果一个房间管理员尝试通过修改主持人列表来撤销这类用户的主持人权限, 服务必须 MUST 拒绝请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 140. 服务在用户尝试撤销管理员或所有者的主持人权限时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='modtest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===批准注册申请===&lt;br /&gt;
&lt;br /&gt;
如果一个服务不自动接受注册到房间的请求, 它可以 MAY 为房间管理员提供一个方法来批准或拒绝来自 Jabber 的注册请求(替代方案是, 它可能提供一个 web 接口或一些其他管理工具). 对这个服务来说，最简单的办法就是，当接收到注册请求时发送一个 &amp;lt;message/&amp;gt; 节给房间管理员(们), 这里的&amp;lt;message/&amp;gt; 节包含一个数据表格 Data Form asking 用来询问管理员是否批准用户的注册申请. 推荐 RECOMMENDED 以下数据表格 Data Form，但是实现可以 MAY 使用完全不同的表格, 或or 在下面的表格基础上补充字段.&lt;br /&gt;
&lt;br /&gt;
'''例子 141. 注册申请批准表格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='crone1@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Registration request&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To approve this registration request, select the&lt;br /&gt;
      &amp;amp;quot;Allow this person to register with the room?&amp;amp;quot;&lt;br /&gt;
      checkbox and click OK. To skip this request, click the &lt;br /&gt;
      cancel button.&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_first'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Given Name'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Brunhilde&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_last'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Family Name&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Entwhistle-Throckmorton&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_roomnick'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Desired Nickname&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_url'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;User URL&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;http://witchesonline/~hag66/&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_email'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Email Address&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@witchesonline&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_faqentry'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;FAQ Entry&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Just another witch.&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_allow'&lt;br /&gt;
           type='boolean'&lt;br /&gt;
           label='Allow this person to register with the room?'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果管理员批准了注册申请, 服务将把该用户注册到房间.&lt;br /&gt;
&lt;br /&gt;
更多高级的批准机制(例如, 使用特定命令[http://xmpp.org/extensions/xep-0050.html Ad-Hoc Commands] [[XEP-0045#附录G:备注|19]]来接收注册申请列表,就像 [http://xmpp.org/extensions/xep-0060.html Publish-Subscribe] [[XEP-0045#附录G:备注|20]]里所做的一样) 超出了本文的范围.&lt;br /&gt;
&lt;br /&gt;
==所有者用例==&lt;br /&gt;
&lt;br /&gt;
每个房间必须 MUST 至少有一个所有者, 而所有者(或一个成功者)在一个房间的生命周期里是这个房间长期存在的属性(例如, 所有者在退出一个持久性的房间时不会失去所有权). 本文假定(初始的) 房间所有者是那个新建了该房间的用户并且有一个房间所有者有权修改房间配置选项的定义，例如房间类型. 理想情况下, 房间所有者不仅能指定房间类型(密码保护的, 仅限会员的, 等等) 而且包括如本文的 [XEP-0045#需求|需求]章节所述的房间特定属性. 另外, 如果所有者能指定其他所有者们的JID也是不错的, 但那将取决于具体实现.&lt;br /&gt;
&lt;br /&gt;
为了让配置选项更加广泛提供必要的伸缩性, 房间配置将使用 Data Forms ('''XEP-0004'''), 通过使用由 'http://jabber.org/protocol/muc' 名字空间触发. 也就是, 如果一个实体在它请求加入房间的 join/request 里不包含 MUC 名字空间, 那么服务将立刻新建房间，在新建房间之前不等待通过数据表格进行配置(这保证了和旧的&amp;quot;groupchat 1.0&amp;quot;协议的向后兼容); 无论如何, 如果房间的 join/create 请求包含了 MUC 扩展, 那么服务在新建和解锁该房间之前将通过数据表格请求配置.&lt;br /&gt;
&lt;br /&gt;
注意: 以下展示的配置选项列出了本文的需求章节的所有特性和房间类型; 无论如何, 实际的配置选项和表格布局将取决于实现和具体的布署. 而且, 这些只是例子，不代表这些就是房间可以拥有的所有允许或需要的配置选项. 一个特定的实现或布署可以 MAY 选择提供额外的配置选项(敏感词过滤, 设置房间的缺省语言, 消息记录, 等等), 这就是为什么在这里使用 'jabber:x:data' 协议是很有价值的.&lt;br /&gt;
&lt;br /&gt;
===新建房间===&lt;br /&gt;
====一般注意事项====&lt;br /&gt;
&lt;br /&gt;
新建房间的权限可以 MAY 限制在特定的用户群或可以 MAY 保留给一个服务级别的管理员. 如果访问被拒绝而一个用户试图新建一个房间, 服务必须MUST 返回一个 &amp;lt;not-allowed/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 142. 服务通知用户不能新建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果访问不限制, 服务必须 MUST 允许用户按以下步骤新建房间.&lt;br /&gt;
&lt;br /&gt;
从房间创建的视角来看, 本质上有两种房间:&lt;br /&gt;
&lt;br /&gt;
* 即时房间&amp;quot;Instant rooms&amp;quot; -- 可以立刻访问并基于某些缺省配置自动创建.&lt;br /&gt;
* 保留房间&amp;quot;Reserved rooms&amp;quot; -- 在任何人访问之前由房间配置者手动创建.&lt;br /&gt;
&lt;br /&gt;
新建和配置这些房间的流程如下:&lt;br /&gt;
&lt;br /&gt;
# 用户必须 MUST 发送出席信息到 &amp;lt;room@service/nick&amp;gt; 并声明他或她对MUC协议的支持，通过包含一个扩展的出席信息,并包含在一个空的满足'http://jabber.org/protocol/muc'名字空间的 &amp;lt;x/&amp;gt; 子元素里(注意这里不包含 '#owner' 或 '#user' 后缀).&lt;br /&gt;
# 如果用户被允许新建房间并且房间还不存在, 服务必须 MUST 根据一些缺省配置新建此房间, 指定请求的用户成为初始的房间拥有者, 并增加这个拥有者到该房间但不允许任何别的用户进入该房间(有效地锁定 &amp;quot;locking&amp;quot;该房间). 从房间发送由所有者收到的初始的出席信息节必须 MUST 包含扩展的出席信息以指出该用户的状态为一个所有者并承认房间已经被创建了(通过状态码 201) 并等待配置.&lt;br /&gt;
# 如果初始的房间所有者想新建和配置一个保留房间, 房间所有者必须 MUST 接着请求一个配置，通过发送类型为&amp;quot;get&amp;quot;的IQ节并包含一个空的满足'http://jabber.org/protocol/muc#owner'名字空间的&amp;lt;query/&amp;gt;元素给该房间 ,然后完成第4和第5步. 如果房间所有者喜欢新建一个即时房间, 该房间所有者必须 MUST 发送一个遵循'http://jabber.org/protocol/muc#owner'名字空间的 query 元素并包含一个遵循 'jabber:x:data' 名字空间的空的类型为 &amp;quot;submit&amp;quot; 的 &amp;lt;x/&amp;gt; 元素, 然后跳到第6步.&lt;br /&gt;
# 如果房间所有者请求了一个配置表格, 服务必须 MUST 发送一个包含配置表格并遵循 'jabber:x:data'名字空间的 IQ 给房间拥有者. 如果没有配置选项可用, 房间必须 MUST 返回一个空的 query 元素给房间所有者.&lt;br /&gt;
# 初始的房间所有者应该 SHOULD 为该房间提供一个开始的配置(或接受缺省配置)，通过发送&amp;quot;set&amp;quot;类型并包含完整的配置表格的 IQ . 另外, 房间所有者可以 MAY 取消配置过程. (实现可以 MAY 设置一个初始化配置的超时, 这样如果房间所有者再给定的超时时间内不配置房间, 房间所有者就被假定已经接受了缺省得配置或取消了配置过程.)&lt;br /&gt;
# 一旦服务从初始房间所有者接收了完整的配置表格(或接收到了一个即时房间的请求), 服务必须 MUST 解锁 &amp;quot;unlock&amp;quot; 这个房间 (即, 允许其他用户进入此房间) 并发送&amp;quot;result&amp;quot;类型的 IQ  给房间所有者. 如果服务接收到了取消（指令）, 它必须 MUST 销毁这个房间.&lt;br /&gt;
&lt;br /&gt;
以下例子展示了这个协议流程.&lt;br /&gt;
&lt;br /&gt;
首先, Jabber用户必须 MUST 发送出席信息给房间, 包含空的 &amp;lt;x/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc' 名字空间(当他寻求进入一个房间时也发送和这同样的节).&lt;br /&gt;
&lt;br /&gt;
'''例子 143. Jabber用户新建一个房间并声明对多用户聊天的支持'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该房间不存在, 服务应该 SHOULD 新建这个房间(取决于关于新建房间的本地策略), 指定发出请求的用户的纯JID成为所有者, 添加这个所有者到房间, 并通过发送以下格式的出席信息节承认房间新建成功:&lt;br /&gt;
&lt;br /&gt;
'''例子 144. 服务承认房间新建成功'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='201'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接收到该房间已经创建的通知之后, 房间所有者需要决定是否接受缺省的房间配置(即, 新建一个即时房间 &amp;quot;instant room&amp;quot;) 还是做一些不同于缺省房间设置的配置 (即, 新建一个保留房间&amp;quot;reserved room&amp;quot;). 完成这两个用例的协议流程展示如下.&lt;br /&gt;
&lt;br /&gt;
注意: 如果如上的发送到一个不存在的房间里的出席信息节没有包含一个遵循 'http://jabber.org/protocol/muc'名字空间的 &amp;lt;x/&amp;gt; 元素, 服务应该SHOULD 立刻新建一个缺省的房间(即, 它必须 MUST 假定客户端支持 &amp;quot;groupchat 1.0&amp;quot; 而不是 Multi-User Chat, 所以在等待房间创建者决定是创建即时房间还是保留房间的时候,它不能 MUST NOT 锁定这个房间).&lt;br /&gt;
&lt;br /&gt;
====新建即时房间====&lt;br /&gt;
&lt;br /&gt;
如果初始的房间所有者想接受缺省的房间配置(即, 新建一个即时房间&amp;quot;instant room&amp;quot;), 房间所有者必须 MUST 拒绝初始配置表格,通过发送一个 IQ set 给 &amp;lt;room@service&amp;gt; 本身,包含一个遵循'http://jabber.org/protocol/muc#owner'名字空间的 &amp;lt;query/&amp;gt; 元素, 这里 &amp;lt;query/&amp;gt; 的唯一子元素是一个空的遵循'jabber:x:data'名字空间的 &amp;lt;x/&amp;gt; 元素并且拥有一个 'type'属性值为 &amp;quot;submit&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 145. 所有者请求即时房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着解锁该房间并允许其他实体加入它.&lt;br /&gt;
&lt;br /&gt;
====新建保留房间====&lt;br /&gt;
&lt;br /&gt;
如果初始的房间所有者想新建并配置一个保留房间, 这个房间所有者必须 MUST 请求初始配置表格,通过发送一个 IQ get 给 &amp;lt;room@service&amp;gt; 本身,包含一个空的遵循 'http://jabber.org/protocol/muc#owner' 名字空间的 &amp;lt;query/&amp;gt; 元素 :&lt;br /&gt;
&lt;br /&gt;
'''例子 146. 所有者请求配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间还不存在, 服务必须 MUST 返回一个初始的房间配置表单给该用户. (注意: 以下例子展示一个配置选项的典型例子. 已登记用于房间创建和配置的所有 x:data 字段列表由 XMPP Registrar 维护; 参见本文的 [[XEP-0045#XMPP注册项事项|XMPP注册项事项]] 章节.)&lt;br /&gt;
&lt;br /&gt;
'''例子 147. 服务发送配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Configuration for &amp;quot;darkcave&amp;quot; Room&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
          Your room darkcave@macbeth has been created!&lt;br /&gt;
          The default configuration is as follows:&lt;br /&gt;
            - No logging&lt;br /&gt;
            - No moderation&lt;br /&gt;
            - Up to 20 occupants&lt;br /&gt;
            - No password required&lt;br /&gt;
            - No invitation required&lt;br /&gt;
            - Room is not persistent&lt;br /&gt;
            - Only admins may change the subject&lt;br /&gt;
            - Presence broadcasted for all users&lt;br /&gt;
          To accept the default configuration, click OK. To&lt;br /&gt;
          select a different configuration, please complete&lt;br /&gt;
          this form.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural-Language Room Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomname'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Short Description of Room'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomdesc'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural Language for Room Discussions'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_lang'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Enable Public Logging?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Change Subject?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Invite Others?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Maximum Number of Occupants'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='10'&amp;gt;&amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='20'&amp;gt;&amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='30'&amp;gt;&amp;lt;value&amp;gt;30&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='50'&amp;gt;&amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='100'&amp;gt;&amp;lt;value&amp;gt;100&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='None'&amp;gt;&amp;lt;value&amp;gt;none&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles for which Presence is Broadcast'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_presencebroadcast'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles and Affiliations that May Retrieve Member List'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_getmemberlist'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Publicly Searchable?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Persistent?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Moderated?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Members-Only?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password Required to Enter?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          If a password is required to enter this room,&lt;br /&gt;
          you must specify the password below.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password'&lt;br /&gt;
          type='text-private'&lt;br /&gt;
          var='muc#roomconfig_roomsecret'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Who May Discover Real JIDs?'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderators Only'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Anyone'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;anyone&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional people who have&lt;br /&gt;
          administrative privileges in the room. Please&lt;br /&gt;
          provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Admins'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomadmins'/&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional owners for this&lt;br /&gt;
          room. Please provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Owners'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomowners'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: _whois 配置选项指定该房间是非匿名的(值为 &amp;quot;anyone&amp;quot;), 半匿名的(值为&amp;quot;moderators&amp;quot;), 还是全匿名的(值为&amp;quot;none&amp;quot;, 不显示在这).&lt;br /&gt;
&lt;br /&gt;
如果没有配置选项可用, 服务必须 MUST 返回空的 query 元素给房间所有者:&lt;br /&gt;
&lt;br /&gt;
'''例子 148. 服务通知所有者没有配置可用'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间所有者应该 SHOULD 接着填好表单并提交给服务.&lt;br /&gt;
&lt;br /&gt;
'''例子 149. 所有者提交配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomname'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;A Dark Cave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomdesc'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomsecret'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;cauldronburn&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomadmins'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;wiccarocks@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hecate@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间创建成功, 服务必须 MUST 通知新的房间所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 150. 服务通知新房间所有者成功'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果因为指定的房间配置违反了一个或多个服务策略而导致房间创建失败 (例如, 因为密码保护房间的密码为空), 服务必须 MUST 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
'''例子 151. 服务通知所有者请求的配置选项不被接受'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一方面, 房间所有者可以 MAY 取消配置过程:&lt;br /&gt;
&lt;br /&gt;
'''例子 152. 所有者取消初始的配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='cancel'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间所有者取消了初始的房间配置, 服务应该 SHOULD 销毁房间, 确保发送不可用出席信息给房间所有者 (详见 &amp;quot;销毁房间&amp;quot; 用例).&lt;br /&gt;
&lt;br /&gt;
如果房间所有者在提交表单之前因为任何原因下线了(例如, 失去连接), 服务将接收到一个类型为 &amp;quot;unavailable&amp;quot; 的出席信息节，从所有者到所有者的 &amp;lt;room@service/nick&amp;gt; 或到 &amp;lt;room@service&amp;gt; (或两者). 服务必须 MUST 接着销毁这个房间, 发送一个 &amp;quot;unavailable&amp;quot; 类型的出席信息节，从房间到所有者，包含一个 &amp;lt;destroy/&amp;gt; 元素以及 reason (子元素)(如果提供了) ，参见本文的 [[XEP-0045#销毁房间|销毁房间]]章节.&lt;br /&gt;
&lt;br /&gt;
====申请唯一房间名====&lt;br /&gt;
&lt;br /&gt;
在一些场合 (例如, 当 [[XEP-0045#把一对一聊天转为多用户会议|把一对一聊天转为会议]]), 房间创建者可能想在尝试新建房间之前请求一个唯一的房间名 (例如, 避免可能的房间冲突). 为此, 服务可以 MAY 如本章所述支持这个特性. (如果服务支持这个特性, 它必须 MUST 在对服务发现信息请求应答时返回一个 &amp;quot;http://jabber.org/protocol/muc#unique&amp;quot; 特性.)&lt;br /&gt;
&lt;br /&gt;
房间创建者通过发送一个 IQ-get 给服务本身来请求唯一房间名, 这个IQ节中包含一个空的 &amp;lt;unique/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc#unique' 名字空间:&lt;br /&gt;
&lt;br /&gt;
'''例子 153. 实体请求唯一房间名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='unique1'&lt;br /&gt;
    to='chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;unique xmlns='http://jabber.org/protocol/muc#unique'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果服务支持这个特性, 它应该 SHOULD 以 XML 字符数据的方式返回一个唯一房间名，包含一个 &amp;lt;unique/&amp;gt; 元素 (但不创建该房间):&lt;br /&gt;
&lt;br /&gt;
'''例子 154. 服务返回唯一房间名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='chat.shakespeare.lit'&lt;br /&gt;
    id='unique1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;unique xmlns='http://jabber.org/protocol/muc#unique'&amp;gt;&lt;br /&gt;
    6d9423a55f499b29ad20bf7b2bdea4f4b885ead1&lt;br /&gt;
  &amp;lt;/unique&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 拒绝返回一个唯一房间名给一个没有资格创建房间的实体, 或那些发送请求唯一房间名过多次数的实体, 等等.&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 使用算法保证房间名的创建在服务上下文中是唯一的 (例如, 对发出请求的JID,datetime,和random salt的SHA-1 哈希运算).&lt;br /&gt;
&lt;br /&gt;
房间创建者将接着使用 XML 字符数据 &amp;lt;unique/&amp;gt; 元素作为它请求的房间JID的节点标识符(ID):&lt;br /&gt;
&lt;br /&gt;
'''例子 155. 所有者以唯一名创建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence &lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='6d9423a55f499b29ad20bf7b2bdea4f4b885ead1@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===随后的房间配置===&lt;br /&gt;
&lt;br /&gt;
在指定房间的初始配置之后的任何时间, 房间所有者可能想修改房间配置. 为此, 房间所有者必须 MUST 向房间发出一个新的配置表单请求,通过发送一个 IQ 到 &amp;lt;room@service&amp;gt; ，包含一个空的 &amp;lt;query/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc#owner' 名字空间.&lt;br /&gt;
&lt;br /&gt;
'''例子 156. 所有者请求配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='config1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 157. 服务禁止非所有者的访问配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='configures'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 服务必须 MUST 以当前使用的选项组作为缺省值发送一个配置表单给房间所有者:&lt;br /&gt;
&lt;br /&gt;
'''例子 158. 服务发送配置表单给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='config1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Configuration for &amp;quot;darkcave&amp;quot; Room&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
        Complete this form to make changes to&lt;br /&gt;
        the configuration of your room.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural-Language Room Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomname'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;A Dark Cave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Short Description of Room'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomdesc'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Enable Public Logging?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Change Subject?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Invite Others?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Maximum Number of Occupants'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='10'&amp;gt;&amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='20'&amp;gt;&amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='30'&amp;gt;&amp;lt;value&amp;gt;30&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='50'&amp;gt;&amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='100'&amp;gt;&amp;lt;value&amp;gt;100&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='None'&amp;gt;&amp;lt;value&amp;gt;none&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles for which Presence is Broadcast'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_presencebroadcast'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles and Affiliations that May Retrieve Member List'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_getmemberlist'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Publicly Searchable?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Persistent?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Moderated?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Members Only?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password Required for Entry?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          If a password is required to enter this room,&lt;br /&gt;
          you must specify the password below.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password'&lt;br /&gt;
          type='text-private'&lt;br /&gt;
          var='muc#roomconfig_roomsecret'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;cauldronburn&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Who May Discover Real JIDs?'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderators Only'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Anyone'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;anyone&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional people who have&lt;br /&gt;
          administrative privileges in the room. Please&lt;br /&gt;
          provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Admins'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomadmins'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;wiccarocks@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hecate@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional owners for this&lt;br /&gt;
          room. Please provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Owners'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomowners'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有配置选项可用, 服务必须 MUST 返回一个空的 query 元素给房间所有者，如前面的用例所示.&lt;br /&gt;
&lt;br /&gt;
该房间所有者应该 SHOULD 接着以更新的配置信息提交表单.&lt;br /&gt;
&lt;br /&gt;
另外, 房间所有者可以 MAY 取消这次配置过程:&lt;br /&gt;
&lt;br /&gt;
'''例子 159. 所有者取消随后的配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='config2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='cancel'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间所有者取消随后的配置, 服务必须 MUST 让该房间的配置保持和房间所有者请求这次配置之前一样.&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个房间管理员失去管理权限，而这个管理员正在房间里, 该房间必须 MUST 为那个管理员发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;member&amp;quot; 或 'role' 属性值为 &amp;quot;participant&amp;quot; 或 &amp;quot;visitor&amp;quot; ，以适当地表达岗位级别和房间类型:&lt;br /&gt;
&lt;br /&gt;
'''例子 160. 服务通知失去管理员岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个用户获得管理员权限，而这个用户正在房间里, 房间必须 MUST 为那个用户发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 或 'role' 属性值为 &amp;quot;admin&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
'''例子 161. 服务通知所有用户有人获得管理员岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个房间所有者失去所有者权限，而这个所有者正在房间里, 该房间必须 MUST 为那个所有者发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 或 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 162. 服务通知失去所有者岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有其他所有者，服务不能 MUST NOT 允许一个所有者撤销他或她自己的所有权; 如果一个所有者企图这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给这个所有者. 然而, 如果有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有者权限.&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个用户获得所有者权限，而这个用户正在房间里, 房间必须 MUST 为那个用户发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; 或 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 163. 服务通知所有用户有人获得所有者权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致房间类型变成仅限会员，但还有非成员在房间里, 服务必须 MUST 从房间移除任何非成员，并在发送给那些剩余的房客的 '不可用' 出席信息节里包含状态码 322.&lt;br /&gt;
&lt;br /&gt;
====配置变更通知====&lt;br /&gt;
&lt;br /&gt;
当一个房间的配置变更会对房间的隐私和安全策略产生影响时，该房间必须 MUST 发送通知给所有房客. 这个通知将包括一个 &amp;lt;message/&amp;gt; 节，包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 元素,  &amp;lt;x/&amp;gt; 元素则只有一个 &amp;lt;status/&amp;gt; 子元素，其 'code' 属性为一个适当的值. 这是例子:&lt;br /&gt;
&lt;br /&gt;
'''例子 164. 配置状态码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
         type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;status code='170'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间配置中和隐私相关的策略变更导致生成这些状态码，如下:&lt;br /&gt;
&lt;br /&gt;
* 如果房间日志功能可用了, 状态码 170.&lt;br /&gt;
* 如果房间日志现在禁止了, 状态码 171.&lt;br /&gt;
* 如果房间现在是非匿名的了, 状态码 172.&lt;br /&gt;
* 如果房间现在是半匿名的了, 状态码 173.&lt;br /&gt;
* 如果房间现在是全匿名的了, 状态码 174.&lt;br /&gt;
&lt;br /&gt;
对更多其他配置变更, 房间应该 SHOULD 发送状态码 104 这样感兴趣的房客如果想要的话可以接受到更新的房间配置.&lt;br /&gt;
&lt;br /&gt;
===授予所有者权限===&lt;br /&gt;
&lt;br /&gt;
如果实现允许, 一个所有者可以 MAY 授予所有权给其他用户; 只要把用户的岗位改成&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 165. 所有者授予所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 166. 所有者授予所有权(饱含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把用户添加到所有者列表并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 167. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已授予所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
'''例子 168. 服务发送所有权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/hecate'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已授予所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; . &lt;br /&gt;
&lt;br /&gt;
'''例子 169. 服务发送所有权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销所有者权限===&lt;br /&gt;
&lt;br /&gt;
实现可以 MAY 允许一个所有者撤销其他用户的所有权; 只要把用户的岗位改成非&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 170. 所有者撤销所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt;元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 171. 所有者撤销所有权(包含一个原因)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有其它所有者，服务不能 MUST NOT 允许一个所有者撤销他或她自己的所有权; 如果一个所有者尝试这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该所有者. 然而, 如果有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有权.&lt;br /&gt;
&lt;br /&gt;
如果一个实现不允许所有者撤销另一个用户的所有权, 实现必须 MUST 返回一个 &amp;lt;not-authorized/&amp;gt; 错误给做出这个请求的所有者.&lt;br /&gt;
&lt;br /&gt;
注意: 允许一个所有者移除其它用户的所有权能给房间管理一个折衷的控制模式; 所以这个特性是可选的 OPTIONAL, 并且鼓励实现支持通过一个只有拥有服务范围管理权限的用户使用的接口来移除所有者.&lt;br /&gt;
&lt;br /&gt;
其它情况下, 服务必须 MUST 把用户从所有者列表移除并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 172. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;owner&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值:&lt;br /&gt;
&lt;br /&gt;
'''例子 173. 服务通知失去所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;owner&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
'''例子 174. 服务发送失去所有权通知给所有房客 '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改所有者列表===&lt;br /&gt;
&lt;br /&gt;
如果实现允许, 一个房间所有者可能想修改所有者列表. 为此, 所有者首先请求所有者列表，通过向房间请求所有岗位为 'owner'的用户.&lt;br /&gt;
&lt;br /&gt;
'''例子 175. 所有者请求所有者列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='owner3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 接着返回所有者列表给所有者; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，对任何正是一名房客（也就是正在房间里）的所有者可以 MAY 包含 'nick' 和 'role' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 176. 服务发送所有者列表给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='crone1@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
所有者可以 MAY 接着修改所有者列表. 为此, 所有者必须 MUST 发送修改的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; [[XEP-0045#附录G:备注|21]]每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用于管理参与者之类的角色，而不是所有者之类的岗位):&lt;br /&gt;
&lt;br /&gt;
'''例子 177. 所有者发送修改过的所有者列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='owner4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
只有所有者被允许修改所有者列表. 如果一个非所有者试图察看或修改所有者列表, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 178. 服务对于非所有者试图修改所有者列表返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='ownertest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' &lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有别的所有者，服务不能 MUST NOT 允许一个所有者撤销自己的所有权; 如果一个所有者尝试这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该所有者. 然而, 如果有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有权. &lt;br /&gt;
&lt;br /&gt;
其它情况下, 服务必须 MUST 修改所有者列表并通知所有者成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 179. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也为任何因前述所有者列表修改而导致的岗位变化而发送出席信息通知.&lt;br /&gt;
&lt;br /&gt;
===授予管理员权限===&lt;br /&gt;
&lt;br /&gt;
一个所有者可以授予管理员权限给一个成员或无岗位的用户; 只要把用户的岗位改成&amp;quot;admin&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 180. 所有者授予管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL. &lt;br /&gt;
&lt;br /&gt;
'''例子 181. 所有者授予管理员权限(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把用户添加到管理员列表并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 182. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已授予管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值. &lt;br /&gt;
&lt;br /&gt;
'''例子 183. 服务发送管理员权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已授予管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 184. 服务发送管理员权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销管理员权限===&lt;br /&gt;
&lt;br /&gt;
一个所有者可能想撤销一个用户的管理员权限; 只要把用户的岗位改成非&amp;quot;admin&amp;quot;和非&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 185. 所有者撤销管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt;元素是可选的 OPTIONAL. &lt;br /&gt;
&lt;br /&gt;
'''例子 186. 所有者撤销管理员权限(包含一个原因)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把该用户从管理员列表移除并接着通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 187. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已失去管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非&amp;quot;admin&amp;quot;非&amp;quot;owner&amp;quot;, 并且 'role' 属性值为根据岗位和房间类型确定的适当的值: &lt;br /&gt;
&lt;br /&gt;
'''例子 188. 服务通知失去管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;admin&amp;quot; . &lt;br /&gt;
&lt;br /&gt;
'''例子 189. 服务通知失去管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改管理员列表===&lt;br /&gt;
&lt;br /&gt;
一个房间所有者可能想修改管理员列表. 为此, 所有者首先请求管理员列表，通过向房间请求所有岗位为 'admin'的用户. &lt;br /&gt;
&lt;br /&gt;
'''例子 190. 所有者请求管理员列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/desktopaffiliation&lt;br /&gt;
    id='admin3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 接着返回管理员列表给所有者; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，对任何正是一名房客（也就是正在房间里）的管理员可以 MAY 包含 'nick' 和 'role' 属性: &lt;br /&gt;
&lt;br /&gt;
'''例子 191. 服务发送管理员列表给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          nick='secondwitch'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
所有者可以 MAY 接着修改管理员列表. 为此, 所有者必须 MUST 发送修改的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; [[XEP-0045#附录G:备注|22]] 每个条目必须 MUST 包含 'affiliation'属性(通常值为 &amp;quot;admin&amp;quot; 或 &amp;quot;none&amp;quot;) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用于管理参与者之类的角色，而不是管理员之类的岗位): &lt;br /&gt;
&lt;br /&gt;
'''例子 192. 所有者发送修改的管理员列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='admin4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
只有所有者被允许修改管理员列表. 如果一个非所有者试图察看或修改所有者列表, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者: &lt;br /&gt;
&lt;br /&gt;
'''例子 193. 服务对于非所有者试图修改管理员列表返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admintest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin' &lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 修改管理员列表并通知所有者成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 194. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也为任何因前述管理员列表修改而导致的岗位变化而发送出席信息通知.&lt;br /&gt;
&lt;br /&gt;
===销毁房间===&lt;br /&gt;
&lt;br /&gt;
房间所有者必须 MUST 能够销毁一个房间, 特别是如果这个房间不是持久房间的时候. 流程如下:&lt;br /&gt;
&lt;br /&gt;
# 房间所有者请求销毁房间, 如果必要的话指出一个原因 reason 和一个备用场地.&lt;br /&gt;
# 该房间移除所有房客(包含适当的关于备用场地和被移除的原因的信息) 并销毁房间, 即使它被定义为持久房间.&lt;br /&gt;
&lt;br /&gt;
不像前述的, 本文不指定一个MUC服务实现收到一个销毁房间请求之后将会如何做. 例如, 如果房间定义为持久地, 一个实现可以 MAY 选择锁定房间I，这样它不能被重用, 把加入该房间的请求重定向到替代场地, 或邀请当前的参与者到新的房间; 无论如何, 这些行为是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
为了销毁一个房间, 房间所有者必须 MUST 发送一个 IQ set 指令到要销毁的房间的地址. 这个 &amp;lt;iq/&amp;gt; 节将包含一个遵循 'http://jabber.org/protocol/muc#owner' 名字空间的 &amp;lt;query/&amp;gt; 元素，它将包含一个 &amp;lt;destroy/&amp;gt; 元素. 替代场地的地址可以 MAY 用这个 &amp;lt;destroy/&amp;gt; 元素的 'jid' 属性来提供. 一个密码保护的替代场地可以 MAY 通过 &amp;lt;destroy/&amp;gt; 元素的 &amp;lt;password/&amp;gt; 子元素的 XML 字符数据来提供. 摧毁房间的原因可以 MAY 通过 &amp;lt;destroy/&amp;gt; 元素的 &amp;lt;reason/&amp;gt; 子元素的 XML 字符数据来提供.&lt;br /&gt;
&lt;br /&gt;
以下例子展示了协议发送和接收的元素:&lt;br /&gt;
&lt;br /&gt;
'''例子 195. 所有者提交房间摧毁请求'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='begone'&lt;br /&gt;
    to='heath@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务负责移除所有房客. 它不应该 SHOULD NOT 广播类型为&amp;quot;unavailable&amp;quot;的出席信息节给所有房客, 只需要发送一个&amp;quot;unavailable&amp;quot;类型的出席信息节给每个房客，这样该用户知道他或她已经从房间移除了. 如果所有者的扩展出席信息指定了一个替代场地的 JID 以及房间销毁的原因, 这个出席信息节必须 MUST 包含那些信息.&lt;br /&gt;
&lt;br /&gt;
'''例子 196. 服务移除每个房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 197. 服务通知所有者成功销毁房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='begone'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果在一个销毁请求中接收到的'from'地址的 &amp;lt;user@host&amp;gt; 和一个房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 198. 服务拒绝由非所有者提交的销毁请求'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='destroytest'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==错误和状态码==&lt;br /&gt;
===错误码===&lt;br /&gt;
&lt;br /&gt;
和'http://jabber.org/protocol/muc#user' 名字空间相关的错误码相当简单, 总结于下表之中. 关于传统的错误码到XMPP格式的错误之间的映射的详细信息, 参见 [http://xmpp.org/extensions/xep-0086.html 错误条件映射] [[XEP-0045#附录G:备注|23]]; 实现应该 SHOULD 支持传统和XMPP错误处理两者.&lt;br /&gt;
&lt;br /&gt;
'''表9: http://jabber.org/protocol/muc#user 名字空间的错误码'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!码 !!类型 !!元素 !!上下文 !!目的&lt;br /&gt;
|-&lt;br /&gt;
|401 ||Error ||Presence  ||进入一个房间 ||通知用户需要密码&lt;br /&gt;
|-&lt;br /&gt;
|403 ||Error ||Presence  ||进入一个房间 ||通知用户他或她被房间禁止了&lt;br /&gt;
|-&lt;br /&gt;
|404 ||Error ||Presence  ||进入一个房间 ||通知用户房间不存在&lt;br /&gt;
|-&lt;br /&gt;
|405 ||Error ||Presence  ||进入一个房间 ||通知用户限制创建房间&lt;br /&gt;
|-&lt;br /&gt;
|406 ||Error ||Presence  ||进入一个房间 ||通知用户必须使用保留的房间昵称&lt;br /&gt;
|-&lt;br /&gt;
|407 ||Error ||Presence  ||进入一个房间 ||通知用户他或她不在成员列表中&lt;br /&gt;
|-&lt;br /&gt;
|409 ||Error ||Presence  ||进入一个房间 ||通知用户他或她的房间昵称正在使用或被别的用户注册了&lt;br /&gt;
|-&lt;br /&gt;
|503 ||Error ||Presence  ||进入一个房间 ||通知用户已经达到最大用户数&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
本文不规定和上述错误条件相关的文本字符串(即, XMPP &amp;lt;text/&amp;gt; 元素值).&lt;br /&gt;
&lt;br /&gt;
===状态码===&lt;br /&gt;
&lt;br /&gt;
多用户聊天的使用一个 &amp;lt;status/&amp;gt; 元素(特指, &amp;lt;status/&amp;gt; 元素的的 'code' 属性  ) 来传达关于用户在一个房间里的状态的信息. 随着时间的推移, 状态码的数量已经增加了很多, 而新的状态码继续被作者申请. 所以, 这些状态码现在记录在一个由XMPP登记处维护的注册表里. 细节可参考本文的 [[XEP-0045#状态码注册表|状态码注册表]].&lt;br /&gt;
&lt;br /&gt;
注意: 通常, MUC 状态码倾向于沿用[http://tools.ietf.org/html/rfc2616 RFC 2616] [[XEP-0045#附录G:备注|24]] 和 [http://tools.ietf.org/html/rfc1893 RFC 1893] [[XEP-0045#附录G:备注|25]] (1xx 码表示信息, 2xx 码说明情况良好可继续, 3xx 码指定重定向被踢或被禁止的用户, x3x 码指系统状态, x7x 码指安全或策略事务, 等等) 里面的状态码的 &amp;quot;抽象&amp;quot;含义.&lt;br /&gt;
&lt;br /&gt;
注意: 如果今天来定义 MUC 协议, 它将指定一个更有弹性的, XML-友好的 途径而不是硬编码的状态数字; 然而, 现在修改状态汇报系统带来的痛苦将远大于好处, 这是为什么状态码数字保持使用至今. 本文的未来版本可能定义一个更 类XMPP 的途径来表示状态条件, 保留状态码数字但是给它们补充更多的描述性的子元素,就像 '''RFC 3920 '''里那样.&lt;br /&gt;
&lt;br /&gt;
==国际化事项==&lt;br /&gt;
&lt;br /&gt;
如 '''RFC 3920''' 中所定义的, XMPP 实体 (包括 MUC 房间和 MUC 服务) 应该 SHOULD 遵守任何给定的节提供的 'xml:lang' 属性. 然而, 群聊消息的同声翻译超出了本文的范围.&lt;br /&gt;
&lt;br /&gt;
这里定义的状态和错误码允许一个客户端实现展示一个本地化的界面; 然而, 任何给定语言社区的本地化文本字符串的定义超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
尽管这里的很多数据表单字段的标签显示为英文, MUC 客户端应该 SHOULD 把这些字段展示为本地化的文本而不是英文文本.&lt;br /&gt;
&lt;br /&gt;
==安全事项==&lt;br /&gt;
===用户验证和授权===&lt;br /&gt;
&lt;br /&gt;
本文没有定义或要求比明文密码更安全的房间准入验证或授权方法. 然而, 这些潜在的风险可能使用 '''RFC 3920''' 描述的通过使用 TLS 和 SASL 加密通道来减轻.&lt;br /&gt;
&lt;br /&gt;
===端到端加密===&lt;br /&gt;
&lt;br /&gt;
这里没有定义没有端到端消息或会话加密方法. 用户不应该 SHOULD NOT 相信一个服务能保持通过房间发送的任何文本的安全.&lt;br /&gt;
&lt;br /&gt;
===隐私===&lt;br /&gt;
&lt;br /&gt;
取决于房间配置, 一个房间可以公开地记录房间里发生的所有讨论. 服务必须 MUST 警告用户该房间是公开记录的，通过在该用户的初始出席信息中返回一个状态码 &amp;quot;170&amp;quot; , 并且如果房间讨论被记录 (用户的客户端也应该 SHOULD 在允许用户进入之前查询房间的配置，以&amp;quot;预先发现&amp;quot;房间是否被记录)，该用户的客户端也必须 MUST 警告用户. 如果房间的配置随后修改成允许房间记录(当房间发送状态码 170 时客户端将发现)，客户端也必须 MUST 警告用户 . 注意: 房间内的历史和公开房间记录是不同的, 并且很自然的一个房间不能有效地阻止房客独立维护的自有的房间记录, 它可能被公开; 用户应该 SHOULD 谨慎操作并认识到任何房间讨论可能被有效地公开.&lt;br /&gt;
&lt;br /&gt;
===匿名===&lt;br /&gt;
&lt;br /&gt;
取决于房间配置, 一个房间可以 MAY 暴光每个房客的真实 JID 给其他房客 (如果该房间是非匿名的) 并且将几乎肯定地暴光每个房客的真实 JID 给该房间的所有者和管理员(如果该房间不是全匿名的).服务必须 MUST 警告用户真实 JIDs 在房间被暴光，通过在该用户的初始出席信息中包含状态码 &amp;quot;100&amp;quot; , 并且用户的客户端必须 MUST 警告该用户 (一个用户的客户端应该 SHOULD 也在允许用户进入房间之前查询房间配置以 &amp;quot;预先发现&amp;quot; 是否真实 JIDs 会在房间中暴光). 如果房间配置随后从半匿名或全匿名修改成非匿名(当房间发送状态码 172 时客户端将发现) ，客户端必须 MUST 也警告用户，如果房间的配置随后从全匿名改成半匿名时(当房间发送状态码 173 时客户端将发现)，客户端也应该 SHOULD 警告用户.&lt;br /&gt;
&lt;br /&gt;
===拒绝服务===&lt;br /&gt;
&lt;br /&gt;
公开的 MUC 房间能承受一定数量的攻击, 大部分能减少拒绝服务攻击. 这些攻击包括但不限于:&lt;br /&gt;
&lt;br /&gt;
# 向房间里塞进大量的非法房客从而阻止合法用户加入房间.&lt;br /&gt;
# 发送侮辱性的消息接着在被踢或被禁止之前离开房间; 这些侮辱性的消息包含但不限于，大量消息以阻止参与者正常跟踪会话线索或房间历史, 对参与者的人身攻击 (特别是房间管理员和主持人), 攻击性的文字, 以及垃圾网站链接.&lt;br /&gt;
# 高频率的制造出席信息变更.&lt;br /&gt;
# 使用过长的昵称导致无法看到完整的发言.&lt;br /&gt;
# 辱骂房间管理员或其他房间房客.&lt;br /&gt;
# 在一个服务里注册很多昵称然后禁止这些昵称的使用.&lt;br /&gt;
# 模仿别的房客的昵称(例如, 通过在尾部增加一个空格或看起来相似的字符串), 然后以那个房间昵称发送消息用于欺骗房客.&lt;br /&gt;
&lt;br /&gt;
这些攻击可能被减轻不能完全被阻止，通过灵活地使用管理员操作。例如禁止用户, 有管理员权限的自动的房间机器人出席信息, 智能内容过滤的实现, 检查连接的用户的 IP 地址(在分布式的系统里不一定能实现), 应用发言规则到出席信息以及消息, 使用比Resourceprep profile of stringprep更严格的规则匹配房间昵称, 等等. 然而, 经验表明无法完全阻止这类攻击.&lt;br /&gt;
&lt;br /&gt;
===其它事项===&lt;br /&gt;
&lt;br /&gt;
关于延迟递送符号的列入和流程的更多安全事项参见 '''XEP-0203'''.&lt;br /&gt;
&lt;br /&gt;
==IANA事项==&lt;br /&gt;
&lt;br /&gt;
本文档与[http://www.iana.org/ 互联网编号分配授权机构] [[XEP-0045#附录G:备注|26]]无关。&lt;br /&gt;
&lt;br /&gt;
==XMPP登记事项==&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/registrar/ XMPP登记处] [[XEP-0045#附录G:备注|27]]在它的登记处包含了以下信息.&lt;br /&gt;
&lt;br /&gt;
===协议名字空间===&lt;br /&gt;
&lt;br /&gt;
XMPP登记处在它的协议名字空间注册表里包含了以下 MUC相关的名字空间:&lt;br /&gt;
&lt;br /&gt;
* http://jabber.org/protocol/muc&lt;br /&gt;
* http://jabber.org/protocol/muc#admin&lt;br /&gt;
* http://jabber.org/protocol/muc#owner&lt;br /&gt;
* http://jabber.org/protocol/muc#user&lt;br /&gt;
&lt;br /&gt;
===服务发现种类/类型===&lt;br /&gt;
&lt;br /&gt;
一个多用户聊天服务或房间在服务发现里是用 &amp;quot;conference&amp;quot; 种类categary 和 &amp;quot;text&amp;quot; 类型type 来标识的.&lt;br /&gt;
&lt;br /&gt;
===服务发现特性===&lt;br /&gt;
&lt;br /&gt;
有很多和MUC相关的服务或房间相关的特性可以被&amp;quot;服务发现&amp;quot;来发现. 这里面最基本的是 'http://jabber.org/protocol/muc' 名字空间. 另外, 一个MUC房间应该 SHOULD 提供关于它实现的特定房间特性的信息, 例如密码保护和房间主持.&lt;br /&gt;
&lt;br /&gt;
'''注册提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#register FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#roomconfig FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#roominfo FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_hidden&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Hidden room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_membersonly&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Members-only room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_moderated&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Moderated room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_nonanonymous&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Non-anonymous room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_open&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Open room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_passwordprotected&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Password-protected room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_persistent&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Persistent room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_public&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Public room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_rooms&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;List of MUC rooms (each as a separate item)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_semianonymous&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Semi-anonymous room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_temporary&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Temporary room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_unmoderated&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Unmoderated room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_unsecured&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Unsecured room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===知名服务发现节点===&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'http://jabber.org/protocol/muc#rooms' 允许发现一个用户是哪个房间的房客.&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'x-roomuser-item' 允许一个用户从房间外发现自己的已注册房间昵称.&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'http://jabber.org/protocol/muc#traffic' 允许发现通过一个房间能发送哪些名字空间的通讯(参见本文允许的 [[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
&lt;br /&gt;
===字段标准化===&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/extensions/xep-0068.html 数据表单的字段标准化] [[XEP-0045#附录G:备注|28]] 定义了用于遵循特定名字空间的数据表单的字段标准化的过程. 在 MUC 里面, 使用了四种这类表单: 房间注册 ( &amp;quot;muc#register&amp;quot; FORM_TYPE), 请求发言权和批准请求 (&amp;quot;muc#request&amp;quot;), 房间配置 (&amp;quot;muc#roomconfig&amp;quot;), 以及用于房间信息的服务发现扩展 (&amp;quot;muc#roominfo&amp;quot;). 这些保留的字段定义如下.&lt;br /&gt;
&lt;br /&gt;
====muc#register FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling user registration with a&lt;br /&gt;
    Multi-User Chat (MUC) room or admin approval&lt;br /&gt;
    of user registration requests.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field &lt;br /&gt;
     var='muc#register_allow'&lt;br /&gt;
     type='boolean'&lt;br /&gt;
     label='Allow this person to register with the room?'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_email'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Email Address'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_faqentry'&lt;br /&gt;
      type='text-multi'&lt;br /&gt;
      label='FAQ Entry'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_first'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Given Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_last'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Family Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_roomnick'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Desired Nickname'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_url'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Your URL'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#request FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling voice requests in a &lt;br /&gt;
    Multi-User Chat (MUC) room or admin&lt;br /&gt;
    approval of such requests.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#role'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='Requested role'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#jid'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='User ID'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#roomnick'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='Room Nickname'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#request_allow'&lt;br /&gt;
         type='boolean'&lt;br /&gt;
         label='Whether to grant voice'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#roomconfig FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling creation and configuration of&lt;br /&gt;
    a Multi-User Chat (MUC) room.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_allowinvites'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Occupants to Invite Others'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_changesubject'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Occupants to Change Subject'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_enablelogging'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Enable Public Logging of Room Conversations'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_getmemberlist'&lt;br /&gt;
      type='list-multi'&lt;br /&gt;
      label='Roles and Affiliations that May Retrieve Member List'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_lang'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural Language for Room Discussions'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_pubsub'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='XMPP URI of Associated Publish-Subcribe Node'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_maxusers'&lt;br /&gt;
      type='list-single'&lt;br /&gt;
      label='Maximum Number of Room Occupants'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_membersonly'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether an Make Room Members-Only'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_moderatedroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Make Room Moderated'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_passwordprotectedroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether a Password is Required to Enter'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_persistentroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Make Room Persistent'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_presencebroadcast'&lt;br /&gt;
      type='list-multi'&lt;br /&gt;
      label='Roles for which Presence is Broadcast'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_publicroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Public Searching for Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomadmins'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Full List of Room Admins'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomdesc'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Short Description of Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomname'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural-Language Room Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomowners'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Full List of Room Owners'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomsecret'&lt;br /&gt;
      type='text-private'&lt;br /&gt;
      label='The Room Password'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_whois'&lt;br /&gt;
      type='list-single'&lt;br /&gt;
      label='Affiliations that May Discover Real JIDs of Occupants'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#roominfo FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling the communication of extended service discovery&lt;br /&gt;
    information about a Multi-User Chat (MUC) room.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_contactjid'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Contact Addresses (normally, room owner or owners)'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_description'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Short Description of Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_lang'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural Language for Room Discussions'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_ldapgroup'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='An associated LDAP group that defines room membership; &lt;br /&gt;
             this should be an LDAP Distinguished Name according to an&lt;br /&gt;
             implementation-specific or deployment-specific definition&lt;br /&gt;
             of a group.'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_logs'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='URL for Archived Discussion Logs'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_occupants'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Current Number of Occupants in Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_subject'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Current Subject or Discussion Topic in Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_subjectmod'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='The room subject can be modified by participants'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===状态码登记处===&lt;br /&gt;
====过程====&lt;br /&gt;
&lt;br /&gt;
XMPP注册员为遵循 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;status/&amp;gt; 元素的 'code' 属性维护注册表中的值 .&lt;br /&gt;
&lt;br /&gt;
为了提交新值给这个注册表, 注册人将按以下格式定义一个XML段并把它包含在相关的XMPP扩展协议中，或者发到&amp;lt;registrar@xmpp.org&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;the three-digit code number&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;the stanza type of which it is a child (message or presence)&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;the use case or situation in which the status is used&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;a natural-language description of the meaning&amp;lt;/purpose&amp;gt;&lt;br /&gt;
  &amp;lt;child&amp;gt;the descriptive child element (reserved for future use)&amp;lt;/child&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注册人可一次注册多个状态码，每个状态码包含在独立的&amp;lt;statuscode/&amp;gt;元素中。&lt;br /&gt;
&lt;br /&gt;
====初始提交====&lt;br /&gt;
&lt;br /&gt;
作为本文的一部分, 以下状态码已被注册了:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;100&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message or presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that any occupant is allowed to see the user's full JID&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;101&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message (out of band)&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Affiliation change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that his or her affiliation changed while not in the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;102&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room now shows unavailable members&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;103&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room now does not show unavailable members&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;104&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;&lt;br /&gt;
    Inform occupants that a non-privacy-related room configuration change has occurred&lt;br /&gt;
  &amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;110&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Any room presence&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that presence refers to one of its own room occupants&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;170&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message or initial presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room logging is now enabled&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;171&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room logging is now disabled&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;172&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now non-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;173&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now semi-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;174&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now fully-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;201&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that a new room has been created&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;210&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that service has assigned or modified occupant's roomnick&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;301&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she has been banned from the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;303&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Exiting a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform all occupants of new room nickname&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;307&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she has been kicked from the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;321&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because of an affiliation change&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;322&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because the room has been changed to members-only and the user &lt;br /&gt;
    is not a member&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;332&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because of a system shutdown&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===URI查询类型===&lt;br /&gt;
&lt;br /&gt;
作为由[http://www.xmpp.org/extensions/xep-0147.html XMPP URI Query Components] [[XEP-00450#附录G:备注|29]]授权的机构，XMPP注册员维护着一个用于 XMPP URIs 的查询和键-值对的注册表（见&amp;lt;[http://www.xmpp.org/registrar/querytypes.html http://www.xmpp.org/registrar/querytypes.html]&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
====join====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;join&amp;quot; 查询类型被注册为一个 MUC相关的动作, 伴随一个可选的键 &amp;quot;password&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 199. Join动作: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?join&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
应用必须 MUST 要么展示一个界面允许用户提供一个房间昵称，要么基于配置好的选项或昵称发现来获取这个房间昵称.&lt;br /&gt;
&lt;br /&gt;
'''例子 200. Join动作: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
join 动作可以 MAY 为这房间包含一个密码. 自然的, 对一个包含了房间密码的 URI 的访问必须 MUST 得到适当的控制.&lt;br /&gt;
&lt;br /&gt;
'''例子 201. Join动作包含密码: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?join;password=cauldronburn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 202. Join动作包含密码: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下提交注册 &amp;quot;join&amp;quot; 查询类型.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;querytype&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;join&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;proto&amp;gt;http://jabber.org/protocol/muc&amp;lt;/proto&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;enables joining a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;keys&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;password&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the password required to enter a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
  &amp;lt;/keys&amp;gt;&lt;br /&gt;
&amp;lt;/querytype&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====invite====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;invite&amp;quot; 查询类型被注册为一个 MUC相关的动作, 伴随一个可选的键 &amp;quot;jid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 203. Invite动作: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果加入中的用户还未在房间里, 应用必须 MUST 发送两个节: 第一个加入房间，第二个邀请另一个人. 如果加入中的用户已经在房间里, 应用将只发送邀请节.&lt;br /&gt;
&lt;br /&gt;
'''例子 204. Invite动作: 结果节(s)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
URI 可以包含多个邀请:&lt;br /&gt;
&lt;br /&gt;
'''例子 205. Invite动作包含多个邀请: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit;jid=bard@shakespeare.lit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 206. Invite动作包含多个邀请: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
URI 也可以包含一个密码:&lt;br /&gt;
&lt;br /&gt;
'''例子 207. Invite动作包含密码: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit;password=cauldronburn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果加入中的用户还未在房间里, 应用必须 MUST 发送两个节: 第一个加入房间，第二个邀请另一个人. 如果加入中的用户已经在房间里, 应用将只发送邀请节.&lt;br /&gt;
&lt;br /&gt;
'''例子 208. Invite动作包含密码: 结果节(s)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下提交注册 &amp;quot;invite&amp;quot; 查询类型.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;querytype&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;invite&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;proto&amp;gt;http://jabber.org/protocol/muc&amp;lt;/proto&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;enables simultaneously joining a groupchat room and inviting others&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;keys&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;jid&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the Jabber ID of the invitee&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;password&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the password required to enter a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
  &amp;lt;/keys&amp;gt;&lt;br /&gt;
&amp;lt;/querytype&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==商业规则==&lt;br /&gt;
===Addresses===&lt;br /&gt;
&lt;br /&gt;
为了提供关于从房间JIDs抓获的地址的一致性, Room IDs 必须 MUST 遵循 Stringprep 的 Nodeprep 规范并且 Room Nicknames 必须 MUST 符合 Stringprep (这些都定义在 '''RFC 3920''') 的 Resourceprep 规范. 尽管在 '''RFC 3920''' 中没有显式的说明 , 一个 Room JID 的 Room ID (node) 和 Room Nickname (resource) 部分都必须 MUST 长度不为零. 另外, 一个 MUC 服务不能 MUST NOT 允许空的或不可见的房间昵称 Room Nicknames (即, 房间昵称Room Nicknames 只包含一个或多个空格).&lt;br /&gt;
&lt;br /&gt;
取决于服务实现，是否更多地限制房间昵称 (例如, 通过应用情景例程, stringprep的Nodeprep规范, 或其他限制).&lt;br /&gt;
&lt;br /&gt;
===Message===&lt;br /&gt;
&lt;br /&gt;
# 如果一个房客想发送一个消息给所有其他房客, MUC 客户端必须 MUST 把 'type' 属性值设为 &amp;quot;groupchat&amp;quot;. 服务可以 MAY 忽略不正确的消息类型, 或用 &amp;lt;bad-request/&amp;gt; 错误弹回.&lt;br /&gt;
# 如果一个MUC服务从一个角色为&amp;quot;none&amp;quot;的Jabber用户收到一个发送给该房间的消息或给某个房客的消息, 服务不能 MUST NOT 递送这个消息并应该 SHOULD 返回给这个消息给发送者并伴随一个 &amp;lt;forbidden/&amp;gt; 错误.&lt;br /&gt;
# 如果一个MUC服务 接收到一个发送给不存在的或尚未解锁的房间的消息, 服务应该 SHOULD 返回这个消息给发送者并伴随一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
# 一个MUC服务应该 SHOULD 不做修改地传递扩展的消息 (例如, 一个消息主体的 XHTML 版本) 给房客; 然而, 一个 MUC 服务可以 MAY 不允许消息的特定扩展(参见本文的[[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
# 一个MUC客户端可以 MAY 生成扩展以满足 [http://xmpp.org/extensions/xep-0022.html 消息事件] [[XEP-0045#附录G:备注|30]] 或 [http://xmpp.org/extensions/xep-0085.html 聊天状态通知] [[XEP-0045#附录G:备注|31]] 规范; 然而, 一个 MUC 服务可以 MAY 不允许这些扩展 (参见本文的[[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
&lt;br /&gt;
===Presence===&lt;br /&gt;
&lt;br /&gt;
# 一个房间必须 MUST 安静地忽略从一个角色为&amp;quot;none&amp;quot;的用户发来的不可用出席信息信息.&lt;br /&gt;
# 只有MUC服务自身应该 SHOULD 生成关于角色，岗位，全JIDs或遵循 'http://jabber.org/protocol/muc#user' 名字空间的状态码的扩展的出席信息 (基于服务所知道的关于房客的信息, 例如, 角色, 或由一个主持人或房间管理员的动作所产生的结果). 一个客户端不应该 SHOULD NOT 推定生成这类信息. 如果一个 MUC 服务从一个房客接收到这类扩展的出席信息, 它不能 MUST NOT 反射它给其他房客们. (一个客户端可以 MAY 为了提供一个密码而生成遵循 'http://jabber.org/protocol/muc#user' 名字空间的扩展的出席信息, 但自然的这是不反射给其他房客的.)&lt;br /&gt;
# 一个MUC服务应该 SHOULD 允许所有其他出席信息通过, 尽管它可以 MAY 选择阻塞扩展的出席信息; 参见本文的 [[XEP-0045#允许的通讯|允许的通讯]]章节.&lt;br /&gt;
# 为了适当地通知房客角色和岗位, 并使之更易于Jabber客户端跟踪房间里所有用户的当前状态, MUC服务实现必须 MUST 在所有出席信息节里提供关于角色和岗位的扩展的出席信息, 包括一个用户因为任何原因退出该房间时被发送的类型为&amp;quot;unavailable&amp;quot;的出席信息节.&lt;br /&gt;
# 如果一个权限被撤销, 服务必须 MUST 通知这件事，通过发送一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 元素并包含一个 &amp;lt;item/&amp;gt; 子元素，该&amp;lt;item/&amp;gt; 子元素的 'role' 和/或 'affiliation' 属性值的设定指明是去了有关的权限. 所有将来的为这个房客发出的出席信息节必须 MUST 包含这个更新的角色和岗位, 直到除非它们再次改变.&lt;br /&gt;
# 一个MUC服务必须 MUST 发送扩展的出席信息给一个客户端，即使客户端在进入该房间时没有发送一个空的遵循 'http://jabber.org/protocol/muc' 名字空间的 &amp;lt;x/&amp;gt; 元素 ; 自然的, 一个客户端必须 MUST 忽略这类信息，如果它不懂得它的话(根据 '''RFC 3920''').&lt;br /&gt;
# 在 muc#user 名字空间中被发送的关于角色和岗位的扩展的出席信息必须 MUST 包含全JID (不是纯JID) 作为 'jid' 属性的值.&lt;br /&gt;
# 如果想要，一个客户端可以 MAY 发送一个客户化的退出消息 (就像 IRC 频道里经常出现的那样) ，通过在退出时被发送的&amp;quot;unavailable&amp;quot;类型的出席信息节里包含一个 &amp;lt;status/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
===IQ===&lt;br /&gt;
&lt;br /&gt;
# MUC被设计用于分享消息和出席信息, 而不是 IQs. 一个被发送的到房间本身JID的 IQ 由房间本身来处理并且不反射给所有房客.&lt;br /&gt;
# 如果一个房客想在一个非匿名房间发送一个 IQ 节给其他用户, 发送者应该 SHOULD 直接发送请求给接收者的纯JID或全JID, 而不是试图通过房间发送请求(即, 通过接收者的房间JID).&lt;br /&gt;
# 如果一个房客想在一个半匿名房间发送一个 IQ 节给其他用户, 发送者能直接发送这个节给接受者的房间JID并且服务可以 MAY 转发这个节给接收者的真实JID. 然而, 任何时候一个MUC服务不能 MUST NOT 泄露这个发送者的真实JID给接收者, 也不能泄露接收者的真实JID给发送者.&lt;br /&gt;
# 一个MUC客户端必须 MUST 在IQ set 中的遵循 'http://jabber.org/protocol/muc#admin' &amp;lt;item/&amp;gt; 子元素中只发送 'affiliation' 属性或 'role' 属性; 如果一个主持人, 管理员, 或所有者试图在相同的IQ set中修改相同条目的岗位或角色, 服务必须 MUST 返回一个 &amp;lt;bad-request/&amp;gt; 错误给发送者. 无论如何, 一个MUC服务可以 MAY 基于一个岗位的变更来修改一个角色，从而可以 MAY 发送出席信息更新，同时包含一个修改的角色和一个修改的岗位.&lt;br /&gt;
# 在关于角色的 IQ sets中, 一个MUC客户端必须 MUST 只包含 'nick' 属性; 在关于角色的 IQ results中, 一个 MUC 服务必须 MUST 包含 'nick', 'role', 'affiliation', 和'jid' 属性 (值为后来设置的用户的全JID).&lt;br /&gt;
# 在关于岗位的 IQ sets中, 一个MUC客户端必须 MUST 只包含 'jid' 属性(值为纯JID); 在关于岗位的 IQ results中, 一个MUC服务不能 MUST NOT 包含 'role' 属性, 必须MUST 包含 'affiliation' 属性和 'jid' 属性 (值为纯JID), 并且应该 SHOULD 包含 'nick' 属性 (除非岗位为 &amp;quot;outcast&amp;quot;, 以为被排斥者不应该 SHOULD NOT 有保留的房间昵称).&lt;br /&gt;
&lt;br /&gt;
==实现注意事项==&lt;br /&gt;
&lt;br /&gt;
以下方针有助于客户端和组件开发者建立 MUC 实现.&lt;br /&gt;
&lt;br /&gt;
===服务端===&lt;br /&gt;
&lt;br /&gt;
# 在处理一个被主持的房间里游客发送的消息时, 一个MUC服务可以 MAY 通过一个主持人让每个消息排队等待批准并且可以 MAY 通知发送者消息正在等待批准; 然而, 这一行为是可选的 OPTIONAL, 并且一个消息批准协议的定义 (例如, 使用'''XEP-0004'''定义的数据表单) 超出了本文的范围.&lt;br /&gt;
# 对于一个 MUC 服务来说，在特定事件发生时提供房间内的消息是很常见的, 例如当标题变更时, 当一个房客加入或退出时, 或当一个房间被销毁时. 这类消息完全是可选的 OPTIONAL 并且留给实现或布署来决定, 但如果使用了，则必须 MUST 是从房间JID本身(&amp;lt;room@service&amp;gt;) 而不是从一个特定的&lt;br /&gt;
房客(&amp;lt;room@service/nick&amp;gt;)发送的类型为 &amp;quot;groupchat&amp;quot; 类型的消息. 无论如何, 通常接收的客户端倾向于基于房间的事件以及MUC提供的特定状态码来生成类似的消息(例如, 用户加入或退出) ; 这将帮助确保这类消息的正确的本地化.&lt;br /&gt;
# 出于礼貌, 一个MUC服务可以 MAY 发送一个房间外的 &amp;lt;message/&amp;gt; 给一个被踢的或被禁止的房客, 并且可以 MAY 广播一个房间内的 &amp;lt;message/&amp;gt; 给所有剩余的房客通知他们该房客已被该房间踢出或禁止. 无论如何, 这类消息是可选的 OPTIONAL, 并且事实上是多余的，因为接收的客户端生成这类消息所必需的信息已经通过MUC服务发送的出席信息节(特别是状态码)得到了.&lt;br /&gt;
# 出于礼貌, 如果一个用户的岗位变更了而该用户不在房间里，一个MUC服务可以MAY发送一个房间外的 &amp;lt;message/&amp;gt; ; 这消息应该 SHOULD 被从房间发送给该用户的纯JID, 可以 MAY 包含一个 &amp;lt;body/&amp;gt; 元素描述岗位变更, 并且必须 MUST 包含一个状态码 101.&lt;br /&gt;
# 没有需求要一个MUC服务将为旧的&amp;quot;groupchat 1.0&amp;quot;用户提供特别的治疗, 例如包含等价于扩展的遵循 'http://jabber.org/protocol/muc#user' 名字空间的出席信息的消息.&lt;br /&gt;
# 房间类型可以 MAY 被配置成任何组合. 一个MUC服务可以 MAY 支持或允许任何想要的房间类型或它们的组合.&lt;br /&gt;
# 一个MUC服务可以 MAY 限制在初始配置完成之后配置选项展示给一个所有者的次数, 例如因为特定的选项除非重启服务无法生效.&lt;br /&gt;
# 一个MUC服务可以 MAY 提供一个接口给房间创建和配置(例如, 以一个特定的Jabber表单或一个网页), 这样表面上房间所有者是一个应用而不是一个自然人用户.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择让一个特定的房间内资源提供接口给管理功能 (例如, 一个 &amp;quot;user&amp;quot; 名的机器人 &amp;quot;ChatBot&amp;quot;), 房客们可以和它直接互动, 从而允许管理员在一个私有消息里键入命令参数 '/command parameter' 给那个机器人 &amp;quot;user&amp;quot;. 显然这种服务要求服务在房间创建时添加一个 'ChatBot' 用户到房间, 并且阻止任何房客在该房间使用房间昵称 'ChatBot' . 这可能在一些实现或布署中比较难以保证. 任何情况下, 任何这类接口是可选的 OPTIONAL.&lt;br /&gt;
# 如果服务接收到它之前发送给该用户的节相关的递送类错误，一个MUC服务应该 SHOULD 移除一个用户; 递送相关的错误即 &amp;lt;gone/&amp;gt;, &amp;lt;item-not-found/&amp;gt;, &amp;lt;recipient-unavailable/&amp;gt;, &amp;lt;redirect/&amp;gt;, &amp;lt;remote-server-not-found/&amp;gt;, 和 &amp;lt;remote-server-timeout/&amp;gt;.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择在反射出席信息变更给一个房间的房客们之前，抛弃附加在&amp;lt;presence/&amp;gt; 节上的扩展的出席信息. 也就是, 一个实现可以 MAY 选择只反射该出席信息节的 &amp;lt;show/&amp;gt;, &amp;lt;status/&amp;gt;, 和 &amp;lt;priority/&amp;gt; 子元素，如 'jabber:client' 名字空间描述的 XML 架构之中, 结果导致那个在扩展的名字空间中的出席信息变更 &amp;quot;changes&amp;quot; (例如, gabber:x:music:info) 不被传递给房客. 如果一个服务禁止特定的扩展名字空间, 它应该 SHOULD 在本文 [[XEP-0045#允许的通讯|允许的通讯]]章节描述的知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 提供一个允许的通讯的描述.&lt;br /&gt;
# 一个MUC服务可以 MAY 在反射消息给一个房间的房客之前选择抛弃附加在 &amp;lt;message/&amp;gt; 节的扩展信息. 一个这类扩展信息的例子是轻量级文本标记，定义于 [http://xmpp.org/extensions/xep-0071.html XHTML-IM]  [XEP-0045#附录G:备注|32]]. 如果一个服务禁止特定的扩展名字空间, 它应该 SHOULD 在本文 [[XEP-0045#允许的通讯|允许的通讯]]章节描述的知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 提供一个允许的通讯的描述.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择锁定 &amp;quot;lock down&amp;quot; 房间昵称 (例如, 硬编码房间昵称给该房客的纯JID). 如果这么干, 该服务必须 MUST 把被锁定的昵称看作一个保留的房间昵称并且必须 MUST 支持本文[[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]]章节定义的协议.&lt;br /&gt;
&lt;br /&gt;
====允许的通讯====&lt;br /&gt;
&lt;br /&gt;
大家知道, 一个服务 (更准确地说, 一个正确配置的房间)可以 MAY 抛弃一些或所有的扩展的附加在从发送者通过房间反射给所有房客的 &amp;lt;message/&amp;gt; 和 &amp;lt;presence/&amp;gt; 节的名字空间. 如果房间这么干, 它应该 SHOULD 允许发送者通过发送 disco#info 查询知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 来发现允许的扩展的列表, 在结果中返回支持的名字空间每个用一个 &amp;lt;feature/&amp;gt; 元素表示. 如果该房间不允许任何扩展的名字空间, 它必须 MUST 如 '''XEP-0030''' 所述返回一个空的 query . 如果该房间不支持 &amp;quot;#traffic&amp;quot; 节点, 它必须 MUST 返回一个 &amp;lt;feature-not-implemented/&amp;gt; 错误应答给查询发送到 'http://jabber.org/protocol/muc#traffic' 节点的查询.&lt;br /&gt;
&lt;br /&gt;
以下例子展示一个只允许 'http://jabber.org/protocol/xhtml-im' 和 'http://jabber.org/protocol/rosterx' 名字空间的房间, 而不包括其他的名字空间.&lt;br /&gt;
&lt;br /&gt;
'''例子 209. 用户查询服务关于允许的名字空间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 210. 服务返回允许的名字空间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/xhtml-im'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/rosterx'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个服务不抛弃任何名字空间或不实现这个特性, 它必须 MUST 返回一个 &amp;lt;service-unavailable/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 211. 服务返回服务不可用错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===客户端===&lt;br /&gt;
&lt;br /&gt;
# Jabber客户端可以 MAY 展示房间角色，通过在一个房间名册里为每个角色显示特定的群. 这将使房客清楚图形化的知道哪个房客是主持人, 参与者, 和游客. 无论如何, 这样一个展示是可选的 OPTIONAL.&lt;br /&gt;
# Jabber客户端可以 MAY 实现多样化的界面以提供快捷方式 &amp;quot;shortcuts&amp;quot; 给功能，例如修改某人昵称, 踢人或禁止用户, 发现一个房客的全JID, 或修改主题. 一个选项包含了类IRC 的命令例如 '/nick', '/kick', '/ban', 和 '/whois'; 另一个是使用户能用鼠标右击房间名册里的项目. 所有这些界面形式是可选的 OPTIONAL. 然而, 为方便起见, 下面提供了一个 IRC 命令到 MUC 协议的映射.&lt;br /&gt;
&lt;br /&gt;
====IRC命令映射====&lt;br /&gt;
&lt;br /&gt;
IRC 客户端使用大量常用的快捷方式 &amp;quot;shortcut&amp;quot; 命令，以一个斜杠开始, 例如 '/nick' and '/ban'. 下表提供一个 类IRC 命令到 MUC 协议的映射, 用于希望支持类似功能的 Jabber 客户端.&lt;br /&gt;
&lt;br /&gt;
'''表10: IRC命令映射'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!命令 !!功能 !!MUC协议&lt;br /&gt;
|-&lt;br /&gt;
|/ban &amp;lt;roomnick&amp;gt; [comment] ||在房间里以房间昵称禁止用户(客户端翻译房间昵称为纯JID) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;iq id='someid'&lt;br /&gt;
    to='room@service'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='bare-jid-of-user'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/invite &amp;lt;jid&amp;gt; [comment] ||以JID邀请用户到此房间 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='jid'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
|/join &amp;lt;roomname&amp;gt; [pass] ||在服务里加入房间(房间昵称同本房间内的昵称) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/nick'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;pass&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/kick &amp;lt;roomnick&amp;gt; [comment] ||以房间昵称从房间里踢人 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;iq id='someid'&lt;br /&gt;
    to='room@service'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='roomnick' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|/msg &amp;lt;roomnick&amp;gt; &amp;lt;foo&amp;gt; ||发送私有消息&amp;quot;foo&amp;quot;给房间昵称 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service/nick' type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;foo&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/nick &amp;lt;newnick&amp;gt; ||变更在此房间内的昵称为&amp;quot;newnick&amp;quot; ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/newnick'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/part [comment] ||退出本房间(一些 IRC 客户端也支持 /leave) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/nick'&lt;br /&gt;
          type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;comment&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/topic &amp;lt;foo&amp;gt; ||变更此房间主题为&amp;quot;foo&amp;quot; ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service' type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;foo&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 因为 MUC 房间昵称遵循stringprep的Resourceprep脚本, 它们被允许包含一个空格字符, 而 IRC 昵称不允许. 尽管一个给定的客户端可以 MAY 支持引用字符串用于这个目的 (导致命令类似 '/ban &amp;quot;king lear&amp;quot; insanity is no defense'), 最常见的引用字符(类似 &amp;quot; 和 ') 也是被Resourceprep允许的 , 从而导致增加了复杂性和包含空格和引号的房间昵称中引号的潜在问题. 所以不建议 NOT RECOMMENDED Jabber客户端支持包含了空格符的房间昵称的类IRC的快捷方式命令.&lt;br /&gt;
&lt;br /&gt;
注意: 很多Jabber客户端也实现了 '/me ' 命令，如 [http://xmpp.org/extensions/xep-0245.html The /me Command] [[XEP-0045#附录G:备注|33]] 所述. 这个命令不会导致任何 MUC 或 IRC 协议的动作所以不显式在上表中.&lt;br /&gt;
&lt;br /&gt;
==XML架构==&lt;br /&gt;
===http://jabber.org/protocol/muc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='x'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='history' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='history'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='maxchars' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='maxstanzas' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='seconds' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='since' type='xs:dateTime' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#user===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#user'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#user'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='x'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:choice minOccurs='0' maxOccurs='unbounded'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='decline' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='destroy' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='invite' minOccurs='0' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='item' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='status' minOccurs='0' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='decline'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='destroy'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='invite'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='item'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='actor' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='continue' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='affiliation' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='admin'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='member'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='outcast'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='owner'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='nick' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='role' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='moderator'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='participant'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='visitor'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='actor'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='jid' type='xs:string' use='required'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='continue'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='thread' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='status'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='code' use='required'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:int'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:minInclusive value='100'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:maxInclusive value='999'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='reason' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#admin===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#admin'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#admin'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='query'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='item' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='item'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='actor' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='affiliation' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='admin'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='member'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='outcast'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='owner'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='nick' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='role' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='moderator'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='participant'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='visitor'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='actor'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='jid' type='xs:string' use='required'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='reason' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#owner===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#owner'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#owner'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:import &lt;br /&gt;
      namespace='jabber:x:data'&lt;br /&gt;
      schemaLocation='http://www.xmpp.org/schemas/x-data.xsd'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='query'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:choice xmlns:xdata='jabber:x:data' minOccurs='0'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='xdata:x'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='destroy'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='destroy'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='reason' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#unique===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#unique'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#unique'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='unique' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==鸣谢==&lt;br /&gt;
&lt;br /&gt;
作者感谢以下个人，为他们很多对于本协议草案的帮助性的评论: David Sutton, Peter Millard, Joe Hildebrand, Craig Kaes, Alexey Shchepin, David Waite, Jean-Louis Seguineau, Jacek Konieczny, Gaston Dombiak, 以及其他在 jdev@conference.jabber.org 会议室和在 Standards 邮件列表里的人.&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
&lt;br /&gt;
系列：[http://xmpp.org/extensions/ XEP]&lt;br /&gt;
&lt;br /&gt;
序号：0045&lt;br /&gt;
&lt;br /&gt;
发布者：[http://xmpp.org/xsf/ XMPP标准基金会]&lt;br /&gt;
&lt;br /&gt;
状态：[http://xmpp.org/extensions/xep-0001.html#states-Draft 草案 ]&lt;br /&gt;
&lt;br /&gt;
类型：[http://www.xmpp.org/extensions/xep-0001.html#types-Standards%20Track 标准跟踪]&lt;br /&gt;
&lt;br /&gt;
版本：1.24&lt;br /&gt;
&lt;br /&gt;
最后更新：2008-07-16&lt;br /&gt;
&lt;br /&gt;
批准机构：[http://xmpp.org/council/ XMPP理事会]&lt;br /&gt;
&lt;br /&gt;
依赖标准：XMPP Core, XMPP IM, XEP-0004, XEP-0030, XEP-0068, XEP-0082, XEP-0128&lt;br /&gt;
&lt;br /&gt;
替代标准：无&lt;br /&gt;
&lt;br /&gt;
被替代标准：无&lt;br /&gt;
&lt;br /&gt;
缩略名：muc&lt;br /&gt;
&lt;br /&gt;
muc名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#admin名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-admin.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#owner名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-owner.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#unique名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-unique.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#user名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-user.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注册表: &amp;lt;http://www.xmpp.org/registrar/muc.html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原文控制： [http://svn.xmpp.org:18080/browse/XMPP/trunk/extensions/xep-0045.xml HTML] [http://svn.xmpp.org:18080//changelog/~rss/XMPP/trunk/extensions/xep-0045.xml/rss.xml RSS]&lt;br /&gt;
&lt;br /&gt;
本文的其它格式： [http://xmpp.org/extensions/xep-0045.xml XML] [http://xmpp.org/extensions/xep-0045.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
URI: https://stpeter.im/&lt;br /&gt;
&lt;br /&gt;
{{Template:XEP附录CDEF}}&lt;br /&gt;
&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
&lt;br /&gt;
# RFC 1459: Internet Relay Chat &amp;lt;http://tools.ietf.org/html/rfc1459&amp;gt;.&lt;br /&gt;
# RFC 2810: Internet Relay Chat: Architecture &amp;lt;http://tools.ietf.org/html/rfc2810&amp;gt;.&lt;br /&gt;
# RFC 2811: Internet Relay Chat: Channel Management &amp;lt;http://tools.ietf.org/html/rfc2811&amp;gt;.&lt;br /&gt;
# RFC 2812: Internet Relay Chat: Client Protocol &amp;lt;http://tools.ietf.org/html/rfc2812&amp;gt;.&lt;br /&gt;
# RFC 2813: Internet Relay Chat: Server Protocol &amp;lt;http://tools.ietf.org/html/rfc2813&amp;gt;.&lt;br /&gt;
# XEP-0133: Service Administration &amp;lt;http://xmpp.org/extensions/xep-0133.html&amp;gt;.&lt;br /&gt;
# XEP-0030: Service Discovery &amp;lt;http://xmpp.org/extensions/xep-0030.html&amp;gt;.&lt;br /&gt;
# XEP-0059: Result Set Management &amp;lt;http://xmpp.org/extensions/xep-0059.html&amp;gt;.&lt;br /&gt;
# XEP-0128: Service Discovery Extensions &amp;lt;http://xmpp.org/extensions/xep-0128.html&amp;gt;.&lt;br /&gt;
# RFC 3920: 可扩展的消息和出席信息协议 (XMPP): Core &amp;lt;http://tools.ietf.org/html/rfc3920&amp;gt;.&lt;br /&gt;
# XEP-0203: Delayed Delivery &amp;lt;http://xmpp.org/extensions/xep-0203.html&amp;gt;.&lt;br /&gt;
# XEP-0091: Legacy Delayed Delivery &amp;lt;http://xmpp.org/extensions/xep-0091.html&amp;gt;.&lt;br /&gt;
# XEP-0082: XMPP Date and Time Profiles &amp;lt;http://xmpp.org/extensions/xep-0082.html&amp;gt;.&lt;br /&gt;
# RFC 3921: 可扩展的消息和出席信息协议 (XMPP): Instant Messaging and Presence &amp;lt;http://tools.ietf.org/html/rfc3921&amp;gt;.&lt;br /&gt;
# XEP-0249: Direct MUC Invitations &amp;lt;http://xmpp.org/extensions/xep-0249.html&amp;gt;.&lt;br /&gt;
# XEP-0077: In-Band Registration &amp;lt;http://xmpp.org/extensions/xep-0077.html&amp;gt;.&lt;br /&gt;
# XEP-0004: Data Forms &amp;lt;http://xmpp.org/extensions/xep-0004.html&amp;gt;.&lt;br /&gt;
# 一些评论者抱怨公开房间的所有者和管理员存在潜在的滥用; 很不幸的, 能力越大责任越大.&lt;br /&gt;
# XEP-0050: Ad-Hoc Commands &amp;lt;http://xmpp.org/extensions/xep-0050.html&amp;gt;.&lt;br /&gt;
# XEP-0060: Publish-Subscribe &amp;lt;http://xmpp.org/extensions/xep-0060.html&amp;gt;.&lt;br /&gt;
# 这和房间配置的行为不同, 这里 'muc#roomconfig_roomowners' 字段指定房间所有者的完整列表, 不是delta.&lt;br /&gt;
# 这和房间配置的行为不同, 这里 'muc#roomconfig_roomadmins' 字段指定房间管理眼的完整列表, 不是delta.&lt;br /&gt;
# XEP-0086: Error Condition Mappings &amp;lt;http://xmpp.org/extensions/xep-0086.html&amp;gt;.&lt;br /&gt;
# RFC 2616: Hypertext Transport Protocol -- HTTP/1.1 &amp;lt;http://tools.ietf.org/html/rfc2616&amp;gt;.&lt;br /&gt;
# RFC 1893: Enhanced Mail System Status Codes &amp;lt;http://tools.ietf.org/html/rfc1893&amp;gt;.&lt;br /&gt;
# 互联网编号分配机构 (IANA) 是用于互联网协议的唯一性参数值分配的核心协调者, 例如号码和URI计划. 更多信息, 见 &amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
# XMPP登记员 XMPP Registrar 维护着一个保留的协议名字空间以及用于由XMPP标准基金会批准的XMPP扩展协议的上下文参数的注册项的列表. 更多信息, 见 &amp;lt;http://xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
# XEP-0068: Field Data Standardization for Data Forms &amp;lt;http://xmpp.org/extensions/xep-0068.html&amp;gt;.&lt;br /&gt;
# XEP-0147: XMPP URI Query Components &amp;lt;http://xmpp.org/extensions/xep-0147.html&amp;gt;.&lt;br /&gt;
# XEP-0022: Message Events &amp;lt;http://xmpp.org/extensions/xep-0022.html&amp;gt;.&lt;br /&gt;
# XEP-0085: Chat State Notifications &amp;lt;http://xmpp.org/extensions/xep-0085.html&amp;gt;.&lt;br /&gt;
# XEP-0071: XHTML-IM &amp;lt;http://xmpp.org/extensions/xep-0071.html&amp;gt;.&lt;br /&gt;
# XEP-0245: The /me Command &amp;lt;http://xmpp.org/extensions/xep-0245.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===附录H: 修订历史===&lt;br /&gt;
&lt;br /&gt;
注意: 本协议的旧版本可能在 http://xmpp.org/extensions/attic/ 还可用&lt;br /&gt;
&lt;br /&gt;
'''版本 1.24 (2008-07-16)'''&lt;br /&gt;
&lt;br /&gt;
增加了更多原因reason元素的例子; 移除了关于黑名单包含的昵称部分; 增加了拒绝服务注意事项.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.23 (2008-01-14)'''&lt;br /&gt;
&lt;br /&gt;
* 定义了 getmemberlist 房间配置选项&lt;br /&gt;
* 增加了直接邀请协议&lt;br /&gt;
* 修正了当房间满的时候房间承认所有者/管理员的逻辑&lt;br /&gt;
* 定义了和LDAP群关联的服务发现扩展字段&lt;br /&gt;
* 指定了房间配置字段能被列入扩展的房间信息之中&lt;br /&gt;
* 指定了消息格式用于用户不在房间时的岗位变更&lt;br /&gt;
* 增加了例子展示结果集管理&lt;br /&gt;
* 推荐出席信息错误中包含的MUC子元素&lt;br /&gt;
* 为一对一聊天和多用户聊天的连续性描述了ThreadID的使用, 包括在邀请中为 continue 元素定义 thread 属性.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.22 (2007-04-10)'''&lt;br /&gt;
&lt;br /&gt;
更新了延迟消息递送以反映 XEP-0203 演化到草案和 XEP-0091 的过时.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.21 (2006-09-13)'''&lt;br /&gt;
&lt;br /&gt;
* 澄清了MUC扩展的介入，在房间加入/创建请求触发数据表单流但没有MUC扩展可导致自动房间创建以向后兼容旧的 groupchat 1.0 协议.&lt;br /&gt;
* 指定昵称变更时如果昵称被锁定则返回 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
* 要求客户端在进入房间之前发现房间配置并指定相关的安全事项, 包括使用隐私相关的状态码 170, 171, 172, 173, 和 174.&lt;br /&gt;
* 指定在房间配置选项不能被执行或违反服务策略时使用 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
* 强制要求房间昵称不能只包含空格.&lt;br /&gt;
* 移除所有服务发现用例到专用章节.&lt;br /&gt;
* 修改 urn:xmpp:delay 支持从 SHOULD 改为 MUST.&lt;br /&gt;
* 澄清 _whois 房间配置选项定义房间类型.&lt;br /&gt;
* 定义 XEP-0128 房间信息字段用于讨论记录, 关联的 pubsub 节点, 以及联系人 JID.&lt;br /&gt;
* 指出修改角色到主持人导致岗位变更为管理员或所有者成为推荐的, 而不是必需的.&lt;br /&gt;
* 增加了国际化事项中关于数据表单的本地化的部分.&lt;br /&gt;
* 指出实现可以持久化角色括月整个访问并且应该在被主持的房间里这样做.&lt;br /&gt;
* 增加了协议和服务发现特性用于在新建房间之前请求唯一的房间名.&lt;br /&gt;
* 更多澄清保留的房间昵称和昵称锁定的性质.&lt;br /&gt;
* 定义数据表单用于请求发言权和批准发言申请.&lt;br /&gt;
* 增加了多个邀请的例子用于XMPP URI.&lt;br /&gt;
* 澄清了出席信息，讨论历史的顺序, 等等.&lt;br /&gt;
* 增加了状态码用于房客拥有的房间昵称, 服务修改的房间昵称, 并警告房间讨论被公开记录.&lt;br /&gt;
* 澄清关于房间记录和非匿名房间的隐私和匿名事项.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.20 (2005-09-08)'''&lt;br /&gt;
&lt;br /&gt;
同意了踢人和禁止用户的能力, 并定义了一个用户不能被一个比自己岗位低的主持人或管理员踢或禁止.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.19 (2005-04-21)'''&lt;br /&gt;
&lt;br /&gt;
定义了怎样发送并发多邀请; 纠正了一些和岗位变更状态一致性的错误; 修改了消息事件禁令表单从 MUST NOT 到 SHOULD NOT; 修正了和 #traffic disco 节点相关的错误处理; 允许了 &amp;lt;password/&amp;gt; 作为&amp;lt;destroy/&amp;gt;的一个子元素; 修改了最大用户数错误从 &amp;lt;not-allowed/&amp;gt; 到 &amp;lt;service-unavailable/&amp;gt;; 指定了 maxchars 属性的字符数是指完整的 XML 节; 为 FORM_TYPEs;增加了 disco 特性 为状态码定义了注册表; 为遵守协议分开了新建即时房间的用例; 调整了 XML 架构以反映之前的修改; 重写了绪论; 澄清了小的文本错误.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
Version 1.18 (2004-11-02)&lt;br /&gt;
&lt;br /&gt;
Corrected several errors in the affiliation state chart and in the examples (wrong FORM_TYPE values); mentioned /me command.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.17 (2004-10-04)&lt;br /&gt;
&lt;br /&gt;
Added text about allowable extension namespaces and related service discovery mechanisms; specified well-known service discovery nodes; added conformance terms to clarify some descriptions; modified affiliation state chart to allow more flexible state changes; per list dicussion, added ability to convert a one-to-one chat into a conference, including sending of history; specified error to use when max users limit is reached; specified form for admin approval of user registration requests and modified FORM_TYPE from http://jabber.org/protocol/muc#user to http://jabber.org/protocol/muc#register; modified FORM_TYPE for room configuration from http://jabber.org/protocol/muc#owner to http://jabber.org/protocol/muc#roomconfig.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.16 (2004-06-30)&lt;br /&gt;
&lt;br /&gt;
Added example and registry submission for service discovery extension.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.15 (2004-06-24)&lt;br /&gt;
&lt;br /&gt;
Removed jabber:iq:browse references; clarified order of presence stanzas sent to new occupant on entering room; specified format of in-room messages (type='groupchat', from='room@service'); clarified allowable attributes in various list-related operations; made admin/owner revocation text and examples consistent with state chart; clarified ownership revocation conflict scenarios; changed the 'muc#roomconfig_inviteonly' field to 'muc#roomconfig_membersonly'; changed attribute order in examples to match XML canonicalization rules; corrected several errors in the schemas.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.14 (2004-05-03)&lt;br /&gt;
&lt;br /&gt;
Corrected discovery of registered roomnicks; added note about error to return if nicks are locked down.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.13 (2004-03-31)&lt;br /&gt;
&lt;br /&gt;
Fixed an error in the muc#user schema.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.12 (2004-03-01)&lt;br /&gt;
&lt;br /&gt;
Corrected a few errors in the examples; added IQ results in order to clarify workflows.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.11 (2004-02-05)&lt;br /&gt;
&lt;br /&gt;
Clarified JID matching rules (same as for privacy lists in XMPP IM).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.10 (2004-01-07)&lt;br /&gt;
&lt;br /&gt;
Added XMPP error handling; fully specified all conformance terms.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.9 (2003-12-14)&lt;br /&gt;
&lt;br /&gt;
Removed protocol for requesting voice in a moderated room (should be performed using Ad-Hoc Commands).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.8 (2003-12-04)&lt;br /&gt;
&lt;br /&gt;
Added protocol for requesting voice in a moderated room; added (informational) mapping of IRC commands to MUC protocols.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.7 (2003-10-21)&lt;br /&gt;
&lt;br /&gt;
Added room configuration option for restricting presence broadcast to certain roles.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.6 (2003-10-03)&lt;br /&gt;
&lt;br /&gt;
Added history management protocol on entering a room.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.5 (2003-09-11)&lt;br /&gt;
&lt;br /&gt;
Specified that ban occurs by JID, not roomnick; allowed privileged users to send messages to the room even if not present in the room; added note that service should remove occupant if a delivery-related stanza error occurs; enabled user to disco the room in order to discover registered roomnick; specified that &amp;quot;banning&amp;quot; by domain or regex is a service-level configuration matter and therefore out of scope for MUC; specified that role should be decremented as appropriate if affiliation is lowered; added some clarifying text to room creation workflow; added implementation note about sending an out-of-band message if a user's affiliation changes while the user is not in the room; fixed stringprep references (room nicks use Resourceprep); clarified relationship between Room ID (i.e., node identifier of Room JID, which may be opaque) and natural-language Room Name; specified Field Standardization profile per XEP-0068; defined XMPP Registrar submissions; added schema locations.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.4 (2003-02-16)&lt;br /&gt;
&lt;br /&gt;
Added XML schemas.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.3 (2003-02-11)&lt;br /&gt;
&lt;br /&gt;
Added reference to nodeprep Internet-Draft.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.2 (2003-01-30)&lt;br /&gt;
&lt;br /&gt;
Commented out revision history prior to version 1.0 (too long); clarified business rules regarding when nicks, full JIDs, and bare JIDs are used in reference to roles and affiliations; consistently specified that extended presence information in the muc#user namespace must include the full JID as the value of the 'jid' attribute in all cases; cleaned up text and examples throughout; added open issue regarding syntax of room nicknames.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.1 (2002-12-16)&lt;br /&gt;
&lt;br /&gt;
Added protocol for declining an invitation; replaced &amp;lt;created/&amp;gt; element with status code 201; modified the destroy room protocol so that &amp;lt;destroy/&amp;gt; is a child of &amp;lt;query/&amp;gt;; clarified usage of 'nick' attribute when adding members; prohibited use of message events.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.0 (2002-11-21)&lt;br /&gt;
&lt;br /&gt;
Per a vote of the Jabber Council, revision 0.23 was advanced to Draft on 2002-11-21. (For earlier revision history, refer to XML source.)&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.23 (2002-11-06)&lt;br /&gt;
&lt;br /&gt;
Added examples for disco#items queries sent to a room; prohibited 'type' attribute on invite messages sent from client to room; added dependencies on browse and disco; changed 'room user' to 'occupant'; fixed many small errors throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.22 (2002-11-04)&lt;br /&gt;
&lt;br /&gt;
Added example for disco#items; added support for cancellation of room configuration using type='cancel' from XEP-0004; noted 403 error for invites sent by non-admins in members-only room.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.21 (2002-11-01)&lt;br /&gt;
&lt;br /&gt;
Clarified several small ambiguities; made &amp;lt;body/&amp;gt; optional on invites sent from the service to the invitee; added error scenarios for changing nickname and for destroying the room; specified that the service must return the full member list for a members-only room (not only the members in the room); updated the disco examples to track protocol changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.20 (2002-10-29)&lt;br /&gt;
&lt;br /&gt;
Specified that messages sent to change the room subject must be of type &amp;quot;groupchat&amp;quot;; updated the legal notice to conform to the XSF IPR policy.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.19 (2002-10-28)&lt;br /&gt;
&lt;br /&gt;
Added ability to create an instant room within MUC (not by using gc-1.0 protocol); cleaned up disco examples.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.18 (2002-10-27)&lt;br /&gt;
&lt;br /&gt;
Added experimental support for disco; added sections for security, IANA, and JANA considerations; corrected typographical errors; cleaned up some DocBook formatting.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.17 (2002-10-23)&lt;br /&gt;
&lt;br /&gt;
Added the optional &amp;lt;actor/&amp;gt; element (with 'jid' attribute) to &amp;lt;item/&amp;gt; elements inside presence stanzas of type &amp;quot;unavailable&amp;quot; that are sent to users who are kicked or banned, as well as within IQs for tracking purposes; reverted all list editing use cases (ban, voice, member, moderator, admin, owner) to use of MUC format rather than 'jabber:x:data' namespace; added several guidelines regarding generation and handling of XML stanzas; cleaned up the change room subject use case; changed several ambiguous uses of 'would', 'can', and 'will' to 'should', 'may', or 'must'; fixed several small errors in the text, examples, and DTDs.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.16 (2002-10-20)&lt;br /&gt;
&lt;br /&gt;
Added the &amp;lt;item/&amp;gt; element to presence stanzas of type &amp;quot;unavailable&amp;quot; in order to improve the tracking of user states in the room; consolidated &amp;lt;invitee/&amp;gt; and &amp;lt;invitor/&amp;gt; elements into an &amp;lt;invite/&amp;gt; element with 'from' and 'to' attributes; made &amp;lt;reason/&amp;gt; element always a child of &amp;lt;item/&amp;gt; or &amp;lt;invite/&amp;gt; in the muc#user namespace; moved the alternate room location in room destruction to a 'jid' attribute of the &amp;lt;alt/&amp;gt; element; further specified several error messages; disallowed simultaneous modifications of both affiliations and roles by a moderator or admin; added several more rules regarding handling of XML stanzas; added use cases for granting and revoking administrative privileges; adjusted DTD to track all changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.15 (2002-10-18)&lt;br /&gt;
&lt;br /&gt;
Fully incorporated the change to affiliations + roles; moved a number of admin use cases to a new section for moderator use cases; added participant use case for requesting membership; added admin use cases for adding members, removing members, granting and revoking moderator privileges, and modifying the moderator list; organized the sections in a more logical manner.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.14 (2002-10-17)&lt;br /&gt;
&lt;br /&gt;
Significantly modified the privileges model by distinguishing between in-room &amp;quot;roles&amp;quot; and long-lived &amp;quot;affiliations&amp;quot;; specified the privileges of the various roles and affiliations; included state transition charts for both roles and affiliations; removed use of MUC protocol for editing ban, voice, and admin lists (but not for the actions of banning users and granting/revoking voice); added delivery rule regarding IQ stanzas; changed kick so that the action is based on changing the role to &amp;quot;none&amp;quot;.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.13 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Corrected the change nickname examples (newnick sent on unavailable, no nick sent on available).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.12 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Removed SHA1 passwords; specified that room shall add passwords on invitations to password-protected rooms (not supplied by invitor).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.11 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Changed 'participant' to 'room user' and 'discussant' to 'participant'; clarified presence rule about client generation of extended presence information; added role of 'none'.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.10 (2002-10-15)&lt;br /&gt;
&lt;br /&gt;
Fixed extended presence on entering or creating a room (plain '...muc' with no fragment); harmonized #user with #admin regarding the use of the &amp;lt;item/&amp;gt; element and associated attributes (jid, nick, etc.), and added 'role' attribute; modified management of voice, ban, admin, and member lists to use &amp;lt;query/&amp;gt; wrapper and new &amp;lt;item/&amp;gt; structure; changed the 'member' role to 'discussant', added 'outcast' role for banned users, and added new 'member' role to enable management of member lists; changed invitation-only rooms to members-only rooms and made appropriate adjustments to apply member lists to both members-only rooms and open rooms; modified nickname change protocol slightly to send the old nickname in the unavailable presence and the new nickname in the available presence; removed prohibition on members-only rooms that are password-protected; removed the &amp;lt;query/&amp;gt; wrapper for the &amp;lt;destroy/&amp;gt; element; updated the DTDs.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.9 (2002-10-13)&lt;br /&gt;
&lt;br /&gt;
Added extended presence ('...#user') on entering a room for MUC clients; changed namespace on room creation request to '...#owner'; added a service discovery example using jabber:iq:browse; added information about discussion history; made small fixes to several examples; further defined the presence rules; transferred all implementation notes to a dedicated section; added a Terminology section.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.8 (2002-10-10)&lt;br /&gt;
&lt;br /&gt;
Made further changes to the room creation workflow (finally correct); removed feature discovery use case (this needs to be addressed by a real service discovery protocol!); added ability for room owners to edit the admin list; removed &amp;lt;body/&amp;gt; from invitations generated by the service; removed messages sent to kicked and banned users (handled by unavailable presence with status code); added a number of implementation notes; converted all examples to Shakespeare style.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.6 (2002-10-09)&lt;br /&gt;
&lt;br /&gt;
Fixed the room creation workflow; changed some terminology (&amp;quot;join&amp;quot; to &amp;quot;enter&amp;quot; and &amp;quot;leave&amp;quot; to &amp;quot;exit&amp;quot;).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.5 (2002-10-08)&lt;br /&gt;
&lt;br /&gt;
Specified and improved the handling of invitation-only rooms. In particular, added the ability for room admins to edit the invitation list and added a configuration option that limits the ability to send invitations to room admins only.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.4 (2002-10-07)&lt;br /&gt;
&lt;br /&gt;
Changed namespaces from http://jabber.org/protocol/muc/owner etc. to http://jabber.org/protocol/muc#owner etc. per Jabber Council discussion.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.3 (2002-10-07)&lt;br /&gt;
&lt;br /&gt;
Changed namespaces to HTTP URIs; left role handling up to the implementation; further clarified presence rules.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.2 (2002-10-06)&lt;br /&gt;
&lt;br /&gt;
Disallowed kicking, banning, and revoking voice with respect to room admins and room owners; replaced &amp;lt;x/&amp;gt; with &amp;lt;query/&amp;gt; in the Discovering Room Features and Destroying a Room use cases; corrected some small errors and made many clarifications throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.1 (2002-10-04)&lt;br /&gt;
&lt;br /&gt;
Removed &amp;lt;whois/&amp;gt; command (unnecessary since participants with appropriate privileges receive the full JID of all participants in presence stanzas); completed many small fixes throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7 (2002-10-03)&lt;br /&gt;
&lt;br /&gt;
More clearly delineated participant roles and defined the hierarchy thereof (owner, admin, member, visitor); replaced &amp;lt;voice/&amp;gt; element in extended presence with &amp;lt;item role='member'/&amp;gt;; changed initial room configuration to use IQ rather than message; adjusted presence rules (especially regarding extended presence information); cleaned up examples throughout; updated DTD to track changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.6 (2002-09-21)&lt;br /&gt;
&lt;br /&gt;
More clearly defined the scope; removed fully anonymous rooms; changed meaning of semi-anonymous rooms and of non-anonymous rooms; added mechanism for notification of full JIDs in non-anonymous rooms; replaced the &amp;lt;admin/&amp;gt; element in extended presence with a &amp;lt;role/&amp;gt; element (more extensible); changed room passwords to cleartext; added status codes for various messages received from the service; added lists of valid error and status codes associated with the 'http://jabber.org/protocol/muc#user' namespace; added a &amp;lt;reason/&amp;gt; element for invitations; made kick and ban reasons child elements rather than attributes; replaced stopgap feature discovery mechanism with jabber:iq:negotiate; added extended presence element to room creation request and clarified the room creation process; specified presence reflection rules; added method for destroying a room; adjusted DTDs to track all changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.5.1 (2002-09-20)&lt;br /&gt;
&lt;br /&gt;
Added DTDs; changed feature discovery to use &amp;lt;x/&amp;gt; element rather than query and made service response come in IQ result; fixed reference to JID spec; changed 'grant' to 'add' and 'revoke' to 'remove' for consistency in the item attributes; made several other small changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.5 (2002-09-19)&lt;br /&gt;
&lt;br /&gt;
Changed the kick, ban, and voice protocols; added a few more configuration options; specified the restrictions for roomnicks; and added a stopgap service discovery protocol.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.4 (2002-09-18)&lt;br /&gt;
&lt;br /&gt;
Changed all non-GC-1.0 use cases to jabber:gc:* namespaces or jabber:x:data; added use cases for ban list management and room moderation; added protocol for sending notice of admin and voice privileges in presence; cleaned up text and many examples.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.3 (2002-09-17)&lt;br /&gt;
&lt;br /&gt;
Changed admin use cases; cleaned up participant and owner use cases.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.2 (2002-09-12)&lt;br /&gt;
&lt;br /&gt;
Broke content out into three actors (participant, owner, and admin) and added more detail to owner and admin use cases.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.1 (2002-09-09)&lt;br /&gt;
&lt;br /&gt;
Initial version.&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
END&lt;/div&gt;</summary>
		<author><name>Zyhserry</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0045</id>
		<title>XEP-0045</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0045"/>
				<updated>2014-01-02T03:17:26Z</updated>
		
		<summary type="html">&lt;p&gt;Zyhserry: /* 随后的房间配置 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0045.html XEP-0045]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0045: 多用户聊天'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本文定义了一个XMPP协议扩展用于多用户文本会议.即多个XMPP可以在一个房间或频道互相交流信息, 类似互联网中继聊天系统(IRC).还有标准聊天室功能如聊天室的主题和邀请，本协议定义了一个强有力的房间控制模型，包括能够踢和禁止用户，任命主持人和管理员，要求会员或密码才能加入房间，等等。&lt;br /&gt;
&lt;br /&gt;
作者:	Peter Saint-Andre&lt;br /&gt;
&lt;br /&gt;
XMPP扩展协议的版权(1999-2008)归XMPP标准化基金会(XSF)所有&lt;br /&gt;
&lt;br /&gt;
版权:	© 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0045#法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.24&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2008-07-16&lt;br /&gt;
&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个草案标准.对本协议的执行是被鼓励的,也适于部署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
传统上, 即时消息被视为由一对一的聊天构成而不是多对多聊天(即所谓&amp;quot;群聊&amp;quot;或&amp;quot;文本会议&amp;quot;). 群聊功能常见于一些系统如 Internet Relay Chat (IRC) 和 流行的IM服务所提供的聊天室功能. Jabber社区早在1999年开发和实施了一个基本的群聊协议. 这个 &amp;quot;groupchat 1.0&amp;quot; 协议为聊天室提供了一个最小功能集但是范围很有限. 本协议(多用户聊天或简称MUC)建立在向后兼容旧的&amp;quot;groupchat 1.0&amp;quot;协议的基础上但是提供高级功能如邀请, 房间主持和管理, 以及专门的房间类型.&lt;br /&gt;
&lt;br /&gt;
==范围==&lt;br /&gt;
&lt;br /&gt;
本文着重于和配置,参与以及管理一个独立的基于文本的会议室相关的通用需求. 这里所指出的需求是应用于单个房间级别的并且是&amp;quot;通用的&amp;quot;, 某种意义上它们是在Jabber社区广泛讨论的或在现有的Jabber之外的基于文本的会议环境(例如, 定义在 [http://tools.ietf.org/html/rfc1459 RFC 1459] [[XEP-0045#附录G:备注|1]]中的Internet Relay Chat 和它的继承者: [http://tools.ietf.org/html/rfc2810 RFC 2810] [[XEP-0045#附录G:备注|2]], [http://tools.ietf.org/html/rfc2811 RFC 2811] [[XEP-0045#附录G:备注|3]], [http://tools.ietf.org/html/rfc2812 RFC 2812] [[XEP-0045#附录G:备注|4]], [http://tools.ietf.org/html/rfc2813 RFC 2813] [[XEP-0045#附录G:备注|5]])中已经存在的.&lt;br /&gt;
&lt;br /&gt;
本文明确地不涉及以下需求:&lt;br /&gt;
&lt;br /&gt;
* 房间之间的关系(例如, 房间的层次结构)&lt;br /&gt;
&lt;br /&gt;
* 多用户聊天服务的管理(例如, 管理跨越整个服务级别的权限或注册一个全局可用的房间昵称)；这些用例定义在[http://xmpp.org/extensions/xep-0133.html Service Administration] [[XEP-0045#附录G:备注|6]]&lt;br /&gt;
&lt;br /&gt;
* 个别消息的主持&lt;br /&gt;
&lt;br /&gt;
* 通过房间发送的消息的加密&lt;br /&gt;
&lt;br /&gt;
* 高级特性, 如附加文件给一个房间, 集成白板, 以及和语音或视频聊天服务的接口&lt;br /&gt;
&lt;br /&gt;
* MUC部署和外来的聊天系统(例如, 和IRC网关或现有的其他IM系统)之间的交互&lt;br /&gt;
&lt;br /&gt;
* 在多个MUC部署之间进行镜像或复制&lt;br /&gt;
&lt;br /&gt;
这一受限的范围并非蔑视这些都很有用的主题; 无论如何, 这意味着本文专注于讨论和介绍一个易于理解的协议能够被类似的Jabber客户端和组件开发者实现. 将来的协议当然可能涉及以上提到的这些主题.&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
本文描述了由Jabber现有的多用户聊天服务提供的最小功能集. 为了向后兼容性起见, 本文使用原来的&amp;quot;groupchat 1.0&amp;quot;协议作为基本功能, 包括以下这些:&lt;br /&gt;
&lt;br /&gt;
* 每个房间被标识为 &amp;lt;room@service&amp;gt; (例如, &amp;lt;jdev@conference.jabber.org&amp;gt;), 这里 &amp;quot;room&amp;quot; 是房间的名称而 &amp;quot;service&amp;quot; 是多用户聊天服务运行所在的主机名.&lt;br /&gt;
&lt;br /&gt;
* 在一个房间里每个房客被标识为 &amp;lt;room@service/nick&amp;gt;, 这里 &amp;quot;nick&amp;quot; 是这个房客在这个房间里的昵称,定义于刚加入这个房间的时候，也可以在房客驻留改房间期间修改.&lt;br /&gt;
&lt;br /&gt;
* 一个用户通过发送出席信息给 &amp;lt;room@service/nick&amp;gt; 来加入一个房间（也就是成为房客）.&lt;br /&gt;
&lt;br /&gt;
* 在多用户聊天房间里发送的消息使用特殊的类型&amp;quot;groupchat&amp;quot;并且被寻址于房间本身 (room@service), 然后反映给所有房客.&lt;br /&gt;
&lt;br /&gt;
* 通过发送出席信息给 &amp;lt;room@service/newnick&amp;gt;，一个房客可以改变他或她的房间昵称以及在房间中的可用性状态 .&lt;br /&gt;
&lt;br /&gt;
* 通过发送一个类型为&amp;quot;unavailable&amp;quot;的出席信息给当前的&amp;lt;room@service/nick&amp;gt;，一个房客可以退出房间.&lt;br /&gt;
&lt;br /&gt;
本文追加的特性和功能包括以下这些:&lt;br /&gt;
&lt;br /&gt;
# 本地会话日志(不需要房间内的机器人)&lt;br /&gt;
# 允许用户申请房间成员&lt;br /&gt;
# 在一个非匿名房间里, 允许房客可以察看(另)一个房客的全JID&lt;br /&gt;
# 在一个半匿名房间里, 允许主持人可以察看一个房客的全JID&lt;br /&gt;
# 允许只有主持人修改房间主题&lt;br /&gt;
# 允许主持人从房间里踢出与会者和游客&lt;br /&gt;
# 在一个被主持的房间里,主持人可以授予和撤销发言权(也就是说, 发言的权力), 并且管理发言权列表&lt;br /&gt;
# 允许管理员授权和取消主持人权力, 并且管理主持人列表&lt;br /&gt;
# 允许管理员在房间禁止用户, 并管理黑名单&lt;br /&gt;
# 允许管理员授予和撤销成员权力, 并且管理一个仅限成员的房间的成员列表&lt;br /&gt;
# 允许所有者限制房客的数量&lt;br /&gt;
# 允许所有者指定其他的所有者(们)&lt;br /&gt;
# 允许所有者授予或撤销管理特权, 并管理管理员列表&lt;br /&gt;
# 允许所有者销毁房间&lt;br /&gt;
&lt;br /&gt;
另外, 本文提供了协议元素用于支持以下房间类型:&lt;br /&gt;
&lt;br /&gt;
# 公共的或隐藏的&lt;br /&gt;
# 持久的或临时的&lt;br /&gt;
# 密码保护的或不安全的&lt;br /&gt;
# 仅限成员的或开放的&lt;br /&gt;
# 主持的或非主持的&lt;br /&gt;
# 非匿名的或半匿名的&lt;br /&gt;
&lt;br /&gt;
为了实现这些需求, 本扩展协议需要满足 'http://jabber.org/protocol/muc' 名字空间(以及 在主名字空间URI加上 #owner, #admin, 和 #user 片断).&lt;br /&gt;
&lt;br /&gt;
==术语==&lt;br /&gt;
&lt;br /&gt;
===通用术语===&lt;br /&gt;
&lt;br /&gt;
Affiliation(岗位) -- 一个长期存在的和房间之间的联系或连接; 可能的岗位有 &amp;quot;owner&amp;quot;(所有者), &amp;quot;admin&amp;quot;(管理者), &amp;quot;member&amp;quot;(成员), 以及 &amp;quot;outcast&amp;quot;(被排斥者) (当然也可能没有岗位); 岗位(affiliation)和角色(role)是有区别的. 一个岗位跨越了用户对一个房间的访问期间.&lt;br /&gt;
&lt;br /&gt;
Ban(禁止) -- 从一个房间移除一个用户以使这个用户不能够再进入这个房间 (直到这个禁令被废除为止). 一个被禁止的用户的岗位(affiliation)为 &amp;quot;outcast&amp;quot;(被排斥者).&lt;br /&gt;
&lt;br /&gt;
Bare JID(纯JID) -- 一个用户的标识符 &amp;lt;user@host&amp;gt;, 不同于任何已有会话或资源的上下文, 与之相对的是全JID和房间JID.&lt;br /&gt;
&lt;br /&gt;
Full JID(全JID) -- 一个在线用户的标识符 &amp;lt;user@host/resource&amp;gt; , 不同于一个房间的上下文; 与之相对的是纯JID和房间JID.&lt;br /&gt;
&lt;br /&gt;
GC -- 最小的 &amp;quot;groupchat 1.0&amp;quot; 协议[7], Jabber社区于1999年开发; MUC 向后兼容GC.&lt;br /&gt;
&lt;br /&gt;
History(历史) -- 有限数量的消息节, 由当前讨论的上下文提供发送给一个新的房客.&lt;br /&gt;
&lt;br /&gt;
Invitation(邀请) -- 从一个用户发出的特殊消息给另一个用户, 邀请对方加入房间.; the invitation can be sent directly (see Direct MUC Invitations [8]) or mediated through the room (as described under Inviting Another User to a Room).&lt;br /&gt;
&lt;br /&gt;
IRC -- Internet Relay Chat.&lt;br /&gt;
&lt;br /&gt;
Kick(踢人) -- 临时从一个房间移除一个与会者或游客; 这个用户任何时候都可以再次进入这个房间. 一个被踢的用户的角色是&amp;quot;none&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Logging(记录) -- 存储发生在一个房间的讨论内容用于公开发布到房间上下文之外的地方.&lt;br /&gt;
&lt;br /&gt;
Member(成员) -- 一个用户在一个仅限会员的房间内处于&amp;quot;white list&amp;quot;(白名单)内，或已经注册到一个公开的房间. 一个成员的岗位是&amp;quot;member&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Moderator(主持人) -- 一个房间角色,通常和房间的管理有关但是这个角色可以被赋予非管理员; 可以踢人, 可以授予和撤销发言权, 等等. 一个主持人的角色是&amp;quot;moderator&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
MUC -- 本文所定义的基于文本会议的多用户聊天协议.&lt;br /&gt;
&lt;br /&gt;
Occupant(房客) -- 一个房间里的任何Jabber用户 (这是一个 &amp;quot;抽象类&amp;quot; 并且不对应任何特定的角色).&lt;br /&gt;
&lt;br /&gt;
Occupant JID(房客JID) -- 在一个房间上下文中的一个房客，以 &amp;lt;room@service/nick&amp;gt; 来标识; 与之相对的是纯JID和全JID.&lt;br /&gt;
&lt;br /&gt;
Outcast(被排斥者) -- 一个被某个房间禁止的用户. 一个被排斥者的岗位是 &amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Participant(与会者) -- 一个没有管理权限的房客; 在一个被主持的房间里, 参与者更多地被定义为有发言权的 (与之相反的是游客). 一个与会者的角色是&amp;quot;participant&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Private Message(私有消息) -- 从一个房客直接发给另一个房间JID的消息(不是房间本身广播给所有房客的消息).&lt;br /&gt;
&lt;br /&gt;
Role(角色) -- 在一个房间里的一个临时的地位或者权限级别, 对于这个房间中的用户的长期岗位来说是唯一的; 可能的角色有 &amp;quot;moderator&amp;quot;（主持人）, &amp;quot;participant&amp;quot;(与会者), 和 &amp;quot;visitor&amp;quot;(游客) (也可能没有预定义的角色). 一个角色仅仅存在于一个房客访问一个房间的期间.&lt;br /&gt;
&lt;br /&gt;
Room(房间) -- 一个虚拟的地方, Jabber用户象征性地加入它, 来和其他用户一起参与一个实时的基于文本的会议.&lt;br /&gt;
&lt;br /&gt;
Room Administrator(房间管理员) -- 一个由房间所有者授权的用户, 可以执行管理功能, 如禁止用户等等; 无论如何, 不允许改变定义的房间特性. 一个管理员的岗位是&amp;quot;admin&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
Room ID(房间ID) -- 一个房间JID的节点标识符部分, 它可以是不透明的因而对人类用户没有什么含义(见  语法的商业规则Business Rules for syntax); 与之相对的是房间名.&lt;br /&gt;
&lt;br /&gt;
Room JID(房间JID) -- 房间地址，如 &amp;lt;room@service&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Room Name(房间名) -- 一个用户友好的, 自然语言的房间名字, 由房间所有者配置并在服务查询中展示; 与之相对的是房间ID.&lt;br /&gt;
&lt;br /&gt;
Room Nickname(房间昵称) -- 房间JID的资源标识符部分(见语法的商业规则); 这是一个房客在这个房间中所呈现的&amp;quot;友好的名字&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Room Owner(房间所有者) -- 建立某个房间的Jabber用户或一个被房间创建者或所有者指派拥有所有者权限(如果允许的话)的Jabber用户; 它被允许改变定义好的房间特性, 也可以执行全部的管理功能. 一个所有者的岗位为&amp;quot;owner&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Room Roster(房间名册) -- 一个房间中的所有房客在一个Jabber客户端的展现.&lt;br /&gt;
&lt;br /&gt;
Server(服务器) -- 一个Jabber服务器，可以关联或不关联一个基于文本的会议服务.&lt;br /&gt;
&lt;br /&gt;
Service(服务) -- 一个主机, 提供基于文本的会议的能力; 通常但不必须是一个Jabber服务器的子域(例如, conference.jabber.org).&lt;br /&gt;
&lt;br /&gt;
Subject(主题) -- 一个房间的临时讨论标题.&lt;br /&gt;
&lt;br /&gt;
Visit(访问) -- 一个房间的一个用户的&amp;quot;session&amp;quot;(会话), 当用户进入这个房间时开始(也就是说, 成为一个房客) , 结束于用户离开房间之时.&lt;br /&gt;
&lt;br /&gt;
Visitor(游客) -- 在一个被主持的房间里的一个没有发言权的房客(相反则是一个与会者). 一个游客的角色是&amp;quot;visitor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Voice(发言权) -- 在一个被主持的房间里, 发送消息给全部房客的权限.&lt;br /&gt;
&lt;br /&gt;
===房间类型===&lt;br /&gt;
&lt;br /&gt;
Hidden Room(隐藏房间) -- 一个无法被任何用户以普通方法如搜索和服务查询来发现的房间; 反义词: 公开(public)房间.&lt;br /&gt;
&lt;br /&gt;
Members-Only Room(仅限会员的房间) -- 如果一个用户不在成员列表中则无法加入的一个房间; 反义词: 开放(open)房间.&lt;br /&gt;
&lt;br /&gt;
Moderated Room(被主持的房间) -- 只有有&amp;quot;发言权&amp;quot;的用户才可以发送消息给所有房客的房间; 反义词: 非主持的(Unmoderated)房间.&lt;br /&gt;
&lt;br /&gt;
Non-Anonymous Room(非匿名房间) -- 一个房客的全JID会暴露给所有其他房客的房间, 尽管房客可以选择任何期望的房间昵称; 相对的是半匿名(Semi-Anonymous)房间.&lt;br /&gt;
&lt;br /&gt;
Open Room(开放房间) -- 任何人可以加入而不需要在成员列表中的房间; 反义词: 仅限会员的房间.&lt;br /&gt;
&lt;br /&gt;
Password-Protected Room(密码保护房间) -- 一个用户必须提供正确密码才能加入的房间; 反义词: 非保密房间.&lt;br /&gt;
&lt;br /&gt;
Persistent Room(持久房间) -- 如果最后一个房客退出也不会被销毁的房间; 反义词: 临时房间.&lt;br /&gt;
&lt;br /&gt;
Public Room(公开房间) -- 用户可以通过普通方法如搜索和服务查询来发现的房间; 反义词: 隐藏房间.&lt;br /&gt;
&lt;br /&gt;
Semi-Anonymous Room(半匿名房间) -- 一个房客的全JID只能被房间管理员发现的房间; 相对的是非匿名(Non-Anonymous)房间.&lt;br /&gt;
&lt;br /&gt;
Temporary Room(临时房间) -- 如果最后一个房客退出就会被销毁的房间; 反义词: 持久房间.&lt;br /&gt;
&lt;br /&gt;
Unmoderated Room(非主持的房间) -- 任何房客都被允许发送消息给所有房客的房间; 反义词: 被主持的房间.&lt;br /&gt;
&lt;br /&gt;
Unsecured Room(非保密房间) -- 任何人不需要提供密码就可以进入的房间; 反义词: 密码保护房间.&lt;br /&gt;
&lt;br /&gt;
===登场人物===&lt;br /&gt;
&lt;br /&gt;
本文的大部分例子使用了莎士比亚的《麦克白》中第四幕第一场开头女巫在黑洞中开会的场景，在这里使用&amp;quot;coven@chat.shakespeare.lit&amp;quot;代表聊天室. 人物如下:&lt;br /&gt;
&lt;br /&gt;
'''表1: 剧中人'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!Room Nickname !!Full JID!!Affiliation&lt;br /&gt;
|-&lt;br /&gt;
|firstwitch ||crone1@shakespeare.lit/desktop ||Owner&lt;br /&gt;
|-&lt;br /&gt;
|secondwitch ||wiccarocks@shakespeare.lit/laptop ||Admin&lt;br /&gt;
|-&lt;br /&gt;
|thirdwitch ||hag66@shakespeare.lit/pda ||None&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==角色(Roles)，岗位(Affiliations)和权限(Privileges)==&lt;br /&gt;
&lt;br /&gt;
A user might be allowed to perform any number of actions in a room, from joining or sending a message to changing configuration options or destroying the room altogether. We call each permitted action a &amp;quot;privilege&amp;quot;. There are two ways we might structure privileges:&lt;br /&gt;
&lt;br /&gt;
1. Define each privilege atomically and explicitly define each user's particular privileges; this is flexible but can be confusing to manage.&lt;br /&gt;
&lt;br /&gt;
2. Define bundles of privileges that are generally applicable and assign a user-friendly &amp;quot;shortcut&amp;quot; to each bundle (e.g., &amp;quot;moderator&amp;quot; or &amp;quot;admin&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
MUC使用第2种方式。&lt;br /&gt;
&lt;br /&gt;
有两个尺度我们可以用来衡量一个用户的连接或在一个房间的地位. 一个是用户和一个房间的长期的联系 -- 例如, 用户的状态是一个所有者或一个被排斥者. 另一个是当用户驻留于一个聊天室的时候的角色 -- 例如, 一个房客的地位是主持人,有权踢出游客和与会者. 这两个尺度各自都是唯一的, 因为一个岗位是跨越访问的, 而一个角色只存在于一次访问期间. 另外, 在角色和岗位之间没有一对一的对应关系; 例如, 某个不从属于某房间的人可能成为一个(临时的)主持人, 一个成员可能在一个被主持的房间中是一个与会者或游客者. 这些概念以下全面解释.&lt;br /&gt;
&lt;br /&gt;
===角色===&lt;br /&gt;
&lt;br /&gt;
以下是已定义的角色:&lt;br /&gt;
&lt;br /&gt;
'''表2: 角色'''&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!名称 !!支持&lt;br /&gt;
|-&lt;br /&gt;
| 主持人Moderator   ||必需的 &lt;br /&gt;
|-&lt;br /&gt;
| 无None       ||缺少角色&lt;br /&gt;
|-&lt;br /&gt;
| 与会者Participant   ||必需的&lt;br /&gt;
|-&lt;br /&gt;
| 游客Visitor     ||推荐的&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
角色是临时的,它不一定要在用户对房间的访问中持久化,它可以(MAY)在一个房客访问房间期间改变. 一个实现可以(MAY)在一次访问期间持久化角色并且应该(SHOULD)在被主持的房间这样做 (因为在游客和与会者之间,唯一性对一个被主持的房间是很关键的).&lt;br /&gt;
&lt;br /&gt;
在角色和岗位之间没有一对一的映射(例如, 一个成员可以是一个与会者或一个游客).&lt;br /&gt;
&lt;br /&gt;
在房间会话中,一个主持人是最有权力的房客, 它能在某种程度走上管理房间的其他房客的角色. 一个与会者的权力小于一个主持人, 尽管他或她有权发言. 在一个被主持的房间会话中游客是一个更受限制的角色, 因为访问者不允许发送消息给所有房客.&lt;br /&gt;
&lt;br /&gt;
角色的授予,撤销, 和维护是基于房客的房间昵称或全JID,而不是纯JID. 和这些角色相关的权限，还有角色改变触发的动作, 定义在下文中.&lt;br /&gt;
&lt;br /&gt;
所有在房间中生成或反射的出席信息中关于角色的信息必须(MUST)被发送,从而发送给房客们.&lt;br /&gt;
&lt;br /&gt;
====权限====&lt;br /&gt;
&lt;br /&gt;
大部分情况下, 角色存在于一个层次中. 例如, 一个与会者可以做任何游客能做的事, 而一个主持人可以做任何与会者能做的事. 每个角色拥有下一级角色所没有的权限; 这些权限定义于下表作为缺省值(一个实现可以(MAY)提供配置选项来重载这些缺省值).&lt;br /&gt;
&lt;br /&gt;
'''表3: 和角色相关的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!权限 !!无 !!游客 !!与会者 !!主持人&lt;br /&gt;
|-&lt;br /&gt;
|在房间中出席 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|接收消息 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|接收房客出席信息 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|出席信息广播到房间 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|改变可用性状态 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|改变房间昵称 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|发送私人消息 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|邀请其他用户 ||否 ||是* ||是* ||是&lt;br /&gt;
|-&lt;br /&gt;
|发送消息给所有人 ||否 ||否** ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|修改标题 ||否 ||否* ||是* ||是&lt;br /&gt;
|-&lt;br /&gt;
|踢出与会者和游客 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|授予发言权 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|撤销发言权 ||否 ||否 ||否 ||是***&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 缺省; 设定配置时可以(MAY)修改这个权限.&lt;br /&gt;
&lt;br /&gt;
** 一个实现可以(MAY)在非主持的房间里缺省地授予发言权给游客.&lt;br /&gt;
&lt;br /&gt;
*** 主持人不能(MUST NOT)从一个管理员或所有者收回发言权.&lt;br /&gt;
&lt;br /&gt;
====默认角色====&lt;br /&gt;
&lt;br /&gt;
服务必须（SHOULD）根据用户的岗位信息来设置房客在房间里的默认角色（没有与岗位（“outcast”）关联的默认角色，因为outcast用户不允许进入房间）。下表对与每个岗位关联的默认角色进行了总结。&lt;br /&gt;
&lt;br /&gt;
表4: 基于岗位的默认角色&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!Room Type !!None !!Member !!Admin !!Owner&lt;br /&gt;
|-&lt;br /&gt;
|Moderated ||Visitor ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Unmoderated ||Participant ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Members-Only ||N/A * ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Open	||Participant ||Participant ||Moderator ||Moderator&lt;br /&gt;
|}&lt;br /&gt;
* Entry is not permitted.&lt;br /&gt;
&lt;br /&gt;
====变更角色====&lt;br /&gt;
&lt;br /&gt;
一个房客的角色变更方法是定义好的. 有时候房客自己的动作导致变更 (例如, 加入或退出房间), 反之有时候由主持人,管理员或所有者的动作导致变更. 如果一个房客的角色改变了, 一个 MUC 服务实现必须(MUST)变更这个房客的角色来反映这个变更并且传达这个变更给所有房客. 角色的变更和它们触发的动作定义于下表.&lt;br /&gt;
&lt;br /&gt;
'''表4: 角色状态表'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!&amp;gt; !!无 !!游客 !!与会者 !!主持人&lt;br /&gt;
|-&lt;br /&gt;
|无 ||-- ||进入被主持的房间 ||进入非主持的房间 ||管理员或所有者进入房间&lt;br /&gt;
|-&lt;br /&gt;
|游客 ||退出房间或被主持人踢出房间 ||-- ||主持人授予发言权 ||管理员或所有者授予主持人权限&lt;br /&gt;
|-&lt;br /&gt;
|与会者 ||退出房间或被主持人踢出房间 ||主持人撤销发言权	||--  ||管理员或所有者授予主持人权限 &lt;br /&gt;
|-&lt;br /&gt;
|主持人	||退出房间 ||管理员或所有者改变角色成为游客* ||管理员或所有者改变角色成为与会者或撤销主持人权限* ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 一个主持人不能(MUST NOT)从一个岗位等于或高于主持人的房客那里收回主持人权限.&lt;br /&gt;
&lt;br /&gt;
注意: 特定的角色一般暗含特定的权限. 例如, 一个管理员或所有者自动成为一个主持人, 所以如果一个房客被授予管理员地位那么这个房客事实上将被授予主持人权限; 类似的, 当一个房客成为一个被主持的房间的成员, 这个房客自动拥有一个与会者的角色. 无论如何, 失去管理员地位并不足以意味这个房客不再是主持人 (因为只要是与会者就可能成为一个主持人). 因此, 当一个房客被授予特定的岗位的时候所拥有的角色是固定的, 反之当一个房客失去一个特定的岗位时它的角色是不确定的并取决于(服务的)实现. 因为一个客户端无法预料是否在撤销某个岗位之后这个角色成为什么, 如果它不想同时移除管理员/所有者权限和主持人角色, 那么除了岗位变更之外它还必须特意请求角色变更.&lt;br /&gt;
&lt;br /&gt;
===岗位===&lt;br /&gt;
&lt;br /&gt;
已定义了以下岗位:&lt;br /&gt;
&lt;br /&gt;
# 所有者&lt;br /&gt;
# 管理员&lt;br /&gt;
# 成员&lt;br /&gt;
# 被排斥者&lt;br /&gt;
# 无 (缺少岗位)&lt;br /&gt;
&lt;br /&gt;
必须支持&amp;quot;所有者&amp;quot;这个岗位,推荐支持&amp;quot;管理员&amp;quot;,&amp;quot;成员&amp;quot;,&amp;quot;被排斥者&amp;quot;的岗位.（&amp;quot;无&amp;quot;表示缺少岗位)&lt;br /&gt;
&lt;br /&gt;
这些岗位是长时间的跨越一个用户对这个房间的访问期间的并且不受房间里事件的影响. 而且, 这些岗位和一个房客在房间中的角色之间没有一对一的映射关系. 岗位被授予,撤销, 和维护都是基于这个用户的纯 JID.&lt;br /&gt;
&lt;br /&gt;
如果一个没有已定义的岗位的用户进入一个房间, 这个用户的岗位被定义为&amp;quot;无&amp;quot;; 无论如何, 这个岗位不能跨越(多次的)访问 (也就是说, 一个服务不会跨越访问维护一个 &amp;quot;无 列表&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;quot;成员&amp;quot;岗位为房间所有者或管理员提供了一个方法来指定一个&amp;quot;白名单&amp;quot;,其中的用户被允许加入一个仅供会员的房间. 当一个成员加入了一个仅供会员的房间, 他或她的岗位不会改变, 无论他或她的角色是什么. 成员岗位也为用户提供一个方法来高效地注册一个开放的房间并在某种方式意义上保持和那个房间的联系(例如可能在房间里预留那个用户的昵称).&lt;br /&gt;
&lt;br /&gt;
一个被排斥者就是一个被从房间踢出来并且不允许进入那个房间的用户.&lt;br /&gt;
&lt;br /&gt;
关于岗位的信息必须(MUST)由房间生成或反射到所有的出席信息节之中发送给房客们.&lt;br /&gt;
&lt;br /&gt;
====权限====&lt;br /&gt;
&lt;br /&gt;
大部分情况下, 岗位存在一个层次结构. 例如, 一个所有者可以做任何管理员能做的事情, 而一个管理员可以做任何成员能做的事情. 每个岗位拥有其下一级岗位所没有的权限; 这些权限定义在下表中.&lt;br /&gt;
&lt;br /&gt;
'''表5: 和岗位相关的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!权限 !!Outcast(被排斥者) !!None(无) !!Member(成员) !!Admin(管理员) !!Owner(所有者)&lt;br /&gt;
|-&lt;br /&gt;
|进入房间 ||否 ||是* ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|注册一个开放的房间 ||否 ||是 ||N/A ||N/A ||N/A&lt;br /&gt;
|-&lt;br /&gt;
|接收成员列表 ||否 ||否** ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|加入一个仅限会员的房间 ||否 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|禁止成员并把用户的岗位删除	||否 ||否 ||否 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑成员列表 ||否 ||否 ||否 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑主持人列表 ||否 ||否 ||否 ||是** ||是**&lt;br /&gt;
|-&lt;br /&gt;
|编辑管理员列表 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑所有者列表 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|变更房间定义 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|销毁房间	||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 作为缺省值, 一个无岗位的用户进入一个被主持的房间的角色是一个游客, 而进入一个开放的房间的角色是一个与会者. 一个成员进入一个房间的角色是与会者. 一个管理员或所有者进入房间的角色是一个主持人.&lt;br /&gt;
&lt;br /&gt;
** 一个管理员或所有者不能(MUST NOT)撤销另一个管理员或所有者的权限.&lt;br /&gt;
&lt;br /&gt;
====变更岗位====&lt;br /&gt;
&lt;br /&gt;
一个用户的岗位变更方法已经定义得很完善. 有时用户自己的动作导致这些变更(例如, 注册为一个房间的新成员), 反之有时候一个管理员或所有者的动作导致了这些变更. 如果一个用户的岗位改变了, 一个MUC服务实现必须(MUST)变更这个用户的岗位来反射这一变更并通知所有房客. 岗位变更和他们触发的动作定义在下表中.&lt;br /&gt;
&lt;br /&gt;
'''表6: 岗位状态表'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|  ||被排斥者(Outcast) ||无(None) ||成员(Member) ||管理员(Admin) ||所有者(Owner)&lt;br /&gt;
|-&lt;br /&gt;
|被排斥者(Outcast) ||-- ||管理员或所有者移除屏蔽 ||管理员或所有者增加用户到成员列表 ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|无(None) ||管理员或所有者使用屏蔽 ||-- ||管理员或所有者增加用户到成员列表, 或用户注册一个成员(如果允许) ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|成员(Member) ||管理员或所有者使用屏蔽 ||管理员或所有者变更岗位为&amp;quot;none&amp;quot; ||-- ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|管理员(Admin) ||所有者使用屏蔽 ||所有者变更岗位为&amp;quot;none&amp;quot; ||所有者变更岗位为&amp;quot;member&amp;quot; ||-- ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|所有者(Owner) ||所有者使用屏蔽 ||所有者变更岗位为&amp;quot;none&amp;quot; ||所有者变更岗位为&amp;quot;member&amp;quot; ||所有者变更岗位为&amp;quot;admin&amp;quot; ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==实体用例==&lt;br /&gt;
&lt;br /&gt;
一个MUC实现必须(MUST)支持[http://xmpp.org/extensions/xep-0030.html 服务发现] [[XEP-0045#附录G:备注|7]].&lt;br /&gt;
&lt;br /&gt;
===MUC的发现组件支持===&lt;br /&gt;
&lt;br /&gt;
一个Jabber实体可能希望发现是否一个服务实现了多用户聊天协议; 为了达到这个目的, 它发送一个服务发现信息(&amp;quot;disco#info&amp;quot;)查询给这组件的JID:&lt;br /&gt;
&lt;br /&gt;
'''例子 1. 用户通过Disco查询聊天服务是否支持MUC'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco1'&lt;br /&gt;
    to='macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须(MUST)返回它的的身份和它所支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 2. 服务返回Disco Info结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='Macbeth Chat Service'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 因为MUC是旧的&amp;quot;groupchat 1.0&amp;quot;协议的超集, 一个MUC服务不应该(SHOULD NOT)返回一个&amp;lt;feature var='gc-1.0'/&amp;gt;条目在一个disco#info结果中.&lt;br /&gt;
&lt;br /&gt;
===发现房间===&lt;br /&gt;
&lt;br /&gt;
发现服务条目(&amp;quot;disco#items&amp;quot;)协议使得一个用户可以向一个服务查询相关的条目列表, 在一个聊天服务中这包含这个服务所承载的所有特定房间的集合.&lt;br /&gt;
&lt;br /&gt;
'''例子 3. 用户向聊天服务查询房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco2'&lt;br /&gt;
    to='macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务应该(SHOULD)返回它承载的所有房间的列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 4. 服务返回Disco Item结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='heath@macbeth.shakespeare.lit'&lt;br /&gt;
          name='A Lonely Heath'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
          name='A Dark Cave'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='forres@macbeth.shakespeare.lit'&lt;br /&gt;
          name='The Palace'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='inverness@macbeth.shakespeare.lit'&lt;br /&gt;
          name='Macbeth&amp;amp;apos;s Castle'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果全部房间的列表太大(详见[[XEP-0030]]), 服务可以(MAY)只返回部分的房间列表.如果这样做了, 它应该 SHOULD 包含一个 &amp;lt;set/&amp;gt; 元素 (定义在 [http://xmpp.org/extensions/xep-0059.html Result Set Management] [[XEP-0045#附录G:备注|8]]) 以表明这个列表不是全部的结果集.&lt;br /&gt;
&lt;br /&gt;
'''例子 5. 服务返回Disco Item结果的部分列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='rooms.shakespeare.lit'&lt;br /&gt;
    id='disco-rsm-1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='alls-well-that-ends-well@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='as-you-like-it@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='cleopatra@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='comedy-of-errors@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='coriolanus@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='cymbeline@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hamlet@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fourth-one@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fourth-two@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fifth@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;set xmlns='http://jabber.org/protocol/rsm'&amp;gt;&lt;br /&gt;
      &amp;lt;first index='0'&amp;gt;alls-well-that-ends-well@rooms.shakespeare.lit&amp;lt;/first&amp;gt;&lt;br /&gt;
      &amp;lt;last&amp;gt;henry-the-fifth@rooms.shakespeare.lit&amp;lt;/last&amp;gt;&lt;br /&gt;
      &amp;lt;count&amp;gt;37&amp;lt;/count&amp;gt;&lt;br /&gt;
    &amp;lt;/set&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===查询房间信息===&lt;br /&gt;
&lt;br /&gt;
使用 disco#info 协议, 一个用户也可以查询一个特定房间的详情. 为了在进入房间之间确定这个房间的隐私和安全配置用户应该(SHOULD)这样做(详见[[XEP-0045#安全事项|安全事项]]).&lt;br /&gt;
&lt;br /&gt;
'''例子 6. 用户查询特定聊天室的信息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco3'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间必须(MUST)返回它的标识并且应该(SHOULD)返回它支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 7. 房间返回查询信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco3'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='A Dark Cave'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_passwordprotected'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_hidden'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_temporary'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_open'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_unmoderated'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_nonanonymous'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 因为 MUC 是旧的 &amp;quot;groupchat 1.0&amp;quot; 协议的超集, 一个 MUC 房间不应该(SHOULD NOT)在一个disco#info结果中返回&amp;lt;feature var='gc-1.0'/&amp;gt;条目. 房间应该(SHOULD)返回它支持的实质的有意义的特性, 例如密码保护和房间主持(这些特性被完整地列入了特性注册, 由[http://xmpp.org/registrar/ XMPP Registrar]维护; 也见于本文的[[XEP-0045#registrar|XMPP注册]] 章节).&lt;br /&gt;
&lt;br /&gt;
一个聊天室可以(MAY)使用[http://xmpp.org/extensions/xep-0128.html 服务查询扩展] [[XEP-0045#附录G:备注|9]]在它的disco#info应答中返回更详细的信息, 通过包含一个隐含的FORM_TYPE属性值&amp;quot;http://jabber.org/protocol/muc#roominfo&amp;quot;来标识. 这些信息可能包括关于一个房间的更详细的描述, 当前的房间标题, 以及这个房间当前的房客数量:&lt;br /&gt;
&lt;br /&gt;
'''例子 8. 房间返回扩展的查询信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco3a'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='A Dark Cave'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_passwordprotected'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_hidden'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_temporary'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_open'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_unmoderated'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_nonanonymous'/&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_description' label='Description'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_changesubject' label='Whether Occupants May Change the Subject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_contactjid' label='Contact Addresses'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;crone1@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_subject' label='Subject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Spells&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_occupants' label='Number of occupants'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;3&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_lang' label='Language of discussion'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_logs' label='URL for discussion logs'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://www.shakespeare.lit/chatlogs/darkcave/&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_pubsub' label='Associated pubsub node'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;xmpp:pubsub.shakespeare.lit?node=chatrooms/darkcave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
某些扩展的房间信息可能是动态生成的(例如, 讨论记录的URL地址, 它可能取决于服务器那一层的配置); 反之另一些信息则可能基于房间那一层的配置,任何定义在[[XEP-0045#附录G:备注|muc#roomconfig FORM_TYPE]] 里的字段都可以用于扩展服务发现的字段(如上文所示的 muc#roomconfig_changesubject 字段).&lt;br /&gt;
&lt;br /&gt;
注意: 前述 'http://jabber.org/protocol/muc#roominfo' FORM_TYPE的扩展服务发现字段将来还可以扩充(通过本文的[[XEP-0045#附录G:备注|字段标准化]]章节描述的机制).&lt;br /&gt;
&lt;br /&gt;
===查询房间条目===&lt;br /&gt;
&lt;br /&gt;
一个用户也可以(MAY)向一个特定的聊天室查询和它相关的条目:&lt;br /&gt;
&lt;br /&gt;
'''例子 9. 用户查询和一个特定聊天室相关的条目'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个实现可以(MAY)返回现有房客的列表(如果那信息是可公开的), 或不返回列表(如果那信息是私有的).&lt;br /&gt;
&lt;br /&gt;
'''例子 10. 房间返回查询条目结果(条目是公开的)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit/firstwitch'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit/secondwitch'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 这些 &amp;lt;item/&amp;gt; 元素由 disco#items 名字空间限定, 而不是 muc 名字空间; 这意味着他们不能拥有 'affiliation' 或 'role' 属性, 例如.&lt;br /&gt;
&lt;br /&gt;
'''例子 11. 房间返回空的查询条目结果(条目是私有的)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===查询一个房间的房客===&lt;br /&gt;
&lt;br /&gt;
如果一个非房客试图发送一个查询请求给一个&amp;lt;room@service/nick&amp;gt;类型的地址, 一个 MUC 服务应该(SHOULD)返回这个请求给这个实体并指明一个&amp;lt;bad-request/&amp;gt;错误条件. 如果一个房客发送这样一个请求, 服务可以(MAY)把它传递给指定的接收者; 详见本文的 [[XEP-0045#实现注意事项|实现注意事项]]章节.&lt;br /&gt;
&lt;br /&gt;
===发现客户端对MUC的支持===&lt;br /&gt;
&lt;br /&gt;
一个 Jabber 用户可能想发现这个用户的某个联系人是否支持多用户聊天协议. 这可以使用服务发现(协议)来完成.&lt;br /&gt;
&lt;br /&gt;
'''例子 12. 用户查询联系人对于 MUC 的支持'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco5'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
客户端应该(SHOULD)返回它的标识和它支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 13. 联系人返回发现信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='disco5'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='client'&lt;br /&gt;
        type='pc'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个用户也可能查询一个联系人在哪个房间. 这可以通过特定服务发现节点 'http://jabber.org/protocol/muc#rooms' 查询联系人的全JID(&amp;lt;user@host/resource&amp;gt;)来完成 :&lt;br /&gt;
&lt;br /&gt;
'''例子 14. 用户在当前房间查询联系人'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='rooms1'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#rooms'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 15. 联系人返回房间查询结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='rooms1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#rooms'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='characters@conference.shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可选的, 联系人可以(MAY)把它的房间昵称作为'name'属性的值返回:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
          name='secondwitch'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==房客用例==&lt;br /&gt;
&lt;br /&gt;
在一个多用户聊天环境中主要的行为者是房客, 它可以被认为存在于一个多用户聊天室&amp;quot;之内&amp;quot;并且参与那个房间的讨论 (在本协议中, 与会者和游客&amp;quot;仅仅&amp;quot;被认为是房客, 因为他们不拥有管理员权限). 为了更加清晰起见, 本文中的协议元素中涉及到驻留者的用例分为以下三类:&lt;br /&gt;
&lt;br /&gt;
# 现存于 &amp;quot;groupchat 1.0&amp;quot; 协议的最小功能集&lt;br /&gt;
# 对于 &amp;quot;groupchat 1.0&amp;quot; 协议直接的应用, 如处理一些和新房间类型有关的错误&lt;br /&gt;
# 用来处理&amp;quot;groupchat 1.0&amp;quot;协议未涉及的功能的额外的协议元素(房间邀请, 房间密码, 和房间角色及岗位相关的扩展出席信息); 在'http://jabber.org/protocol/muc#user'名字空间&lt;br /&gt;
&lt;br /&gt;
注意: 这里所有客户端生成的例子是从服务的角度来展示的, 所以所有由服务收到的节都包含一个'from'属性来表达发送者的全JID(这个from属性是由一个通用的Jabber路由或会话管理者加入的). 另外, 通常的表示请求已被完成的 IQ 结果节(如 [[RFC 3920]] [10]中所要求的)未显示在这里.&lt;br /&gt;
&lt;br /&gt;
===进入一个房间===&lt;br /&gt;
&lt;br /&gt;
====Groupchat 1.0协议====&lt;br /&gt;
&lt;br /&gt;
为了参加一个多用户聊天室的讨论, 一个Jabber用户必须(MUST)首先进入一个房间成为一个房客. 在旧的&amp;quot;groupchat 1.0&amp;quot;协议中, 这是通过发送出席信息&amp;lt;room@service/nick&amp;gt;来实现的, 这里&amp;quot;room&amp;quot;是房间的 ID, &amp;quot;service&amp;quot; 是聊天服务的主机名, &amp;quot;nick&amp;quot; 是这个用户在这房间里预期的昵称:&lt;br /&gt;
&lt;br /&gt;
'''例子 16. Jabber用户进入一个房间(Groupchat 1.0)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit/thirdwitch'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子中, 一个全JID为&amp;quot;hag66@shakespeare.lit/pda&amp;quot;的用户请求用昵称&amp;quot;thirdwitch&amp;quot;进入位于&amp;quot;macbeth.shakespeare.lit&amp;quot;聊天服务的房间&amp;quot;darkcave&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
如果用户未指定一个房间昵称, 服务应该(SHOULD)返回一个&amp;lt;jid-malformed/&amp;gt;错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 17. Jabber用户进入一个房间(Groupchat 1.0)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error code='400' type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;jid-malformed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====基本MUC协议====&lt;br /&gt;
&lt;br /&gt;
兼容的多用户聊天服务必须（MUST）接受知道&amp;quot;groupchat 1.0&amp;quot; (GC)协议或multi-user chat (MUC)协议的任何客户端发出上述请求进入会议室; 无论如何, MUC 客户端应该(SHOULD)声明他们的有能力支持 MUC 协议, 方法是在出席信息节里面包含一个空的 &amp;lt;x/&amp;gt; 元素, 满足名字空间 'http://jabber.org/protocol/muc'  (注意不需要 '#user' 部分):&lt;br /&gt;
&lt;br /&gt;
'''例子 18. Jabber用户准备进入一个房间(Multi-User Chat)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from=&amp;quot;hag66@shakespeare.lit/pda&amp;quot;&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 如果发生了一个和加入房间有关的错误, 服务应该 SHOULD 返回一个包含 MUC 子元素 (i.e., &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;) 的 &amp;lt;presence/&amp;gt; 节，其 type 为 &amp;quot;error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
在尝试进入房间之间, 一个兼容MUC的客户端应该(SHOULD)首先查询它的保留的房间昵称 (如果有的话), 接下来的协议本文中的 [[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]] 章节对此作了定义.&lt;br /&gt;
&lt;br /&gt;
====出席信息广播====&lt;br /&gt;
&lt;br /&gt;
如果服务能够添加用户到房间, 它必须(MUST)从所有现存的房客的房间JID发送出席信息给新的房客的全JID, 包括扩展的关于角色的出席信息, 一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;moderator&amp;quot;, &amp;quot;participant&amp;quot;, 或&amp;quot;visitor&amp;quot;, 这个子元素的'affiliation'属性值设为&amp;quot;owner&amp;quot;, &amp;quot;admin&amp;quot;, &amp;quot;member&amp;quot;, 或 &amp;quot;none&amp;quot; 中的一个:&lt;br /&gt;
&lt;br /&gt;
'''例子 19. 服务从现有的房客发送出席信息给新的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个示例中, 用户已从前一个例子进入房间, 有两个人已经在房间里: 一个是昵称为&amp;quot;firstwitch&amp;quot;的(房间拥有者), 另一个是昵称为&amp;quot;secondwitch&amp;quot;的(房间管理员).&lt;br /&gt;
&lt;br /&gt;
服务也必须(MUST)从新进入的房客的房间JID向所有房客的全JID发送出席信息(含新房客):&lt;br /&gt;
&lt;br /&gt;
'''例子 20. 服务发送新房客的出席信息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
在这个例子里, 初始的房间出席信息从新房客(thirdwitch)发送给所有房客, 包括这个新房客自己. 看看上面最后一个节, 由房间以房客的名义发送给用户自己的出席信息,应该 SHOULD 包含一个 110 状态码，这样用户就知道这个出席信息来自于作为房客的那个他自己.&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 重写新房客的房间昵称 (例如, 如果房间昵称被锁定). 如果服务不接受新房客请求的房间昵称，而是分配一个新的房间昵称, 它必须 MUST 包含一个 &amp;quot;210&amp;quot; 状态码在发送给这个新房客的出席信息广播里.&lt;br /&gt;
&lt;br /&gt;
'''例子 21. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
注意: 发送给新房客的出席信息的顺序是很重要的. 服务必须 MUST 首先发送现有房客的完整列表给这个新房客,然后只发送新房客自己的出席信息给新房客. 这有助于客户端知道什么时候它收到了完整的房间名册( &amp;quot;room roster&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
发送出席信息广播之后(并且只在这之后), 服务可以发送讨论历史, 即时消息, 出席信息更新, 以及其他房间内的流量.&lt;br /&gt;
&lt;br /&gt;
====缺省角色====&lt;br /&gt;
&lt;br /&gt;
下表总结了初始缺省的角色，一个服务应该根据用户的岗位来设置它们(没有和 被排斥者 &amp;quot;outcast&amp;quot; 岗位相关的角色, 因为这些用户不允许进入房间).&lt;br /&gt;
&lt;br /&gt;
'''表7: 基于岗位的初始角色'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!房间类型 !!无 !!成员 !!管理员 !!所有者&lt;br /&gt;
|-&lt;br /&gt;
|被主持的 ||游客 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|非主持的 ||与会者 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|仅限会员的 ||N/A * ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|开放的 ||与会者 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 实体不被允许.&lt;br /&gt;
&lt;br /&gt;
====非匿名房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是非匿名的, 服务必须 MUST 发送新房客的全JID给所有房客,使用满足 'http://jabber.org/protocol/muc#user' 名字空间的扩展出席信息,其中带有 &amp;lt;x/&amp;gt; 元素并包含一个 &amp;lt;item/&amp;gt; 子元素,其 'jid' 属性值为这个房客的全JID:&lt;br /&gt;
&lt;br /&gt;
'''例子 22. 服务发送全JID给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这个用户正在进入一个非匿名房间(即, 它如上所示,向所有房客通报每个房客的全JID), 服务应该 SHOULD 允许该用户加入本房间,但是必须 MUST 同时警告该用户本房间是非匿名的. 应该 SHOULD 在房间发送给这个新房客的初始出席信息种包含状态码 &amp;quot;100&amp;quot; 来实现这一点:&lt;br /&gt;
&lt;br /&gt;
'''例子 23. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 也可以 MAY 发送一个 &amp;quot;groupchat&amp;quot; 类型的消息给新房客来达到上述目的,这个消息应该包含一个 &amp;lt;x/&amp;gt; 子元素,并拥有 &amp;lt;status/&amp;gt; 子元素,并且其'code'属性值为&amp;quot;100&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 24. 服务警告新房客(该房间)非匿名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;This room is not anonymous.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
附带的状态码协助客户端展示它们自己的通知消息 (例如, 和用户所在地方有关的信息).&lt;br /&gt;
&lt;br /&gt;
====半匿名房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是半匿名的, 服务必须 MUST 如上文所述从新房客发送出席信息给所有房客, 但是必须 MUST 只在发给&amp;quot;主持人&amp;quot;的时候发送新房客的全JID,而非主持人则不发(全JID).&lt;br /&gt;
&lt;br /&gt;
(注意: 所有随后的例子中，涉及的&amp;lt;item/&amp;gt;元素都带有'jid'属性, 即使这个信息在半匿名房间里不被发送给非主持人.)&lt;br /&gt;
&lt;br /&gt;
====密码保护房间====&lt;br /&gt;
&lt;br /&gt;
如果房间要求密码验证而用户不能提供(或密码错误), 服务必须 MUST 拒绝访问这个房间并且通知该用户它们是未被授权的; 具体方法是返回一个类型为&amp;quot;error&amp;quot;的出席信息节并标明 &amp;lt;not-authorized/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 25. 服务拒绝访问,因为(用户)未提供密码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
密码应该 SHOULD 通过进入房间时发送的出席信息节来提供, 包含在满足 'http://jabber.org/protocol/muc' 名字空间的 &amp;lt;x/&amp;gt; 元素的&amp;lt;password/&amp;gt; 子元素里. 密码以明码方式发送; 目前不支持其它验证方法, 而且任何这类的验证或授权方法都将会定义在一个独立的协议里(参见本文的[[XEP-0045#安全事项|安全事项]]章节).&lt;br /&gt;
&lt;br /&gt;
'''例子 26. 用户进入房间时提供密码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====仅限会员房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限会员的,但用户不是(该房间的)成员, 服务必须 MUST 拒绝访问这个房间并通知用户它们不被允许进入房间; 具体方法是返回一个&amp;quot;error&amp;quot;类型的出席信息节，并包含一个 &amp;lt;registration-required/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 27. 服务拒绝访问，因为用户不在成员列表中'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;registration-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====被禁止的用户====&lt;br /&gt;
&lt;br /&gt;
如果用户已经被房间禁止(即, 其岗位为被排斥者 &amp;quot;outcast&amp;quot;), 服务必须 MUST 拒绝访问这个房间并通知用户他(她)被禁止了; 具体方法是返回一个出席信息节,类型为&amp;quot;error&amp;quot;，标明 &amp;lt;forbidden/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 28. 服务拒绝访问，因为用户被禁止了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====昵称冲突====&lt;br /&gt;
&lt;br /&gt;
如果房间里已经有别的用户使用了准备进入房间的新用户预期的昵称(或如果这个昵称被保留给另一个成员列表里面的用户), 服务必须 MUST 拒绝访问这个房间并通知用户这个冲突; 具体方法是返回一个出席信息节,类型为&amp;quot;error&amp;quot;，标明 &amp;lt;conflict/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 29. 服务拒绝访问，因为昵称冲突'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 如果现有房客的纯 JID &amp;lt;localpart@domain.tld&amp;gt; 和准备进入房间的用户的纯 JID 相同, 那么服务应该 SHOULD 允许这个用户的进入, 所以这个用户就有两个(或更多) 房间内的会话 &amp;quot;sessions&amp;quot; 使用同一个房间昵称, 每一个对应一个资源. 如果一个服务允许相同纯JID可以同时存在多个房客并使用同一个房间的房间昵称, 它应该 SHOULD 路由房间内的消息给该用户的所有资源并允许用户的所有资源发送消息给房间; 视实现而定，服务来决定如何适当的处理从用户的资源发送的出席信息以及如何路由私有消息到所有或某个资源(基于出席信息优先级或其他机制).&lt;br /&gt;
&lt;br /&gt;
如何确定昵称冲突取决于实现(例如, 该服务是否应用于一个特定的惯例, 一个 stringprep 规则如 Resourceprep 或 Nodeprep, 等等).&lt;br /&gt;
&lt;br /&gt;
====最大用户数====&lt;br /&gt;
&lt;br /&gt;
如果房间达到它的最大房客数量, 服务应该 SHOULD 拒绝访问这个房间并通知该用户这个限制; 方法是返回一个出席信息节，类型为&amp;quot;error&amp;quot;，标明 &amp;lt;service-unavailable/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 30. 服务通知用户该房间已达到房客数量极限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='wait'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 房间可以踢出空闲用户(&amp;quot;idle user&amp;quot;)以腾出空间.&lt;br /&gt;
&lt;br /&gt;
如果房间的房客数量已达到最大值但是一个房间管理员或所有者试图进入，该房间应该允许管理员或所有者加入，为了使得额外的房客达到一个合理的数目，该数量可以 MAY 做成可配置的。&lt;br /&gt;
&lt;br /&gt;
====锁住的房间====&lt;br /&gt;
&lt;br /&gt;
如果一个用户尝试进入一个房间而该房间是锁住的 &amp;quot;locked&amp;quot; (即, 在房间创建者提供初始的配置之前以及也就是在房间正式存在之前), 服务必须 MUST 拒绝进入并返回一个 &amp;lt;item-not-found/&amp;gt; 错误给该用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 31. 服务拒绝访问，因为房间不存在'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====不存在的房间====&lt;br /&gt;
&lt;br /&gt;
如果用户准备进入房间时，该房间已经不存在了, 服务应该 SHOULD 建立它; 无论如何, 这不是必需的, 因为一个实现或部署可以 MAY 选择限制建立房间的权限. 详见本文的[[XEP-0045#新建房间|新建房间]]章节.&lt;br /&gt;
&lt;br /&gt;
====房间记录====&lt;br /&gt;
&lt;br /&gt;
如果用户进入一个房间，该房间的讨论是被记录到一个公开的存档里面(经常可以通过HTTP访问的), 服务应该 SHOULD 允许该用户加入该房间但是必须 MUST 同时警告该用户讨论已被记录. 方法是应该 SHOULD 在房间发送给该新房客的初始出席信息中包含一个状态码 &amp;quot;170&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 32. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='170'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====讨论历史====&lt;br /&gt;
&lt;br /&gt;
如上发送完初始出席信息之后, 一个房间可以 MAY 发送讨论历史给这个新房客. (在完成按照本文[[XEP-0045#出席信息广播|出席信息广播]]章节规定的发送房间出席信息之前，该房间不能 MUST NOT 发送任何讨论历史.) 是否这个历史要被发送, 以及这个历史里面包含多少条消息, 将由聊天服务实现或特定的部署来决定.&lt;br /&gt;
&lt;br /&gt;
'''例子 33. 讨论历史的发送'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2002-10-13T23:58:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2002-10-13T23:58:43Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries 'Tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='hag66@shakespeare.lit/pda'&lt;br /&gt;
     stamp='2002-10-13T23:58:49Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
讨论历史消息必须 MUST 标为[http://xmpp.org/extensions/xep-0203.html Delayed Delivery] [[XEP-0045#附录G:备注|11]]信息，满足'urn:xmpp:delay' 名字空间，以表明它们是被延迟发送的并且标明它们最初发出的时间. (注意: 'urn:xmpp:delay' 名字空间定义在 XEP-0203 里面，取代了旧的定义在 [http://xmpp.org/extensions/xep-0091.html Legacy Delayed Delivery] [[XEP-0045#附录G:备注|12]] 里的 'jabber:x:delay' 名字空间 ; XEP-0091状态更改为已过时之前, 实现应该 SHOULD 包含两种日期时间(datetime)格式.). 在非匿名房间里，'from'属性应该 SHOULD 是原始发送者的全JID, 但不能 MUST NOT 在半匿名房间里(在那里'from'属性应该 SHOULD 设置为房间本身的JID). 服务应该 SHOULD 在进入该房间之后，发送任何即时(&amp;quot;live&amp;quot;)消息之前，发送完所有讨论历史消息.&lt;br /&gt;
&lt;br /&gt;
====管理讨论历史====&lt;br /&gt;
&lt;br /&gt;
用户可能 MAY 希望管理进入房间时(由房间)提供的讨论历史(可能因为用户带宽比较低或正在使用迷你客户端). 他必须 MUST 在加入房间时发出的初始出席信息节里包含一个 &amp;lt;history/&amp;gt; 子元素. 这个元素有四个可用的属性:&lt;br /&gt;
&lt;br /&gt;
'''表8: 历史管理属性'''&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!属性 !!数据类型 !!含义&lt;br /&gt;
|-&lt;br /&gt;
| maxchars   ||int    ||限制历史中的字符总数为&amp;quot;X&amp;quot; (这里的字符数量是全部 XML 节的字符数, 不只是它们的 XML 字符数据). &lt;br /&gt;
|-&lt;br /&gt;
| maxstanzas    ||int    ||限制历史中的消息总数为&amp;quot;X&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| seconds   ||int   ||仅发送最后 &amp;quot;X&amp;quot; 秒收到的消息.&lt;br /&gt;
|-&lt;br /&gt;
| since     ||dateTime     ||仅发送从指定日期时间 datetime 之后收到的消息 (这个datatime必须 MUST 符合[http://xmpp.org/extensions/xep-0082.html XMPP Date and Time Profiles] [[XEP-0045#附录G:备注|13]] 定义的DateTime 规则，).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 发送满足以上条件组合的最小数量的消息, 还要顾及服务级别和房间级别的缺省设置. 服务必须 MUST 只发送完整的消息节(即, 它不能 MUST not 按特定字符数把历史从字面上截断, 但是必须 MUST 发送最大数量的完整节,这使得字符数小于或等于 'maxchars' 属性的值). 如果客户端不希望收到历史, 它必须 MUST 把'maxchars' 属性值设为&amp;quot;0&amp;quot; (zero).&lt;br /&gt;
&lt;br /&gt;
以下例子展示如何使用这个协议.&lt;br /&gt;
&lt;br /&gt;
'''例子 34. 用户请求在历史中限制消息数量'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history maxstanzas='20'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 35. 用户请求最后三分钟的历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history seconds='180'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 36. 用户请求从Unix时代到现在的所有历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history since='1970-01-01T00:00:00Z'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务绝对不应该 SHOULD NOT 返回从Unix时代开始到现在的所有消息, 而应该 SHOULD 基于服务或房间的缺省值返回适当的有限数量的历史给用户.&lt;br /&gt;
&lt;br /&gt;
'''例子 37. 用户请求不发送历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history maxchars='0'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===退出一个房间===&lt;br /&gt;
&lt;br /&gt;
为了退出一个多用户聊天房间, 一个房客发送一个类型为&amp;quot;unavailable&amp;quot;的出席信息节给正在使用这个房间的 &amp;lt;room@service/nick&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
'''例子 38. 房客退出一个房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着从要离开的房客的房间JID发送&amp;quot;unavailable&amp;quot;类型的出席信息节给这个要离开的房客的全JID们以及留在房间的房客们:&lt;br /&gt;
&lt;br /&gt;
'''例子 39. 服务发送和离开的房客有关的出席信息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
由房间反射的类型为&amp;quot;unavailable&amp;quot;的出席信息节必须 MUST 包含扩展的关于角色和岗位的出席信息; 'role'属性值应该 SHOULD 被设为 &amp;quot;none&amp;quot; 以表示这个人不再是一个房客了.&lt;br /&gt;
&lt;br /&gt;
房客可以 MAY 在出席信息节包含一个常规的 &amp;lt;status/&amp;gt; 信息; 这使房客能在必要的情况下提供一个自定的退出消息:&lt;br /&gt;
&lt;br /&gt;
'''例子 40. 自定的退出消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
常规的出席信息节生成规则定义在 [[RFC3921|XMPP IM]] [[XEP-0045#附录G;备注|14]], 所以如果用户发送一个一般的不可用出席信息节, 用户的服务器将广播那个节到 &amp;lt;room@service/nick&amp;gt; ，而该用户之前曾经发送过直接出席信息给这个&amp;lt;room@service/nick&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
有可能一个用户不能正常地通过直接发送不可用信息给一个房间来退出该房间. 如果该用户没有发送不可用出席信息就下线了, 用户的服务器负责代替该用户发送不可用出席信息 (依据 RFC 3921). 如果该用户的服务器下线或该用户的服务器和该用户连接的MUC服务失去连接(例如, 在联邦通信), 这个MUC服务负责监视它收到的错误信息节以确定该用户是否下线. 如果该MUC服务确定该用户已下线, 它必须 must 当成该用户自己发送了不可用信息一样地处理这个用户.&lt;br /&gt;
&lt;br /&gt;
注意: 如果房间不是持久的并且该房客是最后一个退出的, 服务负责销毁这个房间.&lt;br /&gt;
&lt;br /&gt;
===更改昵称===&lt;br /&gt;
&lt;br /&gt;
多用户聊天室的一个常用功能是一个房客能修改自己在房间里的昵称. 在 MUC 里这需要发送一个更新出席信息给房间, 具体来说是在相同的房间里发送出席信息给一个新的房间JID (变更的只是这个房间JID的资源).&lt;br /&gt;
&lt;br /&gt;
'''例子 41. 房客修改昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务接着发送两个出席信息节给每个房客的全JID(包括修改自己昵称的房客本身), 一个是类型为&amp;quot;unavailable&amp;quot;的用于旧的昵称另一个指明新昵称可用了.&lt;br /&gt;
&lt;br /&gt;
这个不可用出席信息必须 MUST 在一个满足'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 子元素里面包含以下扩展的出席信息 :&lt;br /&gt;
&lt;br /&gt;
* 新昵称(在这个例子中, nick='oldhag')&lt;br /&gt;
* 一个状态码 303&lt;br /&gt;
&lt;br /&gt;
这使接受者能从旧昵称关联到新昵称.&lt;br /&gt;
&lt;br /&gt;
'''例子 42. 服务更新昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户尝试修改他或她的房间昵称,但这个昵称已经被其他用户使用了 (或者这个昵称是被这房间的其他用户岗位保留的, 例如, 一个成员或者所有者), 服务必须 MUST 拒绝这次昵称修改并通知该用户这一冲突; 也就是返回一个类型为 &amp;quot;error&amp;quot; 的出席信息节指明 &amp;lt;conflict/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 43. 服务拒绝昵称修改，因为昵称冲突'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 如果现有房客的纯JID &amp;lt;localpart@domain.tld&amp;gt; 和尝试变更昵称的房客的纯JID相同, 那么服务可以 MAY 允许昵称变更. 详见本文的[[XEP-0045#昵称冲突|昵称冲突]]章节.&lt;br /&gt;
&lt;br /&gt;
如果该用户尝试变更自己的昵称但是房间昵称被锁定了(&amp;quot;locked down&amp;quot;), 服务必须 MUST 拒绝这个昵称变更请求并返回一个&amp;quot;error&amp;quot;类型的出席信息节，指明一个 &amp;lt;not-acceptable/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 44. 服务拒绝昵称变更，因为房间昵称被锁定'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户应该 SHOULD 接着发现它的保留昵称，如本文的 [[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]]章节所述.&lt;br /&gt;
&lt;br /&gt;
===更改可用性状态===&lt;br /&gt;
&lt;br /&gt;
在一个多用户聊天系统里例如IRC, 一个常用的修改某人房间昵称的行为也意味着变更某人的可用性(例如, 变更某人的房间昵称为&amp;quot;thirdwitch|away&amp;quot;). 在Jabber里面, 可用性当然是通过出席信息 (中 &amp;lt;show/&amp;gt; 和 &amp;lt;status/&amp;gt; 元素)的变更来通知的, 这能提供重要的上下文给聊天室. 一个房客通过发送更新的出席信息给它自己的&amp;lt;room@service/nick&amp;gt;来改变他在房间内的可用性状态.&lt;br /&gt;
&lt;br /&gt;
'''例子 45. 房客变更可用性状态'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'&amp;gt;&lt;br /&gt;
  &amp;lt;show&amp;gt;xa&amp;lt;/show&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务然后从该房客发送一个出席信息节来修改他或她的出席信息给每个房客的全JID, 包含扩展的出席信息，包括这个房客的角色和全JID(给那些有权知道的人):&lt;br /&gt;
&lt;br /&gt;
'''例子 46. 服务传递修改的出席信息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;show&amp;gt;xa&amp;lt;/show&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===邀请其他用户进入一个房间===&lt;br /&gt;
====直接邀请====&lt;br /&gt;
&lt;br /&gt;
一个办法是发送一个直接的邀请(而不是由房间本身来间接邀请),定义在[http://xmpp.org/extensions/xep-0249.html Direct MUC Invitations] [[XEP-0045#附录G:备注|15]]. 直接发送邀请有助于适应被邀请者那一边的通信阻塞(对方可能拒绝和和不在好友名单中的实体通信).&lt;br /&gt;
&lt;br /&gt;
====间接邀请====&lt;br /&gt;
&lt;br /&gt;
邀请别的用户到一个房间成为房客是很有用的. 为了做到这一点, 一个 MUC 客户端必须 MUST 发送以下格式的 XML 给 &amp;lt;room@service&amp;gt; 本身 (原因(reason)是可选的 OPTIONAL 而消息(message)的类型必须 MUST 是显式或隐式的&amp;quot;normal&amp;quot;类型):&lt;br /&gt;
&lt;br /&gt;
'''例子 47. 房客通过房间发送一个邀请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;room@service&amp;gt; 本身必须 MUST 接着增加一个 'from' 地址到 &amp;lt;invite/&amp;gt; 元素，其值为邀请者的纯JID, 全JID, 或房间JID，并发送邀请给 'to' 地址所指明的被邀请者(为了旧的客户端，服务可以 MAY 包含一个消息主体&amp;quot;message body&amp;quot;解释这个邀请或包含一个原因&amp;quot;reason&amp;quot;(子元素); 另外, 房间应该 SHOULD 增加 password 如果该房间是密码保护的):&lt;br /&gt;
&lt;br /&gt;
'''例子 48. 房间代表邀请者发送邀请给被邀请者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限成员的, 服务可以 MAY 同时把这个被邀请者加入成员列表. (注意: 在仅限成员的房间里邀请的权力应该 SHOULD 由房间管理员限定; 如果一个没有权限的成员修改成员列表试图邀请别的用户, 服务应该 SHOULD 返回一个 &amp;lt;forbidden/&amp;gt; 错误给该房客; 详见本文的[[XEP-0045#修改成员列表|修改成员列表]]章节.)&lt;br /&gt;
&lt;br /&gt;
如果邀请者提供了一个不存在的JID, 房间应该 SHOULD 返回一个 &amp;lt;item-not-found/&amp;gt; 错误给邀请者.&lt;br /&gt;
&lt;br /&gt;
被邀请者可以 MAY 选择正式地拒绝 (反之则忽略) 邀请; 这是发送者希望看到的正式的通知. 为了拒绝这个邀请, 被邀请者必须 MUST 发送以下格式的消息给 &amp;lt;room@service&amp;gt; 本身:&lt;br /&gt;
&lt;br /&gt;
'''例子 49. 被邀请者谢绝邀请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='hecate@shakespeare.lit/broom'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;decline to='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Sorry, I'm too busy right now.&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/decline&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 50. 房间通知邀请者邀请被拒绝了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;decline from='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Sorry, I'm too busy right now.&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/decline&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能(有人)想知道为什么被邀请者不直接发送拒绝消息给访问者. 主要原因是特定的实现可能 MAY 选择让邀请基于房间JIDs而不是纯JIDs (所以, 例如, 一个房客可能从一个房间邀请某人到另一个房间而不需要知道这个人的纯JID). 因而服务必须 MUST 同时处理邀请和拒绝.&lt;br /&gt;
&lt;br /&gt;
===把一对一聊天转为多用户会议===&lt;br /&gt;
&lt;br /&gt;
有时候人们需要把一个一对一的聊天转成一个多用户的会议. 以下例子展示了这个流程.&lt;br /&gt;
&lt;br /&gt;
首先, 两个用户开始一个一对一聊天.&lt;br /&gt;
&lt;br /&gt;
'''例子 51. 一个一对一聊天'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在第一个用户决定加入第三个人到这个讨论, 所以她 (或, 更准确地说, 她的客户端) 做以下事情:&lt;br /&gt;
&lt;br /&gt;
# 新建一个多用户聊天室&lt;br /&gt;
# 可选地发送一对一聊天的历史到房间&lt;br /&gt;
# 发送一个邀请给第二个人和第三个人, 包含一个 &amp;lt;continue/&amp;gt; 元素 (可选地包含一个 'thread' 属性).&lt;br /&gt;
&lt;br /&gt;
注意: 新房间应该 SHOULD 是非匿名的, 可以 MAY 是一个即时房间(定义于本文的[[XEP-0045#新建即时房间|新建即时房间]]章节), 也可以 MAY 有一个从服务接收的唯一房间名(定义于本文的[[XEP-0045#请求唯一的房间名|请求唯一的房间名]]章节.&lt;br /&gt;
&lt;br /&gt;
注意: 如果这个一对一的聊天消息包含了一个 &amp;lt;thread/&amp;gt; 元素, 这个新建房间的人应该 SHOULD 在历史消息中包含这个 ThreadID, 在邀请中把这个 ThreadID 的值赋予 &amp;lt;continue/&amp;gt; 元素的 'thread' 属性, 并把这 ThreadID 包含在任何新的消息中发送到房间. ThreadIDs 的使用是推荐的 RECOMMENDED ，因为它帮助提供一对一聊天和多用户聊天的连续性.&lt;br /&gt;
&lt;br /&gt;
'''例子 52. 继续讨论 I: 用户新建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 53. 继续讨论 II: 所有者发送历史到房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2004-09-29T01:54:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2004-09-29T01:55:21Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 使用 Delayed Delivery 协议使房间创建者能够从他一对一聊天历史指明每个消息的日期时间 datetime (通过 'stamp' 属性), 以及每个消息的原始发送者的 JID (通过'from' 属性). 房间创建者应该 SHOULD 在邀请额外的用户到房间之前发送完整的一对一聊天历史, 并且也应该 SHOULD 把第二个人加入该房间之前和第一个人在一对一聊天界面中出现的任何消息当成历史来发送; 如果这个一对一历史特别的大, 发送的客户端可能希望在数秒内发送这个历史而不是一次性发送所有历史(以to 避免触发频率限制). 服务不应该 SHOULD NOT 在从房间所有者接收的历史消息之前添加它自己的延迟元素&amp;quot;delay elements&amp;quot; (见本文的[[XEP-0045#讨论历史|讨论历史]]章节) .&lt;br /&gt;
&lt;br /&gt;
'''例子 54. 继续讨论 III: 所有者发送邀请(们), 包含 Continue 标志'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 当邀请者的客户端一知道和它一对一聊天的那个人的全JID之后, 它就应该 SHOULD 在邀请中包含这个全JID (而不是纯JID).&lt;br /&gt;
&lt;br /&gt;
邀请被递送到被邀请者:&lt;br /&gt;
&lt;br /&gt;
'''例子 55. 邀请被递送'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
    to='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当客户端被 &amp;lt;wiccarocks@shakespeare.lit/laptop&amp;gt; 用来接收邀请, 它应该 SHOULD 自动加入或提示用户是否加入 (取决于用户的选项配置) 并且随后无缝地把现有的一对一聊天窗口转到一个多用户会议的窗口:&lt;br /&gt;
&lt;br /&gt;
'''例子 56. 被邀请者接受邀请, 加入房间, 并接收出席信息和历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/secondwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2004-09-29T01:54:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2004-09-29T01:55:21Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 事实上,这些消息从 &amp;lt;room@service&amp;gt; 本身而不是 &amp;lt;room@service/nick&amp;gt; 发出，告诉这些接收的客户端这些消息是优先的聊天历史, 因为任何来自房客的消息的 'from' 地址应该等于发送者的房间JID.&lt;br /&gt;
&lt;br /&gt;
===房客修改房间标题===&lt;br /&gt;
&lt;br /&gt;
如果房间配置允许, 一个房客可以 MAY 被允许修改一个房间的主题. 详见本文的[[XEP-0045#修改房间主题|修改房间主题]]章节.&lt;br /&gt;
&lt;br /&gt;
===发送私有消息===&lt;br /&gt;
&lt;br /&gt;
因为每个房客有一个唯一的房间JID, 一个房客可以 MAY 发送一个私有消息 &amp;quot;private message&amp;quot; 给选定的房客，即通过服务发送一个消息给那房客的房间JID. 这个消息类型应该 SHOULD 是 &amp;quot;chat&amp;quot; 并且不能 MUST NOT 是 &amp;quot;groupchat&amp;quot;, 但是可以 MAY 不表明 (即, 一个常规&amp;quot;normal&amp;quot;消息). 这个权力应该 SHOULD 被任何房客允许 (甚至在一个被主持的房间里的游客).&lt;br /&gt;
&lt;br /&gt;
'''例子 57. 房客发送私有消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务负责把'from'地址改为发送者的房间JID并递送这个消息到预期的接收者的全JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 58. 接收者接收私有消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者尝试发送一个类型为 &amp;quot;groupchat&amp;quot; 的私有消息给特定的房客, 服务必须 MUST 拒绝递送这个消息 (因为接收者的客户端期望的房间内的消息类型为&amp;quot;groupchat&amp;quot;) 并且返回一个 &amp;lt;bad-request/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 59. 房客尝试发送类型为&amp;quot;Groupchat&amp;quot;的私有消息给特定的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者尝试发送一个私有消息给一个不存在的房间JID, 服务必须 MUST 返回一个 &amp;lt;item-not-found/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
如果发送者不是预期的接收者正在访问的那个房间的房客, 服务必须 MUST 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
===发送消息给所有房客===&lt;br /&gt;
&lt;br /&gt;
房客发送一个消息给所有房间内的房客的方法，是发送一个类型为 &amp;quot;groupchat&amp;quot; 的消息到 &amp;lt;room@service&amp;gt; 本身 (服务可以 MAY 忽略或拒绝类型不是 &amp;quot;groupchat&amp;quot; 的消息). 在一个被主持的房间, 这个权力限于角色为与会者或更高的房客拥有.&lt;br /&gt;
&lt;br /&gt;
'''例子 60. 房客发送一个消息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者在这个房间有发言权 (在被主持的房间里缺省是这样期望), 服务必须 MUST 修改发送者的 'from' 属性成为房间JID并反射这个消息到每个房客的全JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 61. 服务反射消息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者是个游客 即, 在一个被主持的房间里没有发言权), 服务可以 MAY 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者并且不能 MUST NOT 反射这个消息给所有房客. 如果发送者不是该房间的房客, 服务应该 SHOULD 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给发送者并且不应该 SHOULD NOT 反射这个消息给所有房客; 这个规则的唯一的例外是，一个实现可以 MAY 允许用户们拥有特定的权限 (例如, 一个房间拥有者, 房间管理员, 或服务级别的管理员) 发送消息到这个房间，即使那些用户不是房客.&lt;br /&gt;
&lt;br /&gt;
===注册到房间===&lt;br /&gt;
&lt;br /&gt;
一个实现可以 MAY 允许一个无岗位的用户(在一个被主持的房间里, 通常是一个与会者) 注册一个房间从而成为该房间的一个成员 (反之, 一个实现也可以 MAY 限制这个权力并且只允许房间管理员添加新的成员). 特别是, 不在成员列表的人是无法加入一个仅限会员的房间的, 所以为了加入这样一个房间，实体需要申请会籍.&lt;br /&gt;
&lt;br /&gt;
如果允许, 这个功能应该 SHOULD 这样被实现。让用户使用 'jabber:iq:register' 名字空间[[XEP-0077|带内注册]] [[XEP-0045#附录G:备注|16]]提出注册申请给房间,:&lt;br /&gt;
&lt;br /&gt;
'''例子 62. 用户提出注册申请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='reg1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果用户提出的注册申请不被允许注册该房间 (例如, 因为那个权限被限制了), 该房间必须 MUST 返回一个 &amp;lt;not-allowed/&amp;gt; 错误给该用户. 如果该用户已经注册过了, 房间必须 MUST 返回一个类型为&amp;quot;result&amp;quot;的IQ节并包含一个空的&amp;lt;register/&amp;gt;元素(定义于'''XEP-0077'''). 如果该房间不存在, 服务必须 MUST 返回一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
否则, 房间必须 MUST 接着返回一个数据表单&amp;quot;Data Form&amp;quot;给该用户 (定义于[[XEP-0004|数据表单]] [[XEP-0045#附录G:备注|17]]). 注册需要的信息可以 MAY 根据实现和部署的不同而不同并且没有完全定义在本文中 (例如, 本文根据 'http://jabber.org/protocol/muc#register' 名字空间采用的注册字段  FORM_TYPE 可能将来会根据[[XEP-0045#字段标准化|字段标准化]]章节里描述的得到补充，). 以下是一个典型的例子:&lt;br /&gt;
&lt;br /&gt;
'''例子 63. 服务返回注册表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To register on the web, visit http://shakespeare.lit/&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Dark Cave Registration&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
        Please provide the following information&lt;br /&gt;
        to register with this room.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Given Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_first'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Family Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_last'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Desired Nickname'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_roomnick'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Your URL'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_url'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Email Address'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_email'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='FAQ Entry'&lt;br /&gt;
          type='text-multi'&lt;br /&gt;
          var='muc#register_faqentry'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户应该 SHOULD 接着提交这个表单:&lt;br /&gt;
&lt;br /&gt;
'''例子 64. 用户提交注册表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_first'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Brunhilde&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_last'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Entwhistle-Throckmorton&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_roomnick'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_url'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://witchesonline/~hag66/&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_email'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hag66@witchesonline&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_faqentry'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Just another witch.&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果期望的房间昵称已经被那个房间保留, 房间必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 65. 房间返回冲突错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该房间或服务不支持注册, 它必须 MUST 返回一个 &amp;lt;service-unavailable/&amp;gt; 错误给用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 66. 房间返回服务不可用错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果用户没有提交合法的数据表格, 房间必须 MUST 返回一个 &amp;lt;bad-request/&amp;gt; 错误给用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 67. 房间返回&amp;quot;服务错误的请求&amp;quot;错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
否则, 该房间必须 MUST 通知用户注册请求被成功地接收到了:&lt;br /&gt;
&lt;br /&gt;
'''例子 68. 房间通知用户注册请求已经被处理了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户提交表单之后, 服务可以 MAY 向一个房间 管理员/所有者 请求批准该申请 (参见本文的[[XEP-0045#批准注册申请|批准注册申请]]章节) 或也可以 MAY 立刻把该用户的岗位从&amp;quot;none&amp;quot;变更为&amp;quot;member&amp;quot;来添加此用户到成员列表. 如果服务变更了该用户的岗位并且该用户在房间里, 它必须 MUST 从这个用户发送更新的出席信息给所有房客, 声明岗位的变更，这个更新的出席信息应包含一个满足 'http://jabber.org/protocol/muc#user' 名字空间 &amp;lt;x/&amp;gt; 元素并包含一个'affiliation' 属性值设为&amp;quot;member&amp;quot;的 &amp;lt;item/&amp;gt; 子元素.&lt;br /&gt;
&lt;br /&gt;
'''例子 69. 服务发送成员变更通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个用户已经注册到一个房间, 该房间可以 MAY 选择限制这个用户在那个房间仅能使用已注册的昵称. 如果它这样做, 当用户尝试以不同于该用户之前已注册的房间昵称来加入该房间 (这使房间锁定&amp;quot;lock down&amp;quot;房间昵称以保证房客身份的一致性)的时候，它应该 SHOULD 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给该用户.&lt;br /&gt;
&lt;br /&gt;
===获取成员列表===&lt;br /&gt;
&lt;br /&gt;
根据房间配置如果允许的话, 一个房客可以 MAY 被允许接收房间成员的列表. 详见本文的[[XEP-0045#修改成员列表|修改成员列表]]章节.&lt;br /&gt;
&lt;br /&gt;
===发现保留的房间昵称===&lt;br /&gt;
&lt;br /&gt;
一个用户可以 MAY 有一个保留的房间昵称, 例如通过显式的房间注册, 数据库集成, 或昵称锁定 &amp;quot;lockdown&amp;quot;. 用户应该 SHOULD 在尝试进入该房间之前发现自己的保留昵称. 这可以通过发送一个发现服务信息请求并指定一个服务发现节点&amp;quot;x-roomuser-item&amp;quot;给房间JID来做到.&lt;br /&gt;
&lt;br /&gt;
'''例子 70. 用户请求保留的昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='getnick1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='x-roomuser-item'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
对一个多用户聊天服务来说，对上述的服务发现节点的支持是可选的 OPTIONAL . 如果房间或服务不支持上述的服务发现节点, 它必须 MUST 返回一个 &amp;lt;feature-not-implemented/&amp;gt; 错误给用户. 如果它支持这个特性并且该用户有一个已注册的昵称, 它必须 MUST 返回这个昵称给这个用户，方法是发送一个服务发现的&amp;lt;identity/&amp;gt;元素，其'name'属性值为这个昵称 (此处 category/type 应该 SHOULD 是 &amp;quot;conference/text&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
'''例子 71. 房间返回昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='getnick1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='x-roomuser-item'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='thirdwitch'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户没有已注册的昵称, 房间必须 MUST 返回一个空的服务发现 &amp;lt;query/&amp;gt; 元素 (根据 '''XEP-0030''').&lt;br /&gt;
&lt;br /&gt;
即使一个用户已经注册了一个房间昵称, 服务应该 SHOULD 允许该用户在加入该房间时指定一个不同的昵称 (例如, 为了从不同的客户端资源加入), 尽管该服务可以 MAY 选择通过一个 &amp;lt;not-acceptable/&amp;gt; 错误来锁定 &amp;quot;lock down&amp;quot; 昵称并拒绝该用户 . 如果该用户的客户端在加入该房间之后发送上述请求，服务不能 MUST NOT 返回一个错误给该用户, 而应该 SHOULD 返回上文所述.&lt;br /&gt;
&lt;br /&gt;
如果另一个用户尝试以第一个用户保留的房间昵称来加入房间, 服务必须 MUST 拒绝第二个用户并返回一个前文所述的 &amp;lt;conflict/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
===申请发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里游客是不能发言的 (即, 发送一个消息给所有房客). 为了申请发言权, 一个游客应该 SHOULD 发送包含一个数据表格的 &amp;lt;message/&amp;gt; 节给房间本身, 这个数据表格仅仅是一个 'muc#role' 字段，值为 &amp;quot;participant&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 72. 房客申请发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='hag66@shakespeare.lit/pda'&lt;br /&gt;
         to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Requested role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务接着应该 SHOULD 转发这个请求给房间主持人(们) ，定义于本文的[[XEP-0045#批准发言权申请|批准发言权申请]].&lt;br /&gt;
&lt;br /&gt;
==主持人用例==&lt;br /&gt;
&lt;br /&gt;
一个主持人有权在房间里执行特定的动作 (例如, 变更某些房客的角色) 但无权变更岗位的持久信息 (它只能被管理员或所有者) 或定义关于这个房间的信息. 具体哪些动作可由主持人执行，取决于配置. 无论如何, 对于 MUC 框架来说, 主持人被规定有权执行以下动作:&lt;br /&gt;
&lt;br /&gt;
# 在一个半匿名的房间里发现一个房客的全JID(如上文所述缺省会发生)&lt;br /&gt;
# 修改主题&lt;br /&gt;
# 从该房间踢出一个与会者或游客&lt;br /&gt;
# 在一个被主持的房间里授予或撤销发言权&lt;br /&gt;
# 在一个被主持的房间里修改拥有发言权的房客列表&lt;br /&gt;
&lt;br /&gt;
这些特性将通过一个基于 &amp;lt;iq/&amp;gt; 元素的 请求/应答 交换来实现，这个IQ元素包含一个满足 'http://jabber.org/protocol/muc#admin' 名字空间的子元素. 以下例子展示这个协议和实现如何互动达到期望的功能. (以下除非显式地提及, 任何接下来的管理请求必须 MUST 被拒绝,如果该请求的'from'地址 &amp;lt;user@host&amp;gt; 和主持人的纯JID不符的话; 在这种情况下, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误.)&lt;br /&gt;
&lt;br /&gt;
===修改房间主题===&lt;br /&gt;
&lt;br /&gt;
多用户聊天室的一个常用特性是变更房间主题的能力. 缺省地, 一个房间里只有角色为主持人 &amp;quot;moderator&amp;quot; 的用户应该 SHOULD 被允许变更主题 (尽管这应该 SHOULD 是可配置的, 结果是如果需要的话，仅仅与会者或甚至游客都被允许修改主题). 主题变更是通过发送一个类型为 &amp;quot;groupchat&amp;quot; 的消息给 &amp;lt;room@service&amp;gt;来实现的, 在这里 &amp;lt;message/&amp;gt; 必须 MUST 包含一个 &amp;lt;subject/&amp;gt; 元素以指定新的主题，但不应该 SHOULD NOT 包含其他元素 (例如, 不应该有 &amp;lt;body/&amp;gt; 元素或 &amp;lt;thread/&amp;gt; 元素).&lt;br /&gt;
&lt;br /&gt;
'''例子 73. 主持人变更主题'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个 MUC 服务接收到这样一个消息, 它必须 MUST 以发送这个变更主题消息的那个用户的房间JID作为'from'地址来反射这个消息给所有其他房客:&lt;br /&gt;
&lt;br /&gt;
'''例子 74. 服务通知所有房客主题变更'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 当一个新的房客加入房间时，该房间应该 SHOULD 在被发送的讨论历史中包含最后的主题变更.&lt;br /&gt;
&lt;br /&gt;
一个接收到这类信息的 MUC 客户端可以 MAY 选择显示一个房间内的消息, 如下:&lt;br /&gt;
&lt;br /&gt;
'''例子 75. 客户端显式房间主题变更消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
* secondwitch has changed the subject to: Fire Burn and Cauldron Bubble!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一些没有适当权限的人尝试变更房间主题, 服务必须 MUST 返回一个 &amp;quot;error&amp;quot; 类型的消息指明一个 &amp;lt;forbidden/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 76. 服务返回未被授权变更主题的错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
为了移除现有的主题而不是提供一个新主题 (即, 设置主题为空), 客户端应该发送一个空的 &amp;lt;subject/&amp;gt; 元素 (即,  &amp;quot;&amp;lt;subject/&amp;gt;&amp;quot; 或 &amp;quot;&amp;lt;subject&amp;gt;&amp;lt;/subject&amp;gt;&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 77. 主持人设置空的主题'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===踢出房客===&lt;br /&gt;
&lt;br /&gt;
主持人有权从一个房间踢出特定种类的房客 (哪些房客是可被踢的 &amp;quot;kickable&amp;quot; 取决于服务规定, 房间配置, 以及主持人的岗位 -- 见下文). 踢人通常基于房客的房间昵称来执行 (尽管可以 MAY 基于全JID) 并且完全是通过把与会者或游客的角色设为 &amp;quot;none&amp;quot; 来实现的.&lt;br /&gt;
&lt;br /&gt;
'''例子 78. 主持人踢出房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='fluellen@shakespeare.lit/pda'&lt;br /&gt;
    id='kick1'&lt;br /&gt;
    to='harfleur@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='pistol' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Avaunt, you cullion!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 移除被踢的用户，通过发送一个类型为 &amp;quot;unavailable&amp;quot; 的出席信息节给每个被踢的房客, 这个出席信息应在其扩展出席信息中包含状态码 307 , 或(可选地)包含 reason 子元素(如果提供了) 以及踢人的执行者的纯JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 79. 服务移除被踢的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='harfleur@henryv.shakespeare.lit/pistol'&lt;br /&gt;
    to='pistol@shakespeare.lit/harfleur'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='fluellen@shakespeare.lit'/&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Avaunt, you cullion!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='307'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
包含状态码可使客户端能够提交他们自己的通知消息 (例如, 适当的用户位置的信息). 可选的包含原因 reason 元素以及执行者 actor 使得被踢的用户能理解为什么他或她被踢了, 以及被踢的用户可以找谁去理论. [[XEP-0045#附录G:备注|18]]&lt;br /&gt;
&lt;br /&gt;
移除被踢的房客(们)之后, 服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 80. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='harfleur@henryv.shakespeare.lit'&lt;br /&gt;
    id='kick1'&lt;br /&gt;
    to='fluellen@shakespeare.lit/pda'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
通知主持人之后, 服务必须 MUST 接着通知剩余的房客那个被踢的房客已经不在房间里了,即从被踢者的房间昵称(&amp;lt;room@service/nick&amp;gt;)发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给所有剩余的房客 (就像房客自愿退出房间时所做的一样), 包含状态码 status 以及可选的原因 reason 和执行者 actor.&lt;br /&gt;
&lt;br /&gt;
'''例子 81. 服务通知剩余的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='harfleur@henryv.shakespeare.lit/pistol'&lt;br /&gt;
    to='gower@shakespeare.lit/cell'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='307'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个用户不能被比自己岗位低的主持人踢出. 所以, 如果一个身为与会者的主持人尝试踢出一个管理员，或一个身为与会者的主持人或管理员尝试踢出一个所有者, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 82. 服务对于尝试踢出更高岗位的用户返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='kicktest'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='firstwitch' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Be gone!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个主持人尝试踢出他自己, 服务可以 MAY 拒绝这个请求并返回一个 &amp;lt;conflict/&amp;gt; 错误给发送者. (尽管这个踢出自己的行为可能看起来怪异, 它在 IRC 里很常见，用于在房间里为某人的行为道歉.)&lt;br /&gt;
&lt;br /&gt;
===授予游客发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里, 主持人可能希望管理房间内谁有水没有发言权 &amp;quot;voice&amp;quot; (即, 发送消息给所有房客的能力). 发言权的授予是基于游客的房间昵称来的, 服务将从内部把这个房间昵称转成游客的全JID. 主持人通过把游客的角色变更为与会者 &amp;quot;participant&amp;quot;来给一个游客授予权限.&lt;br /&gt;
&lt;br /&gt;
'''例子 83. 主持人授予权限给一个游客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 84. 主持人授予权限给一个游客(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 85. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个人的&amp;lt;room@service/nick&amp;gt;发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'role'属性值为&amp;quot;participant&amp;quot;，指明添加了发言权.&lt;br /&gt;
&lt;br /&gt;
'''例子 86. 服务发送发言权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销与会者发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里, 主持人可能希望撤销一个与会者发言的权力,主持人通过把与会者的角色变更为游客 &amp;quot;visitor&amp;quot;来撤销一个游客的发言权:&lt;br /&gt;
&lt;br /&gt;
'''例子 87. 主持人撤销一个与会者的发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 88. 主持人撤销一个与会者的发言权(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='visitor'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 89. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个人的&amp;lt;room@service/nick&amp;gt;发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'role'属性值为&amp;quot;visitor&amp;quot;，指明移除了发言权.&lt;br /&gt;
&lt;br /&gt;
'''例子 90. 服务通知失去发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个主持人不能 MUST NOT 从一个岗位等于或高于主持人岗位的用户撤销发言权. 另外, 服务不能 MUST NOT 允许一个管理员或所有者的发言权被任何人撤销. 如果一个主持人尝试撤销这些人的发言权, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 的错误给发送者(通过以下的违规条目):&lt;br /&gt;
&lt;br /&gt;
'''例子 91. 服务对于尝试从管理员，所有者或更高岗位的用户撤销权限返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voicetest'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='secondwitch' role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改发言权列表===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里主持人可能希望管理发言权列表. 为了达到这个目的, 主持人首先查询房间所有角色为'participant'的房客列表来请求发言权列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 92. 主持人请求发言权列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='voice3'&lt;br /&gt;
    to='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回发言权列表给主持人; 每个条目必须 MUST 包含 'nick' 和 'role' 属性并且应该 SHOULD 包含 'affiliation' 和 'jid' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 93. 服务发送发言权列表给主持人'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voice3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='polonius@hamlet/castle'&lt;br /&gt;
          nick='Polo'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='horatio@hamlet/castle'&lt;br /&gt;
          nick='horotoro'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
主持人可以 MAY 接着修改发言权列表. 为了达到这个目的, 主持人必须 MUST 发送变更了的条目 (即, 只有 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'nick' 属性和 'role' 属性 (通常设置值为 &amp;quot;participant&amp;quot; 或 &amp;quot;visitor&amp;quot;) 但是不应该 SHOULD NOT 包含 'jid' 属性并且不能 MUST NOT 包含 'affiliation' 属性 (它用于管理如所有者那样的岗位而不是与会者那样的角色):&lt;br /&gt;
&lt;br /&gt;
'''例子 94. 主持人发送修改的发言权列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='voice4'&lt;br /&gt;
    to='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='Hecate'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='rosencrantz'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy fellow.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='guildenstern'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy fellow.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 95. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着为任何受影响的人发送更新的出席信息给所有房客, 如前文的用例所述，发送适当的扩展出席信息来指明发言权的变更.&lt;br /&gt;
&lt;br /&gt;
大家知道, 不能撤销一个房间所有者或管理员的发言权, 也不能撤销比发出请求的主持人岗位高的用户的发言权. 如果一个房间管理员尝试通过修改发言权列表来撤销这类用户的发言权, 服务必须 MUST 拒绝请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 96. 服务返回错误给试图撤销管理员，所有者或比发送者岗位更高的用户的发言权的发送者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voicetest'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===批准发言权申请===&lt;br /&gt;
&lt;br /&gt;
在本文的[[XEP-0045#申请发言权|申请发言权]]章节提到, 当服务接受到一个来自房客的请求，它应该 SHOULD 转发那个请求给房间的主持人(们). 为了达到这个目的, 服务应该 SHOULD 发送一个 &amp;lt;message/&amp;gt; 节给房间主持人(们), 这里 &amp;lt;message/&amp;gt; 节包含一个数据表格data form来批准或拒绝这个申请, 如下所示.&lt;br /&gt;
&lt;br /&gt;
'''例子 97. 申请批准发言权表格''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='crone1@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Voice request&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To approve this request for voice, select &lt;br /&gt;
      the &amp;amp;quot;Grant voice to this person?&amp;amp;quot;&lt;br /&gt;
      checkbox and click OK. To skip this request, &lt;br /&gt;
      click the cancel button.&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Requested role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#jid'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='User ID'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@shakespeare.lit/pda&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#roomnick'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Room Nickname'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#request_allow'&lt;br /&gt;
           type='boolean'&lt;br /&gt;
           label='Grant voice to this person?'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
为了批准这个申请, 主持人将提交此表格:&lt;br /&gt;
&lt;br /&gt;
'''例子 98. 批准发言权申请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='crone1@shakespeare.lit/pda'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#jid'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@shakespeare.lit/pda&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#roomnick'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#request_allow'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果主持人批准了这个发言权申请, 服务将授予发言权给该房客并发送一个出席信息更新，如本文[[XEP-0045#授予游客发言权|授予游客发言权]]章节所述.&lt;br /&gt;
&lt;br /&gt;
==管理员用例==&lt;br /&gt;
&lt;br /&gt;
一个房间管理员有权修改用户岗位的持久信息 (例如, 通过禁止用户) 并授予和撤销主持人权限, 但是无权修改房间的定义, 那是唯一属于房间所有者(们)的权力. 具体哪些动作是管理员可以执行的则取决于配置. 无论如何, 在 MUC 框架中的用途, 规定房间管理员最少拥有执行以下操作的权限:&lt;br /&gt;
&lt;br /&gt;
# 在房间里禁止一个用户&lt;br /&gt;
# 在房间里修改黑名单&lt;br /&gt;
# 授予或撤销成员资格&lt;br /&gt;
# 修改成员列表&lt;br /&gt;
# 授予或撤销主持人权力&lt;br /&gt;
# 修改主持人列表&lt;br /&gt;
&lt;br /&gt;
这些特性将由一个 请求/应答 request/response 式的交换来实现，使用 &amp;lt;iq/&amp;gt; 元素，包含满足 'http://jabber.org/protocol/muc#admin' 名字空间的子元素. 以下例子展示协议如何与实现互动以得到期望的功能. (以下除非显示地声明, 如果发送方的'from'地址中的&amp;lt;user@host&amp;gt;和任何房间管理员的纯JID都不同，接下来的任何管理请求必须 MUST 被拒绝; 这种情况下, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误.)&lt;br /&gt;
&lt;br /&gt;
===禁止用户===&lt;br /&gt;
&lt;br /&gt;
在房间里一个管理员或所有者可以禁止一个或多个用户. 这动作必须 MUST 基于房客的纯JID来执行. 为了禁止一个用户, 管理员必须 MUST 把该用户的岗位改为&amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 99. 管理员禁止用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 100. 管理员禁止用户(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把那个纯JID添加到黑名单, 应该 SHOULD 把被排斥者的昵称从已注册的昵称列表中移除, 并且必须 MUST 通知管理员或所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 101. 服务通知管理员或所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也移除任何还在房间中的被禁止的用户，通过发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给每个被禁止的房客, 在扩展的出席信息中包含一个状态码 301 , 可选地带上 reason (如果服务提供的话) 以及执行这个禁止动作的用户的纯JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 102. 服务移除被禁止的用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='southampton@henryv.shakespeare.lit/cambridge'&lt;br /&gt;
    to='earlofcambridge@shakespeare.lit/stabber'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='kinghenryv@shakespeare.lit'/&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='301'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
包含状态码可使客户端能够提交他们自己的通知消息 (例如, 适当的用户位置的信息). 可选的包含原因 reason 元素以及执行者 actor 使得被踢的用户能理解为什么他或她被踢了, 以及被踢的用户可以找谁去理论.&lt;br /&gt;
&lt;br /&gt;
通知主持人之后, 服务必须 MUST 接着通知剩余的房客那个被禁止的房客已经不在房间里了,即从被禁止用户发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给所有剩余的房客 (就像房客自愿退出房间时所做的一样), 包含状态码 status 以及可选的原因 reason 和执行者 actor. &lt;br /&gt;
&lt;br /&gt;
'''例子 103. 服务通知剩余的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    type='unavailable'&lt;br /&gt;
    from='southampton@henryv.shakespeare.lit/cambridge'&lt;br /&gt;
    to='exeter@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit/stabber'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='301'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
就像[[XEP-0045#踢出房客|踢出房客]]一样, 一个用户不能被自己岗位低的管理员禁止. 所以, 如果一个管理员尝试禁止一个所有者， 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者: &lt;br /&gt;
&lt;br /&gt;
'''例子 104. 服务对尝试禁止更高岗位用户返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个管理员或所有者尝试禁止他自己, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;conflict/&amp;gt; 错误给发送者. (注意:这和踢出自己时推荐的服务行为不同, 踢自己的行为服务是允许的.)&lt;br /&gt;
&lt;br /&gt;
===修改黑名单===&lt;br /&gt;
&lt;br /&gt;
房间管理员可能希望修改黑名单. 注意: 黑名单总是基于用户的纯JID. 要修改黑名单, 管理员首先向房间查询所有岗位为'outcast'的用户以得到黑名单.&lt;br /&gt;
&lt;br /&gt;
'''例子 105. 管理员请求黑名单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban2'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回黑名单给管理员; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性但不应该 SHOULD NOT 包含 'nick' 和 'role' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 106. 服务发送黑名单给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban2'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改黑名单. 为此, 管理员必须 MUST 发送变更的条目 (即, 仅是 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'affiliation' 属性 (通常设为&amp;quot;outcast&amp;quot;来禁止或&amp;quot;none&amp;quot;来取消禁止) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用来管理角色，例如与会者，而不是被排斥者岗位); 另外, reason 和 actor 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 107. 管理员发送修改的黑名单给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban3'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&amp;gt;&lt;br /&gt;
          jid='lordscroop@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='sirthomasgrey@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更新黑名单之后, 服务必须 MUST 通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 108. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban3'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着移除受影响的房客 (如果他们在房间里) 并从他们发送更新的出席信息 (包含适当的状态码) 给所有剩余的房客，如 &amp;quot;禁止用户&amp;quot; 用例所述. (服务应该 SHOULD 也移除从保留房间昵称列表中移除每个被禁止的用户的保留昵称, 如果必要.)&lt;br /&gt;
&lt;br /&gt;
当一个实体被一个房间禁止, 实现应该 SHOULD 按以下顺序匹配 JIDs (这些匹配规则和'''RFC 3921'''中定义的隐私列表的匹配规则是相同的):&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;user@domain/resource&amp;gt; (仅匹配特定的资源)&lt;br /&gt;
# &amp;lt;user@domain&amp;gt; (匹配任何资源)&lt;br /&gt;
# &amp;lt;domain/resource&amp;gt; (仅匹配特定资源)&lt;br /&gt;
# &amp;lt;domain&amp;gt; (匹配域名本身, 就像任何 user@domain 或 domain/resource 一样)&lt;br /&gt;
&lt;br /&gt;
一些管理员可能希望在一个 MUC 服务中的所有房间里禁止所有和特定域名相关的用户. 这个功能是一个服务级的特性，所以超过了本文的范围, 它定义在 '''XEP-0133'''里.&lt;br /&gt;
&lt;br /&gt;
===授予成员资格===&lt;br /&gt;
&lt;br /&gt;
管理员可以授予成员资格给一个用户; 方法是把用户的岗位改为 &amp;quot;member&amp;quot; (通常如果用户在房间里，基于昵称，如果用户不在房间里，则基于纯JID; 在这两种情况下如果提供了昵称, 那么这个昵称就是用户在这个房间的缺省昵称，如果实现支持那个功能的话):&lt;br /&gt;
&lt;br /&gt;
'''例子 109. 管理员授予成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 110. 管理员授予成员资格(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把这个用户添加到成员列表，然后通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 111. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;member&amp;quot;，指明授予了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 112. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间里, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 在这个消息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;member&amp;quot;，指明授予了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 113. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销成员资格===&lt;br /&gt;
&lt;br /&gt;
一个管理员可能想撤销一个用户的成员资格; 通过把该用户的岗位改为&amp;quot;none&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 114. 管理员撤销成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 115. 管理员撤销成员资格(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 从成员列表中移除该用户然后通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 116. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个用户的名义发送更新的出席信息节给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;none&amp;quot;，指明失去了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 117. 服务通知失去成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限会员的, 服务必须 MUST 从房间移除这个用户, 包含一个状态码 321 来指明用户被移除是因为岗位变更, 并通知所有剩余的房客:&lt;br /&gt;
&lt;br /&gt;
'''例子 118. 服务移除非会员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='321'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='321'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改成员列表===&lt;br /&gt;
&lt;br /&gt;
在一个仅限会员的房间的上下文里, 成员列表本质上是一个允许人们加入房间的白名单 &amp;quot;whitelist&amp;quot;. 任何不是成员的人等于是被禁止加入该房间, 即使他们的岗位不是&amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
在一个开放房间的上下文里, 成员列表只是一个注册了这个房间的用户 (纯JID和保留的昵称) 的列表. 这些用户可以出现在一个房间名册里, 有他们自己的保留房间昵称, 在搜索结果或类似FAQ里被返回给(查询者).&lt;br /&gt;
&lt;br /&gt;
推荐 RECOMMENDED 在仅限会员的房间里只让房间管理员拥有修改成员列表的权力. 为此, 管理员首先请求成员列表，通过查询房间里所有岗位为&amp;quot;member&amp;quot;的用户来实现:&lt;br /&gt;
&lt;br /&gt;
'''例子 119. 管理员请求成员列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 在一个仅限会员的房间里，服务也应该 SHOULD 返回成员列表给任何房客; 即, 当一个房间的成员请求房间列表时，它不应该 SHOULD NOT 生成一个 &amp;lt;forbidden/&amp;gt; 错误. 这个功能可帮助客户端展示所有现有的成员，即使他们中的一些人不在房间里, 例如. 帮助成员确定是否另一个用户应该被邀请. 服务也应该 SHOULD 允许任何成员接收成员列表，即使还不是一个房客（译注：即未进入房间）.&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回全部的成员列表给管理员，遵循 'http://jabber.org/protocol/muc#admin' 名字空间; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，每个正在房间里的成员可以 MAY 包含 'nick' 和 'role' 属性.&lt;br /&gt;
&lt;br /&gt;
'''例子 120. 服务发送成员列表给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member3'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改成员列表. 为此, 管理员必须 MUST 发送变更的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'affiliation' 属性(通常值设为 &amp;quot;member&amp;quot; 或 &amp;quot;none&amp;quot;) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，并且不能 MUST NOT 包含 'role' 属性(它是用来管理角色的，例如与会者，而不是成员的岗位):&lt;br /&gt;
&lt;br /&gt;
'''例子 121. 管理员发送修改的成员列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 修改成员列表然后通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 122. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 变更任何受影响的用户的岗位. 如果该用户已经从成员列表中移除了, 服务必须 MUST 把该用户的岗位从 &amp;quot;member&amp;quot; 变更为 &amp;quot;none&amp;quot;. 如果该用户已经被加入到成员列表, 服务必须 MUST 把该用户的岗位改成 &amp;quot;member&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
如果一个被移除的成员正在一个仅限会员的房间, 服务应该 SHOULD 踢出这个房客，如前文所述，通过把被移除的成员的角色改成 &amp;quot;none&amp;quot; 并发送适当的出席信息给这个被移除的成员来实现. 无论是否被移除的那个用户在或不在一个仅限会员的房间里, 服务必须 MUST 随后拒绝这个用户的进入.&lt;br /&gt;
&lt;br /&gt;
对所有的房间类型来说, 服务必须 MUST 以这个用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'affiliation'属性值设为&amp;quot;none&amp;quot;,以指明这个岗位的变更.&lt;br /&gt;
&lt;br /&gt;
'''例子 123. 服务发送失去成员资格的通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 服务必须 SHOULD 发送一个邀请给任何已加入到仅限会员的房间里的成员名单中的用户，如果该用户目前在该房间还没有岗位, 例如作为一个管理员或所有者(这类用户在定义时不在房间里; 同时要注意这个例子里使用了一个密码password而不是原因reason -- 这两个子元素都是可选的 OPTIONAL):&lt;br /&gt;
&lt;br /&gt;
'''例子 124. 房间发送邀请给新成员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
因为只有管理员们和所有者们应该 SHOULD 被允许修改成员列表, 一个实现可以 MAY 提供一个配置选项，在仅限会员的房间里开放邀请权限给任何成员. 这种情况下, 任何被发送的邀请都应该 SHOULD 自动触发被邀请者加入成员列表. 无论如何, 如果邀请权限被限于管理员们，而普通成员尝试发送邀请, 服务必须 MUST 拒绝这个邀请的的请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 125. 服务在普通成员尝试邀请其他人加入仅限会员的房间时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从开放房间发送的邀请不能 MUST NOT 触发被邀请者加入成员列表.&lt;br /&gt;
&lt;br /&gt;
如果一个用户被加入一个开放房间的成员列表并且该用户在该房间内, 服务必须 MUST 以该用户的名义发送更新的出席信息给所有房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'affiliation'属性值设为&amp;quot;member&amp;quot;,以指明这个岗位的变更.&lt;br /&gt;
&lt;br /&gt;
'''例子 126. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/hecate'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===授予主持人权限===&lt;br /&gt;
&lt;br /&gt;
管理员可能想授予主持人权限给一个与会者或游客; 通过把用户的角色改为 &amp;quot;moderator&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 127. 管理员授予主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 128. 管理员授予主持人权限(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='moderator'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 添加这个用户到主持人列表然后通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 129. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以该用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;moderator&amp;quot;,以指明添加了主持人权限.&lt;br /&gt;
&lt;br /&gt;
'''例子 130. 服务发送主持人权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销主持人权限===&lt;br /&gt;
&lt;br /&gt;
管理员可能想撤销用户的主持人权限. 一个管理员只可以 MAY 撤销岗位为&amp;quot;member&amp;quot; 或 &amp;quot;none&amp;quot; (也就是, 非管理员和所有者)的用户的主持人权限. 权限的撤销是通过把用户的角色改为 &amp;quot;participant&amp;quot;实现的:&lt;br /&gt;
&lt;br /&gt;
'''例子 131. 管理员撤销主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 132. 管理员撤销主持人权限(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 从主持人列表移除这个用户然后通知管理员成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 133. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以该用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user'  名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;participant&amp;quot;,以指明移除了主持人权限. &lt;br /&gt;
&lt;br /&gt;
'''例子 134. 服务通知失去了主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
大家知道, 管理员不 MUST NOT 被允许从岗位为 &amp;quot;owner&amp;quot; 或 &amp;quot;admin&amp;quot;的用户撤销主持人权限. 如果一个管理员尝试撤销这类用户的权限, 服务必须MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 135. 服务在用户尝试撤销管理员或所有者的主持人权限时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='modtest'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='secondwitch' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改主持人列表===&lt;br /&gt;
&lt;br /&gt;
管理员可能希望修改主持人列表. 为此, 管理员首先通过请求房间内所有角色为'moderator'的用户来请求主持人列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 136. 管理员请求主持人列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回主持人列表给管理员; 每个条目必须 MUST 包含 'jid', 'nick', 'role' 属性并应该 SHOULD 包含 'affiliation' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 137. 服务发送主持人列表给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod3'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改主持人列表. 为此, 管理员必须 MUST发送修改的条目(即, 仅&amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'jid' 属性和'role' 属性(通常值设为 &amp;quot;member&amp;quot; 或 &amp;quot;participant&amp;quot;) 但不应该 SHOULD NOT 包含 'nick' 属性并且不能 MUST NOT 包含 'affiliation' 属性(它被用于管理类似管理员这样的岗位而不是主持人这样的角色):&lt;br /&gt;
&lt;br /&gt;
'''例子 138. 管理员发送修改了的主持人列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 修改主持人列表并通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 139. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 随后以所有受影响的用户发送更新的出席信息给所有的房客, 支出主持人权限的变更，通过发送前面用例所述的适当的扩展出席信息.&lt;br /&gt;
&lt;br /&gt;
显然, 房间所有者或房间管理员的主持人权限不能被撤销. 如果一个房间管理员尝试通过修改主持人列表来撤销这类用户的主持人权限, 服务必须 MUST 拒绝请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 140. 服务在用户尝试撤销管理员或所有者的主持人权限时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='modtest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===批准注册申请===&lt;br /&gt;
&lt;br /&gt;
如果一个服务不自动接受注册到房间的请求, 它可以 MAY 为房间管理员提供一个方法来批准或拒绝来自 Jabber 的注册请求(替代方案是, 它可能提供一个 web 接口或一些其他管理工具). 对这个服务来说，最简单的办法就是，当接收到注册请求时发送一个 &amp;lt;message/&amp;gt; 节给房间管理员(们), 这里的&amp;lt;message/&amp;gt; 节包含一个数据表格 Data Form asking 用来询问管理员是否批准用户的注册申请. 推荐 RECOMMENDED 以下数据表格 Data Form，但是实现可以 MAY 使用完全不同的表格, 或or 在下面的表格基础上补充字段.&lt;br /&gt;
&lt;br /&gt;
'''例子 141. 注册申请批准表格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='crone1@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Registration request&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To approve this registration request, select the&lt;br /&gt;
      &amp;amp;quot;Allow this person to register with the room?&amp;amp;quot;&lt;br /&gt;
      checkbox and click OK. To skip this request, click the &lt;br /&gt;
      cancel button.&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_first'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Given Name'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Brunhilde&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_last'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Family Name&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Entwhistle-Throckmorton&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_roomnick'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Desired Nickname&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_url'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;User URL&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;http://witchesonline/~hag66/&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_email'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Email Address&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@witchesonline&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_faqentry'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;FAQ Entry&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Just another witch.&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_allow'&lt;br /&gt;
           type='boolean'&lt;br /&gt;
           label='Allow this person to register with the room?'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果管理员批准了注册申请, 服务将把该用户注册到房间.&lt;br /&gt;
&lt;br /&gt;
更多高级的批准机制(例如, 使用特定命令[http://xmpp.org/extensions/xep-0050.html Ad-Hoc Commands] [[XEP-0045#附录G:备注|19]]来接收注册申请列表,就像 [http://xmpp.org/extensions/xep-0060.html Publish-Subscribe] [[XEP-0045#附录G:备注|20]]里所做的一样) 超出了本文的范围.&lt;br /&gt;
&lt;br /&gt;
==所有者用例==&lt;br /&gt;
&lt;br /&gt;
每个房间必须 MUST 至少有一个所有者, 而所有者(或一个成功者)在一个房间的生命周期里是这个房间长期存在的属性(例如, 所有者在退出一个持久性的房间时不会失去所有权). 本文假定(初始的) 房间所有者是那个新建了该房间的用户并且有一个房间所有者有权修改房间配置选项的定义，例如房间类型. 理想情况下, 房间所有者不仅能指定房间类型(密码保护的, 仅限会员的, 等等) 而且包括如本文的 [XEP-0045#需求|需求]章节所述的房间特定属性. 另外, 如果所有者能指定其他所有者们的JID也是不错的, 但那将取决于具体实现.&lt;br /&gt;
&lt;br /&gt;
为了让配置选项更加广泛提供必要的伸缩性, 房间配置将使用 Data Forms ('''XEP-0004'''), 通过使用由 'http://jabber.org/protocol/muc' 名字空间触发. 也就是, 如果一个实体在它请求加入房间的 join/request 里不包含 MUC 名字空间, 那么服务将立刻新建房间，在新建房间之前不等待通过数据表格进行配置(这保证了和旧的&amp;quot;groupchat 1.0&amp;quot;协议的向后兼容); 无论如何, 如果房间的 join/create 请求包含了 MUC 扩展, 那么服务在新建和解锁该房间之前将通过数据表格请求配置.&lt;br /&gt;
&lt;br /&gt;
注意: 以下展示的配置选项列出了本文的需求章节的所有特性和房间类型; 无论如何, 实际的配置选项和表格布局将取决于实现和具体的布署. 而且, 这些只是例子，不代表这些就是房间可以拥有的所有允许或需要的配置选项. 一个特定的实现或布署可以 MAY 选择提供额外的配置选项(敏感词过滤, 设置房间的缺省语言, 消息记录, 等等), 这就是为什么在这里使用 'jabber:x:data' 协议是很有价值的.&lt;br /&gt;
&lt;br /&gt;
===新建房间===&lt;br /&gt;
====一般注意事项====&lt;br /&gt;
&lt;br /&gt;
新建房间的权限可以 MAY 限制在特定的用户群或可以 MAY 保留给一个服务级别的管理员. 如果访问被拒绝而一个用户试图新建一个房间, 服务必须MUST 返回一个 &amp;lt;not-allowed/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 142. 服务通知用户不能新建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果访问不限制, 服务必须 MUST 允许用户按以下步骤新建房间.&lt;br /&gt;
&lt;br /&gt;
从房间创建的视角来看, 本质上有两种房间:&lt;br /&gt;
&lt;br /&gt;
* 即时房间&amp;quot;Instant rooms&amp;quot; -- 可以立刻访问并基于某些缺省配置自动创建.&lt;br /&gt;
* 保留房间&amp;quot;Reserved rooms&amp;quot; -- 在任何人访问之前由房间配置者手动创建.&lt;br /&gt;
&lt;br /&gt;
新建和配置这些房间的流程如下:&lt;br /&gt;
&lt;br /&gt;
# 用户必须 MUST 发送出席信息到 &amp;lt;room@service/nick&amp;gt; 并声明他或她对MUC协议的支持，通过包含一个扩展的出席信息,并包含在一个空的满足'http://jabber.org/protocol/muc'名字空间的 &amp;lt;x/&amp;gt; 子元素里(注意这里不包含 '#owner' 或 '#user' 后缀).&lt;br /&gt;
# 如果用户被允许新建房间并且房间还不存在, 服务必须 MUST 根据一些缺省配置新建此房间, 指定请求的用户成为初始的房间拥有者, 并增加这个拥有者到该房间但不允许任何别的用户进入该房间(有效地锁定 &amp;quot;locking&amp;quot;该房间). 从房间发送由所有者收到的初始的出席信息节必须 MUST 包含扩展的出席信息以指出该用户的状态为一个所有者并承认房间已经被创建了(通过状态码 201) 并等待配置.&lt;br /&gt;
# 如果初始的房间所有者想新建和配置一个保留房间, 房间所有者必须 MUST 接着请求一个配置，通过发送类型为&amp;quot;get&amp;quot;的IQ节并包含一个空的满足'http://jabber.org/protocol/muc#owner'名字空间的&amp;lt;query/&amp;gt;元素给该房间 ,然后完成第4和第5步. 如果房间所有者喜欢新建一个即时房间, 该房间所有者必须 MUST 发送一个遵循'http://jabber.org/protocol/muc#owner'名字空间的 query 元素并包含一个遵循 'jabber:x:data' 名字空间的空的类型为 &amp;quot;submit&amp;quot; 的 &amp;lt;x/&amp;gt; 元素, 然后跳到第6步.&lt;br /&gt;
# 如果房间所有者请求了一个配置表格, 服务必须 MUST 发送一个包含配置表格并遵循 'jabber:x:data'名字空间的 IQ 给房间拥有者. 如果没有配置选项可用, 房间必须 MUST 返回一个空的 query 元素给房间所有者.&lt;br /&gt;
# 初始的房间所有者应该 SHOULD 为该房间提供一个开始的配置(或接受缺省配置)，通过发送&amp;quot;set&amp;quot;类型并包含完整的配置表格的 IQ . 另外, 房间所有者可以 MAY 取消配置过程. (实现可以 MAY 设置一个初始化配置的超时, 这样如果房间所有者再给定的超时时间内不配置房间, 房间所有者就被假定已经接受了缺省得配置或取消了配置过程.)&lt;br /&gt;
# 一旦服务从初始房间所有者接收了完整的配置表格(或接收到了一个即时房间的请求), 服务必须 MUST 解锁 &amp;quot;unlock&amp;quot; 这个房间 (即, 允许其他用户进入此房间) 并发送&amp;quot;result&amp;quot;类型的 IQ  给房间所有者. 如果服务接收到了取消（指令）, 它必须 MUST 销毁这个房间.&lt;br /&gt;
&lt;br /&gt;
以下例子展示了这个协议流程.&lt;br /&gt;
&lt;br /&gt;
首先, Jabber用户必须 MUST 发送出席信息给房间, 包含空的 &amp;lt;x/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc' 名字空间(当他寻求进入一个房间时也发送和这同样的节).&lt;br /&gt;
&lt;br /&gt;
'''例子 143. Jabber用户新建一个房间并声明对多用户聊天的支持'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该房间不存在, 服务应该 SHOULD 新建这个房间(取决于关于新建房间的本地策略), 指定发出请求的用户的纯JID成为所有者, 添加这个所有者到房间, 并通过发送以下格式的出席信息节承认房间新建成功:&lt;br /&gt;
&lt;br /&gt;
'''例子 144. 服务承认房间新建成功'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='201'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接收到该房间已经创建的通知之后, 房间所有者需要决定是否接受缺省的房间配置(即, 新建一个即时房间 &amp;quot;instant room&amp;quot;) 还是做一些不同于缺省房间设置的配置 (即, 新建一个保留房间&amp;quot;reserved room&amp;quot;). 完成这两个用例的协议流程展示如下.&lt;br /&gt;
&lt;br /&gt;
注意: 如果如上的发送到一个不存在的房间里的出席信息节没有包含一个遵循 'http://jabber.org/protocol/muc'名字空间的 &amp;lt;x/&amp;gt; 元素, 服务应该SHOULD 立刻新建一个缺省的房间(即, 它必须 MUST 假定客户端支持 &amp;quot;groupchat 1.0&amp;quot; 而不是 Multi-User Chat, 所以在等待房间创建者决定是创建即时房间还是保留房间的时候,它不能 MUST NOT 锁定这个房间).&lt;br /&gt;
&lt;br /&gt;
====新建即时房间====&lt;br /&gt;
&lt;br /&gt;
如果初始的房间所有者想接受缺省的房间配置(即, 新建一个即时房间&amp;quot;instant room&amp;quot;), 房间所有者必须 MUST 拒绝初始配置表格,通过发送一个 IQ set 给 &amp;lt;room@service&amp;gt; 本身,包含一个遵循'http://jabber.org/protocol/muc#owner'名字空间的 &amp;lt;query/&amp;gt; 元素, 这里 &amp;lt;query/&amp;gt; 的唯一子元素是一个空的遵循'jabber:x:data'名字空间的 &amp;lt;x/&amp;gt; 元素并且拥有一个 'type'属性值为 &amp;quot;submit&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 145. 所有者请求即时房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着解锁该房间并允许其他实体加入它.&lt;br /&gt;
&lt;br /&gt;
====新建保留房间====&lt;br /&gt;
&lt;br /&gt;
如果初始的房间所有者想新建并配置一个保留房间, 这个房间所有者必须 MUST 请求初始配置表格,通过发送一个 IQ get 给 &amp;lt;room@service&amp;gt; 本身,包含一个空的遵循 'http://jabber.org/protocol/muc#owner' 名字空间的 &amp;lt;query/&amp;gt; 元素 :&lt;br /&gt;
&lt;br /&gt;
'''例子 146. 所有者请求配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间还不存在, 服务必须 MUST 返回一个初始的房间配置表单给该用户. (注意: 以下例子展示一个配置选项的典型例子. 已登记用于房间创建和配置的所有 x:data 字段列表由 XMPP Registrar 维护; 参见本文的 [[XEP-0045#XMPP注册项事项|XMPP注册项事项]] 章节.)&lt;br /&gt;
&lt;br /&gt;
'''例子 147. 服务发送配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Configuration for &amp;quot;darkcave&amp;quot; Room&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
          Your room darkcave@macbeth has been created!&lt;br /&gt;
          The default configuration is as follows:&lt;br /&gt;
            - No logging&lt;br /&gt;
            - No moderation&lt;br /&gt;
            - Up to 20 occupants&lt;br /&gt;
            - No password required&lt;br /&gt;
            - No invitation required&lt;br /&gt;
            - Room is not persistent&lt;br /&gt;
            - Only admins may change the subject&lt;br /&gt;
            - Presence broadcasted for all users&lt;br /&gt;
          To accept the default configuration, click OK. To&lt;br /&gt;
          select a different configuration, please complete&lt;br /&gt;
          this form.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural-Language Room Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomname'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Short Description of Room'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomdesc'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural Language for Room Discussions'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_lang'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Enable Public Logging?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Change Subject?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Invite Others?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Maximum Number of Occupants'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='10'&amp;gt;&amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='20'&amp;gt;&amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='30'&amp;gt;&amp;lt;value&amp;gt;30&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='50'&amp;gt;&amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='100'&amp;gt;&amp;lt;value&amp;gt;100&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='None'&amp;gt;&amp;lt;value&amp;gt;none&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles for which Presence is Broadcast'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_presencebroadcast'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles and Affiliations that May Retrieve Member List'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_getmemberlist'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Publicly Searchable?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Persistent?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Moderated?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Members-Only?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password Required to Enter?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          If a password is required to enter this room,&lt;br /&gt;
          you must specify the password below.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password'&lt;br /&gt;
          type='text-private'&lt;br /&gt;
          var='muc#roomconfig_roomsecret'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Who May Discover Real JIDs?'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderators Only'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Anyone'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;anyone&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional people who have&lt;br /&gt;
          administrative privileges in the room. Please&lt;br /&gt;
          provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Admins'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomadmins'/&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional owners for this&lt;br /&gt;
          room. Please provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Owners'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomowners'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: _whois 配置选项指定该房间是非匿名的(值为 &amp;quot;anyone&amp;quot;), 半匿名的(值为&amp;quot;moderators&amp;quot;), 还是全匿名的(值为&amp;quot;none&amp;quot;, 不显示在这).&lt;br /&gt;
&lt;br /&gt;
如果没有配置选项可用, 服务必须 MUST 返回空的 query 元素给房间所有者:&lt;br /&gt;
&lt;br /&gt;
'''例子 148. 服务通知所有者没有配置可用'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间所有者应该 SHOULD 接着填好表单并提交给服务.&lt;br /&gt;
&lt;br /&gt;
'''例子 149. 所有者提交配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomname'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;A Dark Cave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomdesc'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomsecret'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;cauldronburn&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomadmins'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;wiccarocks@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hecate@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间创建成功, 服务必须 MUST 通知新的房间所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 150. 服务通知新房间所有者成功'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果因为指定的房间配置违反了一个或多个服务策略而导致房间创建失败 (例如, 因为密码保护房间的密码为空), 服务必须 MUST 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
'''例子 151. 服务通知所有者请求的配置选项不被接受'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一方面, 房间所有者可以 MAY 取消配置过程:&lt;br /&gt;
&lt;br /&gt;
'''例子 152. 所有者取消初始的配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='cancel'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间所有者取消了初始的房间配置, 服务应该 SHOULD 销毁房间, 确保发送不可用出席信息给房间所有者 (详见 &amp;quot;销毁房间&amp;quot; 用例).&lt;br /&gt;
&lt;br /&gt;
如果房间所有者在提交表单之前因为任何原因下线了(例如, 失去连接), 服务将接收到一个类型为 &amp;quot;unavailable&amp;quot; 的出席信息节，从所有者到所有者的 &amp;lt;room@service/nick&amp;gt; 或到 &amp;lt;room@service&amp;gt; (或两者). 服务必须 MUST 接着销毁这个房间, 发送一个 &amp;quot;unavailable&amp;quot; 类型的出席信息节，从房间到所有者，包含一个 &amp;lt;destroy/&amp;gt; 元素以及 reason (子元素)(如果提供了) ，参见本文的 [[XEP-0045#销毁房间|销毁房间]]章节.&lt;br /&gt;
&lt;br /&gt;
====申请唯一房间名====&lt;br /&gt;
&lt;br /&gt;
在一些场合 (例如, 当 [[XEP-0045#把一对一聊天转为多用户会议|把一对一聊天转为会议]]), 房间创建者可能想在尝试新建房间之前请求一个唯一的房间名 (例如, 避免可能的房间冲突). 为此, 服务可以 MAY 如本章所述支持这个特性. (如果服务支持这个特性, 它必须 MUST 在对服务发现信息请求应答时返回一个 &amp;quot;http://jabber.org/protocol/muc#unique&amp;quot; 特性.)&lt;br /&gt;
&lt;br /&gt;
房间创建者通过发送一个 IQ-get 给服务本身来请求唯一房间名, 这个IQ节中包含一个空的 &amp;lt;unique/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc#unique' 名字空间:&lt;br /&gt;
&lt;br /&gt;
'''例子 153. 实体请求唯一房间名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='unique1'&lt;br /&gt;
    to='chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;unique xmlns='http://jabber.org/protocol/muc#unique'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果服务支持这个特性, 它应该 SHOULD 以 XML 字符数据的方式返回一个唯一房间名，包含一个 &amp;lt;unique/&amp;gt; 元素 (但不创建该房间):&lt;br /&gt;
&lt;br /&gt;
'''例子 154. 服务返回唯一房间名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='chat.shakespeare.lit'&lt;br /&gt;
    id='unique1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;unique xmlns='http://jabber.org/protocol/muc#unique'&amp;gt;&lt;br /&gt;
    6d9423a55f499b29ad20bf7b2bdea4f4b885ead1&lt;br /&gt;
  &amp;lt;/unique&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 拒绝返回一个唯一房间名给一个没有资格创建房间的实体, 或那些发送请求唯一房间名过多次数的实体, 等等.&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 使用算法保证房间名的创建在服务上下文中是唯一的 (例如, 对发出请求的JID,datetime,和random salt的SHA-1 哈希运算).&lt;br /&gt;
&lt;br /&gt;
房间创建者将接着使用 XML 字符数据 &amp;lt;unique/&amp;gt; 元素作为它请求的房间JID的节点标识符(ID):&lt;br /&gt;
&lt;br /&gt;
'''例子 155. 所有者以唯一名创建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence &lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='6d9423a55f499b29ad20bf7b2bdea4f4b885ead1@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===随后的房间配置===&lt;br /&gt;
&lt;br /&gt;
在指定房间的初始配置之后的任何时间, 房间所有者可能想修改房间配置. 为此, 房间所有者必须 MUST 向房间发出一个新的配置表单请求,通过发送一个 IQ 到 &amp;lt;room@service&amp;gt; ，包含一个空的 &amp;lt;query/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc#owner' 名字空间.&lt;br /&gt;
&lt;br /&gt;
'''例子 156. 所有者请求配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='config1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 157. 服务禁止非所有者的访问配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='configures'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 服务必须 MUST 以当前使用的选项组作为缺省值发送一个配置表单给房间所有者:&lt;br /&gt;
&lt;br /&gt;
'''例子 158. 服务发送配置表单给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='config1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Configuration for &amp;quot;darkcave&amp;quot; Room&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
        Complete this form to make changes to&lt;br /&gt;
        the configuration of your room.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural-Language Room Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomname'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;A Dark Cave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Short Description of Room'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomdesc'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Enable Public Logging?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Change Subject?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Invite Others?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Maximum Number of Occupants'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='10'&amp;gt;&amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='20'&amp;gt;&amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='30'&amp;gt;&amp;lt;value&amp;gt;30&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='50'&amp;gt;&amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='100'&amp;gt;&amp;lt;value&amp;gt;100&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='None'&amp;gt;&amp;lt;value&amp;gt;none&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles for which Presence is Broadcast'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_presencebroadcast'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles and Affiliations that May Retrieve Member List'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_getmemberlist'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Publicly Searchable?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Persistent?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Moderated?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Members Only?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password Required for Entry?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          If a password is required to enter this room,&lt;br /&gt;
          you must specify the password below.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password'&lt;br /&gt;
          type='text-private'&lt;br /&gt;
          var='muc#roomconfig_roomsecret'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;cauldronburn&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Who May Discover Real JIDs?'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderators Only'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Anyone'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;anyone&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional people who have&lt;br /&gt;
          administrative privileges in the room. Please&lt;br /&gt;
          provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Admins'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomadmins'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;wiccarocks@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hecate@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional owners for this&lt;br /&gt;
          room. Please provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Owners'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomowners'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有配置选项可用, 服务必须 MUST 返回一个空的 query 元素给房间所有者，如前面的用例所示.&lt;br /&gt;
&lt;br /&gt;
该房间所有者应该 SHOULD 接着以更新的配置信息提交表单.&lt;br /&gt;
&lt;br /&gt;
另外, 房间所有者可以 MAY 取消这次配置过程:&lt;br /&gt;
&lt;br /&gt;
'''例子 159. 所有者取消随后的配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='config2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='cancel'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间所有者取消随后的配置, 服务必须 MUST 让该房间的配置保持和房间所有者请求这次配置之前一样.&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个房间管理员失去管理权限，而这个管理员正在房间里, 该房间必须 MUST 为那个管理员发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;member&amp;quot; 或 'role' 属性值为 &amp;quot;participant&amp;quot; 或 &amp;quot;visitor&amp;quot; ，以适当地表达岗位级别和房间类型:&lt;br /&gt;
&lt;br /&gt;
'''例子 160. 服务通知失去管理员岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个用户获得管理员权限，而这个用户正在房间里, 房间必须 MUST 为那个用户发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 或 'role' 属性值为 &amp;quot;admin&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
'''例子 161. 服务通知所有用户有人获得管理员岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个房间所有者失去所有者权限，而这个所有者正在房间里, 该房间必须 MUST 为那个所有者发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 或 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 162. 服务通知失去所有者岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有其他所有者，服务不能 MUST NOT 允许一个所有者撤销他或她自己的所有权; 如果一个所有者企图这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给这个所有者. 然而, 如果有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有者权限.&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个用户获得所有者权限，而这个用户正在房间里, 房间必须 MUST 为那个用户发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; 或 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 163. 服务通知所有用户有人获得所有者权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致房间类型变成仅限会员，但还有非成员在房间里, 服务必须 MUST 从房间移除任何非成员，并在发送给那些剩余的房客的 '不可用' 出席信息节里包含状态码 322.&lt;br /&gt;
&lt;br /&gt;
====配置变更通知====&lt;br /&gt;
&lt;br /&gt;
当一个房间的配置变更会对房间的隐私和安全策略产生影响时，该房间必须 MUST 发送通知给所有房客. 这个通知将包括一个 &amp;lt;message/&amp;gt; 节，包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 元素,  &amp;lt;x/&amp;gt; 元素则只有一个 &amp;lt;status/&amp;gt; 子元素，其 'code' 属性为一个适当的值. 这是例子:&lt;br /&gt;
&lt;br /&gt;
'''例子 164. 配置状态码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
         type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;status code='170'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间配置中和隐私相关的策略变更导致生成这些状态码，如下:&lt;br /&gt;
&lt;br /&gt;
* 如果房间日志功能可用了, 状态码 170.&lt;br /&gt;
* 如果房间日志现在禁止了, 状态码 171.&lt;br /&gt;
* 如果房间现在是非匿名的了, 状态码 172.&lt;br /&gt;
* 如果房间现在是半匿名的了, 状态码 173.&lt;br /&gt;
* 如果房间现在是全匿名的了, 状态码 174.&lt;br /&gt;
&lt;br /&gt;
对更多其他配置变更, 房间应该 SHOULD 发送状态码 104 这样感兴趣的房客如果想要的话可以接受到更新的房间配置.&lt;br /&gt;
&lt;br /&gt;
===授予所有者权限===&lt;br /&gt;
&lt;br /&gt;
如果实现允许, 一个所有者可以 MAY 授予所有权给其他用户; 只要把用户的岗位改成&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 165. 所有者授予所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 166. 所有者授予所有权(饱含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把用户添加到所有者列表并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 167. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已授予所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
'''例子 168. 服务发送所有权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/hecate'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已授予所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; . &lt;br /&gt;
&lt;br /&gt;
'''例子 169. 服务发送所有权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销所有者权限===&lt;br /&gt;
&lt;br /&gt;
实现可以 MAY 允许一个所有者撤销其他用户的所有权; 只要把用户的岗位改成非&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 170. 所有者撤销所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt;元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 171. 所有者撤销所有权(包含一个原因)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有其它所有者，服务不能 MUST NOT 允许一个所有者撤销他或她自己的所有权; 如果一个所有者尝试这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该所有者. 然而, 如果有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有权.&lt;br /&gt;
&lt;br /&gt;
如果一个实现不允许所有者撤销另一个用户的所有权, 实现必须 MUST 返回一个 &amp;lt;not-authorized/&amp;gt; 错误给做出这个请求的所有者.&lt;br /&gt;
&lt;br /&gt;
注意: 允许一个所有者移除其它用户的所有权能给房间管理一个折衷的控制模式; 所以这个特性是可选的 OPTIONAL, 并且鼓励实现支持通过一个只有拥有服务范围管理权限的用户使用的接口来移除所有者.&lt;br /&gt;
&lt;br /&gt;
其它情况下, 服务必须 MUST 把用户从所有者列表移除并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 172. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;owner&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值:&lt;br /&gt;
&lt;br /&gt;
'''例子 173. 服务通知失去所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;owner&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
'''例子 174. 服务发送失去所有权通知给所有房客 '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改所有者列表===&lt;br /&gt;
&lt;br /&gt;
如果实现允许, 一个房间所有者可能想修改所有者列表. 为此, 所有者首先请求所有者列表，通过向房间请求所有岗位为 'owner'的用户.&lt;br /&gt;
&lt;br /&gt;
'''例子 175. 所有者请求所有者列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='owner3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 接着返回所有者列表给所有者; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，对任何正是一名房客（也就是正在房间里）的所有者可以 MAY 包含 'nick' 和 'role' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 176. 服务发送所有者列表给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='crone1@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
所有者可以 MAY 接着修改所有者列表. 为此, 所有者必须 MUST 发送修改的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; [[XEP-0045#附录G:备注|21]]每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用于管理参与者之类的角色，而不是所有者之类的岗位):&lt;br /&gt;
&lt;br /&gt;
'''例子 177. 所有者发送修改过的所有者列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='owner4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
只有所有者被允许修改所有者列表. 如果一个非所有者试图察看或修改所有者列表, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 178. 服务对于非所有者试图修改所有者列表返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='ownertest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' &lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有别的所有者，服务不能 MUST NOT 允许一个所有者撤销自己的所有权; 如果一个所有者尝试这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该所有者. 然而, 如果有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有权. &lt;br /&gt;
&lt;br /&gt;
其它情况下, 服务必须 MUST 修改所有者列表并通知所有者成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 179. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也为任何因前述所有者列表修改而导致的岗位变化而发送出席信息通知.&lt;br /&gt;
&lt;br /&gt;
===授予管理员权限===&lt;br /&gt;
&lt;br /&gt;
一个所有者可以授予管理员权限给一个成员或无岗位的用户; 只要把用户的岗位改成&amp;quot;admin&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 180. 所有者授予管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL. &lt;br /&gt;
&lt;br /&gt;
'''例子 181. 所有者授予管理员权限(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把用户添加到管理员列表并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 182. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已授予管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值. &lt;br /&gt;
&lt;br /&gt;
'''例子 183. 服务发送管理员权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已授予管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 184. 服务发送管理员权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销管理员权限===&lt;br /&gt;
&lt;br /&gt;
一个所有者可能想撤销一个用户的管理员权限; 只要把用户的岗位改成非&amp;quot;admin&amp;quot;和非&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 185. 所有者撤销管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt;元素是可选的 OPTIONAL. &lt;br /&gt;
&lt;br /&gt;
'''例子 186. 所有者撤销管理员权限(包含一个原因)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把该用户从管理员列表移除并接着通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 187. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已失去管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非&amp;quot;admin&amp;quot;非&amp;quot;owner&amp;quot;, 并且 'role' 属性值为根据岗位和房间类型确定的适当的值: &lt;br /&gt;
&lt;br /&gt;
'''例子 188. 服务通知失去管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;admin&amp;quot; . &lt;br /&gt;
&lt;br /&gt;
'''例子 189. 服务通知失去管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改管理员列表===&lt;br /&gt;
&lt;br /&gt;
一个房间所有者可能想修改管理员列表. 为此, 所有者首先请求管理员列表，通过向房间请求所有岗位为 'admin'的用户. &lt;br /&gt;
&lt;br /&gt;
'''例子 190. 所有者请求管理员列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/desktopaffiliation&lt;br /&gt;
    id='admin3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 接着返回管理员列表给所有者; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，对任何正是一名房客（也就是正在房间里）的管理员可以 MAY 包含 'nick' 和 'role' 属性: &lt;br /&gt;
&lt;br /&gt;
'''例子 191. 服务发送管理员列表给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          nick='secondwitch'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
所有者可以 MAY 接着修改管理员列表. 为此, 所有者必须 MUST 发送修改的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; [[XEP-0045#附录G:备注|22]] 每个条目必须 MUST 包含 'affiliation'属性(通常值为 &amp;quot;admin&amp;quot; 或 &amp;quot;none&amp;quot;) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用于管理参与者之类的角色，而不是管理员之类的岗位): &lt;br /&gt;
&lt;br /&gt;
'''例子 192. 所有者发送修改的管理员列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='admin4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
只有所有者被允许修改管理员列表. 如果一个非所有者试图察看或修改所有者列表, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者: &lt;br /&gt;
&lt;br /&gt;
'''例子 193. 服务对于非所有者试图修改管理员列表返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admintest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin' &lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 修改管理员列表并通知所有者成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 194. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也为任何因前述管理员列表修改而导致的岗位变化而发送出席信息通知.&lt;br /&gt;
&lt;br /&gt;
===销毁房间===&lt;br /&gt;
&lt;br /&gt;
房间所有者必须 MUST 能够销毁一个房间, 特别是如果这个房间不是持久房间的时候. 流程如下:&lt;br /&gt;
&lt;br /&gt;
# 房间所有者请求销毁房间, 如果必要的话指出一个原因 reason 和一个备用场地.&lt;br /&gt;
# 该房间移除所有房客(包含适当的关于备用场地和被移除的原因的信息) 并销毁房间, 即使它被定义为持久房间.&lt;br /&gt;
&lt;br /&gt;
不像前述的, 本文不指定一个MUC服务实现收到一个销毁房间请求之后将会如何做. 例如, 如果房间定义为持久地, 一个实现可以 MAY 选择锁定房间I，这样它不能被重用, 把加入该房间的请求重定向到替代场地, 或邀请当前的参与者到新的房间; 无论如何, 这些行为是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
为了销毁一个房间, 房间所有者必须 MUST 发送一个 IQ set 指令到要销毁的房间的地址. 这个 &amp;lt;iq/&amp;gt; 节将包含一个遵循 'http://jabber.org/protocol/muc#owner' 名字空间的 &amp;lt;query/&amp;gt; 元素，它将包含一个 &amp;lt;destroy/&amp;gt; 元素. 替代场地的地址可以 MAY 用这个 &amp;lt;destroy/&amp;gt; 元素的 'jid' 属性来提供. 一个密码保护的替代场地可以 MAY 通过 &amp;lt;destroy/&amp;gt; 元素的 &amp;lt;password/&amp;gt; 子元素的 XML 字符数据来提供. 摧毁房间的原因可以 MAY 通过 &amp;lt;destroy/&amp;gt; 元素的 &amp;lt;reason/&amp;gt; 子元素的 XML 字符数据来提供.&lt;br /&gt;
&lt;br /&gt;
以下例子展示了协议发送和接收的元素:&lt;br /&gt;
&lt;br /&gt;
'''例子 195. 所有者提交房间摧毁请求'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='begone'&lt;br /&gt;
    to='heath@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务负责移除所有房客. 它不应该 SHOULD NOT 广播类型为&amp;quot;unavailable&amp;quot;的出席信息节给所有房客, 只需要发送一个&amp;quot;unavailable&amp;quot;类型的出席信息节给每个房客，这样该用户知道他或她已经从房间移除了. 如果所有者的扩展出席信息指定了一个替代场地的 JID 以及房间销毁的原因, 这个出席信息节必须 MUST 包含那些信息.&lt;br /&gt;
&lt;br /&gt;
'''例子 196. 服务移除每个房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 197. 服务通知所有者成功销毁房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='begone'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果在一个销毁请求中接收到的'from'地址的 &amp;lt;user@host&amp;gt; 和一个房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 198. 服务拒绝由非所有者提交的销毁请求'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='destroytest'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==错误和状态码==&lt;br /&gt;
===错误码===&lt;br /&gt;
&lt;br /&gt;
和'http://jabber.org/protocol/muc#user' 名字空间相关的错误码相当简单, 总结于下表之中. 关于传统的错误码到XMPP格式的错误之间的映射的详细信息, 参见 [http://xmpp.org/extensions/xep-0086.html 错误条件映射] [[XEP-0045#附录G:备注|23]]; 实现应该 SHOULD 支持传统和XMPP错误处理两者.&lt;br /&gt;
&lt;br /&gt;
'''表9: http://jabber.org/protocol/muc#user 名字空间的错误码'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!码 !!类型 !!元素 !!上下文 !!目的&lt;br /&gt;
|-&lt;br /&gt;
|401 ||Error ||Presence  ||进入一个房间 ||通知用户需要密码&lt;br /&gt;
|-&lt;br /&gt;
|403 ||Error ||Presence  ||进入一个房间 ||通知用户他或她被房间禁止了&lt;br /&gt;
|-&lt;br /&gt;
|404 ||Error ||Presence  ||进入一个房间 ||通知用户房间不存在&lt;br /&gt;
|-&lt;br /&gt;
|405 ||Error ||Presence  ||进入一个房间 ||通知用户限制创建房间&lt;br /&gt;
|-&lt;br /&gt;
|406 ||Error ||Presence  ||进入一个房间 ||通知用户必须使用保留的房间昵称&lt;br /&gt;
|-&lt;br /&gt;
|407 ||Error ||Presence  ||进入一个房间 ||通知用户他或她不在成员列表中&lt;br /&gt;
|-&lt;br /&gt;
|409 ||Error ||Presence  ||进入一个房间 ||通知用户他或她的房间昵称正在使用或被别的用户注册了&lt;br /&gt;
|-&lt;br /&gt;
|503 ||Error ||Presence  ||进入一个房间 ||通知用户已经达到最大用户数&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
本文不规定和上述错误条件相关的文本字符串(即, XMPP &amp;lt;text/&amp;gt; 元素值).&lt;br /&gt;
&lt;br /&gt;
===状态码===&lt;br /&gt;
&lt;br /&gt;
多用户聊天的使用一个 &amp;lt;status/&amp;gt; 元素(特指, &amp;lt;status/&amp;gt; 元素的的 'code' 属性  ) 来传达关于用户在一个房间里的状态的信息. 随着时间的推移, 状态码的数量已经增加了很多, 而新的状态码继续被作者申请. 所以, 这些状态码现在记录在一个由XMPP登记处维护的注册表里. 细节可参考本文的 [[XEP-0045#状态码注册表|状态码注册表]].&lt;br /&gt;
&lt;br /&gt;
注意: 通常, MUC 状态码倾向于沿用[http://tools.ietf.org/html/rfc2616 RFC 2616] [[XEP-0045#附录G:备注|24]] 和 [http://tools.ietf.org/html/rfc1893 RFC 1893] [[XEP-0045#附录G:备注|25]] (1xx 码表示信息, 2xx 码说明情况良好可继续, 3xx 码指定重定向被踢或被禁止的用户, x3x 码指系统状态, x7x 码指安全或策略事务, 等等) 里面的状态码的 &amp;quot;抽象&amp;quot;含义.&lt;br /&gt;
&lt;br /&gt;
注意: 如果今天来定义 MUC 协议, 它将指定一个更有弹性的, XML-友好的 途径而不是硬编码的状态数字; 然而, 现在修改状态汇报系统带来的痛苦将远大于好处, 这是为什么状态码数字保持使用至今. 本文的未来版本可能定义一个更 类XMPP 的途径来表示状态条件, 保留状态码数字但是给它们补充更多的描述性的子元素,就像 '''RFC 3920 '''里那样.&lt;br /&gt;
&lt;br /&gt;
==国际化事项==&lt;br /&gt;
&lt;br /&gt;
如 '''RFC 3920''' 中所定义的, XMPP 实体 (包括 MUC 房间和 MUC 服务) 应该 SHOULD 遵守任何给定的节提供的 'xml:lang' 属性. 然而, 群聊消息的同声翻译超出了本文的范围.&lt;br /&gt;
&lt;br /&gt;
这里定义的状态和错误码允许一个客户端实现展示一个本地化的界面; 然而, 任何给定语言社区的本地化文本字符串的定义超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
尽管这里的很多数据表单字段的标签显示为英文, MUC 客户端应该 SHOULD 把这些字段展示为本地化的文本而不是英文文本.&lt;br /&gt;
&lt;br /&gt;
==安全事项==&lt;br /&gt;
===用户验证和授权===&lt;br /&gt;
&lt;br /&gt;
本文没有定义或要求比明文密码更安全的房间准入验证或授权方法. 然而, 这些潜在的风险可能使用 '''RFC 3920''' 描述的通过使用 TLS 和 SASL 加密通道来减轻.&lt;br /&gt;
&lt;br /&gt;
===端到端加密===&lt;br /&gt;
&lt;br /&gt;
这里没有定义没有端到端消息或会话加密方法. 用户不应该 SHOULD NOT 相信一个服务能保持通过房间发送的任何文本的安全.&lt;br /&gt;
&lt;br /&gt;
===隐私===&lt;br /&gt;
&lt;br /&gt;
取决于房间配置, 一个房间可以公开地记录房间里发生的所有讨论. 服务必须 MUST 警告用户该房间是公开记录的，通过在该用户的初始出席信息中返回一个状态码 &amp;quot;170&amp;quot; , 并且如果房间讨论被记录 (用户的客户端也应该 SHOULD 在允许用户进入之前查询房间的配置，以&amp;quot;预先发现&amp;quot;房间是否被记录)，该用户的客户端也必须 MUST 警告用户. 如果房间的配置随后修改成允许房间记录(当房间发送状态码 170 时客户端将发现)，客户端也必须 MUST 警告用户 . 注意: 房间内的历史和公开房间记录是不同的, 并且很自然的一个房间不能有效地阻止房客独立维护的自有的房间记录, 它可能被公开; 用户应该 SHOULD 谨慎操作并认识到任何房间讨论可能被有效地公开.&lt;br /&gt;
&lt;br /&gt;
===匿名===&lt;br /&gt;
&lt;br /&gt;
取决于房间配置, 一个房间可以 MAY 暴光每个房客的真实 JID 给其他房客 (如果该房间是非匿名的) 并且将几乎肯定地暴光每个房客的真实 JID 给该房间的所有者和管理员(如果该房间不是全匿名的).服务必须 MUST 警告用户真实 JIDs 在房间被暴光，通过在该用户的初始出席信息中包含状态码 &amp;quot;100&amp;quot; , 并且用户的客户端必须 MUST 警告该用户 (一个用户的客户端应该 SHOULD 也在允许用户进入房间之前查询房间配置以 &amp;quot;预先发现&amp;quot; 是否真实 JIDs 会在房间中暴光). 如果房间配置随后从半匿名或全匿名修改成非匿名(当房间发送状态码 172 时客户端将发现) ，客户端必须 MUST 也警告用户，如果房间的配置随后从全匿名改成半匿名时(当房间发送状态码 173 时客户端将发现)，客户端也应该 SHOULD 警告用户.&lt;br /&gt;
&lt;br /&gt;
===拒绝服务===&lt;br /&gt;
&lt;br /&gt;
公开的 MUC 房间能承受一定数量的攻击, 大部分能减少拒绝服务攻击. 这些攻击包括但不限于:&lt;br /&gt;
&lt;br /&gt;
# 向房间里塞进大量的非法房客从而阻止合法用户加入房间.&lt;br /&gt;
# 发送侮辱性的消息接着在被踢或被禁止之前离开房间; 这些侮辱性的消息包含但不限于，大量消息以阻止参与者正常跟踪会话线索或房间历史, 对参与者的人身攻击 (特别是房间管理员和主持人), 攻击性的文字, 以及垃圾网站链接.&lt;br /&gt;
# 高频率的制造出席信息变更.&lt;br /&gt;
# 使用过长的昵称导致无法看到完整的发言.&lt;br /&gt;
# 辱骂房间管理员或其他房间房客.&lt;br /&gt;
# 在一个服务里注册很多昵称然后禁止这些昵称的使用.&lt;br /&gt;
# 模仿别的房客的昵称(例如, 通过在尾部增加一个空格或看起来相似的字符串), 然后以那个房间昵称发送消息用于欺骗房客.&lt;br /&gt;
&lt;br /&gt;
这些攻击可能被减轻不能完全被阻止，通过灵活地使用管理员操作。例如禁止用户, 有管理员权限的自动的房间机器人出席信息, 智能内容过滤的实现, 检查连接的用户的 IP 地址(在分布式的系统里不一定能实现), 应用发言规则到出席信息以及消息, 使用比Resourceprep profile of stringprep更严格的规则匹配房间昵称, 等等. 然而, 经验表明无法完全阻止这类攻击.&lt;br /&gt;
&lt;br /&gt;
===其它事项===&lt;br /&gt;
&lt;br /&gt;
关于延迟递送符号的列入和流程的更多安全事项参见 '''XEP-0203'''.&lt;br /&gt;
&lt;br /&gt;
==IANA事项==&lt;br /&gt;
&lt;br /&gt;
本文档与[http://www.iana.org/ 互联网编号分配授权机构] [[XEP-0045#附录G:备注|26]]无关。&lt;br /&gt;
&lt;br /&gt;
==XMPP登记事项==&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/registrar/ XMPP登记处] [[XEP-0045#附录G:备注|27]]在它的登记处包含了以下信息.&lt;br /&gt;
&lt;br /&gt;
===协议名字空间===&lt;br /&gt;
&lt;br /&gt;
XMPP登记处在它的协议名字空间注册表里包含了以下 MUC相关的名字空间:&lt;br /&gt;
&lt;br /&gt;
* http://jabber.org/protocol/muc&lt;br /&gt;
* http://jabber.org/protocol/muc#admin&lt;br /&gt;
* http://jabber.org/protocol/muc#owner&lt;br /&gt;
* http://jabber.org/protocol/muc#user&lt;br /&gt;
&lt;br /&gt;
===服务发现种类/类型===&lt;br /&gt;
&lt;br /&gt;
一个多用户聊天服务或房间在服务发现里是用 &amp;quot;conference&amp;quot; 种类categary 和 &amp;quot;text&amp;quot; 类型type 来标识的.&lt;br /&gt;
&lt;br /&gt;
===服务发现特性===&lt;br /&gt;
&lt;br /&gt;
有很多和MUC相关的服务或房间相关的特性可以被&amp;quot;服务发现&amp;quot;来发现. 这里面最基本的是 'http://jabber.org/protocol/muc' 名字空间. 另外, 一个MUC房间应该 SHOULD 提供关于它实现的特定房间特性的信息, 例如密码保护和房间主持.&lt;br /&gt;
&lt;br /&gt;
'''注册提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#register FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#roomconfig FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#roominfo FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_hidden&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Hidden room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_membersonly&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Members-only room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_moderated&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Moderated room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_nonanonymous&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Non-anonymous room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_open&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Open room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_passwordprotected&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Password-protected room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_persistent&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Persistent room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_public&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Public room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_rooms&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;List of MUC rooms (each as a separate item)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_semianonymous&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Semi-anonymous room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_temporary&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Temporary room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_unmoderated&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Unmoderated room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_unsecured&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Unsecured room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===知名服务发现节点===&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'http://jabber.org/protocol/muc#rooms' 允许发现一个用户是哪个房间的房客.&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'x-roomuser-item' 允许一个用户从房间外发现自己的已注册房间昵称.&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'http://jabber.org/protocol/muc#traffic' 允许发现通过一个房间能发送哪些名字空间的通讯(参见本文允许的 [[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
&lt;br /&gt;
===字段标准化===&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/extensions/xep-0068.html 数据表单的字段标准化] [[XEP-0045#附录G:备注|28]] 定义了用于遵循特定名字空间的数据表单的字段标准化的过程. 在 MUC 里面, 使用了四种这类表单: 房间注册 ( &amp;quot;muc#register&amp;quot; FORM_TYPE), 请求发言权和批准请求 (&amp;quot;muc#request&amp;quot;), 房间配置 (&amp;quot;muc#roomconfig&amp;quot;), 以及用于房间信息的服务发现扩展 (&amp;quot;muc#roominfo&amp;quot;). 这些保留的字段定义如下.&lt;br /&gt;
&lt;br /&gt;
====muc#register FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling user registration with a&lt;br /&gt;
    Multi-User Chat (MUC) room or admin approval&lt;br /&gt;
    of user registration requests.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field &lt;br /&gt;
     var='muc#register_allow'&lt;br /&gt;
     type='boolean'&lt;br /&gt;
     label='Allow this person to register with the room?'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_email'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Email Address'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_faqentry'&lt;br /&gt;
      type='text-multi'&lt;br /&gt;
      label='FAQ Entry'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_first'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Given Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_last'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Family Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_roomnick'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Desired Nickname'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_url'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Your URL'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#request FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling voice requests in a &lt;br /&gt;
    Multi-User Chat (MUC) room or admin&lt;br /&gt;
    approval of such requests.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#role'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='Requested role'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#jid'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='User ID'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#roomnick'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='Room Nickname'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#request_allow'&lt;br /&gt;
         type='boolean'&lt;br /&gt;
         label='Whether to grant voice'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#roomconfig FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling creation and configuration of&lt;br /&gt;
    a Multi-User Chat (MUC) room.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_allowinvites'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Occupants to Invite Others'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_changesubject'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Occupants to Change Subject'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_enablelogging'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Enable Public Logging of Room Conversations'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_getmemberlist'&lt;br /&gt;
      type='list-multi'&lt;br /&gt;
      label='Roles and Affiliations that May Retrieve Member List'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_lang'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural Language for Room Discussions'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_pubsub'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='XMPP URI of Associated Publish-Subcribe Node'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_maxusers'&lt;br /&gt;
      type='list-single'&lt;br /&gt;
      label='Maximum Number of Room Occupants'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_membersonly'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether an Make Room Members-Only'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_moderatedroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Make Room Moderated'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_passwordprotectedroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether a Password is Required to Enter'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_persistentroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Make Room Persistent'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_presencebroadcast'&lt;br /&gt;
      type='list-multi'&lt;br /&gt;
      label='Roles for which Presence is Broadcast'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_publicroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Public Searching for Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomadmins'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Full List of Room Admins'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomdesc'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Short Description of Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomname'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural-Language Room Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomowners'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Full List of Room Owners'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomsecret'&lt;br /&gt;
      type='text-private'&lt;br /&gt;
      label='The Room Password'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_whois'&lt;br /&gt;
      type='list-single'&lt;br /&gt;
      label='Affiliations that May Discover Real JIDs of Occupants'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#roominfo FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling the communication of extended service discovery&lt;br /&gt;
    information about a Multi-User Chat (MUC) room.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_contactjid'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Contact Addresses (normally, room owner or owners)'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_description'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Short Description of Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_lang'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural Language for Room Discussions'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_ldapgroup'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='An associated LDAP group that defines room membership; &lt;br /&gt;
             this should be an LDAP Distinguished Name according to an&lt;br /&gt;
             implementation-specific or deployment-specific definition&lt;br /&gt;
             of a group.'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_logs'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='URL for Archived Discussion Logs'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_occupants'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Current Number of Occupants in Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_subject'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Current Subject or Discussion Topic in Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_subjectmod'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='The room subject can be modified by participants'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===状态码登记处===&lt;br /&gt;
====过程====&lt;br /&gt;
&lt;br /&gt;
XMPP注册员为遵循 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;status/&amp;gt; 元素的 'code' 属性维护注册表中的值 .&lt;br /&gt;
&lt;br /&gt;
为了提交新值给这个注册表, 注册人将按以下格式定义一个XML段并把它包含在相关的XMPP扩展协议中，或者发到&amp;lt;registrar@xmpp.org&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;the three-digit code number&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;the stanza type of which it is a child (message or presence)&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;the use case or situation in which the status is used&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;a natural-language description of the meaning&amp;lt;/purpose&amp;gt;&lt;br /&gt;
  &amp;lt;child&amp;gt;the descriptive child element (reserved for future use)&amp;lt;/child&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注册人可一次注册多个状态码，每个状态码包含在独立的&amp;lt;statuscode/&amp;gt;元素中。&lt;br /&gt;
&lt;br /&gt;
====初始提交====&lt;br /&gt;
&lt;br /&gt;
作为本文的一部分, 以下状态码已被注册了:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;100&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message or presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that any occupant is allowed to see the user's full JID&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;101&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message (out of band)&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Affiliation change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that his or her affiliation changed while not in the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;102&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room now shows unavailable members&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;103&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room now does not show unavailable members&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;104&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;&lt;br /&gt;
    Inform occupants that a non-privacy-related room configuration change has occurred&lt;br /&gt;
  &amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;110&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Any room presence&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that presence refers to one of its own room occupants&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;170&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message or initial presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room logging is now enabled&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;171&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room logging is now disabled&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;172&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now non-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;173&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now semi-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;174&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now fully-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;201&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that a new room has been created&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;210&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that service has assigned or modified occupant's roomnick&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;301&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she has been banned from the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;303&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Exiting a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform all occupants of new room nickname&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;307&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she has been kicked from the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;321&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because of an affiliation change&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;322&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because the room has been changed to members-only and the user &lt;br /&gt;
    is not a member&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;332&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because of a system shutdown&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===URI查询类型===&lt;br /&gt;
&lt;br /&gt;
作为由[http://www.xmpp.org/extensions/xep-0147.html XMPP URI Query Components] [[XEP-00450#附录G:备注|29]]授权的机构，XMPP注册员维护着一个用于 XMPP URIs 的查询和键-值对的注册表（见&amp;lt;[http://www.xmpp.org/registrar/querytypes.html http://www.xmpp.org/registrar/querytypes.html]&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
====join====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;join&amp;quot; 查询类型被注册为一个 MUC相关的动作, 伴随一个可选的键 &amp;quot;password&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 199. Join动作: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?join&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
应用必须 MUST 要么展示一个界面允许用户提供一个房间昵称，要么基于配置好的选项或昵称发现来获取这个房间昵称.&lt;br /&gt;
&lt;br /&gt;
'''例子 200. Join动作: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
join 动作可以 MAY 为这房间包含一个密码. 自然的, 对一个包含了房间密码的 URI 的访问必须 MUST 得到适当的控制.&lt;br /&gt;
&lt;br /&gt;
'''例子 201. Join动作包含密码: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?join;password=cauldronburn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 202. Join动作包含密码: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下提交注册 &amp;quot;join&amp;quot; 查询类型.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;querytype&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;join&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;proto&amp;gt;http://jabber.org/protocol/muc&amp;lt;/proto&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;enables joining a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;keys&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;password&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the password required to enter a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
  &amp;lt;/keys&amp;gt;&lt;br /&gt;
&amp;lt;/querytype&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====invite====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;invite&amp;quot; 查询类型被注册为一个 MUC相关的动作, 伴随一个可选的键 &amp;quot;jid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 203. Invite动作: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果加入中的用户还未在房间里, 应用必须 MUST 发送两个节: 第一个加入房间，第二个邀请另一个人. 如果加入中的用户已经在房间里, 应用将只发送邀请节.&lt;br /&gt;
&lt;br /&gt;
'''例子 204. Invite动作: 结果节(s)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
URI 可以包含多个邀请:&lt;br /&gt;
&lt;br /&gt;
'''例子 205. Invite动作包含多个邀请: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit;jid=bard@shakespeare.lit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 206. Invite动作包含多个邀请: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
URI 也可以包含一个密码:&lt;br /&gt;
&lt;br /&gt;
'''例子 207. Invite动作包含密码: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit;password=cauldronburn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果加入中的用户还未在房间里, 应用必须 MUST 发送两个节: 第一个加入房间，第二个邀请另一个人. 如果加入中的用户已经在房间里, 应用将只发送邀请节.&lt;br /&gt;
&lt;br /&gt;
'''例子 208. Invite动作包含密码: 结果节(s)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下提交注册 &amp;quot;invite&amp;quot; 查询类型.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;querytype&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;invite&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;proto&amp;gt;http://jabber.org/protocol/muc&amp;lt;/proto&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;enables simultaneously joining a groupchat room and inviting others&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;keys&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;jid&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the Jabber ID of the invitee&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;password&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the password required to enter a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
  &amp;lt;/keys&amp;gt;&lt;br /&gt;
&amp;lt;/querytype&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==商业规则==&lt;br /&gt;
===Addresses===&lt;br /&gt;
&lt;br /&gt;
为了提供关于从房间JIDs抓获的地址的一致性, Room IDs 必须 MUST 遵循 Stringprep 的 Nodeprep 规范并且 Room Nicknames 必须 MUST 符合 Stringprep (这些都定义在 '''RFC 3920''') 的 Resourceprep 规范. 尽管在 '''RFC 3920''' 中没有显式的说明 , 一个 Room JID 的 Room ID (node) 和 Room Nickname (resource) 部分都必须 MUST 长度不为零. 另外, 一个 MUC 服务不能 MUST NOT 允许空的或不可见的房间昵称 Room Nicknames (即, 房间昵称Room Nicknames 只包含一个或多个空格).&lt;br /&gt;
&lt;br /&gt;
取决于服务实现，是否更多地限制房间昵称 (例如, 通过应用情景例程, stringprep的Nodeprep规范, 或其他限制).&lt;br /&gt;
&lt;br /&gt;
===Message===&lt;br /&gt;
&lt;br /&gt;
# 如果一个房客想发送一个消息给所有其他房客, MUC 客户端必须 MUST 把 'type' 属性值设为 &amp;quot;groupchat&amp;quot;. 服务可以 MAY 忽略不正确的消息类型, 或用 &amp;lt;bad-request/&amp;gt; 错误弹回.&lt;br /&gt;
# 如果一个MUC服务从一个角色为&amp;quot;none&amp;quot;的Jabber用户收到一个发送给该房间的消息或给某个房客的消息, 服务不能 MUST NOT 递送这个消息并应该 SHOULD 返回给这个消息给发送者并伴随一个 &amp;lt;forbidden/&amp;gt; 错误.&lt;br /&gt;
# 如果一个MUC服务 接收到一个发送给不存在的或尚未解锁的房间的消息, 服务应该 SHOULD 返回这个消息给发送者并伴随一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
# 一个MUC服务应该 SHOULD 不做修改地传递扩展的消息 (例如, 一个消息主体的 XHTML 版本) 给房客; 然而, 一个 MUC 服务可以 MAY 不允许消息的特定扩展(参见本文的[[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
# 一个MUC客户端可以 MAY 生成扩展以满足 [http://xmpp.org/extensions/xep-0022.html 消息事件] [[XEP-0045#附录G:备注|30]] 或 [http://xmpp.org/extensions/xep-0085.html 聊天状态通知] [[XEP-0045#附录G:备注|31]] 规范; 然而, 一个 MUC 服务可以 MAY 不允许这些扩展 (参见本文的[[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
&lt;br /&gt;
===Presence===&lt;br /&gt;
&lt;br /&gt;
# 一个房间必须 MUST 安静地忽略从一个角色为&amp;quot;none&amp;quot;的用户发来的不可用出席信息信息.&lt;br /&gt;
# 只有MUC服务自身应该 SHOULD 生成关于角色，岗位，全JIDs或遵循 'http://jabber.org/protocol/muc#user' 名字空间的状态码的扩展的出席信息 (基于服务所知道的关于房客的信息, 例如, 角色, 或由一个主持人或房间管理员的动作所产生的结果). 一个客户端不应该 SHOULD NOT 推定生成这类信息. 如果一个 MUC 服务从一个房客接收到这类扩展的出席信息, 它不能 MUST NOT 反射它给其他房客们. (一个客户端可以 MAY 为了提供一个密码而生成遵循 'http://jabber.org/protocol/muc#user' 名字空间的扩展的出席信息, 但自然的这是不反射给其他房客的.)&lt;br /&gt;
# 一个MUC服务应该 SHOULD 允许所有其他出席信息通过, 尽管它可以 MAY 选择阻塞扩展的出席信息; 参见本文的 [[XEP-0045#允许的通讯|允许的通讯]]章节.&lt;br /&gt;
# 为了适当地通知房客角色和岗位, 并使之更易于Jabber客户端跟踪房间里所有用户的当前状态, MUC服务实现必须 MUST 在所有出席信息节里提供关于角色和岗位的扩展的出席信息, 包括一个用户因为任何原因退出该房间时被发送的类型为&amp;quot;unavailable&amp;quot;的出席信息节.&lt;br /&gt;
# 如果一个权限被撤销, 服务必须 MUST 通知这件事，通过发送一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 元素并包含一个 &amp;lt;item/&amp;gt; 子元素，该&amp;lt;item/&amp;gt; 子元素的 'role' 和/或 'affiliation' 属性值的设定指明是去了有关的权限. 所有将来的为这个房客发出的出席信息节必须 MUST 包含这个更新的角色和岗位, 直到除非它们再次改变.&lt;br /&gt;
# 一个MUC服务必须 MUST 发送扩展的出席信息给一个客户端，即使客户端在进入该房间时没有发送一个空的遵循 'http://jabber.org/protocol/muc' 名字空间的 &amp;lt;x/&amp;gt; 元素 ; 自然的, 一个客户端必须 MUST 忽略这类信息，如果它不懂得它的话(根据 '''RFC 3920''').&lt;br /&gt;
# 在 muc#user 名字空间中被发送的关于角色和岗位的扩展的出席信息必须 MUST 包含全JID (不是纯JID) 作为 'jid' 属性的值.&lt;br /&gt;
# 如果想要，一个客户端可以 MAY 发送一个客户化的退出消息 (就像 IRC 频道里经常出现的那样) ，通过在退出时被发送的&amp;quot;unavailable&amp;quot;类型的出席信息节里包含一个 &amp;lt;status/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
===IQ===&lt;br /&gt;
&lt;br /&gt;
# MUC被设计用于分享消息和出席信息, 而不是 IQs. 一个被发送的到房间本身JID的 IQ 由房间本身来处理并且不反射给所有房客.&lt;br /&gt;
# 如果一个房客想在一个非匿名房间发送一个 IQ 节给其他用户, 发送者应该 SHOULD 直接发送请求给接收者的纯JID或全JID, 而不是试图通过房间发送请求(即, 通过接收者的房间JID).&lt;br /&gt;
# 如果一个房客想在一个半匿名房间发送一个 IQ 节给其他用户, 发送者能直接发送这个节给接受者的房间JID并且服务可以 MAY 转发这个节给接收者的真实JID. 然而, 任何时候一个MUC服务不能 MUST NOT 泄露这个发送者的真实JID给接收者, 也不能泄露接收者的真实JID给发送者.&lt;br /&gt;
# 一个MUC客户端必须 MUST 在IQ set 中的遵循 'http://jabber.org/protocol/muc#admin' &amp;lt;item/&amp;gt; 子元素中只发送 'affiliation' 属性或 'role' 属性; 如果一个主持人, 管理员, 或所有者试图在相同的IQ set中修改相同条目的岗位或角色, 服务必须 MUST 返回一个 &amp;lt;bad-request/&amp;gt; 错误给发送者. 无论如何, 一个MUC服务可以 MAY 基于一个岗位的变更来修改一个角色，从而可以 MAY 发送出席信息更新，同时包含一个修改的角色和一个修改的岗位.&lt;br /&gt;
# 在关于角色的 IQ sets中, 一个MUC客户端必须 MUST 只包含 'nick' 属性; 在关于角色的 IQ results中, 一个 MUC 服务必须 MUST 包含 'nick', 'role', 'affiliation', 和'jid' 属性 (值为后来设置的用户的全JID).&lt;br /&gt;
# 在关于岗位的 IQ sets中, 一个MUC客户端必须 MUST 只包含 'jid' 属性(值为纯JID); 在关于岗位的 IQ results中, 一个MUC服务不能 MUST NOT 包含 'role' 属性, 必须MUST 包含 'affiliation' 属性和 'jid' 属性 (值为纯JID), 并且应该 SHOULD 包含 'nick' 属性 (除非岗位为 &amp;quot;outcast&amp;quot;, 以为被排斥者不应该 SHOULD NOT 有保留的房间昵称).&lt;br /&gt;
&lt;br /&gt;
==实现注意事项==&lt;br /&gt;
&lt;br /&gt;
以下方针有助于客户端和组件开发者建立 MUC 实现.&lt;br /&gt;
&lt;br /&gt;
===服务端===&lt;br /&gt;
&lt;br /&gt;
# 在处理一个被主持的房间里游客发送的消息时, 一个MUC服务可以 MAY 通过一个主持人让每个消息排队等待批准并且可以 MAY 通知发送者消息正在等待批准; 然而, 这一行为是可选的 OPTIONAL, 并且一个消息批准协议的定义 (例如, 使用'''XEP-0004'''定义的数据表单) 超出了本文的范围.&lt;br /&gt;
# 对于一个 MUC 服务来说，在特定时间发生时提供房间内的消息是很常见的, 例如当标题变更时, 当一个房客加入或退出时, 或当一个房间被销毁时. 这类消息完全是可选的 OPTIONAL 并且留给实现或布署来决定, 但如果使用了，则必须 MUST 是从房间JID本身(&amp;lt;room@service&amp;gt;) 而不是从一个特定的&lt;br /&gt;
房客(&amp;lt;room@service/nick&amp;gt;)发送的类型为 &amp;quot;groupchat&amp;quot; 类型的消息. 无论如何, 通常接收的客户端倾向于基于房间的事件以及MUC提供的特定状态码来生成类似的消息(例如, 用户加入或退出) ; 这将帮助确保这类消息的正确的本地化.&lt;br /&gt;
# 出于礼貌, 一个MUC服务可以 MAY 发送一个房间外的 &amp;lt;message/&amp;gt; 给一个被踢的或被禁止的房客, 并且可以 MAY 广播一个房间内的 &amp;lt;message/&amp;gt; 给所有剩余的房客通知他们该房客已被该房间踢出或禁止. 无论如何, 这类消息是可选的 OPTIONAL, 并且事实上是多余的，因为接收的客户端生成这类消息所必需的信息已经通过MUC服务发送的出席信息节(特别是状态码)得到了.&lt;br /&gt;
# 出于礼貌, 如果一个用户的岗位变更了而该用户不在房间里，一个MUC服务可以MAY发送一个房间外的 &amp;lt;message/&amp;gt; ; 这消息应该 SHOULD 被从房间发送给该用户的纯JID, 可以 MAY 包含一个 &amp;lt;body/&amp;gt; 元素描述岗位变更, 并且必须 MUST 包含一个状态码 101.&lt;br /&gt;
# 没有需求要一个MUC服务将为旧的&amp;quot;groupchat 1.0&amp;quot;用户提供特别的治疗, 例如包含等价于扩展的遵循 'http://jabber.org/protocol/muc#user' 名字空间的出席信息的消息.&lt;br /&gt;
# 房间类型可以 MAY 被配置成任何组合. 一个MUC服务可以 MAY 支持或允许任何想要的房间类型或它们的组合.&lt;br /&gt;
# 一个MUC服务可以 MAY 限制在初始配置完成之后配置选项展示给一个所有者的次数, 例如因为特定的选项除非重启服务无法生效.&lt;br /&gt;
# 一个MUC服务可以 MAY 提供一个接口给房间创建和配置(例如, 以一个特定的Jabber表单或一个网页), 这样表面上房间所有者是一个应用而不是一个自然人用户.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择让一个特定的房间内资源提供接口给管理功能 (例如, 一个 &amp;quot;user&amp;quot; 名的机器人 &amp;quot;ChatBot&amp;quot;), 房客们可以和它直接互动, 从而允许管理员在一个私有消息里键入命令参数 '/command parameter' 给那个机器人 &amp;quot;user&amp;quot;. 显然这种服务要求服务在房间创建时添加一个 'ChatBot' 用户到房间, 并且阻止任何房客在该房间使用房间昵称 'ChatBot' . 这可能在一些实现或布署中比较难以保证. 任何情况下, 任何这类接口是可选的 OPTIONAL.&lt;br /&gt;
# 如果服务接收到它之前发送给该用户的节相关的递送类错误，一个MUC服务应该 SHOULD 移除一个用户; 递送相关的错误即 &amp;lt;gone/&amp;gt;, &amp;lt;item-not-found/&amp;gt;, &amp;lt;recipient-unavailable/&amp;gt;, &amp;lt;redirect/&amp;gt;, &amp;lt;remote-server-not-found/&amp;gt;, 和 &amp;lt;remote-server-timeout/&amp;gt;.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择在反射出席信息变更给一个房间的房客们之前，抛弃附加在&amp;lt;presence/&amp;gt; 节上的扩展的出席信息. 也就是, 一个实现可以 MAY 选择只反射该出席信息节的 &amp;lt;show/&amp;gt;, &amp;lt;status/&amp;gt;, 和 &amp;lt;priority/&amp;gt; 子元素，如 'jabber:client' 名字空间描述的 XML 架构之中, 结果导致那个在扩展的名字空间中的出席信息变更 &amp;quot;changes&amp;quot; (例如, gabber:x:music:info) 不被传递给房客. 如果一个服务禁止特定的扩展名字空间, 它应该 SHOULD 在本文 [[XEP-0045#允许的通讯|允许的通讯]]章节描述的知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 提供一个允许的通讯的描述.&lt;br /&gt;
# 一个MUC服务可以 MAY 在反射消息给一个房间的房客之前选择抛弃附加在 &amp;lt;message/&amp;gt; 节的扩展信息. 一个这类扩展信息的例子是轻量级文本标记，定义于 [http://xmpp.org/extensions/xep-0071.html XHTML-IM]  [XEP-0045#附录G:备注|32]]. 如果一个服务禁止特定的扩展名字空间, 它应该 SHOULD 在本文 [[XEP-0045#允许的通讯|允许的通讯]]章节描述的知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 提供一个允许的通讯的描述.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择锁定 &amp;quot;lock down&amp;quot; 房间昵称 (例如, 硬编码房间昵称给该房客的纯JID). 如果这么干, 该服务必须 MUST 把被锁定的昵称看作一个保留的房间昵称并且必须 MUST 支持本文[[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]]章节定义的协议.&lt;br /&gt;
&lt;br /&gt;
====允许的通讯====&lt;br /&gt;
&lt;br /&gt;
大家知道, 一个服务 (更准确地说, 一个正确配置的房间)可以 MAY 抛弃一些或所有的扩展的附加在从发送者通过房间反射给所有房客的 &amp;lt;message/&amp;gt; 和 &amp;lt;presence/&amp;gt; 节的名字空间. 如果房间这么干, 它应该 SHOULD 允许发送者通过发送 disco#info 查询知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 来发现允许的扩展的列表, 在结果中返回支持的名字空间每个用一个 &amp;lt;feature/&amp;gt; 元素表示. 如果该房间不允许任何扩展的名字空间, 它必须 MUST 如 '''XEP-0030''' 所述返回一个空的 query . 如果该房间不支持 &amp;quot;#traffic&amp;quot; 节点, 它必须 MUST 返回一个 &amp;lt;feature-not-implemented/&amp;gt; 错误应答给查询发送到 'http://jabber.org/protocol/muc#traffic' 节点的查询.&lt;br /&gt;
&lt;br /&gt;
以下例子展示一个只允许 'http://jabber.org/protocol/xhtml-im' 和 'http://jabber.org/protocol/rosterx' 名字空间的房间, 而不包括其他的名字空间.&lt;br /&gt;
&lt;br /&gt;
'''例子 209. 用户查询服务关于允许的名字空间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 210. 服务返回允许的名字空间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/xhtml-im'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/rosterx'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个服务不抛弃任何名字空间或不实现这个特性, 它必须 MUST 返回一个 &amp;lt;service-unavailable/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 211. 服务返回服务不可用错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===客户端===&lt;br /&gt;
&lt;br /&gt;
# Jabber客户端可以 MAY 展示房间角色，通过在一个房间名册里为每个角色显示特定的群. 这将使房客清楚图形化的知道哪个房客是主持人, 参与者, 和游客. 无论如何, 这样一个展示是可选的 OPTIONAL.&lt;br /&gt;
# Jabber客户端可以 MAY 实现多样化的界面以提供快捷方式 &amp;quot;shortcuts&amp;quot; 给功能，例如修改某人昵称, 踢人或禁止用户, 发现一个房客的全JID, 或修改主题. 一个选项包含了类IRC 的命令例如 '/nick', '/kick', '/ban', 和 '/whois'; 另一个是使用户能用鼠标右击房间名册里的项目. 所有这些界面形式是可选的 OPTIONAL. 然而, 为方便起见, 下面提供了一个 IRC 命令到 MUC 协议的映射.&lt;br /&gt;
&lt;br /&gt;
====IRC命令映射====&lt;br /&gt;
&lt;br /&gt;
IRC 客户端使用大量常用的快捷方式 &amp;quot;shortcut&amp;quot; 命令，以一个斜杠开始, 例如 '/nick' and '/ban'. 下表提供一个 类IRC 命令到 MUC 协议的映射, 用于希望支持类似功能的 Jabber 客户端.&lt;br /&gt;
&lt;br /&gt;
'''表10: IRC命令映射'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!命令 !!功能 !!MUC协议&lt;br /&gt;
|-&lt;br /&gt;
|/ban &amp;lt;roomnick&amp;gt; [comment] ||在房间里以房间昵称禁止用户(客户端翻译房间昵称为纯JID) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;iq id='someid'&lt;br /&gt;
    to='room@service'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='bare-jid-of-user'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/invite &amp;lt;jid&amp;gt; [comment] ||以JID邀请用户到此房间 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='jid'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
|/join &amp;lt;roomname&amp;gt; [pass] ||在服务里加入房间(房间昵称同本房间内的昵称) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/nick'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;pass&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/kick &amp;lt;roomnick&amp;gt; [comment] ||以房间昵称从房间里踢人 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;iq id='someid'&lt;br /&gt;
    to='room@service'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='roomnick' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|/msg &amp;lt;roomnick&amp;gt; &amp;lt;foo&amp;gt; ||发送私有消息&amp;quot;foo&amp;quot;给房间昵称 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service/nick' type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;foo&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/nick &amp;lt;newnick&amp;gt; ||变更在此房间内的昵称为&amp;quot;newnick&amp;quot; ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/newnick'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/part [comment] ||退出本房间(一些 IRC 客户端也支持 /leave) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/nick'&lt;br /&gt;
          type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;comment&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/topic &amp;lt;foo&amp;gt; ||变更此房间主题为&amp;quot;foo&amp;quot; ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service' type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;foo&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 因为 MUC 房间昵称遵循stringprep的Resourceprep脚本, 它们被允许包含一个空格字符, 而 IRC 昵称不允许. 尽管一个给定的客户端可以 MAY 支持引用字符串用于这个目的 (导致命令类似 '/ban &amp;quot;king lear&amp;quot; insanity is no defense'), 最常见的引用字符(类似 &amp;quot; 和 ') 也是被Resourceprep允许的 , 从而导致增加了复杂性和包含空格和引号的房间昵称中引号的潜在问题. 所以不建议 NOT RECOMMENDED Jabber客户端支持包含了空格符的房间昵称的类IRC的快捷方式命令.&lt;br /&gt;
&lt;br /&gt;
注意: 很多Jabber客户端也实现了 '/me ' 命令，如 [http://xmpp.org/extensions/xep-0245.html The /me Command] [[XEP-0045#附录G:备注|33]] 所述. 这个命令不会导致任何 MUC 或 IRC 协议的动作所以不显式在上表中.&lt;br /&gt;
&lt;br /&gt;
==XML架构==&lt;br /&gt;
===http://jabber.org/protocol/muc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='x'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='history' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='history'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='maxchars' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='maxstanzas' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='seconds' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='since' type='xs:dateTime' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#user===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#user'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#user'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='x'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:choice minOccurs='0' maxOccurs='unbounded'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='decline' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='destroy' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='invite' minOccurs='0' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='item' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='status' minOccurs='0' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='decline'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='destroy'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='invite'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='item'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='actor' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='continue' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='affiliation' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='admin'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='member'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='outcast'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='owner'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='nick' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='role' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='moderator'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='participant'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='visitor'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='actor'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='jid' type='xs:string' use='required'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='continue'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='thread' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='status'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='code' use='required'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:int'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:minInclusive value='100'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:maxInclusive value='999'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='reason' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#admin===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#admin'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#admin'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='query'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='item' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='item'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='actor' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='affiliation' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='admin'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='member'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='outcast'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='owner'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='nick' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='role' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='moderator'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='participant'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='visitor'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='actor'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='jid' type='xs:string' use='required'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='reason' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#owner===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#owner'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#owner'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:import &lt;br /&gt;
      namespace='jabber:x:data'&lt;br /&gt;
      schemaLocation='http://www.xmpp.org/schemas/x-data.xsd'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='query'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:choice xmlns:xdata='jabber:x:data' minOccurs='0'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='xdata:x'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='destroy'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='destroy'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='reason' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#unique===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#unique'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#unique'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='unique' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==鸣谢==&lt;br /&gt;
&lt;br /&gt;
作者感谢以下个人，为他们很多对于本协议草案的帮助性的评论: David Sutton, Peter Millard, Joe Hildebrand, Craig Kaes, Alexey Shchepin, David Waite, Jean-Louis Seguineau, Jacek Konieczny, Gaston Dombiak, 以及其他在 jdev@conference.jabber.org 会议室和在 Standards 邮件列表里的人.&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
&lt;br /&gt;
系列：[http://xmpp.org/extensions/ XEP]&lt;br /&gt;
&lt;br /&gt;
序号：0045&lt;br /&gt;
&lt;br /&gt;
发布者：[http://xmpp.org/xsf/ XMPP标准基金会]&lt;br /&gt;
&lt;br /&gt;
状态：[http://xmpp.org/extensions/xep-0001.html#states-Draft 草案 ]&lt;br /&gt;
&lt;br /&gt;
类型：[http://www.xmpp.org/extensions/xep-0001.html#types-Standards%20Track 标准跟踪]&lt;br /&gt;
&lt;br /&gt;
版本：1.24&lt;br /&gt;
&lt;br /&gt;
最后更新：2008-07-16&lt;br /&gt;
&lt;br /&gt;
批准机构：[http://xmpp.org/council/ XMPP理事会]&lt;br /&gt;
&lt;br /&gt;
依赖标准：XMPP Core, XMPP IM, XEP-0004, XEP-0030, XEP-0068, XEP-0082, XEP-0128&lt;br /&gt;
&lt;br /&gt;
替代标准：无&lt;br /&gt;
&lt;br /&gt;
被替代标准：无&lt;br /&gt;
&lt;br /&gt;
缩略名：muc&lt;br /&gt;
&lt;br /&gt;
muc名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#admin名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-admin.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#owner名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-owner.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#unique名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-unique.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#user名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-user.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注册表: &amp;lt;http://www.xmpp.org/registrar/muc.html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原文控制： [http://svn.xmpp.org:18080/browse/XMPP/trunk/extensions/xep-0045.xml HTML] [http://svn.xmpp.org:18080//changelog/~rss/XMPP/trunk/extensions/xep-0045.xml/rss.xml RSS]&lt;br /&gt;
&lt;br /&gt;
本文的其它格式： [http://xmpp.org/extensions/xep-0045.xml XML] [http://xmpp.org/extensions/xep-0045.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
URI: https://stpeter.im/&lt;br /&gt;
&lt;br /&gt;
{{Template:XEP附录CDEF}}&lt;br /&gt;
&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
&lt;br /&gt;
# RFC 1459: Internet Relay Chat &amp;lt;http://tools.ietf.org/html/rfc1459&amp;gt;.&lt;br /&gt;
# RFC 2810: Internet Relay Chat: Architecture &amp;lt;http://tools.ietf.org/html/rfc2810&amp;gt;.&lt;br /&gt;
# RFC 2811: Internet Relay Chat: Channel Management &amp;lt;http://tools.ietf.org/html/rfc2811&amp;gt;.&lt;br /&gt;
# RFC 2812: Internet Relay Chat: Client Protocol &amp;lt;http://tools.ietf.org/html/rfc2812&amp;gt;.&lt;br /&gt;
# RFC 2813: Internet Relay Chat: Server Protocol &amp;lt;http://tools.ietf.org/html/rfc2813&amp;gt;.&lt;br /&gt;
# XEP-0133: Service Administration &amp;lt;http://xmpp.org/extensions/xep-0133.html&amp;gt;.&lt;br /&gt;
# XEP-0030: Service Discovery &amp;lt;http://xmpp.org/extensions/xep-0030.html&amp;gt;.&lt;br /&gt;
# XEP-0059: Result Set Management &amp;lt;http://xmpp.org/extensions/xep-0059.html&amp;gt;.&lt;br /&gt;
# XEP-0128: Service Discovery Extensions &amp;lt;http://xmpp.org/extensions/xep-0128.html&amp;gt;.&lt;br /&gt;
# RFC 3920: 可扩展的消息和出席信息协议 (XMPP): Core &amp;lt;http://tools.ietf.org/html/rfc3920&amp;gt;.&lt;br /&gt;
# XEP-0203: Delayed Delivery &amp;lt;http://xmpp.org/extensions/xep-0203.html&amp;gt;.&lt;br /&gt;
# XEP-0091: Legacy Delayed Delivery &amp;lt;http://xmpp.org/extensions/xep-0091.html&amp;gt;.&lt;br /&gt;
# XEP-0082: XMPP Date and Time Profiles &amp;lt;http://xmpp.org/extensions/xep-0082.html&amp;gt;.&lt;br /&gt;
# RFC 3921: 可扩展的消息和出席信息协议 (XMPP): Instant Messaging and Presence &amp;lt;http://tools.ietf.org/html/rfc3921&amp;gt;.&lt;br /&gt;
# XEP-0249: Direct MUC Invitations &amp;lt;http://xmpp.org/extensions/xep-0249.html&amp;gt;.&lt;br /&gt;
# XEP-0077: In-Band Registration &amp;lt;http://xmpp.org/extensions/xep-0077.html&amp;gt;.&lt;br /&gt;
# XEP-0004: Data Forms &amp;lt;http://xmpp.org/extensions/xep-0004.html&amp;gt;.&lt;br /&gt;
# 一些评论者抱怨公开房间的所有者和管理员存在潜在的滥用; 很不幸的, 能力越大责任越大.&lt;br /&gt;
# XEP-0050: Ad-Hoc Commands &amp;lt;http://xmpp.org/extensions/xep-0050.html&amp;gt;.&lt;br /&gt;
# XEP-0060: Publish-Subscribe &amp;lt;http://xmpp.org/extensions/xep-0060.html&amp;gt;.&lt;br /&gt;
# 这和房间配置的行为不同, 这里 'muc#roomconfig_roomowners' 字段指定房间所有者的完整列表, 不是delta.&lt;br /&gt;
# 这和房间配置的行为不同, 这里 'muc#roomconfig_roomadmins' 字段指定房间管理眼的完整列表, 不是delta.&lt;br /&gt;
# XEP-0086: Error Condition Mappings &amp;lt;http://xmpp.org/extensions/xep-0086.html&amp;gt;.&lt;br /&gt;
# RFC 2616: Hypertext Transport Protocol -- HTTP/1.1 &amp;lt;http://tools.ietf.org/html/rfc2616&amp;gt;.&lt;br /&gt;
# RFC 1893: Enhanced Mail System Status Codes &amp;lt;http://tools.ietf.org/html/rfc1893&amp;gt;.&lt;br /&gt;
# 互联网编号分配机构 (IANA) 是用于互联网协议的唯一性参数值分配的核心协调者, 例如号码和URI计划. 更多信息, 见 &amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
# XMPP登记员 XMPP Registrar 维护着一个保留的协议名字空间以及用于由XMPP标准基金会批准的XMPP扩展协议的上下文参数的注册项的列表. 更多信息, 见 &amp;lt;http://xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
# XEP-0068: Field Data Standardization for Data Forms &amp;lt;http://xmpp.org/extensions/xep-0068.html&amp;gt;.&lt;br /&gt;
# XEP-0147: XMPP URI Query Components &amp;lt;http://xmpp.org/extensions/xep-0147.html&amp;gt;.&lt;br /&gt;
# XEP-0022: Message Events &amp;lt;http://xmpp.org/extensions/xep-0022.html&amp;gt;.&lt;br /&gt;
# XEP-0085: Chat State Notifications &amp;lt;http://xmpp.org/extensions/xep-0085.html&amp;gt;.&lt;br /&gt;
# XEP-0071: XHTML-IM &amp;lt;http://xmpp.org/extensions/xep-0071.html&amp;gt;.&lt;br /&gt;
# XEP-0245: The /me Command &amp;lt;http://xmpp.org/extensions/xep-0245.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===附录H: 修订历史===&lt;br /&gt;
&lt;br /&gt;
注意: 本协议的旧版本可能在 http://xmpp.org/extensions/attic/ 还可用&lt;br /&gt;
&lt;br /&gt;
'''版本 1.24 (2008-07-16)'''&lt;br /&gt;
&lt;br /&gt;
增加了更多原因reason元素的例子; 移除了关于黑名单包含的昵称部分; 增加了拒绝服务注意事项.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.23 (2008-01-14)'''&lt;br /&gt;
&lt;br /&gt;
* 定义了 getmemberlist 房间配置选项&lt;br /&gt;
* 增加了直接邀请协议&lt;br /&gt;
* 修正了当房间满的时候房间承认所有者/管理员的逻辑&lt;br /&gt;
* 定义了和LDAP群关联的服务发现扩展字段&lt;br /&gt;
* 指定了房间配置字段能被列入扩展的房间信息之中&lt;br /&gt;
* 指定了消息格式用于用户不在房间时的岗位变更&lt;br /&gt;
* 增加了例子展示结果集管理&lt;br /&gt;
* 推荐出席信息错误中包含的MUC子元素&lt;br /&gt;
* 为一对一聊天和多用户聊天的连续性描述了ThreadID的使用, 包括在邀请中为 continue 元素定义 thread 属性.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.22 (2007-04-10)'''&lt;br /&gt;
&lt;br /&gt;
更新了延迟消息递送以反映 XEP-0203 演化到草案和 XEP-0091 的过时.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.21 (2006-09-13)'''&lt;br /&gt;
&lt;br /&gt;
* 澄清了MUC扩展的介入，在房间加入/创建请求触发数据表单流但没有MUC扩展可导致自动房间创建以向后兼容旧的 groupchat 1.0 协议.&lt;br /&gt;
* 指定昵称变更时如果昵称被锁定则返回 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
* 要求客户端在进入房间之前发现房间配置并指定相关的安全事项, 包括使用隐私相关的状态码 170, 171, 172, 173, 和 174.&lt;br /&gt;
* 指定在房间配置选项不能被执行或违反服务策略时使用 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
* 强制要求房间昵称不能只包含空格.&lt;br /&gt;
* 移除所有服务发现用例到专用章节.&lt;br /&gt;
* 修改 urn:xmpp:delay 支持从 SHOULD 改为 MUST.&lt;br /&gt;
* 澄清 _whois 房间配置选项定义房间类型.&lt;br /&gt;
* 定义 XEP-0128 房间信息字段用于讨论记录, 关联的 pubsub 节点, 以及联系人 JID.&lt;br /&gt;
* 指出修改角色到主持人导致岗位变更为管理员或所有者成为推荐的, 而不是必需的.&lt;br /&gt;
* 增加了国际化事项中关于数据表单的本地化的部分.&lt;br /&gt;
* 指出实现可以持久化角色括月整个访问并且应该在被主持的房间里这样做.&lt;br /&gt;
* 增加了协议和服务发现特性用于在新建房间之前请求唯一的房间名.&lt;br /&gt;
* 更多澄清保留的房间昵称和昵称锁定的性质.&lt;br /&gt;
* 定义数据表单用于请求发言权和批准发言申请.&lt;br /&gt;
* 增加了多个邀请的例子用于XMPP URI.&lt;br /&gt;
* 澄清了出席信息，讨论历史的顺序, 等等.&lt;br /&gt;
* 增加了状态码用于房客拥有的房间昵称, 服务修改的房间昵称, 并警告房间讨论被公开记录.&lt;br /&gt;
* 澄清关于房间记录和非匿名房间的隐私和匿名事项.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.20 (2005-09-08)'''&lt;br /&gt;
&lt;br /&gt;
同意了踢人和禁止用户的能力, 并定义了一个用户不能被一个比自己岗位低的主持人或管理员踢或禁止.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.19 (2005-04-21)'''&lt;br /&gt;
&lt;br /&gt;
定义了怎样发送并发多邀请; 纠正了一些和岗位变更状态一致性的错误; 修改了消息事件禁令表单从 MUST NOT 到 SHOULD NOT; 修正了和 #traffic disco 节点相关的错误处理; 允许了 &amp;lt;password/&amp;gt; 作为&amp;lt;destroy/&amp;gt;的一个子元素; 修改了最大用户数错误从 &amp;lt;not-allowed/&amp;gt; 到 &amp;lt;service-unavailable/&amp;gt;; 指定了 maxchars 属性的字符数是指完整的 XML 节; 为 FORM_TYPEs;增加了 disco 特性 为状态码定义了注册表; 为遵守协议分开了新建即时房间的用例; 调整了 XML 架构以反映之前的修改; 重写了绪论; 澄清了小的文本错误.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
Version 1.18 (2004-11-02)&lt;br /&gt;
&lt;br /&gt;
Corrected several errors in the affiliation state chart and in the examples (wrong FORM_TYPE values); mentioned /me command.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.17 (2004-10-04)&lt;br /&gt;
&lt;br /&gt;
Added text about allowable extension namespaces and related service discovery mechanisms; specified well-known service discovery nodes; added conformance terms to clarify some descriptions; modified affiliation state chart to allow more flexible state changes; per list dicussion, added ability to convert a one-to-one chat into a conference, including sending of history; specified error to use when max users limit is reached; specified form for admin approval of user registration requests and modified FORM_TYPE from http://jabber.org/protocol/muc#user to http://jabber.org/protocol/muc#register; modified FORM_TYPE for room configuration from http://jabber.org/protocol/muc#owner to http://jabber.org/protocol/muc#roomconfig.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.16 (2004-06-30)&lt;br /&gt;
&lt;br /&gt;
Added example and registry submission for service discovery extension.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.15 (2004-06-24)&lt;br /&gt;
&lt;br /&gt;
Removed jabber:iq:browse references; clarified order of presence stanzas sent to new occupant on entering room; specified format of in-room messages (type='groupchat', from='room@service'); clarified allowable attributes in various list-related operations; made admin/owner revocation text and examples consistent with state chart; clarified ownership revocation conflict scenarios; changed the 'muc#roomconfig_inviteonly' field to 'muc#roomconfig_membersonly'; changed attribute order in examples to match XML canonicalization rules; corrected several errors in the schemas.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.14 (2004-05-03)&lt;br /&gt;
&lt;br /&gt;
Corrected discovery of registered roomnicks; added note about error to return if nicks are locked down.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.13 (2004-03-31)&lt;br /&gt;
&lt;br /&gt;
Fixed an error in the muc#user schema.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.12 (2004-03-01)&lt;br /&gt;
&lt;br /&gt;
Corrected a few errors in the examples; added IQ results in order to clarify workflows.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.11 (2004-02-05)&lt;br /&gt;
&lt;br /&gt;
Clarified JID matching rules (same as for privacy lists in XMPP IM).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.10 (2004-01-07)&lt;br /&gt;
&lt;br /&gt;
Added XMPP error handling; fully specified all conformance terms.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.9 (2003-12-14)&lt;br /&gt;
&lt;br /&gt;
Removed protocol for requesting voice in a moderated room (should be performed using Ad-Hoc Commands).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.8 (2003-12-04)&lt;br /&gt;
&lt;br /&gt;
Added protocol for requesting voice in a moderated room; added (informational) mapping of IRC commands to MUC protocols.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.7 (2003-10-21)&lt;br /&gt;
&lt;br /&gt;
Added room configuration option for restricting presence broadcast to certain roles.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.6 (2003-10-03)&lt;br /&gt;
&lt;br /&gt;
Added history management protocol on entering a room.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.5 (2003-09-11)&lt;br /&gt;
&lt;br /&gt;
Specified that ban occurs by JID, not roomnick; allowed privileged users to send messages to the room even if not present in the room; added note that service should remove occupant if a delivery-related stanza error occurs; enabled user to disco the room in order to discover registered roomnick; specified that &amp;quot;banning&amp;quot; by domain or regex is a service-level configuration matter and therefore out of scope for MUC; specified that role should be decremented as appropriate if affiliation is lowered; added some clarifying text to room creation workflow; added implementation note about sending an out-of-band message if a user's affiliation changes while the user is not in the room; fixed stringprep references (room nicks use Resourceprep); clarified relationship between Room ID (i.e., node identifier of Room JID, which may be opaque) and natural-language Room Name; specified Field Standardization profile per XEP-0068; defined XMPP Registrar submissions; added schema locations.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.4 (2003-02-16)&lt;br /&gt;
&lt;br /&gt;
Added XML schemas.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.3 (2003-02-11)&lt;br /&gt;
&lt;br /&gt;
Added reference to nodeprep Internet-Draft.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.2 (2003-01-30)&lt;br /&gt;
&lt;br /&gt;
Commented out revision history prior to version 1.0 (too long); clarified business rules regarding when nicks, full JIDs, and bare JIDs are used in reference to roles and affiliations; consistently specified that extended presence information in the muc#user namespace must include the full JID as the value of the 'jid' attribute in all cases; cleaned up text and examples throughout; added open issue regarding syntax of room nicknames.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.1 (2002-12-16)&lt;br /&gt;
&lt;br /&gt;
Added protocol for declining an invitation; replaced &amp;lt;created/&amp;gt; element with status code 201; modified the destroy room protocol so that &amp;lt;destroy/&amp;gt; is a child of &amp;lt;query/&amp;gt;; clarified usage of 'nick' attribute when adding members; prohibited use of message events.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.0 (2002-11-21)&lt;br /&gt;
&lt;br /&gt;
Per a vote of the Jabber Council, revision 0.23 was advanced to Draft on 2002-11-21. (For earlier revision history, refer to XML source.)&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.23 (2002-11-06)&lt;br /&gt;
&lt;br /&gt;
Added examples for disco#items queries sent to a room; prohibited 'type' attribute on invite messages sent from client to room; added dependencies on browse and disco; changed 'room user' to 'occupant'; fixed many small errors throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.22 (2002-11-04)&lt;br /&gt;
&lt;br /&gt;
Added example for disco#items; added support for cancellation of room configuration using type='cancel' from XEP-0004; noted 403 error for invites sent by non-admins in members-only room.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.21 (2002-11-01)&lt;br /&gt;
&lt;br /&gt;
Clarified several small ambiguities; made &amp;lt;body/&amp;gt; optional on invites sent from the service to the invitee; added error scenarios for changing nickname and for destroying the room; specified that the service must return the full member list for a members-only room (not only the members in the room); updated the disco examples to track protocol changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.20 (2002-10-29)&lt;br /&gt;
&lt;br /&gt;
Specified that messages sent to change the room subject must be of type &amp;quot;groupchat&amp;quot;; updated the legal notice to conform to the XSF IPR policy.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.19 (2002-10-28)&lt;br /&gt;
&lt;br /&gt;
Added ability to create an instant room within MUC (not by using gc-1.0 protocol); cleaned up disco examples.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.18 (2002-10-27)&lt;br /&gt;
&lt;br /&gt;
Added experimental support for disco; added sections for security, IANA, and JANA considerations; corrected typographical errors; cleaned up some DocBook formatting.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.17 (2002-10-23)&lt;br /&gt;
&lt;br /&gt;
Added the optional &amp;lt;actor/&amp;gt; element (with 'jid' attribute) to &amp;lt;item/&amp;gt; elements inside presence stanzas of type &amp;quot;unavailable&amp;quot; that are sent to users who are kicked or banned, as well as within IQs for tracking purposes; reverted all list editing use cases (ban, voice, member, moderator, admin, owner) to use of MUC format rather than 'jabber:x:data' namespace; added several guidelines regarding generation and handling of XML stanzas; cleaned up the change room subject use case; changed several ambiguous uses of 'would', 'can', and 'will' to 'should', 'may', or 'must'; fixed several small errors in the text, examples, and DTDs.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.16 (2002-10-20)&lt;br /&gt;
&lt;br /&gt;
Added the &amp;lt;item/&amp;gt; element to presence stanzas of type &amp;quot;unavailable&amp;quot; in order to improve the tracking of user states in the room; consolidated &amp;lt;invitee/&amp;gt; and &amp;lt;invitor/&amp;gt; elements into an &amp;lt;invite/&amp;gt; element with 'from' and 'to' attributes; made &amp;lt;reason/&amp;gt; element always a child of &amp;lt;item/&amp;gt; or &amp;lt;invite/&amp;gt; in the muc#user namespace; moved the alternate room location in room destruction to a 'jid' attribute of the &amp;lt;alt/&amp;gt; element; further specified several error messages; disallowed simultaneous modifications of both affiliations and roles by a moderator or admin; added several more rules regarding handling of XML stanzas; added use cases for granting and revoking administrative privileges; adjusted DTD to track all changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.15 (2002-10-18)&lt;br /&gt;
&lt;br /&gt;
Fully incorporated the change to affiliations + roles; moved a number of admin use cases to a new section for moderator use cases; added participant use case for requesting membership; added admin use cases for adding members, removing members, granting and revoking moderator privileges, and modifying the moderator list; organized the sections in a more logical manner.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.14 (2002-10-17)&lt;br /&gt;
&lt;br /&gt;
Significantly modified the privileges model by distinguishing between in-room &amp;quot;roles&amp;quot; and long-lived &amp;quot;affiliations&amp;quot;; specified the privileges of the various roles and affiliations; included state transition charts for both roles and affiliations; removed use of MUC protocol for editing ban, voice, and admin lists (but not for the actions of banning users and granting/revoking voice); added delivery rule regarding IQ stanzas; changed kick so that the action is based on changing the role to &amp;quot;none&amp;quot;.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.13 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Corrected the change nickname examples (newnick sent on unavailable, no nick sent on available).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.12 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Removed SHA1 passwords; specified that room shall add passwords on invitations to password-protected rooms (not supplied by invitor).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.11 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Changed 'participant' to 'room user' and 'discussant' to 'participant'; clarified presence rule about client generation of extended presence information; added role of 'none'.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.10 (2002-10-15)&lt;br /&gt;
&lt;br /&gt;
Fixed extended presence on entering or creating a room (plain '...muc' with no fragment); harmonized #user with #admin regarding the use of the &amp;lt;item/&amp;gt; element and associated attributes (jid, nick, etc.), and added 'role' attribute; modified management of voice, ban, admin, and member lists to use &amp;lt;query/&amp;gt; wrapper and new &amp;lt;item/&amp;gt; structure; changed the 'member' role to 'discussant', added 'outcast' role for banned users, and added new 'member' role to enable management of member lists; changed invitation-only rooms to members-only rooms and made appropriate adjustments to apply member lists to both members-only rooms and open rooms; modified nickname change protocol slightly to send the old nickname in the unavailable presence and the new nickname in the available presence; removed prohibition on members-only rooms that are password-protected; removed the &amp;lt;query/&amp;gt; wrapper for the &amp;lt;destroy/&amp;gt; element; updated the DTDs.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.9 (2002-10-13)&lt;br /&gt;
&lt;br /&gt;
Added extended presence ('...#user') on entering a room for MUC clients; changed namespace on room creation request to '...#owner'; added a service discovery example using jabber:iq:browse; added information about discussion history; made small fixes to several examples; further defined the presence rules; transferred all implementation notes to a dedicated section; added a Terminology section.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.8 (2002-10-10)&lt;br /&gt;
&lt;br /&gt;
Made further changes to the room creation workflow (finally correct); removed feature discovery use case (this needs to be addressed by a real service discovery protocol!); added ability for room owners to edit the admin list; removed &amp;lt;body/&amp;gt; from invitations generated by the service; removed messages sent to kicked and banned users (handled by unavailable presence with status code); added a number of implementation notes; converted all examples to Shakespeare style.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.6 (2002-10-09)&lt;br /&gt;
&lt;br /&gt;
Fixed the room creation workflow; changed some terminology (&amp;quot;join&amp;quot; to &amp;quot;enter&amp;quot; and &amp;quot;leave&amp;quot; to &amp;quot;exit&amp;quot;).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.5 (2002-10-08)&lt;br /&gt;
&lt;br /&gt;
Specified and improved the handling of invitation-only rooms. In particular, added the ability for room admins to edit the invitation list and added a configuration option that limits the ability to send invitations to room admins only.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.4 (2002-10-07)&lt;br /&gt;
&lt;br /&gt;
Changed namespaces from http://jabber.org/protocol/muc/owner etc. to http://jabber.org/protocol/muc#owner etc. per Jabber Council discussion.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.3 (2002-10-07)&lt;br /&gt;
&lt;br /&gt;
Changed namespaces to HTTP URIs; left role handling up to the implementation; further clarified presence rules.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.2 (2002-10-06)&lt;br /&gt;
&lt;br /&gt;
Disallowed kicking, banning, and revoking voice with respect to room admins and room owners; replaced &amp;lt;x/&amp;gt; with &amp;lt;query/&amp;gt; in the Discovering Room Features and Destroying a Room use cases; corrected some small errors and made many clarifications throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.1 (2002-10-04)&lt;br /&gt;
&lt;br /&gt;
Removed &amp;lt;whois/&amp;gt; command (unnecessary since participants with appropriate privileges receive the full JID of all participants in presence stanzas); completed many small fixes throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7 (2002-10-03)&lt;br /&gt;
&lt;br /&gt;
More clearly delineated participant roles and defined the hierarchy thereof (owner, admin, member, visitor); replaced &amp;lt;voice/&amp;gt; element in extended presence with &amp;lt;item role='member'/&amp;gt;; changed initial room configuration to use IQ rather than message; adjusted presence rules (especially regarding extended presence information); cleaned up examples throughout; updated DTD to track changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.6 (2002-09-21)&lt;br /&gt;
&lt;br /&gt;
More clearly defined the scope; removed fully anonymous rooms; changed meaning of semi-anonymous rooms and of non-anonymous rooms; added mechanism for notification of full JIDs in non-anonymous rooms; replaced the &amp;lt;admin/&amp;gt; element in extended presence with a &amp;lt;role/&amp;gt; element (more extensible); changed room passwords to cleartext; added status codes for various messages received from the service; added lists of valid error and status codes associated with the 'http://jabber.org/protocol/muc#user' namespace; added a &amp;lt;reason/&amp;gt; element for invitations; made kick and ban reasons child elements rather than attributes; replaced stopgap feature discovery mechanism with jabber:iq:negotiate; added extended presence element to room creation request and clarified the room creation process; specified presence reflection rules; added method for destroying a room; adjusted DTDs to track all changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.5.1 (2002-09-20)&lt;br /&gt;
&lt;br /&gt;
Added DTDs; changed feature discovery to use &amp;lt;x/&amp;gt; element rather than query and made service response come in IQ result; fixed reference to JID spec; changed 'grant' to 'add' and 'revoke' to 'remove' for consistency in the item attributes; made several other small changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.5 (2002-09-19)&lt;br /&gt;
&lt;br /&gt;
Changed the kick, ban, and voice protocols; added a few more configuration options; specified the restrictions for roomnicks; and added a stopgap service discovery protocol.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.4 (2002-09-18)&lt;br /&gt;
&lt;br /&gt;
Changed all non-GC-1.0 use cases to jabber:gc:* namespaces or jabber:x:data; added use cases for ban list management and room moderation; added protocol for sending notice of admin and voice privileges in presence; cleaned up text and many examples.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.3 (2002-09-17)&lt;br /&gt;
&lt;br /&gt;
Changed admin use cases; cleaned up participant and owner use cases.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.2 (2002-09-12)&lt;br /&gt;
&lt;br /&gt;
Broke content out into three actors (participant, owner, and admin) and added more detail to owner and admin use cases.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.1 (2002-09-09)&lt;br /&gt;
&lt;br /&gt;
Initial version.&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
END&lt;/div&gt;</summary>
		<author><name>Zyhserry</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0045</id>
		<title>XEP-0045</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0045"/>
				<updated>2013-12-27T07:27:50Z</updated>
		
		<summary type="html">&lt;p&gt;Zyhserry: /* 默认角色 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0045.html XEP-0045]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0045: 多用户聊天'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本文定义了一个XMPP协议扩展用于多用户文本会议.即多个XMPP可以在一个房间或频道互相交流信息, 类似互联网中继聊天系统(IRC).还有标准聊天室功能如聊天室的主题和邀请，本协议定义了一个强有力的房间控制模型，包括能够踢和禁止用户，任命主持人和管理员，要求会员或密码才能加入房间，等等。&lt;br /&gt;
&lt;br /&gt;
作者:	Peter Saint-Andre&lt;br /&gt;
&lt;br /&gt;
XMPP扩展协议的版权(1999-2008)归XMPP标准化基金会(XSF)所有&lt;br /&gt;
&lt;br /&gt;
版权:	© 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0045#法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.24&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2008-07-16&lt;br /&gt;
&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个草案标准.对本协议的执行是被鼓励的,也适于部署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
传统上, 即时消息被视为由一对一的聊天构成而不是多对多聊天(即所谓&amp;quot;群聊&amp;quot;或&amp;quot;文本会议&amp;quot;). 群聊功能常见于一些系统如 Internet Relay Chat (IRC) 和 流行的IM服务所提供的聊天室功能. Jabber社区早在1999年开发和实施了一个基本的群聊协议. 这个 &amp;quot;groupchat 1.0&amp;quot; 协议为聊天室提供了一个最小功能集但是范围很有限. 本协议(多用户聊天或简称MUC)建立在向后兼容旧的&amp;quot;groupchat 1.0&amp;quot;协议的基础上但是提供高级功能如邀请, 房间主持和管理, 以及专门的房间类型.&lt;br /&gt;
&lt;br /&gt;
==范围==&lt;br /&gt;
&lt;br /&gt;
本文着重于和配置,参与以及管理一个独立的基于文本的会议室相关的通用需求. 这里所指出的需求是应用于单个房间级别的并且是&amp;quot;通用的&amp;quot;, 某种意义上它们是在Jabber社区广泛讨论的或在现有的Jabber之外的基于文本的会议环境(例如, 定义在 [http://tools.ietf.org/html/rfc1459 RFC 1459] [[XEP-0045#附录G:备注|1]]中的Internet Relay Chat 和它的继承者: [http://tools.ietf.org/html/rfc2810 RFC 2810] [[XEP-0045#附录G:备注|2]], [http://tools.ietf.org/html/rfc2811 RFC 2811] [[XEP-0045#附录G:备注|3]], [http://tools.ietf.org/html/rfc2812 RFC 2812] [[XEP-0045#附录G:备注|4]], [http://tools.ietf.org/html/rfc2813 RFC 2813] [[XEP-0045#附录G:备注|5]])中已经存在的.&lt;br /&gt;
&lt;br /&gt;
本文明确地不涉及以下需求:&lt;br /&gt;
&lt;br /&gt;
* 房间之间的关系(例如, 房间的层次结构)&lt;br /&gt;
&lt;br /&gt;
* 多用户聊天服务的管理(例如, 管理跨越整个服务级别的权限或注册一个全局可用的房间昵称)；这些用例定义在[http://xmpp.org/extensions/xep-0133.html Service Administration] [[XEP-0045#附录G:备注|6]]&lt;br /&gt;
&lt;br /&gt;
* 个别消息的主持&lt;br /&gt;
&lt;br /&gt;
* 通过房间发送的消息的加密&lt;br /&gt;
&lt;br /&gt;
* 高级特性, 如附加文件给一个房间, 集成白板, 以及和语音或视频聊天服务的接口&lt;br /&gt;
&lt;br /&gt;
* MUC部署和外来的聊天系统(例如, 和IRC网关或现有的其他IM系统)之间的交互&lt;br /&gt;
&lt;br /&gt;
* 在多个MUC部署之间进行镜像或复制&lt;br /&gt;
&lt;br /&gt;
这一受限的范围并非蔑视这些都很有用的主题; 无论如何, 这意味着本文专注于讨论和介绍一个易于理解的协议能够被类似的Jabber客户端和组件开发者实现. 将来的协议当然可能涉及以上提到的这些主题.&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
本文描述了由Jabber现有的多用户聊天服务提供的最小功能集. 为了向后兼容性起见, 本文使用原来的&amp;quot;groupchat 1.0&amp;quot;协议作为基本功能, 包括以下这些:&lt;br /&gt;
&lt;br /&gt;
* 每个房间被标识为 &amp;lt;room@service&amp;gt; (例如, &amp;lt;jdev@conference.jabber.org&amp;gt;), 这里 &amp;quot;room&amp;quot; 是房间的名称而 &amp;quot;service&amp;quot; 是多用户聊天服务运行所在的主机名.&lt;br /&gt;
&lt;br /&gt;
* 在一个房间里每个房客被标识为 &amp;lt;room@service/nick&amp;gt;, 这里 &amp;quot;nick&amp;quot; 是这个房客在这个房间里的昵称,定义于刚加入这个房间的时候，也可以在房客驻留改房间期间修改.&lt;br /&gt;
&lt;br /&gt;
* 一个用户通过发送出席信息给 &amp;lt;room@service/nick&amp;gt; 来加入一个房间（也就是成为房客）.&lt;br /&gt;
&lt;br /&gt;
* 在多用户聊天房间里发送的消息使用特殊的类型&amp;quot;groupchat&amp;quot;并且被寻址于房间本身 (room@service), 然后反映给所有房客.&lt;br /&gt;
&lt;br /&gt;
* 通过发送出席信息给 &amp;lt;room@service/newnick&amp;gt;，一个房客可以改变他或她的房间昵称以及在房间中的可用性状态 .&lt;br /&gt;
&lt;br /&gt;
* 通过发送一个类型为&amp;quot;unavailable&amp;quot;的出席信息给当前的&amp;lt;room@service/nick&amp;gt;，一个房客可以退出房间.&lt;br /&gt;
&lt;br /&gt;
本文追加的特性和功能包括以下这些:&lt;br /&gt;
&lt;br /&gt;
# 本地会话日志(不需要房间内的机器人)&lt;br /&gt;
# 允许用户申请房间成员&lt;br /&gt;
# 在一个非匿名房间里, 允许房客可以察看(另)一个房客的全JID&lt;br /&gt;
# 在一个半匿名房间里, 允许主持人可以察看一个房客的全JID&lt;br /&gt;
# 允许只有主持人修改房间主题&lt;br /&gt;
# 允许主持人从房间里踢出与会者和游客&lt;br /&gt;
# 在一个被主持的房间里,主持人可以授予和撤销发言权(也就是说, 发言的权力), 并且管理发言权列表&lt;br /&gt;
# 允许管理员授权和取消主持人权力, 并且管理主持人列表&lt;br /&gt;
# 允许管理员在房间禁止用户, 并管理黑名单&lt;br /&gt;
# 允许管理员授予和撤销成员权力, 并且管理一个仅限成员的房间的成员列表&lt;br /&gt;
# 允许所有者限制房客的数量&lt;br /&gt;
# 允许所有者指定其他的所有者(们)&lt;br /&gt;
# 允许所有者授予或撤销管理特权, 并管理管理员列表&lt;br /&gt;
# 允许所有者销毁房间&lt;br /&gt;
&lt;br /&gt;
另外, 本文提供了协议元素用于支持以下房间类型:&lt;br /&gt;
&lt;br /&gt;
# 公共的或隐藏的&lt;br /&gt;
# 持久的或临时的&lt;br /&gt;
# 密码保护的或不安全的&lt;br /&gt;
# 仅限成员的或开放的&lt;br /&gt;
# 主持的或非主持的&lt;br /&gt;
# 非匿名的或半匿名的&lt;br /&gt;
&lt;br /&gt;
为了实现这些需求, 本扩展协议需要满足 'http://jabber.org/protocol/muc' 名字空间(以及 在主名字空间URI加上 #owner, #admin, 和 #user 片断).&lt;br /&gt;
&lt;br /&gt;
==术语==&lt;br /&gt;
&lt;br /&gt;
===通用术语===&lt;br /&gt;
&lt;br /&gt;
Affiliation(岗位) -- 一个长期存在的和房间之间的联系或连接; 可能的岗位有 &amp;quot;owner&amp;quot;(所有者), &amp;quot;admin&amp;quot;(管理者), &amp;quot;member&amp;quot;(成员), 以及 &amp;quot;outcast&amp;quot;(被排斥者) (当然也可能没有岗位); 岗位(affiliation)和角色(role)是有区别的. 一个岗位跨越了用户对一个房间的访问期间.&lt;br /&gt;
&lt;br /&gt;
Ban(禁止) -- 从一个房间移除一个用户以使这个用户不能够再进入这个房间 (直到这个禁令被废除为止). 一个被禁止的用户的岗位(affiliation)为 &amp;quot;outcast&amp;quot;(被排斥者).&lt;br /&gt;
&lt;br /&gt;
Bare JID(纯JID) -- 一个用户的标识符 &amp;lt;user@host&amp;gt;, 不同于任何已有会话或资源的上下文, 与之相对的是全JID和房间JID.&lt;br /&gt;
&lt;br /&gt;
Full JID(全JID) -- 一个在线用户的标识符 &amp;lt;user@host/resource&amp;gt; , 不同于一个房间的上下文; 与之相对的是纯JID和房间JID.&lt;br /&gt;
&lt;br /&gt;
GC -- 最小的 &amp;quot;groupchat 1.0&amp;quot; 协议[7], Jabber社区于1999年开发; MUC 向后兼容GC.&lt;br /&gt;
&lt;br /&gt;
History(历史) -- 有限数量的消息节, 由当前讨论的上下文提供发送给一个新的房客.&lt;br /&gt;
&lt;br /&gt;
Invitation(邀请) -- 从一个用户发出的特殊消息给另一个用户, 邀请对方加入房间.; the invitation can be sent directly (see Direct MUC Invitations [8]) or mediated through the room (as described under Inviting Another User to a Room).&lt;br /&gt;
&lt;br /&gt;
IRC -- Internet Relay Chat.&lt;br /&gt;
&lt;br /&gt;
Kick(踢人) -- 临时从一个房间移除一个与会者或游客; 这个用户任何时候都可以再次进入这个房间. 一个被踢的用户的角色是&amp;quot;none&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Logging(记录) -- 存储发生在一个房间的讨论内容用于公开发布到房间上下文之外的地方.&lt;br /&gt;
&lt;br /&gt;
Member(成员) -- 一个用户在一个仅限会员的房间内处于&amp;quot;white list&amp;quot;(白名单)内，或已经注册到一个公开的房间. 一个成员的岗位是&amp;quot;member&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Moderator(主持人) -- 一个房间角色,通常和房间的管理有关但是这个角色可以被赋予非管理员; 可以踢人, 可以授予和撤销发言权, 等等. 一个主持人的角色是&amp;quot;moderator&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
MUC -- 本文所定义的基于文本会议的多用户聊天协议.&lt;br /&gt;
&lt;br /&gt;
Occupant(房客) -- 一个房间里的任何Jabber用户 (这是一个 &amp;quot;抽象类&amp;quot; 并且不对应任何特定的角色).&lt;br /&gt;
&lt;br /&gt;
Occupant JID(房客JID) -- 在一个房间上下文中的一个房客，以 &amp;lt;room@service/nick&amp;gt; 来标识; 与之相对的是纯JID和全JID.&lt;br /&gt;
&lt;br /&gt;
Outcast(被排斥者) -- 一个被某个房间禁止的用户. 一个被排斥者的岗位是 &amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Participant(与会者) -- 一个没有管理权限的房客; 在一个被主持的房间里, 参与者更多地被定义为有发言权的 (与之相反的是游客). 一个与会者的角色是&amp;quot;participant&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Private Message(私有消息) -- 从一个房客直接发给另一个房间JID的消息(不是房间本身广播给所有房客的消息).&lt;br /&gt;
&lt;br /&gt;
Role(角色) -- 在一个房间里的一个临时的地位或者权限级别, 对于这个房间中的用户的长期岗位来说是唯一的; 可能的角色有 &amp;quot;moderator&amp;quot;（主持人）, &amp;quot;participant&amp;quot;(与会者), 和 &amp;quot;visitor&amp;quot;(游客) (也可能没有预定义的角色). 一个角色仅仅存在于一个房客访问一个房间的期间.&lt;br /&gt;
&lt;br /&gt;
Room(房间) -- 一个虚拟的地方, Jabber用户象征性地加入它, 来和其他用户一起参与一个实时的基于文本的会议.&lt;br /&gt;
&lt;br /&gt;
Room Administrator(房间管理员) -- 一个由房间所有者授权的用户, 可以执行管理功能, 如禁止用户等等; 无论如何, 不允许改变定义的房间特性. 一个管理员的岗位是&amp;quot;admin&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
Room ID(房间ID) -- 一个房间JID的节点标识符部分, 它可以是不透明的因而对人类用户没有什么含义(见  语法的商业规则Business Rules for syntax); 与之相对的是房间名.&lt;br /&gt;
&lt;br /&gt;
Room JID(房间JID) -- 房间地址，如 &amp;lt;room@service&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Room Name(房间名) -- 一个用户友好的, 自然语言的房间名字, 由房间所有者配置并在服务查询中展示; 与之相对的是房间ID.&lt;br /&gt;
&lt;br /&gt;
Room Nickname(房间昵称) -- 房间JID的资源标识符部分(见语法的商业规则); 这是一个房客在这个房间中所呈现的&amp;quot;友好的名字&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Room Owner(房间所有者) -- 建立某个房间的Jabber用户或一个被房间创建者或所有者指派拥有所有者权限(如果允许的话)的Jabber用户; 它被允许改变定义好的房间特性, 也可以执行全部的管理功能. 一个所有者的岗位为&amp;quot;owner&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Room Roster(房间名册) -- 一个房间中的所有房客在一个Jabber客户端的展现.&lt;br /&gt;
&lt;br /&gt;
Server(服务器) -- 一个Jabber服务器，可以关联或不关联一个基于文本的会议服务.&lt;br /&gt;
&lt;br /&gt;
Service(服务) -- 一个主机, 提供基于文本的会议的能力; 通常但不必须是一个Jabber服务器的子域(例如, conference.jabber.org).&lt;br /&gt;
&lt;br /&gt;
Subject(主题) -- 一个房间的临时讨论标题.&lt;br /&gt;
&lt;br /&gt;
Visit(访问) -- 一个房间的一个用户的&amp;quot;session&amp;quot;(会话), 当用户进入这个房间时开始(也就是说, 成为一个房客) , 结束于用户离开房间之时.&lt;br /&gt;
&lt;br /&gt;
Visitor(游客) -- 在一个被主持的房间里的一个没有发言权的房客(相反则是一个与会者). 一个游客的角色是&amp;quot;visitor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Voice(发言权) -- 在一个被主持的房间里, 发送消息给全部房客的权限.&lt;br /&gt;
&lt;br /&gt;
===房间类型===&lt;br /&gt;
&lt;br /&gt;
Hidden Room(隐藏房间) -- 一个无法被任何用户以普通方法如搜索和服务查询来发现的房间; 反义词: 公开(public)房间.&lt;br /&gt;
&lt;br /&gt;
Members-Only Room(仅限会员的房间) -- 如果一个用户不在成员列表中则无法加入的一个房间; 反义词: 开放(open)房间.&lt;br /&gt;
&lt;br /&gt;
Moderated Room(被主持的房间) -- 只有有&amp;quot;发言权&amp;quot;的用户才可以发送消息给所有房客的房间; 反义词: 非主持的(Unmoderated)房间.&lt;br /&gt;
&lt;br /&gt;
Non-Anonymous Room(非匿名房间) -- 一个房客的全JID会暴露给所有其他房客的房间, 尽管房客可以选择任何期望的房间昵称; 相对的是半匿名(Semi-Anonymous)房间.&lt;br /&gt;
&lt;br /&gt;
Open Room(开放房间) -- 任何人可以加入而不需要在成员列表中的房间; 反义词: 仅限会员的房间.&lt;br /&gt;
&lt;br /&gt;
Password-Protected Room(密码保护房间) -- 一个用户必须提供正确密码才能加入的房间; 反义词: 非保密房间.&lt;br /&gt;
&lt;br /&gt;
Persistent Room(持久房间) -- 如果最后一个房客退出也不会被销毁的房间; 反义词: 临时房间.&lt;br /&gt;
&lt;br /&gt;
Public Room(公开房间) -- 用户可以通过普通方法如搜索和服务查询来发现的房间; 反义词: 隐藏房间.&lt;br /&gt;
&lt;br /&gt;
Semi-Anonymous Room(半匿名房间) -- 一个房客的全JID只能被房间管理员发现的房间; 相对的是非匿名(Non-Anonymous)房间.&lt;br /&gt;
&lt;br /&gt;
Temporary Room(临时房间) -- 如果最后一个房客退出就会被销毁的房间; 反义词: 持久房间.&lt;br /&gt;
&lt;br /&gt;
Unmoderated Room(非主持的房间) -- 任何房客都被允许发送消息给所有房客的房间; 反义词: 被主持的房间.&lt;br /&gt;
&lt;br /&gt;
Unsecured Room(非保密房间) -- 任何人不需要提供密码就可以进入的房间; 反义词: 密码保护房间.&lt;br /&gt;
&lt;br /&gt;
===登场人物===&lt;br /&gt;
&lt;br /&gt;
本文的大部分例子使用了莎士比亚的《麦克白》中第四幕第一场开头女巫在黑洞中开会的场景，在这里使用&amp;quot;coven@chat.shakespeare.lit&amp;quot;代表聊天室. 人物如下:&lt;br /&gt;
&lt;br /&gt;
'''表1: 剧中人'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!Room Nickname !!Full JID!!Affiliation&lt;br /&gt;
|-&lt;br /&gt;
|firstwitch ||crone1@shakespeare.lit/desktop ||Owner&lt;br /&gt;
|-&lt;br /&gt;
|secondwitch ||wiccarocks@shakespeare.lit/laptop ||Admin&lt;br /&gt;
|-&lt;br /&gt;
|thirdwitch ||hag66@shakespeare.lit/pda ||None&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==角色(Roles)，岗位(Affiliations)和权限(Privileges)==&lt;br /&gt;
&lt;br /&gt;
A user might be allowed to perform any number of actions in a room, from joining or sending a message to changing configuration options or destroying the room altogether. We call each permitted action a &amp;quot;privilege&amp;quot;. There are two ways we might structure privileges:&lt;br /&gt;
&lt;br /&gt;
1. Define each privilege atomically and explicitly define each user's particular privileges; this is flexible but can be confusing to manage.&lt;br /&gt;
&lt;br /&gt;
2. Define bundles of privileges that are generally applicable and assign a user-friendly &amp;quot;shortcut&amp;quot; to each bundle (e.g., &amp;quot;moderator&amp;quot; or &amp;quot;admin&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
MUC使用第2种方式。&lt;br /&gt;
&lt;br /&gt;
有两个尺度我们可以用来衡量一个用户的连接或在一个房间的地位. 一个是用户和一个房间的长期的联系 -- 例如, 用户的状态是一个所有者或一个被排斥者. 另一个是当用户驻留于一个聊天室的时候的角色 -- 例如, 一个房客的地位是主持人,有权踢出游客和与会者. 这两个尺度各自都是唯一的, 因为一个岗位是跨越访问的, 而一个角色只存在于一次访问期间. 另外, 在角色和岗位之间没有一对一的对应关系; 例如, 某个不从属于某房间的人可能成为一个(临时的)主持人, 一个成员可能在一个被主持的房间中是一个与会者或游客者. 这些概念以下全面解释.&lt;br /&gt;
&lt;br /&gt;
===角色===&lt;br /&gt;
&lt;br /&gt;
以下是已定义的角色:&lt;br /&gt;
&lt;br /&gt;
'''表2: 角色'''&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!名称 !!支持&lt;br /&gt;
|-&lt;br /&gt;
| 主持人Moderator   ||必需的 &lt;br /&gt;
|-&lt;br /&gt;
| 无None       ||缺少角色&lt;br /&gt;
|-&lt;br /&gt;
| 与会者Participant   ||必需的&lt;br /&gt;
|-&lt;br /&gt;
| 游客Visitor     ||推荐的&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
角色是临时的,它不一定要在用户对房间的访问中持久化,它可以(MAY)在一个房客访问房间期间改变. 一个实现可以(MAY)在一次访问期间持久化角色并且应该(SHOULD)在被主持的房间这样做 (因为在游客和与会者之间,唯一性对一个被主持的房间是很关键的).&lt;br /&gt;
&lt;br /&gt;
在角色和岗位之间没有一对一的映射(例如, 一个成员可以是一个与会者或一个游客).&lt;br /&gt;
&lt;br /&gt;
在房间会话中,一个主持人是最有权力的房客, 它能在某种程度走上管理房间的其他房客的角色. 一个与会者的权力小于一个主持人, 尽管他或她有权发言. 在一个被主持的房间会话中游客是一个更受限制的角色, 因为访问者不允许发送消息给所有房客.&lt;br /&gt;
&lt;br /&gt;
角色的授予,撤销, 和维护是基于房客的房间昵称或全JID,而不是纯JID. 和这些角色相关的权限，还有角色改变触发的动作, 定义在下文中.&lt;br /&gt;
&lt;br /&gt;
所有在房间中生成或反射的出席信息中关于角色的信息必须(MUST)被发送,从而发送给房客们.&lt;br /&gt;
&lt;br /&gt;
====权限====&lt;br /&gt;
&lt;br /&gt;
大部分情况下, 角色存在于一个层次中. 例如, 一个与会者可以做任何游客能做的事, 而一个主持人可以做任何与会者能做的事. 每个角色拥有下一级角色所没有的权限; 这些权限定义于下表作为缺省值(一个实现可以(MAY)提供配置选项来重载这些缺省值).&lt;br /&gt;
&lt;br /&gt;
'''表3: 和角色相关的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!权限 !!无 !!游客 !!与会者 !!主持人&lt;br /&gt;
|-&lt;br /&gt;
|在房间中出席 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|接收消息 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|接收房客出席信息 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|出席信息广播到房间 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|改变可用性状态 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|改变房间昵称 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|发送私人消息 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|邀请其他用户 ||否 ||是* ||是* ||是&lt;br /&gt;
|-&lt;br /&gt;
|发送消息给所有人 ||否 ||否** ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|修改标题 ||否 ||否* ||是* ||是&lt;br /&gt;
|-&lt;br /&gt;
|踢出与会者和游客 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|授予发言权 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|撤销发言权 ||否 ||否 ||否 ||是***&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 缺省; 设定配置时可以(MAY)修改这个权限.&lt;br /&gt;
&lt;br /&gt;
** 一个实现可以(MAY)在非主持的房间里缺省地授予发言权给游客.&lt;br /&gt;
&lt;br /&gt;
*** 主持人不能(MUST NOT)从一个管理员或所有者收回发言权.&lt;br /&gt;
&lt;br /&gt;
====默认角色====&lt;br /&gt;
&lt;br /&gt;
服务必须（SHOULD）根据用户的岗位信息来设置房客在房间里的默认角色（没有与岗位（“outcast”）关联的默认角色，因为outcast用户不允许进入房间）。下表对与每个岗位关联的默认角色进行了总结。&lt;br /&gt;
&lt;br /&gt;
表4: 基于岗位的默认角色&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!Room Type !!None !!Member !!Admin !!Owner&lt;br /&gt;
|-&lt;br /&gt;
|Moderated ||Visitor ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Unmoderated ||Participant ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Members-Only ||N/A * ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Open	||Participant ||Participant ||Moderator ||Moderator&lt;br /&gt;
|}&lt;br /&gt;
* Entry is not permitted.&lt;br /&gt;
&lt;br /&gt;
====变更角色====&lt;br /&gt;
&lt;br /&gt;
一个房客的角色变更方法是定义好的. 有时候房客自己的动作导致变更 (例如, 加入或退出房间), 反之有时候由主持人,管理员或所有者的动作导致变更. 如果一个房客的角色改变了, 一个 MUC 服务实现必须(MUST)变更这个房客的角色来反映这个变更并且传达这个变更给所有房客. 角色的变更和它们触发的动作定义于下表.&lt;br /&gt;
&lt;br /&gt;
'''表4: 角色状态表'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!&amp;gt; !!无 !!游客 !!与会者 !!主持人&lt;br /&gt;
|-&lt;br /&gt;
|无 ||-- ||进入被主持的房间 ||进入非主持的房间 ||管理员或所有者进入房间&lt;br /&gt;
|-&lt;br /&gt;
|游客 ||退出房间或被主持人踢出房间 ||-- ||主持人授予发言权 ||管理员或所有者授予主持人权限&lt;br /&gt;
|-&lt;br /&gt;
|与会者 ||退出房间或被主持人踢出房间 ||主持人撤销发言权	||--  ||管理员或所有者授予主持人权限 &lt;br /&gt;
|-&lt;br /&gt;
|主持人	||退出房间 ||管理员或所有者改变角色成为游客* ||管理员或所有者改变角色成为与会者或撤销主持人权限* ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 一个主持人不能(MUST NOT)从一个岗位等于或高于主持人的房客那里收回主持人权限.&lt;br /&gt;
&lt;br /&gt;
注意: 特定的角色一般暗含特定的权限. 例如, 一个管理员或所有者自动成为一个主持人, 所以如果一个房客被授予管理员地位那么这个房客事实上将被授予主持人权限; 类似的, 当一个房客成为一个被主持的房间的成员, 这个房客自动拥有一个与会者的角色. 无论如何, 失去管理员地位并不足以意味这个房客不再是主持人 (因为只要是与会者就可能成为一个主持人). 因此, 当一个房客被授予特定的岗位的时候所拥有的角色是固定的, 反之当一个房客失去一个特定的岗位时它的角色是不确定的并取决于(服务的)实现. 因为一个客户端无法预料是否在撤销某个岗位之后这个角色成为什么, 如果它不想同时移除管理员/所有者权限和主持人角色, 那么除了岗位变更之外它还必须特意请求角色变更.&lt;br /&gt;
&lt;br /&gt;
===岗位===&lt;br /&gt;
&lt;br /&gt;
已定义了以下岗位:&lt;br /&gt;
&lt;br /&gt;
# 所有者&lt;br /&gt;
# 管理员&lt;br /&gt;
# 成员&lt;br /&gt;
# 被排斥者&lt;br /&gt;
# 无 (缺少岗位)&lt;br /&gt;
&lt;br /&gt;
必须支持&amp;quot;所有者&amp;quot;这个岗位,推荐支持&amp;quot;管理员&amp;quot;,&amp;quot;成员&amp;quot;,&amp;quot;被排斥者&amp;quot;的岗位.（&amp;quot;无&amp;quot;表示缺少岗位)&lt;br /&gt;
&lt;br /&gt;
这些岗位是长时间的跨越一个用户对这个房间的访问期间的并且不受房间里事件的影响. 而且, 这些岗位和一个房客在房间中的角色之间没有一对一的映射关系. 岗位被授予,撤销, 和维护都是基于这个用户的纯 JID.&lt;br /&gt;
&lt;br /&gt;
如果一个没有已定义的岗位的用户进入一个房间, 这个用户的岗位被定义为&amp;quot;无&amp;quot;; 无论如何, 这个岗位不能跨越(多次的)访问 (也就是说, 一个服务不会跨越访问维护一个 &amp;quot;无 列表&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;quot;成员&amp;quot;岗位为房间所有者或管理员提供了一个方法来指定一个&amp;quot;白名单&amp;quot;,其中的用户被允许加入一个仅供会员的房间. 当一个成员加入了一个仅供会员的房间, 他或她的岗位不会改变, 无论他或她的角色是什么. 成员岗位也为用户提供一个方法来高效地注册一个开放的房间并在某种方式意义上保持和那个房间的联系(例如可能在房间里预留那个用户的昵称).&lt;br /&gt;
&lt;br /&gt;
一个被排斥者就是一个被从房间踢出来并且不允许进入那个房间的用户.&lt;br /&gt;
&lt;br /&gt;
关于岗位的信息必须(MUST)由房间生成或反射到所有的出席信息节之中发送给房客们.&lt;br /&gt;
&lt;br /&gt;
====权限====&lt;br /&gt;
&lt;br /&gt;
大部分情况下, 岗位存在一个层次结构. 例如, 一个所有者可以做任何管理员能做的事情, 而一个管理员可以做任何成员能做的事情. 每个岗位拥有其下一级岗位所没有的权限; 这些权限定义在下表中.&lt;br /&gt;
&lt;br /&gt;
'''表5: 和岗位相关的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!权限 !!Outcast(被排斥者) !!None(无) !!Member(成员) !!Admin(管理员) !!Owner(所有者)&lt;br /&gt;
|-&lt;br /&gt;
|进入房间 ||否 ||是* ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|注册一个开放的房间 ||否 ||是 ||N/A ||N/A ||N/A&lt;br /&gt;
|-&lt;br /&gt;
|接收成员列表 ||否 ||否** ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|加入一个仅限会员的房间 ||否 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|禁止成员并把用户的岗位删除	||否 ||否 ||否 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑成员列表 ||否 ||否 ||否 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑主持人列表 ||否 ||否 ||否 ||是** ||是**&lt;br /&gt;
|-&lt;br /&gt;
|编辑管理员列表 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑所有者列表 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|变更房间定义 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|销毁房间	||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 作为缺省值, 一个无岗位的用户进入一个被主持的房间的角色是一个游客, 而进入一个开放的房间的角色是一个与会者. 一个成员进入一个房间的角色是与会者. 一个管理员或所有者进入房间的角色是一个主持人.&lt;br /&gt;
&lt;br /&gt;
** 一个管理员或所有者不能(MUST NOT)撤销另一个管理员或所有者的权限.&lt;br /&gt;
&lt;br /&gt;
====变更岗位====&lt;br /&gt;
&lt;br /&gt;
一个用户的岗位变更方法已经定义得很完善. 有时用户自己的动作导致这些变更(例如, 注册为一个房间的新成员), 反之有时候一个管理员或所有者的动作导致了这些变更. 如果一个用户的岗位改变了, 一个MUC服务实现必须(MUST)变更这个用户的岗位来反射这一变更并通知所有房客. 岗位变更和他们触发的动作定义在下表中.&lt;br /&gt;
&lt;br /&gt;
'''表6: 岗位状态表'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|  ||被排斥者(Outcast) ||无(None) ||成员(Member) ||管理员(Admin) ||所有者(Owner)&lt;br /&gt;
|-&lt;br /&gt;
|被排斥者(Outcast) ||-- ||管理员或所有者移除屏蔽 ||管理员或所有者增加用户到成员列表 ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|无(None) ||管理员或所有者使用屏蔽 ||-- ||管理员或所有者增加用户到成员列表, 或用户注册一个成员(如果允许) ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|成员(Member) ||管理员或所有者使用屏蔽 ||管理员或所有者变更岗位为&amp;quot;none&amp;quot; ||-- ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|管理员(Admin) ||所有者使用屏蔽 ||所有者变更岗位为&amp;quot;none&amp;quot; ||所有者变更岗位为&amp;quot;member&amp;quot; ||-- ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|所有者(Owner) ||所有者使用屏蔽 ||所有者变更岗位为&amp;quot;none&amp;quot; ||所有者变更岗位为&amp;quot;member&amp;quot; ||所有者变更岗位为&amp;quot;admin&amp;quot; ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==实体用例==&lt;br /&gt;
&lt;br /&gt;
一个MUC实现必须(MUST)支持[http://xmpp.org/extensions/xep-0030.html 服务发现] [[XEP-0045#附录G:备注|7]].&lt;br /&gt;
&lt;br /&gt;
===MUC的发现组件支持===&lt;br /&gt;
&lt;br /&gt;
一个Jabber实体可能希望发现是否一个服务实现了多用户聊天协议; 为了达到这个目的, 它发送一个服务发现信息(&amp;quot;disco#info&amp;quot;)查询给这组件的JID:&lt;br /&gt;
&lt;br /&gt;
'''例子 1. 用户通过Disco查询聊天服务是否支持MUC'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco1'&lt;br /&gt;
    to='macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须(MUST)返回它的的身份和它所支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 2. 服务返回Disco Info结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='Macbeth Chat Service'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 因为MUC是旧的&amp;quot;groupchat 1.0&amp;quot;协议的超集, 一个MUC服务不应该(SHOULD NOT)返回一个&amp;lt;feature var='gc-1.0'/&amp;gt;条目在一个disco#info结果中.&lt;br /&gt;
&lt;br /&gt;
===发现房间===&lt;br /&gt;
&lt;br /&gt;
发现服务条目(&amp;quot;disco#items&amp;quot;)协议使得一个用户可以向一个服务查询相关的条目列表, 在一个聊天服务中这包含这个服务所承载的所有特定房间的集合.&lt;br /&gt;
&lt;br /&gt;
'''例子 3. 用户向聊天服务查询房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco2'&lt;br /&gt;
    to='macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务应该(SHOULD)返回它承载的所有房间的列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 4. 服务返回Disco Item结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='heath@macbeth.shakespeare.lit'&lt;br /&gt;
          name='A Lonely Heath'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
          name='A Dark Cave'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='forres@macbeth.shakespeare.lit'&lt;br /&gt;
          name='The Palace'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='inverness@macbeth.shakespeare.lit'&lt;br /&gt;
          name='Macbeth&amp;amp;apos;s Castle'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果全部房间的列表太大(详见[[XEP-0030]]), 服务可以(MAY)只返回部分的房间列表.如果这样做了, 它应该 SHOULD 包含一个 &amp;lt;set/&amp;gt; 元素 (定义在 [http://xmpp.org/extensions/xep-0059.html Result Set Management] [[XEP-0045#附录G:备注|8]]) 以表明这个列表不是全部的结果集.&lt;br /&gt;
&lt;br /&gt;
'''例子 5. 服务返回Disco Item结果的部分列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='rooms.shakespeare.lit'&lt;br /&gt;
    id='disco-rsm-1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='alls-well-that-ends-well@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='as-you-like-it@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='cleopatra@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='comedy-of-errors@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='coriolanus@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='cymbeline@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hamlet@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fourth-one@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fourth-two@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fifth@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;set xmlns='http://jabber.org/protocol/rsm'&amp;gt;&lt;br /&gt;
      &amp;lt;first index='0'&amp;gt;alls-well-that-ends-well@rooms.shakespeare.lit&amp;lt;/first&amp;gt;&lt;br /&gt;
      &amp;lt;last&amp;gt;henry-the-fifth@rooms.shakespeare.lit&amp;lt;/last&amp;gt;&lt;br /&gt;
      &amp;lt;count&amp;gt;37&amp;lt;/count&amp;gt;&lt;br /&gt;
    &amp;lt;/set&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===查询房间信息===&lt;br /&gt;
&lt;br /&gt;
使用 disco#info 协议, 一个用户也可以查询一个特定房间的详情. 为了在进入房间之间确定这个房间的隐私和安全配置用户应该(SHOULD)这样做(详见[[XEP-0045#安全事项|安全事项]]).&lt;br /&gt;
&lt;br /&gt;
'''例子 6. 用户查询特定聊天室的信息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco3'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间必须(MUST)返回它的标识并且应该(SHOULD)返回它支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 7. 房间返回查询信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco3'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='A Dark Cave'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_passwordprotected'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_hidden'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_temporary'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_open'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_unmoderated'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_nonanonymous'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 因为 MUC 是旧的 &amp;quot;groupchat 1.0&amp;quot; 协议的超集, 一个 MUC 房间不应该(SHOULD NOT)在一个disco#info结果中返回&amp;lt;feature var='gc-1.0'/&amp;gt;条目. 房间应该(SHOULD)返回它支持的实质的有意义的特性, 例如密码保护和房间主持(这些特性被完整地列入了特性注册, 由[http://xmpp.org/registrar/ XMPP Registrar]维护; 也见于本文的[[XEP-0045#registrar|XMPP注册]] 章节).&lt;br /&gt;
&lt;br /&gt;
一个聊天室可以(MAY)使用[http://xmpp.org/extensions/xep-0128.html 服务查询扩展] [[XEP-0045#附录G:备注|9]]在它的disco#info应答中返回更详细的信息, 通过包含一个隐含的FORM_TYPE属性值&amp;quot;http://jabber.org/protocol/muc#roominfo&amp;quot;来标识. 这些信息可能包括关于一个房间的更详细的描述, 当前的房间标题, 以及这个房间当前的房客数量:&lt;br /&gt;
&lt;br /&gt;
'''例子 8. 房间返回扩展的查询信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco3a'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='A Dark Cave'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_passwordprotected'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_hidden'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_temporary'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_open'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_unmoderated'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_nonanonymous'/&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_description' label='Description'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_changesubject' label='Whether Occupants May Change the Subject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_contactjid' label='Contact Addresses'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;crone1@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_subject' label='Subject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Spells&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_occupants' label='Number of occupants'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;3&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_lang' label='Language of discussion'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_logs' label='URL for discussion logs'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://www.shakespeare.lit/chatlogs/darkcave/&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_pubsub' label='Associated pubsub node'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;xmpp:pubsub.shakespeare.lit?node=chatrooms/darkcave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
某些扩展的房间信息可能是动态生成的(例如, 讨论记录的URL地址, 它可能取决于服务器那一层的配置); 反之另一些信息则可能基于房间那一层的配置,任何定义在[[XEP-0045#附录G:备注|muc#roomconfig FORM_TYPE]] 里的字段都可以用于扩展服务发现的字段(如上文所示的 muc#roomconfig_changesubject 字段).&lt;br /&gt;
&lt;br /&gt;
注意: 前述 'http://jabber.org/protocol/muc#roominfo' FORM_TYPE的扩展服务发现字段将来还可以扩充(通过本文的[[XEP-0045#附录G:备注|字段标准化]]章节描述的机制).&lt;br /&gt;
&lt;br /&gt;
===查询房间条目===&lt;br /&gt;
&lt;br /&gt;
一个用户也可以(MAY)向一个特定的聊天室查询和它相关的条目:&lt;br /&gt;
&lt;br /&gt;
'''例子 9. 用户查询和一个特定聊天室相关的条目'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个实现可以(MAY)返回现有房客的列表(如果那信息是可公开的), 或不返回列表(如果那信息是私有的).&lt;br /&gt;
&lt;br /&gt;
'''例子 10. 房间返回查询条目结果(条目是公开的)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit/firstwitch'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit/secondwitch'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 这些 &amp;lt;item/&amp;gt; 元素由 disco#items 名字空间限定, 而不是 muc 名字空间; 这意味着他们不能拥有 'affiliation' 或 'role' 属性, 例如.&lt;br /&gt;
&lt;br /&gt;
'''例子 11. 房间返回空的查询条目结果(条目是私有的)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===查询一个房间的房客===&lt;br /&gt;
&lt;br /&gt;
如果一个非房客试图发送一个查询请求给一个&amp;lt;room@service/nick&amp;gt;类型的地址, 一个 MUC 服务应该(SHOULD)返回这个请求给这个实体并指明一个&amp;lt;bad-request/&amp;gt;错误条件. 如果一个房客发送这样一个请求, 服务可以(MAY)把它传递给指定的接收者; 详见本文的 [[XEP-0045#实现注意事项|实现注意事项]]章节.&lt;br /&gt;
&lt;br /&gt;
===发现客户端对MUC的支持===&lt;br /&gt;
&lt;br /&gt;
一个 Jabber 用户可能想发现这个用户的某个联系人是否支持多用户聊天协议. 这可以使用服务发现(协议)来完成.&lt;br /&gt;
&lt;br /&gt;
'''例子 12. 用户查询联系人对于 MUC 的支持'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco5'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
客户端应该(SHOULD)返回它的标识和它支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 13. 联系人返回发现信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='disco5'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='client'&lt;br /&gt;
        type='pc'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个用户也可能查询一个联系人在哪个房间. 这可以通过特定服务发现节点 'http://jabber.org/protocol/muc#rooms' 查询联系人的全JID(&amp;lt;user@host/resource&amp;gt;)来完成 :&lt;br /&gt;
&lt;br /&gt;
'''例子 14. 用户在当前房间查询联系人'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='rooms1'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#rooms'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 15. 联系人返回房间查询结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='rooms1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#rooms'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='characters@conference.shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可选的, 联系人可以(MAY)把它的房间昵称作为'name'属性的值返回:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
          name='secondwitch'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==房客用例==&lt;br /&gt;
&lt;br /&gt;
在一个多用户聊天环境中主要的行为者是房客, 它可以被认为存在于一个多用户聊天室&amp;quot;之内&amp;quot;并且参与那个房间的讨论 (在本协议中, 与会者和游客&amp;quot;仅仅&amp;quot;被认为是房客, 因为他们不拥有管理员权限). 为了更加清晰起见, 本文中的协议元素中涉及到驻留者的用例分为以下三类:&lt;br /&gt;
&lt;br /&gt;
# 现存于 &amp;quot;groupchat 1.0&amp;quot; 协议的最小功能集&lt;br /&gt;
# 对于 &amp;quot;groupchat 1.0&amp;quot; 协议直接的应用, 如处理一些和新房间类型有关的错误&lt;br /&gt;
# 用来处理&amp;quot;groupchat 1.0&amp;quot;协议未涉及的功能的额外的协议元素(房间邀请, 房间密码, 和房间角色及岗位相关的扩展出席信息); 在'http://jabber.org/protocol/muc#user'名字空间&lt;br /&gt;
&lt;br /&gt;
注意: 这里所有客户端生成的例子是从服务的角度来展示的, 所以所有由服务收到的节都包含一个'from'属性来表达发送者的全JID(这个from属性是由一个通用的Jabber路由或会话管理者加入的). 另外, 通常的表示请求已被完成的 IQ 结果节(如 [[RFC 3920]] [10]中所要求的)未显示在这里.&lt;br /&gt;
&lt;br /&gt;
===进入一个房间===&lt;br /&gt;
&lt;br /&gt;
====Groupchat 1.0协议====&lt;br /&gt;
&lt;br /&gt;
为了参加一个多用户聊天室的讨论, 一个Jabber用户必须(MUST)首先进入一个房间成为一个房客. 在旧的&amp;quot;groupchat 1.0&amp;quot;协议中, 这是通过发送出席信息&amp;lt;room@service/nick&amp;gt;来实现的, 这里&amp;quot;room&amp;quot;是房间的 ID, &amp;quot;service&amp;quot; 是聊天服务的主机名, &amp;quot;nick&amp;quot; 是这个用户在这房间里预期的昵称:&lt;br /&gt;
&lt;br /&gt;
'''例子 16. Jabber用户进入一个房间(Groupchat 1.0)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit/thirdwitch'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子中, 一个全JID为&amp;quot;hag66@shakespeare.lit/pda&amp;quot;的用户请求用昵称&amp;quot;thirdwitch&amp;quot;进入位于&amp;quot;macbeth.shakespeare.lit&amp;quot;聊天服务的房间&amp;quot;darkcave&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
如果用户未指定一个房间昵称, 服务应该(SHOULD)返回一个&amp;lt;jid-malformed/&amp;gt;错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 17. Jabber用户进入一个房间(Groupchat 1.0)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error code='400' type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;jid-malformed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====基本MUC协议====&lt;br /&gt;
&lt;br /&gt;
兼容的多用户聊天服务必须（MUST）接受知道&amp;quot;groupchat 1.0&amp;quot; (GC)协议或multi-user chat (MUC)协议的任何客户端发出上述请求进入会议室; 无论如何, MUC 客户端应该(SHOULD)声明他们的有能力支持 MUC 协议, 方法是在出席信息节里面包含一个空的 &amp;lt;x/&amp;gt; 元素, 满足名字空间 'http://jabber.org/protocol/muc'  (注意不需要 '#user' 部分):&lt;br /&gt;
&lt;br /&gt;
'''例子 18. Jabber用户准备进入一个房间(Multi-User Chat)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from=&amp;quot;hag66@shakespeare.lit/pda&amp;quot;&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 如果发生了一个和加入房间有关的错误, 服务应该 SHOULD 返回一个包含 MUC 子元素 (i.e., &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;) 的 &amp;lt;presence/&amp;gt; 节，其 type 为 &amp;quot;error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
在尝试进入房间之间, 一个兼容MUC的客户端应该(SHOULD)首先查询它的保留的房间昵称 (如果有的话), 接下来的协议本文中的 [[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]] 章节对此作了定义.&lt;br /&gt;
&lt;br /&gt;
====出席信息广播====&lt;br /&gt;
&lt;br /&gt;
如果服务能够添加用户到房间, 它必须(MUST)从所有现存的房客的房间JID发送出席信息给新的房客的全JID, 包括扩展的关于角色的出席信息, 一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;moderator&amp;quot;, &amp;quot;participant&amp;quot;, 或&amp;quot;visitor&amp;quot;, 这个子元素的'affiliation'属性值设为&amp;quot;owner&amp;quot;, &amp;quot;admin&amp;quot;, &amp;quot;member&amp;quot;, 或 &amp;quot;none&amp;quot; 中的一个:&lt;br /&gt;
&lt;br /&gt;
'''例子 19. 服务从现有的房客发送出席信息给新的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个示例中, 用户已从前一个例子进入房间, 有两个人已经在房间里: 一个是昵称为&amp;quot;firstwitch&amp;quot;的(房间拥有者), 另一个是昵称为&amp;quot;secondwitch&amp;quot;的(房间管理员).&lt;br /&gt;
&lt;br /&gt;
服务也必须(MUST)从新进入的房客的房间JID向所有房客的全JID发送出席信息(含新房客):&lt;br /&gt;
&lt;br /&gt;
'''例子 20. 服务发送新房客的出席信息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
在这个例子里, 初始的房间出席信息从新房客(thirdwitch)发送给所有房客, 包括这个新房客自己. 看看上面最后一个节, 由房间以房客的名义发送给用户自己的出席信息,应该 SHOULD 包含一个 110 状态码，这样用户就知道这个出席信息来自于作为房客的那个他自己.&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 重写新房客的房间昵称 (例如, 如果房间昵称被锁定). 如果服务不接受新房客请求的房间昵称，而是分配一个新的房间昵称, 它必须 MUST 包含一个 &amp;quot;210&amp;quot; 状态码在发送给这个新房客的出席信息广播里.&lt;br /&gt;
&lt;br /&gt;
'''例子 21. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
注意: 发送给新房客的出席信息的顺序是很重要的. 服务必须 MUST 首先发送现有房客的完整列表给这个新房客,然后只发送新房客自己的出席信息给新房客. 这有助于客户端知道什么时候它收到了完整的房间名册( &amp;quot;room roster&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
发送出席信息广播之后(并且只在这之后), 服务可以发送讨论历史, 即时消息, 出席信息更新, 以及其他房间内的流量.&lt;br /&gt;
&lt;br /&gt;
====缺省角色====&lt;br /&gt;
&lt;br /&gt;
下表总结了初始缺省的角色，一个服务应该根据用户的岗位来设置它们(没有和 被排斥者 &amp;quot;outcast&amp;quot; 岗位相关的角色, 因为这些用户不允许进入房间).&lt;br /&gt;
&lt;br /&gt;
'''表7: 基于岗位的初始角色'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!房间类型 !!无 !!成员 !!管理员 !!所有者&lt;br /&gt;
|-&lt;br /&gt;
|被主持的 ||游客 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|非主持的 ||与会者 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|仅限会员的 ||N/A * ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|开放的 ||与会者 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 实体不被允许.&lt;br /&gt;
&lt;br /&gt;
====非匿名房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是非匿名的, 服务必须 MUST 发送新房客的全JID给所有房客,使用满足 'http://jabber.org/protocol/muc#user' 名字空间的扩展出席信息,其中带有 &amp;lt;x/&amp;gt; 元素并包含一个 &amp;lt;item/&amp;gt; 子元素,其 'jid' 属性值为这个房客的全JID:&lt;br /&gt;
&lt;br /&gt;
'''例子 22. 服务发送全JID给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这个用户正在进入一个非匿名房间(即, 它如上所示,向所有房客通报每个房客的全JID), 服务应该 SHOULD 允许该用户加入本房间,但是必须 MUST 同时警告该用户本房间是非匿名的. 应该 SHOULD 在房间发送给这个新房客的初始出席信息种包含状态码 &amp;quot;100&amp;quot; 来实现这一点:&lt;br /&gt;
&lt;br /&gt;
'''例子 23. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 也可以 MAY 发送一个 &amp;quot;groupchat&amp;quot; 类型的消息给新房客来达到上述目的,这个消息应该包含一个 &amp;lt;x/&amp;gt; 子元素,并拥有 &amp;lt;status/&amp;gt; 子元素,并且其'code'属性值为&amp;quot;100&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 24. 服务警告新房客(该房间)非匿名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;This room is not anonymous.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
附带的状态码协助客户端展示它们自己的通知消息 (例如, 和用户所在地方有关的信息).&lt;br /&gt;
&lt;br /&gt;
====半匿名房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是半匿名的, 服务必须 MUST 如上文所述从新房客发送出席信息给所有房客, 但是必须 MUST 只在发给&amp;quot;主持人&amp;quot;的时候发送新房客的全JID,而非主持人则不发(全JID).&lt;br /&gt;
&lt;br /&gt;
(注意: 所有随后的例子中，涉及的&amp;lt;item/&amp;gt;元素都带有'jid'属性, 即使这个信息在半匿名房间里不被发送给非主持人.)&lt;br /&gt;
&lt;br /&gt;
====密码保护房间====&lt;br /&gt;
&lt;br /&gt;
如果房间要求密码验证而用户不能提供(或密码错误), 服务必须 MUST 拒绝访问这个房间并且通知该用户它们是未被授权的; 具体方法是返回一个类型为&amp;quot;error&amp;quot;的出席信息节并标明 &amp;lt;not-authorized/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 25. 服务拒绝访问,因为(用户)未提供密码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
密码应该 SHOULD 通过进入房间时发送的出席信息节来提供, 包含在满足 'http://jabber.org/protocol/muc' 名字空间的 &amp;lt;x/&amp;gt; 元素的&amp;lt;password/&amp;gt; 子元素里. 密码以明码方式发送; 目前不支持其它验证方法, 而且任何这类的验证或授权方法都将会定义在一个独立的协议里(参见本文的[[XEP-0045#安全事项|安全事项]]章节).&lt;br /&gt;
&lt;br /&gt;
'''例子 26. 用户进入房间时提供密码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====仅限会员房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限会员的,但用户不是(该房间的)成员, 服务必须 MUST 拒绝访问这个房间并通知用户它们不被允许进入房间; 具体方法是返回一个&amp;quot;error&amp;quot;类型的出席信息节，并包含一个 &amp;lt;registration-required/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 27. 服务拒绝访问，因为用户不在成员列表中'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;registration-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====被禁止的用户====&lt;br /&gt;
&lt;br /&gt;
如果用户已经被房间禁止(即, 其岗位为被排斥者 &amp;quot;outcast&amp;quot;), 服务必须 MUST 拒绝访问这个房间并通知用户他(她)被禁止了; 具体方法是返回一个出席信息节,类型为&amp;quot;error&amp;quot;，标明 &amp;lt;forbidden/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 28. 服务拒绝访问，因为用户被禁止了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====昵称冲突====&lt;br /&gt;
&lt;br /&gt;
如果房间里已经有别的用户使用了准备进入房间的新用户预期的昵称(或如果这个昵称被保留给另一个成员列表里面的用户), 服务必须 MUST 拒绝访问这个房间并通知用户这个冲突; 具体方法是返回一个出席信息节,类型为&amp;quot;error&amp;quot;，标明 &amp;lt;conflict/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 29. 服务拒绝访问，因为昵称冲突'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 如果现有房客的纯 JID &amp;lt;localpart@domain.tld&amp;gt; 和准备进入房间的用户的纯 JID 相同, 那么服务应该 SHOULD 允许这个用户的进入, 所以这个用户就有两个(或更多) 房间内的会话 &amp;quot;sessions&amp;quot; 使用同一个房间昵称, 每一个对应一个资源. 如果一个服务允许相同纯JID可以同时存在多个房客并使用同一个房间的房间昵称, 它应该 SHOULD 路由房间内的消息给该用户的所有资源并允许用户的所有资源发送消息给房间; 视实现而定，服务来决定如何适当的处理从用户的资源发送的出席信息以及如何路由私有消息到所有或某个资源(基于出席信息优先级或其他机制).&lt;br /&gt;
&lt;br /&gt;
如何确定昵称冲突取决于实现(例如, 该服务是否应用于一个特定的惯例, 一个 stringprep 规则如 Resourceprep 或 Nodeprep, 等等).&lt;br /&gt;
&lt;br /&gt;
====最大用户数====&lt;br /&gt;
&lt;br /&gt;
如果房间达到它的最大房客数量, 服务应该 SHOULD 拒绝访问这个房间并通知该用户这个限制; 方法是返回一个出席信息节，类型为&amp;quot;error&amp;quot;，标明 &amp;lt;service-unavailable/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 30. 服务通知用户该房间已达到房客数量极限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='wait'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 房间可以踢出空闲用户(&amp;quot;idle user&amp;quot;)以腾出空间.&lt;br /&gt;
&lt;br /&gt;
如果房间的房客数量已达到最大值但是一个房间管理员或所有者试图进入，该房间应该允许管理员或所有者加入，为了使得额外的房客达到一个合理的数目，该数量可以 MAY 做成可配置的。&lt;br /&gt;
&lt;br /&gt;
====锁住的房间====&lt;br /&gt;
&lt;br /&gt;
如果一个用户尝试进入一个房间而该房间是锁住的 &amp;quot;locked&amp;quot; (即, 在房间创建者提供初始的配置之前以及也就是在房间正式存在之前), 服务必须 MUST 拒绝进入并返回一个 &amp;lt;item-not-found/&amp;gt; 错误给该用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 31. 服务拒绝访问，因为房间不存在'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====不存在的房间====&lt;br /&gt;
&lt;br /&gt;
如果用户准备进入房间时，该房间已经不存在了, 服务应该 SHOULD 建立它; 无论如何, 这不是必需的, 因为一个实现或部署可以 MAY 选择限制建立房间的权限. 详见本文的[[XEP-0045#新建房间|新建房间]]章节.&lt;br /&gt;
&lt;br /&gt;
====房间记录====&lt;br /&gt;
&lt;br /&gt;
如果用户进入一个房间，该房间的讨论是被记录到一个公开的存档里面(经常可以通过HTTP访问的), 服务应该 SHOULD 允许该用户加入该房间但是必须 MUST 同时警告该用户讨论已被记录. 方法是应该 SHOULD 在房间发送给该新房客的初始出席信息中包含一个状态码 &amp;quot;170&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 32. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='170'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====讨论历史====&lt;br /&gt;
&lt;br /&gt;
如上发送完初始出席信息之后, 一个房间可以 MAY 发送讨论历史给这个新房客. (在完成按照本文[[XEP-0045#出席信息广播|出席信息广播]]章节规定的发送房间出席信息之前，该房间不能 MUST NOT 发送任何讨论历史.) 是否这个历史要被发送, 以及这个历史里面包含多少条消息, 将由聊天服务实现或特定的部署来决定.&lt;br /&gt;
&lt;br /&gt;
'''例子 33. 讨论历史的发送'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2002-10-13T23:58:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2002-10-13T23:58:43Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries 'Tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='hag66@shakespeare.lit/pda'&lt;br /&gt;
     stamp='2002-10-13T23:58:49Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
讨论历史消息必须 MUST 标为[http://xmpp.org/extensions/xep-0203.html Delayed Delivery] [[XEP-0045#附录G:备注|11]]信息，满足'urn:xmpp:delay' 名字空间，以表明它们是被延迟发送的并且标明它们最初发出的时间. (注意: 'urn:xmpp:delay' 名字空间定义在 XEP-0203 里面，取代了旧的定义在 [http://xmpp.org/extensions/xep-0091.html Legacy Delayed Delivery] [[XEP-0045#附录G:备注|12]] 里的 'jabber:x:delay' 名字空间 ; XEP-0091状态更改为已过时之前, 实现应该 SHOULD 包含两种日期时间(datetime)格式.). 在非匿名房间里，'from'属性应该 SHOULD 是原始发送者的全JID, 但不能 MUST NOT 在半匿名房间里(在那里'from'属性应该 SHOULD 设置为房间本身的JID). 服务应该 SHOULD 在进入该房间之后，发送任何即时(&amp;quot;live&amp;quot;)消息之前，发送完所有讨论历史消息.&lt;br /&gt;
&lt;br /&gt;
====管理讨论历史====&lt;br /&gt;
&lt;br /&gt;
用户可能 MAY 希望管理进入房间时(由房间)提供的讨论历史(可能因为用户带宽比较低或正在使用迷你客户端). 他必须 MUST 在加入房间时发出的初始出席信息节里包含一个 &amp;lt;history/&amp;gt; 子元素. 这个元素有四个可用的属性:&lt;br /&gt;
&lt;br /&gt;
'''表8: 历史管理属性'''&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!属性 !!数据类型 !!含义&lt;br /&gt;
|-&lt;br /&gt;
| maxchars   ||int    ||限制历史中的字符总数为&amp;quot;X&amp;quot; (这里的字符数量是全部 XML 节的字符数, 不只是它们的 XML 字符数据). &lt;br /&gt;
|-&lt;br /&gt;
| maxstanzas    ||int    ||限制历史中的消息总数为&amp;quot;X&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| seconds   ||int   ||仅发送最后 &amp;quot;X&amp;quot; 秒收到的消息.&lt;br /&gt;
|-&lt;br /&gt;
| since     ||dateTime     ||仅发送从指定日期时间 datetime 之后收到的消息 (这个datatime必须 MUST 符合[http://xmpp.org/extensions/xep-0082.html XMPP Date and Time Profiles] [[XEP-0045#附录G:备注|13]] 定义的DateTime 规则，).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 发送满足以上条件组合的最小数量的消息, 还要顾及服务级别和房间级别的缺省设置. 服务必须 MUST 只发送完整的消息节(即, 它不能 MUST not 按特定字符数把历史从字面上截断, 但是必须 MUST 发送最大数量的完整节,这使得字符数小于或等于 'maxchars' 属性的值). 如果客户端不希望收到历史, 它必须 MUST 把'maxchars' 属性值设为&amp;quot;0&amp;quot; (zero).&lt;br /&gt;
&lt;br /&gt;
以下例子展示如何使用这个协议.&lt;br /&gt;
&lt;br /&gt;
'''例子 34. 用户请求在历史中限制消息数量'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history maxstanzas='20'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 35. 用户请求最后三分钟的历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history seconds='180'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 36. 用户请求从Unix时代到现在的所有历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history since='1970-01-01T00:00:00Z'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务绝对不应该 SHOULD NOT 返回从Unix时代开始到现在的所有消息, 而应该 SHOULD 基于服务或房间的缺省值返回适当的有限数量的历史给用户.&lt;br /&gt;
&lt;br /&gt;
'''例子 37. 用户请求不发送历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history maxchars='0'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===退出一个房间===&lt;br /&gt;
&lt;br /&gt;
为了退出一个多用户聊天房间, 一个房客发送一个类型为&amp;quot;unavailable&amp;quot;的出席信息节给正在使用这个房间的 &amp;lt;room@service/nick&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
'''例子 38. 房客退出一个房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着从要离开的房客的房间JID发送&amp;quot;unavailable&amp;quot;类型的出席信息节给这个要离开的房客的全JID们以及留在房间的房客们:&lt;br /&gt;
&lt;br /&gt;
'''例子 39. 服务发送和离开的房客有关的出席信息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
由房间反射的类型为&amp;quot;unavailable&amp;quot;的出席信息节必须 MUST 包含扩展的关于角色和岗位的出席信息; 'role'属性值应该 SHOULD 被设为 &amp;quot;none&amp;quot; 以表示这个人不再是一个房客了.&lt;br /&gt;
&lt;br /&gt;
房客可以 MAY 在出席信息节包含一个常规的 &amp;lt;status/&amp;gt; 信息; 这使房客能在必要的情况下提供一个自定的退出消息:&lt;br /&gt;
&lt;br /&gt;
'''例子 40. 自定的退出消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
常规的出席信息节生成规则定义在 [[RFC3921|XMPP IM]] [[XEP-0045#附录G;备注|14]], 所以如果用户发送一个一般的不可用出席信息节, 用户的服务器将广播那个节到 &amp;lt;room@service/nick&amp;gt; ，而该用户之前曾经发送过直接出席信息给这个&amp;lt;room@service/nick&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
有可能一个用户不能正常地通过直接发送不可用信息给一个房间来退出该房间. 如果该用户没有发送不可用出席信息就下线了, 用户的服务器负责代替该用户发送不可用出席信息 (依据 RFC 3921). 如果该用户的服务器下线或该用户的服务器和该用户连接的MUC服务失去连接(例如, 在联邦通信), 这个MUC服务负责监视它收到的错误信息节以确定该用户是否下线. 如果该MUC服务确定该用户已下线, 它必须 must 当成该用户自己发送了不可用信息一样地处理这个用户.&lt;br /&gt;
&lt;br /&gt;
注意: 如果房间不是持久的并且该房客是最后一个退出的, 服务负责销毁这个房间.&lt;br /&gt;
&lt;br /&gt;
===更改昵称===&lt;br /&gt;
&lt;br /&gt;
多用户聊天室的一个常用功能是一个房客能修改自己在房间里的昵称. 在 MUC 里这需要发送一个更新出席信息给房间, 具体来说是在相同的房间里发送出席信息给一个新的房间JID (变更的只是这个房间JID的资源).&lt;br /&gt;
&lt;br /&gt;
'''例子 41. 房客修改昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务接着发送两个出席信息节给每个房客的全JID(包括修改自己昵称的房客本身), 一个是类型为&amp;quot;unavailable&amp;quot;的用于旧的昵称另一个指明新昵称可用了.&lt;br /&gt;
&lt;br /&gt;
这个不可用出席信息必须 MUST 在一个满足'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 子元素里面包含以下扩展的出席信息 :&lt;br /&gt;
&lt;br /&gt;
* 新昵称(在这个例子中, nick='oldhag')&lt;br /&gt;
* 一个状态码 303&lt;br /&gt;
&lt;br /&gt;
这使接受者能从旧昵称关联到新昵称.&lt;br /&gt;
&lt;br /&gt;
'''例子 42. 服务更新昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户尝试修改他或她的房间昵称,但这个昵称已经被其他用户使用了 (或者这个昵称是被这房间的其他用户岗位保留的, 例如, 一个成员或者所有者), 服务必须 MUST 拒绝这次昵称修改并通知该用户这一冲突; 也就是返回一个类型为 &amp;quot;error&amp;quot; 的出席信息节指明 &amp;lt;conflict/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 43. 服务拒绝昵称修改，因为昵称冲突'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 如果现有房客的纯JID &amp;lt;localpart@domain.tld&amp;gt; 和尝试变更昵称的房客的纯JID相同, 那么服务可以 MAY 允许昵称变更. 详见本文的[[XEP-0045#昵称冲突|昵称冲突]]章节.&lt;br /&gt;
&lt;br /&gt;
如果该用户尝试变更自己的昵称但是房间昵称被锁定了(&amp;quot;locked down&amp;quot;), 服务必须 MUST 拒绝这个昵称变更请求并返回一个&amp;quot;error&amp;quot;类型的出席信息节，指明一个 &amp;lt;not-acceptable/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 44. 服务拒绝昵称变更，因为房间昵称被锁定'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户应该 SHOULD 接着发现它的保留昵称，如本文的 [[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]]章节所述.&lt;br /&gt;
&lt;br /&gt;
===更改可用性状态===&lt;br /&gt;
&lt;br /&gt;
在一个多用户聊天系统里例如IRC, 一个常用的修改某人房间昵称的行为也意味着变更某人的可用性(例如, 变更某人的房间昵称为&amp;quot;thirdwitch|away&amp;quot;). 在Jabber里面, 可用性当然是通过出席信息 (中 &amp;lt;show/&amp;gt; 和 &amp;lt;status/&amp;gt; 元素)的变更来通知的, 这能提供重要的上下文给聊天室. 一个房客通过发送更新的出席信息给它自己的&amp;lt;room@service/nick&amp;gt;来改变他在房间内的可用性状态.&lt;br /&gt;
&lt;br /&gt;
'''例子 45. 房客变更可用性状态'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'&amp;gt;&lt;br /&gt;
  &amp;lt;show&amp;gt;xa&amp;lt;/show&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务然后从该房客发送一个出席信息节来修改他或她的出席信息给每个房客的全JID, 包含扩展的出席信息，包括这个房客的角色和全JID(给那些有权知道的人):&lt;br /&gt;
&lt;br /&gt;
'''例子 46. 服务传递修改的出席信息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;show&amp;gt;xa&amp;lt;/show&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===邀请其他用户进入一个房间===&lt;br /&gt;
====直接邀请====&lt;br /&gt;
&lt;br /&gt;
一个办法是发送一个直接的邀请(而不是由房间本身来间接邀请),定义在[http://xmpp.org/extensions/xep-0249.html Direct MUC Invitations] [[XEP-0045#附录G:备注|15]]. 直接发送邀请有助于适应被邀请者那一边的通信阻塞(对方可能拒绝和和不在好友名单中的实体通信).&lt;br /&gt;
&lt;br /&gt;
====间接邀请====&lt;br /&gt;
&lt;br /&gt;
邀请别的用户到一个房间成为房客是很有用的. 为了做到这一点, 一个 MUC 客户端必须 MUST 发送以下格式的 XML 给 &amp;lt;room@service&amp;gt; 本身 (原因(reason)是可选的 OPTIONAL 而消息(message)的类型必须 MUST 是显式或隐式的&amp;quot;normal&amp;quot;类型):&lt;br /&gt;
&lt;br /&gt;
'''例子 47. 房客通过房间发送一个邀请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;room@service&amp;gt; 本身必须 MUST 接着增加一个 'from' 地址到 &amp;lt;invite/&amp;gt; 元素，其值为邀请者的纯JID, 全JID, 或房间JID，并发送邀请给 'to' 地址所指明的被邀请者(为了旧的客户端，服务可以 MAY 包含一个消息主体&amp;quot;message body&amp;quot;解释这个邀请或包含一个原因&amp;quot;reason&amp;quot;(子元素); 另外, 房间应该 SHOULD 增加 password 如果该房间是密码保护的):&lt;br /&gt;
&lt;br /&gt;
'''例子 48. 房间代表邀请者发送邀请给被邀请者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限成员的, 服务可以 MAY 同时把这个被邀请者加入成员列表. (注意: 在仅限成员的房间里邀请的权力应该 SHOULD 由房间管理员限定; 如果一个没有权限的成员修改成员列表试图邀请别的用户, 服务应该 SHOULD 返回一个 &amp;lt;forbidden/&amp;gt; 错误给该房客; 详见本文的[[XEP-0045#修改成员列表|修改成员列表]]章节.)&lt;br /&gt;
&lt;br /&gt;
如果邀请者提供了一个不存在的JID, 房间应该 SHOULD 返回一个 &amp;lt;item-not-found/&amp;gt; 错误给邀请者.&lt;br /&gt;
&lt;br /&gt;
被邀请者可以 MAY 选择正式地拒绝 (反之则忽略) 邀请; 这是发送者希望看到的正式的通知. 为了拒绝这个邀请, 被邀请者必须 MUST 发送以下格式的消息给 &amp;lt;room@service&amp;gt; 本身:&lt;br /&gt;
&lt;br /&gt;
'''例子 49. 被邀请者谢绝邀请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='hecate@shakespeare.lit/broom'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;decline to='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Sorry, I'm too busy right now.&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/decline&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 50. 房间通知邀请者邀请被拒绝了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;decline from='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Sorry, I'm too busy right now.&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/decline&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能(有人)想知道为什么被邀请者不直接发送拒绝消息给访问者. 主要原因是特定的实现可能 MAY 选择让邀请基于房间JIDs而不是纯JIDs (所以, 例如, 一个房客可能从一个房间邀请某人到另一个房间而不需要知道这个人的纯JID). 因而服务必须 MUST 同时处理邀请和拒绝.&lt;br /&gt;
&lt;br /&gt;
===把一对一聊天转为多用户会议===&lt;br /&gt;
&lt;br /&gt;
有时候人们需要把一个一对一的聊天转成一个多用户的会议. 以下例子展示了这个流程.&lt;br /&gt;
&lt;br /&gt;
首先, 两个用户开始一个一对一聊天.&lt;br /&gt;
&lt;br /&gt;
'''例子 51. 一个一对一聊天'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在第一个用户决定加入第三个人到这个讨论, 所以她 (或, 更准确地说, 她的客户端) 做以下事情:&lt;br /&gt;
&lt;br /&gt;
# 新建一个多用户聊天室&lt;br /&gt;
# 可选地发送一对一聊天的历史到房间&lt;br /&gt;
# 发送一个邀请给第二个人和第三个人, 包含一个 &amp;lt;continue/&amp;gt; 元素 (可选地包含一个 'thread' 属性).&lt;br /&gt;
&lt;br /&gt;
注意: 新房间应该 SHOULD 是非匿名的, 可以 MAY 是一个即时房间(定义于本文的[[XEP-0045#新建即时房间|新建即时房间]]章节), 也可以 MAY 有一个从服务接收的唯一房间名(定义于本文的[[XEP-0045#请求唯一的房间名|请求唯一的房间名]]章节.&lt;br /&gt;
&lt;br /&gt;
注意: 如果这个一对一的聊天消息包含了一个 &amp;lt;thread/&amp;gt; 元素, 这个新建房间的人应该 SHOULD 在历史消息中包含这个 ThreadID, 在邀请中把这个 ThreadID 的值赋予 &amp;lt;continue/&amp;gt; 元素的 'thread' 属性, 并把这 ThreadID 包含在任何新的消息中发送到房间. ThreadIDs 的使用是推荐的 RECOMMENDED ，因为它帮助提供一对一聊天和多用户聊天的连续性.&lt;br /&gt;
&lt;br /&gt;
'''例子 52. 继续讨论 I: 用户新建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 53. 继续讨论 II: 所有者发送历史到房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2004-09-29T01:54:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2004-09-29T01:55:21Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 使用 Delayed Delivery 协议使房间创建者能够从他一对一聊天历史指明每个消息的日期时间 datetime (通过 'stamp' 属性), 以及每个消息的原始发送者的 JID (通过'from' 属性). 房间创建者应该 SHOULD 在邀请额外的用户到房间之前发送完整的一对一聊天历史, 并且也应该 SHOULD 把第二个人加入该房间之前和第一个人在一对一聊天界面中出现的任何消息当成历史来发送; 如果这个一对一历史特别的大, 发送的客户端可能希望在数秒内发送这个历史而不是一次性发送所有历史(以to 避免触发频率限制). 服务不应该 SHOULD NOT 在从房间所有者接收的历史消息之前添加它自己的延迟元素&amp;quot;delay elements&amp;quot; (见本文的[[XEP-0045#讨论历史|讨论历史]]章节) .&lt;br /&gt;
&lt;br /&gt;
'''例子 54. 继续讨论 III: 所有者发送邀请(们), 包含 Continue 标志'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 当邀请者的客户端一知道和它一对一聊天的那个人的全JID之后, 它就应该 SHOULD 在邀请中包含这个全JID (而不是纯JID).&lt;br /&gt;
&lt;br /&gt;
邀请被递送到被邀请者:&lt;br /&gt;
&lt;br /&gt;
'''例子 55. 邀请被递送'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
    to='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当客户端被 &amp;lt;wiccarocks@shakespeare.lit/laptop&amp;gt; 用来接收邀请, 它应该 SHOULD 自动加入或提示用户是否加入 (取决于用户的选项配置) 并且随后无缝地把现有的一对一聊天窗口转到一个多用户会议的窗口:&lt;br /&gt;
&lt;br /&gt;
'''例子 56. 被邀请者接受邀请, 加入房间, 并接收出席信息和历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/secondwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2004-09-29T01:54:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2004-09-29T01:55:21Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 事实上,这些消息从 &amp;lt;room@service&amp;gt; 本身而不是 &amp;lt;room@service/nick&amp;gt; 发出，告诉这些接收的客户端这些消息是优先的聊天历史, 因为任何来自房客的消息的 'from' 地址应该等于发送者的房间JID.&lt;br /&gt;
&lt;br /&gt;
===房客修改房间标题===&lt;br /&gt;
&lt;br /&gt;
如果房间配置允许, 一个房客可以 MAY 被允许修改一个房间的主题. 详见本文的[[XEP-0045#修改房间主题|修改房间主题]]章节.&lt;br /&gt;
&lt;br /&gt;
===发送私有消息===&lt;br /&gt;
&lt;br /&gt;
因为每个房客有一个唯一的房间JID, 一个房客可以 MAY 发送一个私有消息 &amp;quot;private message&amp;quot; 给选定的房客，即通过服务发送一个消息给那房客的房间JID. 这个消息类型应该 SHOULD 是 &amp;quot;chat&amp;quot; 并且不能 MUST NOT 是 &amp;quot;groupchat&amp;quot;, 但是可以 MAY 不表明 (即, 一个常规&amp;quot;normal&amp;quot;消息). 这个权力应该 SHOULD 被任何房客允许 (甚至在一个被主持的房间里的游客).&lt;br /&gt;
&lt;br /&gt;
'''例子 57. 房客发送私有消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务负责把'from'地址改为发送者的房间JID并递送这个消息到预期的接收者的全JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 58. 接收者接收私有消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者尝试发送一个类型为 &amp;quot;groupchat&amp;quot; 的私有消息给特定的房客, 服务必须 MUST 拒绝递送这个消息 (因为接收者的客户端期望的房间内的消息类型为&amp;quot;groupchat&amp;quot;) 并且返回一个 &amp;lt;bad-request/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 59. 房客尝试发送类型为&amp;quot;Groupchat&amp;quot;的私有消息给特定的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者尝试发送一个私有消息给一个不存在的房间JID, 服务必须 MUST 返回一个 &amp;lt;item-not-found/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
如果发送者不是预期的接收者正在访问的那个房间的房客, 服务必须 MUST 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
===发送消息给所有房客===&lt;br /&gt;
&lt;br /&gt;
房客发送一个消息给所有房间内的房客的方法，是发送一个类型为 &amp;quot;groupchat&amp;quot; 的消息到 &amp;lt;room@service&amp;gt; 本身 (服务可以 MAY 忽略或拒绝类型不是 &amp;quot;groupchat&amp;quot; 的消息). 在一个被主持的房间, 这个权力限于角色为与会者或更高的房客拥有.&lt;br /&gt;
&lt;br /&gt;
'''例子 60. 房客发送一个消息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者在这个房间有发言权 (在被主持的房间里缺省是这样期望), 服务必须 MUST 修改发送者的 'from' 属性成为房间JID并反射这个消息到每个房客的全JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 61. 服务反射消息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者是个游客 即, 在一个被主持的房间里没有发言权), 服务可以 MAY 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者并且不能 MUST NOT 反射这个消息给所有房客. 如果发送者不是该房间的房客, 服务应该 SHOULD 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给发送者并且不应该 SHOULD NOT 反射这个消息给所有房客; 这个规则的唯一的例外是，一个实现可以 MAY 允许用户们拥有特定的权限 (例如, 一个房间拥有者, 房间管理员, 或服务级别的管理员) 发送消息到这个房间，即使那些用户不是房客.&lt;br /&gt;
&lt;br /&gt;
===注册到房间===&lt;br /&gt;
&lt;br /&gt;
一个实现可以 MAY 允许一个无岗位的用户(在一个被主持的房间里, 通常是一个与会者) 注册一个房间从而成为该房间的一个成员 (反之, 一个实现也可以 MAY 限制这个权力并且只允许房间管理员添加新的成员). 特别是, 不在成员列表的人是无法加入一个仅限会员的房间的, 所以为了加入这样一个房间，实体需要申请会籍.&lt;br /&gt;
&lt;br /&gt;
如果允许, 这个功能应该 SHOULD 这样被实现。让用户使用 'jabber:iq:register' 名字空间[[XEP-0077|带内注册]] [[XEP-0045#附录G:备注|16]]提出注册申请给房间,:&lt;br /&gt;
&lt;br /&gt;
'''例子 62. 用户提出注册申请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='reg1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果用户提出的注册申请不被允许注册该房间 (例如, 因为那个权限被限制了), 该房间必须 MUST 返回一个 &amp;lt;not-allowed/&amp;gt; 错误给该用户. 如果该用户已经注册过了, 房间必须 MUST 返回一个类型为&amp;quot;result&amp;quot;的IQ节并包含一个空的&amp;lt;register/&amp;gt;元素(定义于'''XEP-0077'''). 如果该房间不存在, 服务必须 MUST 返回一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
否则, 房间必须 MUST 接着返回一个数据表单&amp;quot;Data Form&amp;quot;给该用户 (定义于[[XEP-0004|数据表单]] [[XEP-0045#附录G:备注|17]]). 注册需要的信息可以 MAY 根据实现和部署的不同而不同并且没有完全定义在本文中 (例如, 本文根据 'http://jabber.org/protocol/muc#register' 名字空间采用的注册字段  FORM_TYPE 可能将来会根据[[XEP-0045#字段标准化|字段标准化]]章节里描述的得到补充，). 以下是一个典型的例子:&lt;br /&gt;
&lt;br /&gt;
'''例子 63. 服务返回注册表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To register on the web, visit http://shakespeare.lit/&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Dark Cave Registration&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
        Please provide the following information&lt;br /&gt;
        to register with this room.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Given Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_first'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Family Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_last'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Desired Nickname'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_roomnick'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Your URL'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_url'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Email Address'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_email'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='FAQ Entry'&lt;br /&gt;
          type='text-multi'&lt;br /&gt;
          var='muc#register_faqentry'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户应该 SHOULD 接着提交这个表单:&lt;br /&gt;
&lt;br /&gt;
'''例子 64. 用户提交注册表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_first'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Brunhilde&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_last'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Entwhistle-Throckmorton&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_roomnick'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_url'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://witchesonline/~hag66/&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_email'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hag66@witchesonline&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_faqentry'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Just another witch.&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果期望的房间昵称已经被那个房间保留, 房间必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 65. 房间返回冲突错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该房间或服务不支持注册, 它必须 MUST 返回一个 &amp;lt;service-unavailable/&amp;gt; 错误给用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 66. 房间返回服务不可用错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果用户没有提交合法的数据表格, 房间必须 MUST 返回一个 &amp;lt;bad-request/&amp;gt; 错误给用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 67. 房间返回&amp;quot;服务错误的请求&amp;quot;错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
否则, 该房间必须 MUST 通知用户注册请求被成功地接收到了:&lt;br /&gt;
&lt;br /&gt;
'''例子 68. 房间通知用户注册请求已经被处理了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户提交表单之后, 服务可以 MAY 向一个房间 管理员/所有者 请求批准该申请 (参见本文的[[XEP-0045#批准注册申请|批准注册申请]]章节) 或也可以 MAY 立刻把该用户的岗位从&amp;quot;none&amp;quot;变更为&amp;quot;member&amp;quot;来添加此用户到成员列表. 如果服务变更了该用户的岗位并且该用户在房间里, 它必须 MUST 从这个用户发送更新的出席信息给所有房客, 声明岗位的变更，这个更新的出席信息应包含一个满足 'http://jabber.org/protocol/muc#user' 名字空间 &amp;lt;x/&amp;gt; 元素并包含一个'affiliation' 属性值设为&amp;quot;member&amp;quot;的 &amp;lt;item/&amp;gt; 子元素.&lt;br /&gt;
&lt;br /&gt;
'''例子 69. 服务发送成员变更通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个用户已经注册到一个房间, 该房间可以 MAY 选择限制这个用户在那个房间仅能使用已注册的昵称. 如果它这样做, 当用户尝试以不同于该用户之前已注册的房间昵称来加入该房间 (这使房间锁定&amp;quot;lock down&amp;quot;房间昵称以保证房客身份的一致性)的时候，它应该 SHOULD 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给该用户.&lt;br /&gt;
&lt;br /&gt;
===获取成员列表===&lt;br /&gt;
&lt;br /&gt;
根据房间配置如果允许的话, 一个房客可以 MAY 被允许接收房间成员的列表. 详见本文的[[XEP-0045#修改成员列表|修改成员列表]]章节.&lt;br /&gt;
&lt;br /&gt;
===发现保留的房间昵称===&lt;br /&gt;
&lt;br /&gt;
一个用户可以 MAY 有一个保留的房间昵称, 例如通过显式的房间注册, 数据库集成, 或昵称锁定 &amp;quot;lockdown&amp;quot;. 用户应该 SHOULD 在尝试进入该房间之前发现自己的保留昵称. 这可以通过发送一个发现服务信息请求并指定一个服务发现节点&amp;quot;x-roomuser-item&amp;quot;给房间JID来做到.&lt;br /&gt;
&lt;br /&gt;
'''例子 70. 用户请求保留的昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='getnick1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='x-roomuser-item'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
对一个多用户聊天服务来说，对上述的服务发现节点的支持是可选的 OPTIONAL . 如果房间或服务不支持上述的服务发现节点, 它必须 MUST 返回一个 &amp;lt;feature-not-implemented/&amp;gt; 错误给用户. 如果它支持这个特性并且该用户有一个已注册的昵称, 它必须 MUST 返回这个昵称给这个用户，方法是发送一个服务发现的&amp;lt;identity/&amp;gt;元素，其'name'属性值为这个昵称 (此处 category/type 应该 SHOULD 是 &amp;quot;conference/text&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
'''例子 71. 房间返回昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='getnick1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='x-roomuser-item'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='thirdwitch'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户没有已注册的昵称, 房间必须 MUST 返回一个空的服务发现 &amp;lt;query/&amp;gt; 元素 (根据 '''XEP-0030''').&lt;br /&gt;
&lt;br /&gt;
即使一个用户已经注册了一个房间昵称, 服务应该 SHOULD 允许该用户在加入该房间时指定一个不同的昵称 (例如, 为了从不同的客户端资源加入), 尽管该服务可以 MAY 选择通过一个 &amp;lt;not-acceptable/&amp;gt; 错误来锁定 &amp;quot;lock down&amp;quot; 昵称并拒绝该用户 . 如果该用户的客户端在加入该房间之后发送上述请求，服务不能 MUST NOT 返回一个错误给该用户, 而应该 SHOULD 返回上文所述.&lt;br /&gt;
&lt;br /&gt;
如果另一个用户尝试以第一个用户保留的房间昵称来加入房间, 服务必须 MUST 拒绝第二个用户并返回一个前文所述的 &amp;lt;conflict/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
===申请发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里游客是不能发言的 (即, 发送一个消息给所有房客). 为了申请发言权, 一个游客应该 SHOULD 发送包含一个数据表格的 &amp;lt;message/&amp;gt; 节给房间本身, 这个数据表格仅仅是一个 'muc#role' 字段，值为 &amp;quot;participant&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 72. 房客申请发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='hag66@shakespeare.lit/pda'&lt;br /&gt;
         to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Requested role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务接着应该 SHOULD 转发这个请求给房间主持人(们) ，定义于本文的[[XEP-0045#批准发言权申请|批准发言权申请]].&lt;br /&gt;
&lt;br /&gt;
==主持人用例==&lt;br /&gt;
&lt;br /&gt;
一个主持人有权在房间里执行特定的动作 (例如, 变更某些房客的角色) 但无权变更岗位的持久信息 (它只能被管理员或所有者) 或定义关于这个房间的信息. 具体哪些动作可由主持人执行，取决于配置. 无论如何, 对于 MUC 框架来说, 主持人被规定有权执行以下动作:&lt;br /&gt;
&lt;br /&gt;
# 在一个半匿名的房间里发现一个房客的全JID(如上文所述缺省会发生)&lt;br /&gt;
# 修改主题&lt;br /&gt;
# 从该房间踢出一个与会者或游客&lt;br /&gt;
# 在一个被主持的房间里授予或撤销发言权&lt;br /&gt;
# 在一个被主持的房间里修改拥有发言权的房客列表&lt;br /&gt;
&lt;br /&gt;
这些特性将通过一个基于 &amp;lt;iq/&amp;gt; 元素的 请求/应答 交换来实现，这个IQ元素包含一个满足 'http://jabber.org/protocol/muc#admin' 名字空间的子元素. 以下例子展示这个协议和实现如何互动达到期望的功能. (以下除非显式地提及, 任何接下来的管理请求必须 MUST 被拒绝,如果该请求的'from'地址 &amp;lt;user@host&amp;gt; 和主持人的纯JID不符的话; 在这种情况下, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误.)&lt;br /&gt;
&lt;br /&gt;
===修改房间主题===&lt;br /&gt;
&lt;br /&gt;
多用户聊天室的一个常用特性是变更房间主题的能力. 缺省地, 一个房间里只有角色为主持人 &amp;quot;moderator&amp;quot; 的用户应该 SHOULD 被允许变更主题 (尽管这应该 SHOULD 是可配置的, 结果是如果需要的话，仅仅与会者或甚至游客都被允许修改主题). 主题变更是通过发送一个类型为 &amp;quot;groupchat&amp;quot; 的消息给 &amp;lt;room@service&amp;gt;来实现的, 在这里 &amp;lt;message/&amp;gt; 必须 MUST 包含一个 &amp;lt;subject/&amp;gt; 元素以指定新的主题，但不应该 SHOULD NOT 包含其他元素 (例如, 不应该有 &amp;lt;body/&amp;gt; 元素或 &amp;lt;thread/&amp;gt; 元素).&lt;br /&gt;
&lt;br /&gt;
'''例子 73. 主持人变更主题'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个 MUC 服务接收到这样一个消息, 它必须 MUST 以发送这个变更主题消息的那个用户的房间JID作为'from'地址来反射这个消息给所有其他房客:&lt;br /&gt;
&lt;br /&gt;
'''例子 74. 服务通知所有房客主题变更'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 当一个新的房客加入房间时，该房间应该 SHOULD 在被发送的讨论历史中包含最后的主题变更.&lt;br /&gt;
&lt;br /&gt;
一个接收到这类信息的 MUC 客户端可以 MAY 选择显示一个房间内的消息, 如下:&lt;br /&gt;
&lt;br /&gt;
'''例子 75. 客户端显式房间主题变更消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
* secondwitch has changed the subject to: Fire Burn and Cauldron Bubble!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一些没有适当权限的人尝试变更房间主题, 服务必须 MUST 返回一个 &amp;quot;error&amp;quot; 类型的消息指明一个 &amp;lt;forbidden/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 76. 服务返回未被授权变更主题的错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
为了移除现有的主题而不是提供一个新主题 (即, 设置主题为空), 客户端应该发送一个空的 &amp;lt;subject/&amp;gt; 元素 (即,  &amp;quot;&amp;lt;subject/&amp;gt;&amp;quot; 或 &amp;quot;&amp;lt;subject&amp;gt;&amp;lt;/subject&amp;gt;&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 77. 主持人设置空的主题'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===踢出房客===&lt;br /&gt;
&lt;br /&gt;
主持人有权从一个房间踢出特定种类的房客 (哪些房客是可被踢的 &amp;quot;kickable&amp;quot; 取决于服务规定, 房间配置, 以及主持人的岗位 -- 见下文). 踢人通常基于房客的房间昵称来执行 (尽管可以 MAY 基于全JID) 并且完全是通过把与会者或游客的角色设为 &amp;quot;none&amp;quot; 来实现的.&lt;br /&gt;
&lt;br /&gt;
'''例子 78. 主持人踢出房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='fluellen@shakespeare.lit/pda'&lt;br /&gt;
    id='kick1'&lt;br /&gt;
    to='harfleur@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='pistol' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Avaunt, you cullion!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 移除被踢的用户，通过发送一个类型为 &amp;quot;unavailable&amp;quot; 的出席信息节给每个被踢的房客, 这个出席信息应在其扩展出席信息中包含状态码 307 , 或(可选地)包含 reason 子元素(如果提供了) 以及踢人的执行者的纯JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 79. 服务移除被踢的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='harfleur@henryv.shakespeare.lit/pistol'&lt;br /&gt;
    to='pistol@shakespeare.lit/harfleur'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='fluellen@shakespeare.lit'/&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Avaunt, you cullion!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='307'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
包含状态码可使客户端能够提交他们自己的通知消息 (例如, 适当的用户位置的信息). 可选的包含原因 reason 元素以及执行者 actor 使得被踢的用户能理解为什么他或她被踢了, 以及被踢的用户可以找谁去理论. [[XEP-0045#附录G:备注|18]]&lt;br /&gt;
&lt;br /&gt;
移除被踢的房客(们)之后, 服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 80. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='harfleur@henryv.shakespeare.lit'&lt;br /&gt;
    id='kick1'&lt;br /&gt;
    to='fluellen@shakespeare.lit/pda'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
通知主持人之后, 服务必须 MUST 接着通知剩余的房客那个被踢的房客已经不在房间里了,即从被踢者的房间昵称(&amp;lt;room@service/nick&amp;gt;)发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给所有剩余的房客 (就像房客自愿退出房间时所做的一样), 包含状态码 status 以及可选的原因 reason 和执行者 actor.&lt;br /&gt;
&lt;br /&gt;
'''例子 81. 服务通知剩余的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='harfleur@henryv.shakespeare.lit/pistol'&lt;br /&gt;
    to='gower@shakespeare.lit/cell'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='307'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个用户不能被比自己岗位低的主持人踢出. 所以, 如果一个身为与会者的主持人尝试踢出一个管理员，或一个身为与会者的主持人或管理员尝试踢出一个所有者, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 82. 服务对于尝试踢出更高岗位的用户返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='kicktest'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='firstwitch' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Be gone!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个主持人尝试踢出他自己, 服务可以 MAY 拒绝这个请求并返回一个 &amp;lt;conflict/&amp;gt; 错误给发送者. (尽管这个踢出自己的行为可能看起来怪异, 它在 IRC 里很常见，用于在房间里为某人的行为道歉.)&lt;br /&gt;
&lt;br /&gt;
===授予游客发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里, 主持人可能希望管理房间内谁有水没有发言权 &amp;quot;voice&amp;quot; (即, 发送消息给所有房客的能力). 发言权的授予是基于游客的房间昵称来的, 服务将从内部把这个房间昵称转成游客的全JID. 主持人通过把游客的角色变更为与会者 &amp;quot;participant&amp;quot;来给一个游客授予权限.&lt;br /&gt;
&lt;br /&gt;
'''例子 83. 主持人授予权限给一个游客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 84. 主持人授予权限给一个游客(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 85. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个人的&amp;lt;room@service/nick&amp;gt;发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'role'属性值为&amp;quot;participant&amp;quot;，指明添加了发言权.&lt;br /&gt;
&lt;br /&gt;
'''例子 86. 服务发送发言权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销与会者发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里, 主持人可能希望撤销一个与会者发言的权力,主持人通过把与会者的角色变更为游客 &amp;quot;visitor&amp;quot;来撤销一个游客的发言权:&lt;br /&gt;
&lt;br /&gt;
'''例子 87. 主持人撤销一个与会者的发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 88. 主持人撤销一个与会者的发言权(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='visitor'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 89. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个人的&amp;lt;room@service/nick&amp;gt;发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'role'属性值为&amp;quot;visitor&amp;quot;，指明移除了发言权.&lt;br /&gt;
&lt;br /&gt;
'''例子 90. 服务通知失去发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个主持人不能 MUST NOT 从一个岗位等于或高于主持人岗位的用户撤销发言权. 另外, 服务不能 MUST NOT 允许一个管理员或所有者的发言权被任何人撤销. 如果一个主持人尝试撤销这些人的发言权, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 的错误给发送者(通过以下的违规条目):&lt;br /&gt;
&lt;br /&gt;
'''例子 91. 服务对于尝试从管理员，所有者或更高岗位的用户撤销权限返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voicetest'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='secondwitch' role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改发言权列表===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里主持人可能希望管理发言权列表. 为了达到这个目的, 主持人首先查询房间所有角色为'participant'的房客列表来请求发言权列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 92. 主持人请求发言权列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='voice3'&lt;br /&gt;
    to='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回发言权列表给主持人; 每个条目必须 MUST 包含 'nick' 和 'role' 属性并且应该 SHOULD 包含 'affiliation' 和 'jid' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 93. 服务发送发言权列表给主持人'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voice3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='polonius@hamlet/castle'&lt;br /&gt;
          nick='Polo'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='horatio@hamlet/castle'&lt;br /&gt;
          nick='horotoro'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
主持人可以 MAY 接着修改发言权列表. 为了达到这个目的, 主持人必须 MUST 发送变更了的条目 (即, 只有 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'nick' 属性和 'role' 属性 (通常设置值为 &amp;quot;participant&amp;quot; 或 &amp;quot;visitor&amp;quot;) 但是不应该 SHOULD NOT 包含 'jid' 属性并且不能 MUST NOT 包含 'affiliation' 属性 (它用于管理如所有者那样的岗位而不是与会者那样的角色):&lt;br /&gt;
&lt;br /&gt;
'''例子 94. 主持人发送修改的发言权列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='voice4'&lt;br /&gt;
    to='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='Hecate'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='rosencrantz'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy fellow.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='guildenstern'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy fellow.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 95. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着为任何受影响的人发送更新的出席信息给所有房客, 如前文的用例所述，发送适当的扩展出席信息来指明发言权的变更.&lt;br /&gt;
&lt;br /&gt;
大家知道, 不能撤销一个房间所有者或管理员的发言权, 也不能撤销比发出请求的主持人岗位高的用户的发言权. 如果一个房间管理员尝试通过修改发言权列表来撤销这类用户的发言权, 服务必须 MUST 拒绝请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 96. 服务返回错误给试图撤销管理员，所有者或比发送者岗位更高的用户的发言权的发送者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voicetest'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===批准发言权申请===&lt;br /&gt;
&lt;br /&gt;
在本文的[[XEP-0045#申请发言权|申请发言权]]章节提到, 当服务接受到一个来自房客的请求，它应该 SHOULD 转发那个请求给房间的主持人(们). 为了达到这个目的, 服务应该 SHOULD 发送一个 &amp;lt;message/&amp;gt; 节给房间主持人(们), 这里 &amp;lt;message/&amp;gt; 节包含一个数据表格data form来批准或拒绝这个申请, 如下所示.&lt;br /&gt;
&lt;br /&gt;
'''例子 97. 申请批准发言权表格''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='crone1@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Voice request&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To approve this request for voice, select &lt;br /&gt;
      the &amp;amp;quot;Grant voice to this person?&amp;amp;quot;&lt;br /&gt;
      checkbox and click OK. To skip this request, &lt;br /&gt;
      click the cancel button.&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Requested role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#jid'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='User ID'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@shakespeare.lit/pda&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#roomnick'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Room Nickname'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#request_allow'&lt;br /&gt;
           type='boolean'&lt;br /&gt;
           label='Grant voice to this person?'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
为了批准这个申请, 主持人将提交此表格:&lt;br /&gt;
&lt;br /&gt;
'''例子 98. 批准发言权申请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='crone1@shakespeare.lit/pda'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#jid'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@shakespeare.lit/pda&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#roomnick'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#request_allow'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果主持人批准了这个发言权申请, 服务将授予发言权给该房客并发送一个出席信息更新，如本文[[XEP-0045#授予游客发言权|授予游客发言权]]章节所述.&lt;br /&gt;
&lt;br /&gt;
==管理员用例==&lt;br /&gt;
&lt;br /&gt;
一个房间管理员有权修改用户岗位的持久信息 (例如, 通过禁止用户) 并授予和撤销主持人权限, 但是无权修改房间的定义, 那是唯一属于房间所有者(们)的权力. 具体哪些动作是管理员可以执行的则取决于配置. 无论如何, 在 MUC 框架中的用途, 规定房间管理员最少拥有执行以下操作的权限:&lt;br /&gt;
&lt;br /&gt;
# 在房间里禁止一个用户&lt;br /&gt;
# 在房间里修改黑名单&lt;br /&gt;
# 授予或撤销成员资格&lt;br /&gt;
# 修改成员列表&lt;br /&gt;
# 授予或撤销主持人权力&lt;br /&gt;
# 修改主持人列表&lt;br /&gt;
&lt;br /&gt;
这些特性将由一个 请求/应答 request/response 式的交换来实现，使用 &amp;lt;iq/&amp;gt; 元素，包含满足 'http://jabber.org/protocol/muc#admin' 名字空间的子元素. 以下例子展示协议如何与实现互动以得到期望的功能. (以下除非显示地声明, 如果发送方的'from'地址中的&amp;lt;user@host&amp;gt;和任何房间管理员的纯JID都不同，接下来的任何管理请求必须 MUST 被拒绝; 这种情况下, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误.)&lt;br /&gt;
&lt;br /&gt;
===禁止用户===&lt;br /&gt;
&lt;br /&gt;
在房间里一个管理员或所有者可以禁止一个或多个用户. 这动作必须 MUST 基于房客的纯JID来执行. 为了禁止一个用户, 管理员必须 MUST 把该用户的岗位改为&amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 99. 管理员禁止用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 100. 管理员禁止用户(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把那个纯JID添加到黑名单, 应该 SHOULD 把被排斥者的昵称从已注册的昵称列表中移除, 并且必须 MUST 通知管理员或所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 101. 服务通知管理员或所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也移除任何还在房间中的被禁止的用户，通过发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给每个被禁止的房客, 在扩展的出席信息中包含一个状态码 301 , 可选地带上 reason (如果服务提供的话) 以及执行这个禁止动作的用户的纯JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 102. 服务移除被禁止的用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='southampton@henryv.shakespeare.lit/cambridge'&lt;br /&gt;
    to='earlofcambridge@shakespeare.lit/stabber'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='kinghenryv@shakespeare.lit'/&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='301'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
包含状态码可使客户端能够提交他们自己的通知消息 (例如, 适当的用户位置的信息). 可选的包含原因 reason 元素以及执行者 actor 使得被踢的用户能理解为什么他或她被踢了, 以及被踢的用户可以找谁去理论.&lt;br /&gt;
&lt;br /&gt;
通知主持人之后, 服务必须 MUST 接着通知剩余的房客那个被禁止的房客已经不在房间里了,即从被禁止用户发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给所有剩余的房客 (就像房客自愿退出房间时所做的一样), 包含状态码 status 以及可选的原因 reason 和执行者 actor. &lt;br /&gt;
&lt;br /&gt;
'''例子 103. 服务通知剩余的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    type='unavailable'&lt;br /&gt;
    from='southampton@henryv.shakespeare.lit/cambridge'&lt;br /&gt;
    to='exeter@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit/stabber'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='301'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
就像[[XEP-0045#踢出房客|踢出房客]]一样, 一个用户不能被自己岗位低的管理员禁止. 所以, 如果一个管理员尝试禁止一个所有者， 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者: &lt;br /&gt;
&lt;br /&gt;
'''例子 104. 服务对尝试禁止更高岗位用户返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个管理员或所有者尝试禁止他自己, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;conflict/&amp;gt; 错误给发送者. (注意:这和踢出自己时推荐的服务行为不同, 踢自己的行为服务是允许的.)&lt;br /&gt;
&lt;br /&gt;
===修改黑名单===&lt;br /&gt;
&lt;br /&gt;
房间管理员可能希望修改黑名单. 注意: 黑名单总是基于用户的纯JID. 要修改黑名单, 管理员首先向房间查询所有岗位为'outcast'的用户以得到黑名单.&lt;br /&gt;
&lt;br /&gt;
'''例子 105. 管理员请求黑名单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban2'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回黑名单给管理员; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性但不应该 SHOULD NOT 包含 'nick' 和 'role' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 106. 服务发送黑名单给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban2'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改黑名单. 为此, 管理员必须 MUST 发送变更的条目 (即, 仅是 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'affiliation' 属性 (通常设为&amp;quot;outcast&amp;quot;来禁止或&amp;quot;none&amp;quot;来取消禁止) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用来管理角色，例如与会者，而不是被排斥者岗位); 另外, reason 和 actor 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 107. 管理员发送修改的黑名单给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban3'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&amp;gt;&lt;br /&gt;
          jid='lordscroop@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='sirthomasgrey@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更新黑名单之后, 服务必须 MUST 通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 108. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban3'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着移除受影响的房客 (如果他们在房间里) 并从他们发送更新的出席信息 (包含适当的状态码) 给所有剩余的房客，如 &amp;quot;禁止用户&amp;quot; 用例所述. (服务应该 SHOULD 也移除从保留房间昵称列表中移除每个被禁止的用户的保留昵称, 如果必要.)&lt;br /&gt;
&lt;br /&gt;
当一个实体被一个房间禁止, 实现应该 SHOULD 按以下顺序匹配 JIDs (这些匹配规则和'''RFC 3921'''中定义的隐私列表的匹配规则是相同的):&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;user@domain/resource&amp;gt; (仅匹配特定的资源)&lt;br /&gt;
# &amp;lt;user@domain&amp;gt; (匹配任何资源)&lt;br /&gt;
# &amp;lt;domain/resource&amp;gt; (仅匹配特定资源)&lt;br /&gt;
# &amp;lt;domain&amp;gt; (匹配域名本身, 就像任何 user@domain 或 domain/resource 一样)&lt;br /&gt;
&lt;br /&gt;
一些管理员可能希望在一个 MUC 服务中的所有房间里禁止所有和特定域名相关的用户. 这个功能是一个服务级的特性，所以超过了本文的范围, 它定义在 '''XEP-0133'''里.&lt;br /&gt;
&lt;br /&gt;
===授予成员资格===&lt;br /&gt;
&lt;br /&gt;
管理员可以授予成员资格给一个用户; 方法是把用户的岗位改为 &amp;quot;member&amp;quot; (通常如果用户在房间里，基于昵称，如果用户不在房间里，则基于纯JID; 在这两种情况下如果提供了昵称, 那么这个昵称就是用户在这个房间的缺省昵称，如果实现支持那个功能的话):&lt;br /&gt;
&lt;br /&gt;
'''例子 109. 管理员授予成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 110. 管理员授予成员资格(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把这个用户添加到成员列表，然后通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 111. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;member&amp;quot;，指明授予了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 112. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间里, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 在这个消息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;member&amp;quot;，指明授予了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 113. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销成员资格===&lt;br /&gt;
&lt;br /&gt;
一个管理员可能想撤销一个用户的成员资格; 通过把该用户的岗位改为&amp;quot;none&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 114. 管理员撤销成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 115. 管理员撤销成员资格(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 从成员列表中移除该用户然后通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 116. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个用户的名义发送更新的出席信息节给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;none&amp;quot;，指明失去了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 117. 服务通知失去成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限会员的, 服务必须 MUST 从房间移除这个用户, 包含一个状态码 321 来指明用户被移除是因为岗位变更, 并通知所有剩余的房客:&lt;br /&gt;
&lt;br /&gt;
'''例子 118. 服务移除非会员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='321'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='321'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改成员列表===&lt;br /&gt;
&lt;br /&gt;
在一个仅限会员的房间的上下文里, 成员列表本质上是一个允许人们加入房间的白名单 &amp;quot;whitelist&amp;quot;. 任何不是成员的人等于是被禁止加入该房间, 即使他们的岗位不是&amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
在一个开放房间的上下文里, 成员列表只是一个注册了这个房间的用户 (纯JID和保留的昵称) 的列表. 这些用户可以出现在一个房间名册里, 有他们自己的保留房间昵称, 在搜索结果或类似FAQ里被返回给(查询者).&lt;br /&gt;
&lt;br /&gt;
推荐 RECOMMENDED 在仅限会员的房间里只让房间管理员拥有修改成员列表的权力. 为此, 管理员首先请求成员列表，通过查询房间里所有岗位为&amp;quot;member&amp;quot;的用户来实现:&lt;br /&gt;
&lt;br /&gt;
'''例子 119. 管理员请求成员列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 在一个仅限会员的房间里，服务也应该 SHOULD 返回成员列表给任何房客; 即, 当一个房间的成员请求房间列表时，它不应该 SHOULD NOT 生成一个 &amp;lt;forbidden/&amp;gt; 错误. 这个功能可帮助客户端展示所有现有的成员，即使他们中的一些人不在房间里, 例如. 帮助成员确定是否另一个用户应该被邀请. 服务也应该 SHOULD 允许任何成员接收成员列表，即使还不是一个房客（译注：即未进入房间）.&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回全部的成员列表给管理员，遵循 'http://jabber.org/protocol/muc#admin' 名字空间; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，每个正在房间里的成员可以 MAY 包含 'nick' 和 'role' 属性.&lt;br /&gt;
&lt;br /&gt;
'''例子 120. 服务发送成员列表给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member3'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改成员列表. 为此, 管理员必须 MUST 发送变更的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'affiliation' 属性(通常值设为 &amp;quot;member&amp;quot; 或 &amp;quot;none&amp;quot;) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，并且不能 MUST NOT 包含 'role' 属性(它是用来管理角色的，例如与会者，而不是成员的岗位):&lt;br /&gt;
&lt;br /&gt;
'''例子 121. 管理员发送修改的成员列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 修改成员列表然后通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 122. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 变更任何受影响的用户的岗位. 如果该用户已经从成员列表中移除了, 服务必须 MUST 把该用户的岗位从 &amp;quot;member&amp;quot; 变更为 &amp;quot;none&amp;quot;. 如果该用户已经被加入到成员列表, 服务必须 MUST 把该用户的岗位改成 &amp;quot;member&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
如果一个被移除的成员正在一个仅限会员的房间, 服务应该 SHOULD 踢出这个房客，如前文所述，通过把被移除的成员的角色改成 &amp;quot;none&amp;quot; 并发送适当的出席信息给这个被移除的成员来实现. 无论是否被移除的那个用户在或不在一个仅限会员的房间里, 服务必须 MUST 随后拒绝这个用户的进入.&lt;br /&gt;
&lt;br /&gt;
对所有的房间类型来说, 服务必须 MUST 以这个用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'affiliation'属性值设为&amp;quot;none&amp;quot;,以指明这个岗位的变更.&lt;br /&gt;
&lt;br /&gt;
'''例子 123. 服务发送失去成员资格的通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 服务必须 SHOULD 发送一个邀请给任何已加入到仅限会员的房间里的成员名单中的用户，如果该用户目前在该房间还没有岗位, 例如作为一个管理员或所有者(这类用户在定义时不在房间里; 同时要注意这个例子里使用了一个密码password而不是原因reason -- 这两个子元素都是可选的 OPTIONAL):&lt;br /&gt;
&lt;br /&gt;
'''例子 124. 房间发送邀请给新成员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
因为只有管理员们和所有者们应该 SHOULD 被允许修改成员列表, 一个实现可以 MAY 提供一个配置选项，在仅限会员的房间里开放邀请权限给任何成员. 这种情况下, 任何被发送的邀请都应该 SHOULD 自动触发被邀请者加入成员列表. 无论如何, 如果邀请权限被限于管理员们，而普通成员尝试发送邀请, 服务必须 MUST 拒绝这个邀请的的请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 125. 服务在普通成员尝试邀请其他人加入仅限会员的房间时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从开放房间发送的邀请不能 MUST NOT 触发被邀请者加入成员列表.&lt;br /&gt;
&lt;br /&gt;
如果一个用户被加入一个开放房间的成员列表并且该用户在该房间内, 服务必须 MUST 以该用户的名义发送更新的出席信息给所有房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'affiliation'属性值设为&amp;quot;member&amp;quot;,以指明这个岗位的变更.&lt;br /&gt;
&lt;br /&gt;
'''例子 126. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/hecate'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===授予主持人权限===&lt;br /&gt;
&lt;br /&gt;
管理员可能想授予主持人权限给一个与会者或游客; 通过把用户的角色改为 &amp;quot;moderator&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 127. 管理员授予主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 128. 管理员授予主持人权限(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='moderator'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 添加这个用户到主持人列表然后通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 129. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以该用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;moderator&amp;quot;,以指明添加了主持人权限.&lt;br /&gt;
&lt;br /&gt;
'''例子 130. 服务发送主持人权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销主持人权限===&lt;br /&gt;
&lt;br /&gt;
管理员可能想撤销用户的主持人权限. 一个管理员只可以 MAY 撤销岗位为&amp;quot;member&amp;quot; 或 &amp;quot;none&amp;quot; (也就是, 非管理员和所有者)的用户的主持人权限. 权限的撤销是通过把用户的角色改为 &amp;quot;participant&amp;quot;实现的:&lt;br /&gt;
&lt;br /&gt;
'''例子 131. 管理员撤销主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 132. 管理员撤销主持人权限(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 从主持人列表移除这个用户然后通知管理员成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 133. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以该用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user'  名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;participant&amp;quot;,以指明移除了主持人权限. &lt;br /&gt;
&lt;br /&gt;
'''例子 134. 服务通知失去了主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
大家知道, 管理员不 MUST NOT 被允许从岗位为 &amp;quot;owner&amp;quot; 或 &amp;quot;admin&amp;quot;的用户撤销主持人权限. 如果一个管理员尝试撤销这类用户的权限, 服务必须MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 135. 服务在用户尝试撤销管理员或所有者的主持人权限时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='modtest'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='secondwitch' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改主持人列表===&lt;br /&gt;
&lt;br /&gt;
管理员可能希望修改主持人列表. 为此, 管理员首先通过请求房间内所有角色为'moderator'的用户来请求主持人列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 136. 管理员请求主持人列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回主持人列表给管理员; 每个条目必须 MUST 包含 'jid', 'nick', 'role' 属性并应该 SHOULD 包含 'affiliation' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 137. 服务发送主持人列表给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod3'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改主持人列表. 为此, 管理员必须 MUST发送修改的条目(即, 仅&amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'jid' 属性和'role' 属性(通常值设为 &amp;quot;member&amp;quot; 或 &amp;quot;participant&amp;quot;) 但不应该 SHOULD NOT 包含 'nick' 属性并且不能 MUST NOT 包含 'affiliation' 属性(它被用于管理类似管理员这样的岗位而不是主持人这样的角色):&lt;br /&gt;
&lt;br /&gt;
'''例子 138. 管理员发送修改了的主持人列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 修改主持人列表并通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 139. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 随后以所有受影响的用户发送更新的出席信息给所有的房客, 支出主持人权限的变更，通过发送前面用例所述的适当的扩展出席信息.&lt;br /&gt;
&lt;br /&gt;
显然, 房间所有者或房间管理员的主持人权限不能被撤销. 如果一个房间管理员尝试通过修改主持人列表来撤销这类用户的主持人权限, 服务必须 MUST 拒绝请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 140. 服务在用户尝试撤销管理员或所有者的主持人权限时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='modtest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===批准注册申请===&lt;br /&gt;
&lt;br /&gt;
如果一个服务不自动接受注册到房间的请求, 它可以 MAY 为房间管理员提供一个方法来批准或拒绝来自 Jabber 的注册请求(替代方案是, 它可能提供一个 web 接口或一些其他管理工具). 对这个服务来说，最简单的办法就是，当接收到注册请求时发送一个 &amp;lt;message/&amp;gt; 节给房间管理员(们), 这里的&amp;lt;message/&amp;gt; 节包含一个数据表格 Data Form asking 用来询问管理员是否批准用户的注册申请. 推荐 RECOMMENDED 以下数据表格 Data Form，但是实现可以 MAY 使用完全不同的表格, 或or 在下面的表格基础上补充字段.&lt;br /&gt;
&lt;br /&gt;
'''例子 141. 注册申请批准表格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='crone1@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Registration request&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To approve this registration request, select the&lt;br /&gt;
      &amp;amp;quot;Allow this person to register with the room?&amp;amp;quot;&lt;br /&gt;
      checkbox and click OK. To skip this request, click the &lt;br /&gt;
      cancel button.&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_first'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Given Name'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Brunhilde&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_last'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Family Name&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Entwhistle-Throckmorton&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_roomnick'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Desired Nickname&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_url'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;User URL&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;http://witchesonline/~hag66/&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_email'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Email Address&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@witchesonline&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_faqentry'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;FAQ Entry&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Just another witch.&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_allow'&lt;br /&gt;
           type='boolean'&lt;br /&gt;
           label='Allow this person to register with the room?'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果管理员批准了注册申请, 服务将把该用户注册到房间.&lt;br /&gt;
&lt;br /&gt;
更多高级的批准机制(例如, 使用特定命令[http://xmpp.org/extensions/xep-0050.html Ad-Hoc Commands] [[XEP-0045#附录G:备注|19]]来接收注册申请列表,就像 [http://xmpp.org/extensions/xep-0060.html Publish-Subscribe] [[XEP-0045#附录G:备注|20]]里所做的一样) 超出了本文的范围.&lt;br /&gt;
&lt;br /&gt;
==所有者用例==&lt;br /&gt;
&lt;br /&gt;
每个房间必须 MUST 至少有一个所有者, 而所有者(或一个成功者)在一个房间的生命周期里是这个房间长期存在的属性(例如, 所有者在退出一个持久性的房间时不会失去所有权). 本文假定(初始的) 房间所有者是那个新建了该房间的用户并且有一个房间所有者有权修改房间配置选项的定义，例如房间类型. 理想情况下, 房间所有者不仅能指定房间类型(密码保护的, 仅限会员的, 等等) 而且包括如本文的 [XEP-0045#需求|需求]章节所述的房间特定属性. 另外, 如果所有者能指定其他所有者们的JID也是不错的, 但那将取决于具体实现.&lt;br /&gt;
&lt;br /&gt;
为了让配置选项更加广泛提供必要的伸缩性, 房间配置将使用 Data Forms ('''XEP-0004'''), 通过使用由 'http://jabber.org/protocol/muc' 名字空间触发. 也就是, 如果一个实体在它请求加入房间的 join/request 里不包含 MUC 名字空间, 那么服务将立刻新建房间，在新建房间之前不等待通过数据表格进行配置(这保证了和旧的&amp;quot;groupchat 1.0&amp;quot;协议的向后兼容); 无论如何, 如果房间的 join/create 请求包含了 MUC 扩展, 那么服务在新建和解锁该房间之前将通过数据表格请求配置.&lt;br /&gt;
&lt;br /&gt;
注意: 以下展示的配置选项列出了本文的需求章节的所有特性和房间类型; 无论如何, 实际的配置选项和表格布局将取决于实现和具体的布署. 而且, 这些只是例子，不代表这些就是房间可以拥有的所有允许或需要的配置选项. 一个特定的实现或布署可以 MAY 选择提供额外的配置选项(敏感词过滤, 设置房间的缺省语言, 消息记录, 等等), 这就是为什么在这里使用 'jabber:x:data' 协议是很有价值的.&lt;br /&gt;
&lt;br /&gt;
===新建房间===&lt;br /&gt;
====一般注意事项====&lt;br /&gt;
&lt;br /&gt;
新建房间的权限可以 MAY 限制在特定的用户群或可以 MAY 保留给一个服务级别的管理员. 如果访问被拒绝而一个用户试图新建一个房间, 服务必须MUST 返回一个 &amp;lt;not-allowed/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 142. 服务通知用户不能新建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果访问不限制, 服务必须 MUST 允许用户按以下步骤新建房间.&lt;br /&gt;
&lt;br /&gt;
从房间创建的视角来看, 本质上有两种房间:&lt;br /&gt;
&lt;br /&gt;
* 即时房间&amp;quot;Instant rooms&amp;quot; -- 可以立刻访问并基于某些缺省配置自动创建.&lt;br /&gt;
* 保留房间&amp;quot;Reserved rooms&amp;quot; -- 在任何人访问之前由房间配置者手动创建.&lt;br /&gt;
&lt;br /&gt;
新建和配置这些房间的流程如下:&lt;br /&gt;
&lt;br /&gt;
# 用户必须 MUST 发送出席信息到 &amp;lt;room@service/nick&amp;gt; 并声明他或她对MUC协议的支持，通过包含一个扩展的出席信息,并包含在一个空的满足'http://jabber.org/protocol/muc'名字空间的 &amp;lt;x/&amp;gt; 子元素里(注意这里不包含 '#owner' 或 '#user' 后缀).&lt;br /&gt;
# 如果用户被允许新建房间并且房间还不存在, 服务必须 MUST 根据一些缺省配置新建此房间, 指定请求的用户成为初始的房间拥有者, 并增加这个拥有者到该房间但不允许任何别的用户进入该房间(有效地锁定 &amp;quot;locking&amp;quot;该房间). 从房间发送由所有者收到的初始的出席信息节必须 MUST 包含扩展的出席信息以指出该用户的状态为一个所有者并承认房间已经被创建了(通过状态码 201) 并等待配置.&lt;br /&gt;
# 如果初始的房间所有者想新建和配置一个保留房间, 房间所有者必须 MUST 接着请求一个配置，通过发送类型为&amp;quot;get&amp;quot;的IQ节并包含一个空的满足'http://jabber.org/protocol/muc#owner'名字空间的&amp;lt;query/&amp;gt;元素给该房间 ,然后完成第4和第5步. 如果房间所有者喜欢新建一个即时房间, 该房间所有者必须 MUST 发送一个遵循'http://jabber.org/protocol/muc#owner'名字空间的 query 元素并包含一个遵循 'jabber:x:data' 名字空间的空的类型为 &amp;quot;submit&amp;quot; 的 &amp;lt;x/&amp;gt; 元素, 然后跳到第6步.&lt;br /&gt;
# 如果房间所有者请求了一个配置表格, 服务必须 MUST 发送一个包含配置表格并遵循 'jabber:x:data'名字空间的 IQ 给房间拥有者. 如果没有配置选项可用, 房间必须 MUST 返回一个空的 query 元素给房间所有者.&lt;br /&gt;
# 初始的房间所有者应该 SHOULD 为该房间提供一个开始的配置(或接受缺省配置)，通过发送&amp;quot;set&amp;quot;类型并包含完整的配置表格的 IQ . 另外, 房间所有者可以 MAY 取消配置过程. (实现可以 MAY 设置一个初始化配置的超时, 这样如果房间所有者再给定的超时时间内不配置房间, 房间所有者就被假定已经接受了缺省得配置或取消了配置过程.)&lt;br /&gt;
# 一旦服务从初始房间所有者接收了完整的配置表格(或接收到了一个即时房间的请求), 服务必须 MUST 解锁 &amp;quot;unlock&amp;quot; 这个房间 (即, 允许其他用户进入此房间) 并发送&amp;quot;result&amp;quot;类型的 IQ  给房间所有者. 如果服务接收到了取消（指令）, 它必须 MUST 销毁这个房间.&lt;br /&gt;
&lt;br /&gt;
以下例子展示了这个协议流程.&lt;br /&gt;
&lt;br /&gt;
首先, Jabber用户必须 MUST 发送出席信息给房间, 包含空的 &amp;lt;x/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc' 名字空间(当他寻求进入一个房间时也发送和这同样的节).&lt;br /&gt;
&lt;br /&gt;
'''例子 143. Jabber用户新建一个房间并声明对多用户聊天的支持'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该房间不存在, 服务应该 SHOULD 新建这个房间(取决于关于新建房间的本地策略), 指定发出请求的用户的纯JID成为所有者, 添加这个所有者到房间, 并通过发送以下格式的出席信息节承认房间新建成功:&lt;br /&gt;
&lt;br /&gt;
'''例子 144. 服务承认房间新建成功'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='201'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接收到该房间已经创建的通知之后, 房间所有者需要决定是否接受缺省的房间配置(即, 新建一个即时房间 &amp;quot;instant room&amp;quot;) 还是做一些不同于缺省房间设置的配置 (即, 新建一个保留房间&amp;quot;reserved room&amp;quot;). 完成这两个用例的协议流程展示如下.&lt;br /&gt;
&lt;br /&gt;
注意: 如果如上的发送到一个不存在的房间里的出席信息节没有包含一个遵循 'http://jabber.org/protocol/muc'名字空间的 &amp;lt;x/&amp;gt; 元素, 服务应该SHOULD 立刻新建一个缺省的房间(即, 它必须 MUST 假定客户端支持 &amp;quot;groupchat 1.0&amp;quot; 而不是 Multi-User Chat, 所以在等待房间创建者决定是创建即时房间还是保留房间的时候,它不能 MUST NOT 锁定这个房间).&lt;br /&gt;
&lt;br /&gt;
====新建即时房间====&lt;br /&gt;
&lt;br /&gt;
如果初始的房间所有者想接受缺省的房间配置(即, 新建一个即时房间&amp;quot;instant room&amp;quot;), 房间所有者必须 MUST 拒绝初始配置表格,通过发送一个 IQ set 给 &amp;lt;room@service&amp;gt; 本身,包含一个遵循'http://jabber.org/protocol/muc#owner'名字空间的 &amp;lt;query/&amp;gt; 元素, 这里 &amp;lt;query/&amp;gt; 的唯一子元素是一个空的遵循'jabber:x:data'名字空间的 &amp;lt;x/&amp;gt; 元素并且拥有一个 'type'属性值为 &amp;quot;submit&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 145. 所有者请求即时房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着解锁该房间并允许其他实体加入它.&lt;br /&gt;
&lt;br /&gt;
====新建保留房间====&lt;br /&gt;
&lt;br /&gt;
如果初始的房间所有者想新建并配置一个保留房间, 这个房间所有者必须 MUST 请求初始配置表格,通过发送一个 IQ get 给 &amp;lt;room@service&amp;gt; 本身,包含一个空的遵循 'http://jabber.org/protocol/muc#owner' 名字空间的 &amp;lt;query/&amp;gt; 元素 :&lt;br /&gt;
&lt;br /&gt;
'''例子 146. 所有者请求配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间还不存在, 服务必须 MUST 返回一个初始的房间配置表单给该用户. (注意: 以下例子展示一个配置选项的典型例子. 已登记用于房间创建和配置的所有 x:data 字段列表由 XMPP Registrar 维护; 参见本文的 [[XEP-0045#XMPP注册项事项|XMPP注册项事项]] 章节.)&lt;br /&gt;
&lt;br /&gt;
'''例子 147. 服务发送配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Configuration for &amp;quot;darkcave&amp;quot; Room&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
          Your room darkcave@macbeth has been created!&lt;br /&gt;
          The default configuration is as follows:&lt;br /&gt;
            - No logging&lt;br /&gt;
            - No moderation&lt;br /&gt;
            - Up to 20 occupants&lt;br /&gt;
            - No password required&lt;br /&gt;
            - No invitation required&lt;br /&gt;
            - Room is not persistent&lt;br /&gt;
            - Only admins may change the subject&lt;br /&gt;
            - Presence broadcasted for all users&lt;br /&gt;
          To accept the default configuration, click OK. To&lt;br /&gt;
          select a different configuration, please complete&lt;br /&gt;
          this form.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural-Language Room Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomname'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Short Description of Room'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomdesc'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural Language for Room Discussions'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_lang'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Enable Public Logging?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Change Subject?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Invite Others?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Maximum Number of Occupants'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='10'&amp;gt;&amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='20'&amp;gt;&amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='30'&amp;gt;&amp;lt;value&amp;gt;30&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='50'&amp;gt;&amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='100'&amp;gt;&amp;lt;value&amp;gt;100&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='None'&amp;gt;&amp;lt;value&amp;gt;none&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles for which Presence is Broadcast'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_presencebroadcast'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles and Affiliations that May Retrieve Member List'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_getmemberlist'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Publicly Searchable?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Persistent?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Moderated?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Members-Only?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password Required to Enter?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          If a password is required to enter this room,&lt;br /&gt;
          you must specify the password below.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password'&lt;br /&gt;
          type='text-private'&lt;br /&gt;
          var='muc#roomconfig_roomsecret'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Who May Discover Real JIDs?'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderators Only'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Anyone'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;anyone&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional people who have&lt;br /&gt;
          administrative privileges in the room. Please&lt;br /&gt;
          provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Admins'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomadmins'/&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional owners for this&lt;br /&gt;
          room. Please provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Owners'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomowners'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: _whois 配置选项指定该房间是非匿名的(值为 &amp;quot;anyone&amp;quot;), 半匿名的(值为&amp;quot;moderators&amp;quot;), 还是全匿名的(值为&amp;quot;none&amp;quot;, 不显示在这).&lt;br /&gt;
&lt;br /&gt;
如果没有配置选项可用, 服务必须 MUST 返回空的 query 元素给房间所有者:&lt;br /&gt;
&lt;br /&gt;
'''例子 148. 服务通知所有者没有配置可用'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间所有者应该 SHOULD 接着填好表单并提交给服务.&lt;br /&gt;
&lt;br /&gt;
'''例子 149. 所有者提交配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomname'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;A Dark Cave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomdesc'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomsecret'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;cauldronburn&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomadmins'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;wiccarocks@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hecate@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间创建成功, 服务必须 MUST 通知新的房间所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 150. 服务通知新房间所有者成功'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果因为指定的房间配置违反了一个或多个服务策略而导致房间创建失败 (例如, 因为密码保护房间的密码为空), 服务必须 MUST 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
'''例子 151. 服务通知所有者请求的配置选项不被接受'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一方面, 房间所有者可以 MAY 取消配置过程:&lt;br /&gt;
&lt;br /&gt;
'''例子 152. 所有者取消初始的配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='cancel'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间所有者取消了初始的房间配置, 服务应该 SHOULD 销毁房间, 确保发送不可用出席信息给房间所有者 (详见 &amp;quot;销毁房间&amp;quot; 用例).&lt;br /&gt;
&lt;br /&gt;
如果房间所有者在提交表单之前因为任何原因下线了(例如, 失去连接), 服务将接收到一个类型为 &amp;quot;unavailable&amp;quot; 的出席信息节，从所有者到所有者的 &amp;lt;room@service/nick&amp;gt; 或到 &amp;lt;room@service&amp;gt; (或两者). 服务必须 MUST 接着销毁这个房间, 发送一个 &amp;quot;unavailable&amp;quot; 类型的出席信息节，从房间到所有者，包含一个 &amp;lt;destroy/&amp;gt; 元素以及 reason (子元素)(如果提供了) ，参见本文的 [[XEP-0045#销毁房间|销毁房间]]章节.&lt;br /&gt;
&lt;br /&gt;
====申请唯一房间名====&lt;br /&gt;
&lt;br /&gt;
在一些场合 (例如, 当 [[XEP-0045#把一对一聊天转为多用户会议|把一对一聊天转为会议]]), 房间创建者可能想在尝试新建房间之前请求一个唯一的房间名 (例如, 避免可能的房间冲突). 为此, 服务可以 MAY 如本章所述支持这个特性. (如果服务支持这个特性, 它必须 MUST 在对服务发现信息请求应答时返回一个 &amp;quot;http://jabber.org/protocol/muc#unique&amp;quot; 特性.)&lt;br /&gt;
&lt;br /&gt;
房间创建者通过发送一个 IQ-get 给服务本身来请求唯一房间名, 这个IQ节中包含一个空的 &amp;lt;unique/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc#unique' 名字空间:&lt;br /&gt;
&lt;br /&gt;
'''例子 153. 实体请求唯一房间名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='unique1'&lt;br /&gt;
    to='chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;unique xmlns='http://jabber.org/protocol/muc#unique'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果服务支持这个特性, 它应该 SHOULD 以 XML 字符数据的方式返回一个唯一房间名，包含一个 &amp;lt;unique/&amp;gt; 元素 (但不创建该房间):&lt;br /&gt;
&lt;br /&gt;
'''例子 154. 服务返回唯一房间名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='chat.shakespeare.lit'&lt;br /&gt;
    id='unique1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;unique xmlns='http://jabber.org/protocol/muc#unique'&amp;gt;&lt;br /&gt;
    6d9423a55f499b29ad20bf7b2bdea4f4b885ead1&lt;br /&gt;
  &amp;lt;/unique&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 拒绝返回一个唯一房间名给一个没有资格创建房间的实体, 或那些发送请求唯一房间名过多次数的实体, 等等.&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 使用算法保证房间名的创建在服务上下文中是唯一的 (例如, 对发出请求的JID,datetime,和random salt的SHA-1 哈希运算).&lt;br /&gt;
&lt;br /&gt;
房间创建者将接着使用 XML 字符数据 &amp;lt;unique/&amp;gt; 元素作为它请求的房间JID的节点标识符(ID):&lt;br /&gt;
&lt;br /&gt;
'''例子 155. 所有者以唯一名创建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence &lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='6d9423a55f499b29ad20bf7b2bdea4f4b885ead1@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===随后的房间配置===&lt;br /&gt;
&lt;br /&gt;
在指定房间的初始配置之后的任何时间, 房间所有者可能想修改房间配置. 为此, 房间所有者必须 MUST 向房间发出一个新的配置表单请求,通过发送一个 IQ 到 &amp;lt;room@service&amp;gt; ，包含一个空的 &amp;lt;query/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc#owner' 名字空间.&lt;br /&gt;
&lt;br /&gt;
'''例子 156. 所有者请求配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='config1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 157. 服务禁止非所有者的访问配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='configures'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 服务必须 MUST 以当前使用的选项组作为缺省值发送一个配置表单给房间所有者:&lt;br /&gt;
&lt;br /&gt;
'''例子 158. 服务发送配置表单给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='config1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Configuration for &amp;quot;darkcave&amp;quot; Room&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
        Complete this form to make changes to&lt;br /&gt;
        the configuration of your room.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural-Language Room Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomname'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;A Dark Cave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Short Description of Room'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomdesc'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Enable Public Logging?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Change Subject?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Invite Others?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Maximum Number of Occupants'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='10'&amp;gt;&amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='20'&amp;gt;&amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='30'&amp;gt;&amp;lt;value&amp;gt;30&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='50'&amp;gt;&amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='100'&amp;gt;&amp;lt;value&amp;gt;100&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='None'&amp;gt;&amp;lt;value&amp;gt;none&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles for which Presence is Broadcast'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_presencebroadcast'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles and Affiliations that May Retrieve Member List'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_getmemberlist'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Publicly Searchable?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Persistent?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Moderated?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Members Only?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password Required for Entry?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          If a password is required to enter this room,&lt;br /&gt;
          you must specify the password below.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password'&lt;br /&gt;
          type='text-private'&lt;br /&gt;
          var='muc#roomconfig_roomsecret'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;cauldronburn&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Who May Discover Real JIDs?'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderators Only'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Anyone'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;anyone&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional people who have&lt;br /&gt;
          administrative privileges in the room. Please&lt;br /&gt;
          provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Admins'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomadmins'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;wiccarocks@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hecate@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional owners for this&lt;br /&gt;
          room. Please provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Owners'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomowners'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有配置选项可用, 服务必须 MUST 返回一个空的 query 元素给房间所有者，如前面的用例所示.&lt;br /&gt;
&lt;br /&gt;
该房间所有者应该 SHOULD 接着以更新的配置信息提交表单.&lt;br /&gt;
&lt;br /&gt;
另外, 房间所有者可以 MAY 取消这次配置过程:&lt;br /&gt;
&lt;br /&gt;
'''例子 159. 所有者取消随后的配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='config2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='cancel'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间所有者取消随后的配置, 服务必须 MUST 让该房间的配置保持和房间所有者请求这次配置之前一样.&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个房间管理员失去管理权限，而这个管理员正在房间里, 该房间必须 MUST 为那个管理员发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;member&amp;quot; 或 'role' 属性值为 &amp;quot;participant&amp;quot; 或 &amp;quot;visitor&amp;quot; ，以适当地表达岗位级别和房间类型:&lt;br /&gt;
&lt;br /&gt;
'''例子 160. 服务通知失去管理员岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个用户获得管理员权限，而这个用户正在房间里, 房间必须 MUST 为那个用户发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 或 'role' 属性值为 &amp;quot;admin&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
'''例子 161. 服务通知所有用户有人获得管理员岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个房间所有者失去所有者权限，而这个所有者正在房间里, 该房间必须 MUST 为那个所有者发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 或 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 162. 服务通知失去所有者岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有其他所有者，服务不能 MUST NOT 允许一个所有者撤销他或她自己的所有权; 如果一个所有者企图这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给这个所有者. 然而, 如果没有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有者权限.&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个用户获得所有者权限，而这个用户正在房间里, 房间必须 MUST 为那个用户发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; 或 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 163. 服务通知所有用户有人获得所有者权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致房间类型变成仅限会员，但还有非成员在房间里, 服务必须 MUST 从房间移除任何非成员，并在发送给那些剩余的房客的 '不可用' 出席信息节里包含状态码 322.&lt;br /&gt;
&lt;br /&gt;
====配置变更通知====&lt;br /&gt;
&lt;br /&gt;
当一个房间的配置变更会对房间的隐私和安全策略产生影响时，该房间必须 MUST 发送通知给所有房客. 这个通知将包括一个 &amp;lt;message/&amp;gt; 节，包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 元素,  &amp;lt;x/&amp;gt; 元素则只有一个 &amp;lt;status/&amp;gt; 子元素，其 'code' 属性为一个适当的值. 这是例子:&lt;br /&gt;
&lt;br /&gt;
'''例子 164. 配置状态码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
         type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;status code='170'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间配置中和隐私相关的策略变更导致生成这些状态码，如下:&lt;br /&gt;
&lt;br /&gt;
* 如果房间日志功能可用了, 状态码 170.&lt;br /&gt;
* 如果房间日志现在禁止了, 状态码 171.&lt;br /&gt;
* 如果房间现在是非匿名的了, 状态码 172.&lt;br /&gt;
* 如果房间现在是半匿名的了, 状态码 173.&lt;br /&gt;
* 如果房间现在是全匿名的了, 状态码 174.&lt;br /&gt;
&lt;br /&gt;
对更多其他配置变更, 房间应该 SHOULD 发送状态码 104 这样感兴趣的房客如果想要的话可以接受到更新的房间配置.&lt;br /&gt;
&lt;br /&gt;
===授予所有者权限===&lt;br /&gt;
&lt;br /&gt;
如果实现允许, 一个所有者可以 MAY 授予所有权给其他用户; 只要把用户的岗位改成&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 165. 所有者授予所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 166. 所有者授予所有权(饱含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把用户添加到所有者列表并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 167. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已授予所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
'''例子 168. 服务发送所有权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/hecate'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已授予所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; . &lt;br /&gt;
&lt;br /&gt;
'''例子 169. 服务发送所有权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销所有者权限===&lt;br /&gt;
&lt;br /&gt;
实现可以 MAY 允许一个所有者撤销其他用户的所有权; 只要把用户的岗位改成非&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 170. 所有者撤销所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt;元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 171. 所有者撤销所有权(包含一个原因)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有其它所有者，服务不能 MUST NOT 允许一个所有者撤销他或她自己的所有权; 如果一个所有者尝试这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该所有者. 然而, 如果有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有权.&lt;br /&gt;
&lt;br /&gt;
如果一个实现不允许所有者撤销另一个用户的所有权, 实现必须 MUST 返回一个 &amp;lt;not-authorized/&amp;gt; 错误给做出这个请求的所有者.&lt;br /&gt;
&lt;br /&gt;
注意: 允许一个所有者移除其它用户的所有权能给房间管理一个折衷的控制模式; 所以这个特性是可选的 OPTIONAL, 并且鼓励实现支持通过一个只有拥有服务范围管理权限的用户使用的接口来移除所有者.&lt;br /&gt;
&lt;br /&gt;
其它情况下, 服务必须 MUST 把用户从所有者列表移除并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 172. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;owner&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值:&lt;br /&gt;
&lt;br /&gt;
'''例子 173. 服务通知失去所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;owner&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
'''例子 174. 服务发送失去所有权通知给所有房客 '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改所有者列表===&lt;br /&gt;
&lt;br /&gt;
如果实现允许, 一个房间所有者可能想修改所有者列表. 为此, 所有者首先请求所有者列表，通过向房间请求所有岗位为 'owner'的用户.&lt;br /&gt;
&lt;br /&gt;
'''例子 175. 所有者请求所有者列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='owner3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 接着返回所有者列表给所有者; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，对任何正是一名房客（也就是正在房间里）的所有者可以 MAY 包含 'nick' 和 'role' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 176. 服务发送所有者列表给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='crone1@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
所有者可以 MAY 接着修改所有者列表. 为此, 所有者必须 MUST 发送修改的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; [[XEP-0045#附录G:备注|21]]每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用于管理参与者之类的角色，而不是所有者之类的岗位):&lt;br /&gt;
&lt;br /&gt;
'''例子 177. 所有者发送修改过的所有者列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='owner4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
只有所有者被允许修改所有者列表. 如果一个非所有者试图察看或修改所有者列表, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 178. 服务对于非所有者试图修改所有者列表返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='ownertest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' &lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有别的所有者，服务不能 MUST NOT 允许一个所有者撤销自己的所有权; 如果一个所有者尝试这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该所有者. 然而, 如果有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有权. &lt;br /&gt;
&lt;br /&gt;
其它情况下, 服务必须 MUST 修改所有者列表并通知所有者成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 179. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也为任何因前述所有者列表修改而导致的岗位变化而发送出席信息通知.&lt;br /&gt;
&lt;br /&gt;
===授予管理员权限===&lt;br /&gt;
&lt;br /&gt;
一个所有者可以授予管理员权限给一个成员或无岗位的用户; 只要把用户的岗位改成&amp;quot;admin&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 180. 所有者授予管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL. &lt;br /&gt;
&lt;br /&gt;
'''例子 181. 所有者授予管理员权限(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把用户添加到管理员列表并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 182. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已授予管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值. &lt;br /&gt;
&lt;br /&gt;
'''例子 183. 服务发送管理员权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已授予管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 184. 服务发送管理员权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销管理员权限===&lt;br /&gt;
&lt;br /&gt;
一个所有者可能想撤销一个用户的管理员权限; 只要把用户的岗位改成非&amp;quot;admin&amp;quot;和非&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 185. 所有者撤销管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt;元素是可选的 OPTIONAL. &lt;br /&gt;
&lt;br /&gt;
'''例子 186. 所有者撤销管理员权限(包含一个原因)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把该用户从管理员列表移除并接着通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 187. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已失去管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非&amp;quot;admin&amp;quot;非&amp;quot;owner&amp;quot;, 并且 'role' 属性值为根据岗位和房间类型确定的适当的值: &lt;br /&gt;
&lt;br /&gt;
'''例子 188. 服务通知失去管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;admin&amp;quot; . &lt;br /&gt;
&lt;br /&gt;
'''例子 189. 服务通知失去管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改管理员列表===&lt;br /&gt;
&lt;br /&gt;
一个房间所有者可能想修改管理员列表. 为此, 所有者首先请求管理员列表，通过向房间请求所有岗位为 'admin'的用户. &lt;br /&gt;
&lt;br /&gt;
'''例子 190. 所有者请求管理员列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/desktopaffiliation&lt;br /&gt;
    id='admin3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 接着返回管理员列表给所有者; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，对任何正是一名房客（也就是正在房间里）的管理员可以 MAY 包含 'nick' 和 'role' 属性: &lt;br /&gt;
&lt;br /&gt;
'''例子 191. 服务发送管理员列表给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          nick='secondwitch'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
所有者可以 MAY 接着修改管理员列表. 为此, 所有者必须 MUST 发送修改的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; [[XEP-0045#附录G:备注|22]] 每个条目必须 MUST 包含 'affiliation'属性(通常值为 &amp;quot;admin&amp;quot; 或 &amp;quot;none&amp;quot;) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用于管理参与者之类的角色，而不是管理员之类的岗位): &lt;br /&gt;
&lt;br /&gt;
'''例子 192. 所有者发送修改的管理员列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='admin4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
只有所有者被允许修改管理员列表. 如果一个非所有者试图察看或修改所有者列表, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者: &lt;br /&gt;
&lt;br /&gt;
'''例子 193. 服务对于非所有者试图修改管理员列表返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admintest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin' &lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 修改管理员列表并通知所有者成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 194. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也为任何因前述管理员列表修改而导致的岗位变化而发送出席信息通知.&lt;br /&gt;
&lt;br /&gt;
===销毁房间===&lt;br /&gt;
&lt;br /&gt;
房间所有者必须 MUST 能够销毁一个房间, 特别是如果这个房间不是持久房间的时候. 流程如下:&lt;br /&gt;
&lt;br /&gt;
# 房间所有者请求销毁房间, 如果必要的话指出一个原因 reason 和一个备用场地.&lt;br /&gt;
# 该房间移除所有房客(包含适当的关于备用场地和被移除的原因的信息) 并销毁房间, 即使它被定义为持久房间.&lt;br /&gt;
&lt;br /&gt;
不像前述的, 本文不指定一个MUC服务实现收到一个销毁房间请求之后将会如何做. 例如, 如果房间定义为持久地, 一个实现可以 MAY 选择锁定房间I，这样它不能被重用, 把加入该房间的请求重定向到替代场地, 或邀请当前的参与者到新的房间; 无论如何, 这些行为是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
为了销毁一个房间, 房间所有者必须 MUST 发送一个 IQ set 指令到要销毁的房间的地址. 这个 &amp;lt;iq/&amp;gt; 节将包含一个遵循 'http://jabber.org/protocol/muc#owner' 名字空间的 &amp;lt;query/&amp;gt; 元素，它将包含一个 &amp;lt;destroy/&amp;gt; 元素. 替代场地的地址可以 MAY 用这个 &amp;lt;destroy/&amp;gt; 元素的 'jid' 属性来提供. 一个密码保护的替代场地可以 MAY 通过 &amp;lt;destroy/&amp;gt; 元素的 &amp;lt;password/&amp;gt; 子元素的 XML 字符数据来提供. 摧毁房间的原因可以 MAY 通过 &amp;lt;destroy/&amp;gt; 元素的 &amp;lt;reason/&amp;gt; 子元素的 XML 字符数据来提供.&lt;br /&gt;
&lt;br /&gt;
以下例子展示了协议发送和接收的元素:&lt;br /&gt;
&lt;br /&gt;
'''例子 195. 所有者提交房间摧毁请求'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='begone'&lt;br /&gt;
    to='heath@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务负责移除所有房客. 它不应该 SHOULD NOT 广播类型为&amp;quot;unavailable&amp;quot;的出席信息节给所有房客, 只需要发送一个&amp;quot;unavailable&amp;quot;类型的出席信息节给每个房客，这样该用户知道他或她已经从房间移除了. 如果所有者的扩展出席信息指定了一个替代场地的 JID 以及房间销毁的原因, 这个出席信息节必须 MUST 包含那些信息.&lt;br /&gt;
&lt;br /&gt;
'''例子 196. 服务移除每个房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 197. 服务通知所有者成功销毁房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='begone'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果在一个销毁请求中接收到的'from'地址的 &amp;lt;user@host&amp;gt; 和一个房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 198. 服务拒绝由非所有者提交的销毁请求'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='destroytest'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==错误和状态码==&lt;br /&gt;
===错误码===&lt;br /&gt;
&lt;br /&gt;
和'http://jabber.org/protocol/muc#user' 名字空间相关的错误码相当简单, 总结于下表之中. 关于传统的错误码到XMPP格式的错误之间的映射的详细信息, 参见 [http://xmpp.org/extensions/xep-0086.html 错误条件映射] [[XEP-0045#附录G:备注|23]]; 实现应该 SHOULD 支持传统和XMPP错误处理两者.&lt;br /&gt;
&lt;br /&gt;
'''表9: http://jabber.org/protocol/muc#user 名字空间的错误码'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!码 !!类型 !!元素 !!上下文 !!目的&lt;br /&gt;
|-&lt;br /&gt;
|401 ||Error ||Presence  ||进入一个房间 ||通知用户需要密码&lt;br /&gt;
|-&lt;br /&gt;
|403 ||Error ||Presence  ||进入一个房间 ||通知用户他或她被房间禁止了&lt;br /&gt;
|-&lt;br /&gt;
|404 ||Error ||Presence  ||进入一个房间 ||通知用户房间不存在&lt;br /&gt;
|-&lt;br /&gt;
|405 ||Error ||Presence  ||进入一个房间 ||通知用户限制创建房间&lt;br /&gt;
|-&lt;br /&gt;
|406 ||Error ||Presence  ||进入一个房间 ||通知用户必须使用保留的房间昵称&lt;br /&gt;
|-&lt;br /&gt;
|407 ||Error ||Presence  ||进入一个房间 ||通知用户他或她不在成员列表中&lt;br /&gt;
|-&lt;br /&gt;
|409 ||Error ||Presence  ||进入一个房间 ||通知用户他或她的房间昵称正在使用或被别的用户注册了&lt;br /&gt;
|-&lt;br /&gt;
|503 ||Error ||Presence  ||进入一个房间 ||通知用户已经达到最大用户数&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
本文不规定和上述错误条件相关的文本字符串(即, XMPP &amp;lt;text/&amp;gt; 元素值).&lt;br /&gt;
&lt;br /&gt;
===状态码===&lt;br /&gt;
&lt;br /&gt;
多用户聊天的使用一个 &amp;lt;status/&amp;gt; 元素(特指, &amp;lt;status/&amp;gt; 元素的的 'code' 属性  ) 来传达关于用户在一个房间里的状态的信息. 随着时间的推移, 状态码的数量已经增加了很多, 而新的状态码继续被作者申请. 所以, 这些状态码现在记录在一个由XMPP登记处维护的注册表里. 细节可参考本文的 [[XEP-0045#状态码注册表|状态码注册表]].&lt;br /&gt;
&lt;br /&gt;
注意: 通常, MUC 状态码倾向于沿用[http://tools.ietf.org/html/rfc2616 RFC 2616] [[XEP-0045#附录G:备注|24]] 和 [http://tools.ietf.org/html/rfc1893 RFC 1893] [[XEP-0045#附录G:备注|25]] (1xx 码表示信息, 2xx 码说明情况良好可继续, 3xx 码指定重定向被踢或被禁止的用户, x3x 码指系统状态, x7x 码指安全或策略事务, 等等) 里面的状态码的 &amp;quot;抽象&amp;quot;含义.&lt;br /&gt;
&lt;br /&gt;
注意: 如果今天来定义 MUC 协议, 它将指定一个更有弹性的, XML-友好的 途径而不是硬编码的状态数字; 然而, 现在修改状态汇报系统带来的痛苦将远大于好处, 这是为什么状态码数字保持使用至今. 本文的未来版本可能定义一个更 类XMPP 的途径来表示状态条件, 保留状态码数字但是给它们补充更多的描述性的子元素,就像 '''RFC 3920 '''里那样.&lt;br /&gt;
&lt;br /&gt;
==国际化事项==&lt;br /&gt;
&lt;br /&gt;
如 '''RFC 3920''' 中所定义的, XMPP 实体 (包括 MUC 房间和 MUC 服务) 应该 SHOULD 遵守任何给定的节提供的 'xml:lang' 属性. 然而, 群聊消息的同声翻译超出了本文的范围.&lt;br /&gt;
&lt;br /&gt;
这里定义的状态和错误码允许一个客户端实现展示一个本地化的界面; 然而, 任何给定语言社区的本地化文本字符串的定义超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
尽管这里的很多数据表单字段的标签显示为英文, MUC 客户端应该 SHOULD 把这些字段展示为本地化的文本而不是英文文本.&lt;br /&gt;
&lt;br /&gt;
==安全事项==&lt;br /&gt;
===用户验证和授权===&lt;br /&gt;
&lt;br /&gt;
本文没有定义或要求比明文密码更安全的房间准入验证或授权方法. 然而, 这些潜在的风险可能使用 '''RFC 3920''' 描述的通过使用 TLS 和 SASL 加密通道来减轻.&lt;br /&gt;
&lt;br /&gt;
===端到端加密===&lt;br /&gt;
&lt;br /&gt;
这里没有定义没有端到端消息或会话加密方法. 用户不应该 SHOULD NOT 相信一个服务能保持通过房间发送的任何文本的安全.&lt;br /&gt;
&lt;br /&gt;
===隐私===&lt;br /&gt;
&lt;br /&gt;
取决于房间配置, 一个房间可以公开地记录房间里发生的所有讨论. 服务必须 MUST 警告用户该房间是公开记录的，通过在该用户的初始出席信息中返回一个状态码 &amp;quot;170&amp;quot; , 并且如果房间讨论被记录 (用户的客户端也应该 SHOULD 在允许用户进入之前查询房间的配置，以&amp;quot;预先发现&amp;quot;房间是否被记录)，该用户的客户端也必须 MUST 警告用户. 如果房间的配置随后修改成允许房间记录(当房间发送状态码 170 时客户端将发现)，客户端也必须 MUST 警告用户 . 注意: 房间内的历史和公开房间记录是不同的, 并且很自然的一个房间不能有效地阻止房客独立维护的自有的房间记录, 它可能被公开; 用户应该 SHOULD 谨慎操作并认识到任何房间讨论可能被有效地公开.&lt;br /&gt;
&lt;br /&gt;
===匿名===&lt;br /&gt;
&lt;br /&gt;
取决于房间配置, 一个房间可以 MAY 暴光每个房客的真实 JID 给其他房客 (如果该房间是非匿名的) 并且将几乎肯定地暴光每个房客的真实 JID 给该房间的所有者和管理员(如果该房间不是全匿名的).服务必须 MUST 警告用户真实 JIDs 在房间被暴光，通过在该用户的初始出席信息中包含状态码 &amp;quot;100&amp;quot; , 并且用户的客户端必须 MUST 警告该用户 (一个用户的客户端应该 SHOULD 也在允许用户进入房间之前查询房间配置以 &amp;quot;预先发现&amp;quot; 是否真实 JIDs 会在房间中暴光). 如果房间配置随后从半匿名或全匿名修改成非匿名(当房间发送状态码 172 时客户端将发现) ，客户端必须 MUST 也警告用户，如果房间的配置随后从全匿名改成半匿名时(当房间发送状态码 173 时客户端将发现)，客户端也应该 SHOULD 警告用户.&lt;br /&gt;
&lt;br /&gt;
===拒绝服务===&lt;br /&gt;
&lt;br /&gt;
公开的 MUC 房间能承受一定数量的攻击, 大部分能减少拒绝服务攻击. 这些攻击包括但不限于:&lt;br /&gt;
&lt;br /&gt;
# 向房间里塞进大量的非法房客从而阻止合法用户加入房间.&lt;br /&gt;
# 发送侮辱性的消息接着在被踢或被禁止之前离开房间; 这些侮辱性的消息包含但不限于，大量消息以阻止参与者正常跟踪会话线索或房间历史, 对参与者的人身攻击 (特别是房间管理员和主持人), 攻击性的文字, 以及垃圾网站链接.&lt;br /&gt;
# 高频率的制造出席信息变更.&lt;br /&gt;
# 使用过长的昵称导致无法看到完整的发言.&lt;br /&gt;
# 辱骂房间管理员或其他房间房客.&lt;br /&gt;
# 在一个服务里注册很多昵称然后禁止这些昵称的使用.&lt;br /&gt;
# 模仿别的房客的昵称(例如, 通过在尾部增加一个空格或看起来相似的字符串), 然后以那个房间昵称发送消息用于欺骗房客.&lt;br /&gt;
&lt;br /&gt;
这些攻击可能被减轻不能完全被阻止，通过灵活地使用管理员操作。例如禁止用户, 有管理员权限的自动的房间机器人出席信息, 智能内容过滤的实现, 检查连接的用户的 IP 地址(在分布式的系统里不一定能实现), 应用发言规则到出席信息以及消息, 使用比Resourceprep profile of stringprep更严格的规则匹配房间昵称, 等等. 然而, 经验表明无法完全阻止这类攻击.&lt;br /&gt;
&lt;br /&gt;
===其它事项===&lt;br /&gt;
&lt;br /&gt;
关于延迟递送符号的列入和流程的更多安全事项参见 '''XEP-0203'''.&lt;br /&gt;
&lt;br /&gt;
==IANA事项==&lt;br /&gt;
&lt;br /&gt;
本文档与[http://www.iana.org/ 互联网编号分配授权机构] [[XEP-0045#附录G:备注|26]]无关。&lt;br /&gt;
&lt;br /&gt;
==XMPP登记事项==&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/registrar/ XMPP登记处] [[XEP-0045#附录G:备注|27]]在它的登记处包含了以下信息.&lt;br /&gt;
&lt;br /&gt;
===协议名字空间===&lt;br /&gt;
&lt;br /&gt;
XMPP登记处在它的协议名字空间注册表里包含了以下 MUC相关的名字空间:&lt;br /&gt;
&lt;br /&gt;
* http://jabber.org/protocol/muc&lt;br /&gt;
* http://jabber.org/protocol/muc#admin&lt;br /&gt;
* http://jabber.org/protocol/muc#owner&lt;br /&gt;
* http://jabber.org/protocol/muc#user&lt;br /&gt;
&lt;br /&gt;
===服务发现种类/类型===&lt;br /&gt;
&lt;br /&gt;
一个多用户聊天服务或房间在服务发现里是用 &amp;quot;conference&amp;quot; 种类categary 和 &amp;quot;text&amp;quot; 类型type 来标识的.&lt;br /&gt;
&lt;br /&gt;
===服务发现特性===&lt;br /&gt;
&lt;br /&gt;
有很多和MUC相关的服务或房间相关的特性可以被&amp;quot;服务发现&amp;quot;来发现. 这里面最基本的是 'http://jabber.org/protocol/muc' 名字空间. 另外, 一个MUC房间应该 SHOULD 提供关于它实现的特定房间特性的信息, 例如密码保护和房间主持.&lt;br /&gt;
&lt;br /&gt;
'''注册提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#register FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#roomconfig FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#roominfo FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_hidden&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Hidden room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_membersonly&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Members-only room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_moderated&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Moderated room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_nonanonymous&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Non-anonymous room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_open&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Open room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_passwordprotected&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Password-protected room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_persistent&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Persistent room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_public&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Public room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_rooms&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;List of MUC rooms (each as a separate item)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_semianonymous&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Semi-anonymous room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_temporary&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Temporary room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_unmoderated&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Unmoderated room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_unsecured&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Unsecured room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===知名服务发现节点===&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'http://jabber.org/protocol/muc#rooms' 允许发现一个用户是哪个房间的房客.&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'x-roomuser-item' 允许一个用户从房间外发现自己的已注册房间昵称.&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'http://jabber.org/protocol/muc#traffic' 允许发现通过一个房间能发送哪些名字空间的通讯(参见本文允许的 [[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
&lt;br /&gt;
===字段标准化===&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/extensions/xep-0068.html 数据表单的字段标准化] [[XEP-0045#附录G:备注|28]] 定义了用于遵循特定名字空间的数据表单的字段标准化的过程. 在 MUC 里面, 使用了四种这类表单: 房间注册 ( &amp;quot;muc#register&amp;quot; FORM_TYPE), 请求发言权和批准请求 (&amp;quot;muc#request&amp;quot;), 房间配置 (&amp;quot;muc#roomconfig&amp;quot;), 以及用于房间信息的服务发现扩展 (&amp;quot;muc#roominfo&amp;quot;). 这些保留的字段定义如下.&lt;br /&gt;
&lt;br /&gt;
====muc#register FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling user registration with a&lt;br /&gt;
    Multi-User Chat (MUC) room or admin approval&lt;br /&gt;
    of user registration requests.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field &lt;br /&gt;
     var='muc#register_allow'&lt;br /&gt;
     type='boolean'&lt;br /&gt;
     label='Allow this person to register with the room?'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_email'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Email Address'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_faqentry'&lt;br /&gt;
      type='text-multi'&lt;br /&gt;
      label='FAQ Entry'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_first'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Given Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_last'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Family Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_roomnick'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Desired Nickname'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_url'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Your URL'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#request FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling voice requests in a &lt;br /&gt;
    Multi-User Chat (MUC) room or admin&lt;br /&gt;
    approval of such requests.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#role'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='Requested role'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#jid'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='User ID'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#roomnick'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='Room Nickname'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#request_allow'&lt;br /&gt;
         type='boolean'&lt;br /&gt;
         label='Whether to grant voice'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#roomconfig FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling creation and configuration of&lt;br /&gt;
    a Multi-User Chat (MUC) room.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_allowinvites'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Occupants to Invite Others'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_changesubject'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Occupants to Change Subject'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_enablelogging'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Enable Public Logging of Room Conversations'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_getmemberlist'&lt;br /&gt;
      type='list-multi'&lt;br /&gt;
      label='Roles and Affiliations that May Retrieve Member List'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_lang'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural Language for Room Discussions'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_pubsub'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='XMPP URI of Associated Publish-Subcribe Node'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_maxusers'&lt;br /&gt;
      type='list-single'&lt;br /&gt;
      label='Maximum Number of Room Occupants'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_membersonly'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether an Make Room Members-Only'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_moderatedroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Make Room Moderated'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_passwordprotectedroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether a Password is Required to Enter'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_persistentroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Make Room Persistent'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_presencebroadcast'&lt;br /&gt;
      type='list-multi'&lt;br /&gt;
      label='Roles for which Presence is Broadcast'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_publicroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Public Searching for Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomadmins'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Full List of Room Admins'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomdesc'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Short Description of Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomname'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural-Language Room Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomowners'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Full List of Room Owners'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomsecret'&lt;br /&gt;
      type='text-private'&lt;br /&gt;
      label='The Room Password'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_whois'&lt;br /&gt;
      type='list-single'&lt;br /&gt;
      label='Affiliations that May Discover Real JIDs of Occupants'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#roominfo FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling the communication of extended service discovery&lt;br /&gt;
    information about a Multi-User Chat (MUC) room.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_contactjid'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Contact Addresses (normally, room owner or owners)'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_description'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Short Description of Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_lang'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural Language for Room Discussions'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_ldapgroup'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='An associated LDAP group that defines room membership; &lt;br /&gt;
             this should be an LDAP Distinguished Name according to an&lt;br /&gt;
             implementation-specific or deployment-specific definition&lt;br /&gt;
             of a group.'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_logs'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='URL for Archived Discussion Logs'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_occupants'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Current Number of Occupants in Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_subject'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Current Subject or Discussion Topic in Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_subjectmod'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='The room subject can be modified by participants'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===状态码登记处===&lt;br /&gt;
====过程====&lt;br /&gt;
&lt;br /&gt;
XMPP注册员为遵循 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;status/&amp;gt; 元素的 'code' 属性维护注册表中的值 .&lt;br /&gt;
&lt;br /&gt;
为了提交新值给这个注册表, 注册人将按以下格式定义一个XML段并把它包含在相关的XMPP扩展协议中，或者发到&amp;lt;registrar@xmpp.org&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;the three-digit code number&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;the stanza type of which it is a child (message or presence)&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;the use case or situation in which the status is used&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;a natural-language description of the meaning&amp;lt;/purpose&amp;gt;&lt;br /&gt;
  &amp;lt;child&amp;gt;the descriptive child element (reserved for future use)&amp;lt;/child&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注册人可一次注册多个状态码，每个状态码包含在独立的&amp;lt;statuscode/&amp;gt;元素中。&lt;br /&gt;
&lt;br /&gt;
====初始提交====&lt;br /&gt;
&lt;br /&gt;
作为本文的一部分, 以下状态码已被注册了:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;100&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message or presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that any occupant is allowed to see the user's full JID&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;101&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message (out of band)&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Affiliation change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that his or her affiliation changed while not in the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;102&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room now shows unavailable members&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;103&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room now does not show unavailable members&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;104&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;&lt;br /&gt;
    Inform occupants that a non-privacy-related room configuration change has occurred&lt;br /&gt;
  &amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;110&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Any room presence&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that presence refers to one of its own room occupants&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;170&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message or initial presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room logging is now enabled&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;171&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room logging is now disabled&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;172&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now non-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;173&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now semi-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;174&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now fully-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;201&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that a new room has been created&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;210&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that service has assigned or modified occupant's roomnick&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;301&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she has been banned from the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;303&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Exiting a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform all occupants of new room nickname&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;307&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she has been kicked from the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;321&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because of an affiliation change&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;322&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because the room has been changed to members-only and the user &lt;br /&gt;
    is not a member&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;332&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because of a system shutdown&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===URI查询类型===&lt;br /&gt;
&lt;br /&gt;
作为由[http://www.xmpp.org/extensions/xep-0147.html XMPP URI Query Components] [[XEP-00450#附录G:备注|29]]授权的机构，XMPP注册员维护着一个用于 XMPP URIs 的查询和键-值对的注册表（见&amp;lt;[http://www.xmpp.org/registrar/querytypes.html http://www.xmpp.org/registrar/querytypes.html]&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
====join====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;join&amp;quot; 查询类型被注册为一个 MUC相关的动作, 伴随一个可选的键 &amp;quot;password&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 199. Join动作: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?join&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
应用必须 MUST 要么展示一个界面允许用户提供一个房间昵称，要么基于配置好的选项或昵称发现来获取这个房间昵称.&lt;br /&gt;
&lt;br /&gt;
'''例子 200. Join动作: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
join 动作可以 MAY 为这房间包含一个密码. 自然的, 对一个包含了房间密码的 URI 的访问必须 MUST 得到适当的控制.&lt;br /&gt;
&lt;br /&gt;
'''例子 201. Join动作包含密码: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?join;password=cauldronburn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 202. Join动作包含密码: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下提交注册 &amp;quot;join&amp;quot; 查询类型.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;querytype&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;join&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;proto&amp;gt;http://jabber.org/protocol/muc&amp;lt;/proto&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;enables joining a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;keys&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;password&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the password required to enter a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
  &amp;lt;/keys&amp;gt;&lt;br /&gt;
&amp;lt;/querytype&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====invite====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;invite&amp;quot; 查询类型被注册为一个 MUC相关的动作, 伴随一个可选的键 &amp;quot;jid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 203. Invite动作: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果加入中的用户还未在房间里, 应用必须 MUST 发送两个节: 第一个加入房间，第二个邀请另一个人. 如果加入中的用户已经在房间里, 应用将只发送邀请节.&lt;br /&gt;
&lt;br /&gt;
'''例子 204. Invite动作: 结果节(s)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
URI 可以包含多个邀请:&lt;br /&gt;
&lt;br /&gt;
'''例子 205. Invite动作包含多个邀请: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit;jid=bard@shakespeare.lit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 206. Invite动作包含多个邀请: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
URI 也可以包含一个密码:&lt;br /&gt;
&lt;br /&gt;
'''例子 207. Invite动作包含密码: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit;password=cauldronburn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果加入中的用户还未在房间里, 应用必须 MUST 发送两个节: 第一个加入房间，第二个邀请另一个人. 如果加入中的用户已经在房间里, 应用将只发送邀请节.&lt;br /&gt;
&lt;br /&gt;
'''例子 208. Invite动作包含密码: 结果节(s)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下提交注册 &amp;quot;invite&amp;quot; 查询类型.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;querytype&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;invite&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;proto&amp;gt;http://jabber.org/protocol/muc&amp;lt;/proto&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;enables simultaneously joining a groupchat room and inviting others&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;keys&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;jid&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the Jabber ID of the invitee&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;password&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the password required to enter a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
  &amp;lt;/keys&amp;gt;&lt;br /&gt;
&amp;lt;/querytype&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==商业规则==&lt;br /&gt;
===Addresses===&lt;br /&gt;
&lt;br /&gt;
为了提供关于从房间JIDs抓获的地址的一致性, Room IDs 必须 MUST 遵循 Stringprep 的 Nodeprep 规范并且 Room Nicknames 必须 MUST 符合 Stringprep (这些都定义在 '''RFC 3920''') 的 Resourceprep 规范. 尽管在 '''RFC 3920''' 中没有显式的说明 , 一个 Room JID 的 Room ID (node) 和 Room Nickname (resource) 部分都必须 MUST 长度不为零. 另外, 一个 MUC 服务不能 MUST NOT 允许空的或不可见的房间昵称 Room Nicknames (即, 房间昵称Room Nicknames 只包含一个或多个空格).&lt;br /&gt;
&lt;br /&gt;
取决于服务实现，是否更多地限制房间昵称 (例如, 通过应用情景例程, stringprep的Nodeprep规范, 或其他限制).&lt;br /&gt;
&lt;br /&gt;
===Message===&lt;br /&gt;
&lt;br /&gt;
# 如果一个房客想发送一个消息给所有其他房客, MUC 客户端必须 MUST 把 'type' 属性值设为 &amp;quot;groupchat&amp;quot;. 服务可以 MAY 忽略不正确的消息类型, 或用 &amp;lt;bad-request/&amp;gt; 错误弹回.&lt;br /&gt;
# 如果一个MUC服务从一个角色为&amp;quot;none&amp;quot;的Jabber用户收到一个发送给该房间的消息或给某个房客的消息, 服务不能 MUST NOT 递送这个消息并应该 SHOULD 返回给这个消息给发送者并伴随一个 &amp;lt;forbidden/&amp;gt; 错误.&lt;br /&gt;
# 如果一个MUC服务 接收到一个发送给不存在的或尚未解锁的房间的消息, 服务应该 SHOULD 返回这个消息给发送者并伴随一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
# 一个MUC服务应该 SHOULD 不做修改地传递扩展的消息 (例如, 一个消息主体的 XHTML 版本) 给房客; 然而, 一个 MUC 服务可以 MAY 不允许消息的特定扩展(参见本文的[[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
# 一个MUC客户端可以 MAY 生成扩展以满足 [http://xmpp.org/extensions/xep-0022.html 消息事件] [[XEP-0045#附录G:备注|30]] 或 [http://xmpp.org/extensions/xep-0085.html 聊天状态通知] [[XEP-0045#附录G:备注|31]] 规范; 然而, 一个 MUC 服务可以 MAY 不允许这些扩展 (参见本文的[[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
&lt;br /&gt;
===Presence===&lt;br /&gt;
&lt;br /&gt;
# 一个房间必须 MUST 安静地忽略从一个角色为&amp;quot;none&amp;quot;的用户发来的不可用出席信息信息.&lt;br /&gt;
# 只有MUC服务自身应该 SHOULD 生成关于角色，岗位，全JIDs或遵循 'http://jabber.org/protocol/muc#user' 名字空间的状态码的扩展的出席信息 (基于服务所知道的关于房客的信息, 例如, 角色, 或由一个主持人或房间管理员的动作所产生的结果). 一个客户端不应该 SHOULD NOT 推定生成这类信息. 如果一个 MUC 服务从一个房客接收到这类扩展的出席信息, 它不能 MUST NOT 反射它给其他房客们. (一个客户端可以 MAY 为了提供一个密码而生成遵循 'http://jabber.org/protocol/muc#user' 名字空间的扩展的出席信息, 但自然的这是不反射给其他房客的.)&lt;br /&gt;
# 一个MUC服务应该 SHOULD 允许所有其他出席信息通过, 尽管它可以 MAY 选择阻塞扩展的出席信息; 参见本文的 [[XEP-0045#允许的通讯|允许的通讯]]章节.&lt;br /&gt;
# 为了适当地通知房客角色和岗位, 并使之更易于Jabber客户端跟踪房间里所有用户的当前状态, MUC服务实现必须 MUST 在所有出席信息节里提供关于角色和岗位的扩展的出席信息, 包括一个用户因为任何原因退出该房间时被发送的类型为&amp;quot;unavailable&amp;quot;的出席信息节.&lt;br /&gt;
# 如果一个权限被撤销, 服务必须 MUST 通知这件事，通过发送一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 元素并包含一个 &amp;lt;item/&amp;gt; 子元素，该&amp;lt;item/&amp;gt; 子元素的 'role' 和/或 'affiliation' 属性值的设定指明是去了有关的权限. 所有将来的为这个房客发出的出席信息节必须 MUST 包含这个更新的角色和岗位, 直到除非它们再次改变.&lt;br /&gt;
# 一个MUC服务必须 MUST 发送扩展的出席信息给一个客户端，即使客户端在进入该房间时没有发送一个空的遵循 'http://jabber.org/protocol/muc' 名字空间的 &amp;lt;x/&amp;gt; 元素 ; 自然的, 一个客户端必须 MUST 忽略这类信息，如果它不懂得它的话(根据 '''RFC 3920''').&lt;br /&gt;
# 在 muc#user 名字空间中被发送的关于角色和岗位的扩展的出席信息必须 MUST 包含全JID (不是纯JID) 作为 'jid' 属性的值.&lt;br /&gt;
# 如果想要，一个客户端可以 MAY 发送一个客户化的退出消息 (就像 IRC 频道里经常出现的那样) ，通过在退出时被发送的&amp;quot;unavailable&amp;quot;类型的出席信息节里包含一个 &amp;lt;status/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
===IQ===&lt;br /&gt;
&lt;br /&gt;
# MUC被设计用于分享消息和出席信息, 而不是 IQs. 一个被发送的到房间本身JID的 IQ 由房间本身来处理并且不反射给所有房客.&lt;br /&gt;
# 如果一个房客想在一个非匿名房间发送一个 IQ 节给其他用户, 发送者应该 SHOULD 直接发送请求给接收者的纯JID或全JID, 而不是试图通过房间发送请求(即, 通过接收者的房间JID).&lt;br /&gt;
# 如果一个房客想在一个半匿名房间发送一个 IQ 节给其他用户, 发送者能直接发送这个节给接受者的房间JID并且服务可以 MAY 转发这个节给接收者的真实JID. 然而, 任何时候一个MUC服务不能 MUST NOT 泄露这个发送者的真实JID给接收者, 也不能泄露接收者的真实JID给发送者.&lt;br /&gt;
# 一个MUC客户端必须 MUST 在IQ set 中的遵循 'http://jabber.org/protocol/muc#admin' &amp;lt;item/&amp;gt; 子元素中只发送 'affiliation' 属性或 'role' 属性; 如果一个主持人, 管理员, 或所有者试图在相同的IQ set中修改相同条目的岗位或角色, 服务必须 MUST 返回一个 &amp;lt;bad-request/&amp;gt; 错误给发送者. 无论如何, 一个MUC服务可以 MAY 基于一个岗位的变更来修改一个角色，从而可以 MAY 发送出席信息更新，同时包含一个修改的角色和一个修改的岗位.&lt;br /&gt;
# 在关于角色的 IQ sets中, 一个MUC客户端必须 MUST 只包含 'nick' 属性; 在关于角色的 IQ results中, 一个 MUC 服务必须 MUST 包含 'nick', 'role', 'affiliation', 和'jid' 属性 (值为后来设置的用户的全JID).&lt;br /&gt;
# 在关于岗位的 IQ sets中, 一个MUC客户端必须 MUST 只包含 'jid' 属性(值为纯JID); 在关于岗位的 IQ results中, 一个MUC服务不能 MUST NOT 包含 'role' 属性, 必须MUST 包含 'affiliation' 属性和 'jid' 属性 (值为纯JID), 并且应该 SHOULD 包含 'nick' 属性 (除非岗位为 &amp;quot;outcast&amp;quot;, 以为被排斥者不应该 SHOULD NOT 有保留的房间昵称).&lt;br /&gt;
&lt;br /&gt;
==实现注意事项==&lt;br /&gt;
&lt;br /&gt;
以下方针有助于客户端和组件开发者建立 MUC 实现.&lt;br /&gt;
&lt;br /&gt;
===服务端===&lt;br /&gt;
&lt;br /&gt;
# 在处理一个被主持的房间里游客发送的消息时, 一个MUC服务可以 MAY 通过一个主持人让每个消息排队等待批准并且可以 MAY 通知发送者消息正在等待批准; 然而, 这一行为是可选的 OPTIONAL, 并且一个消息批准协议的定义 (例如, 使用'''XEP-0004'''定义的数据表单) 超出了本文的范围.&lt;br /&gt;
# 对于一个 MUC 服务来说，在特定时间发生时提供房间内的消息是很常见的, 例如当标题变更时, 当一个房客加入或退出时, 或当一个房间被销毁时. 这类消息完全是可选的 OPTIONAL 并且留给实现或布署来决定, 但如果使用了，则必须 MUST 是从房间JID本身(&amp;lt;room@service&amp;gt;) 而不是从一个特定的&lt;br /&gt;
房客(&amp;lt;room@service/nick&amp;gt;)发送的类型为 &amp;quot;groupchat&amp;quot; 类型的消息. 无论如何, 通常接收的客户端倾向于基于房间的事件以及MUC提供的特定状态码来生成类似的消息(例如, 用户加入或退出) ; 这将帮助确保这类消息的正确的本地化.&lt;br /&gt;
# 出于礼貌, 一个MUC服务可以 MAY 发送一个房间外的 &amp;lt;message/&amp;gt; 给一个被踢的或被禁止的房客, 并且可以 MAY 广播一个房间内的 &amp;lt;message/&amp;gt; 给所有剩余的房客通知他们该房客已被该房间踢出或禁止. 无论如何, 这类消息是可选的 OPTIONAL, 并且事实上是多余的，因为接收的客户端生成这类消息所必需的信息已经通过MUC服务发送的出席信息节(特别是状态码)得到了.&lt;br /&gt;
# 出于礼貌, 如果一个用户的岗位变更了而该用户不在房间里，一个MUC服务可以MAY发送一个房间外的 &amp;lt;message/&amp;gt; ; 这消息应该 SHOULD 被从房间发送给该用户的纯JID, 可以 MAY 包含一个 &amp;lt;body/&amp;gt; 元素描述岗位变更, 并且必须 MUST 包含一个状态码 101.&lt;br /&gt;
# 没有需求要一个MUC服务将为旧的&amp;quot;groupchat 1.0&amp;quot;用户提供特别的治疗, 例如包含等价于扩展的遵循 'http://jabber.org/protocol/muc#user' 名字空间的出席信息的消息.&lt;br /&gt;
# 房间类型可以 MAY 被配置成任何组合. 一个MUC服务可以 MAY 支持或允许任何想要的房间类型或它们的组合.&lt;br /&gt;
# 一个MUC服务可以 MAY 限制在初始配置完成之后配置选项展示给一个所有者的次数, 例如因为特定的选项除非重启服务无法生效.&lt;br /&gt;
# 一个MUC服务可以 MAY 提供一个接口给房间创建和配置(例如, 以一个特定的Jabber表单或一个网页), 这样表面上房间所有者是一个应用而不是一个自然人用户.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择让一个特定的房间内资源提供接口给管理功能 (例如, 一个 &amp;quot;user&amp;quot; 名的机器人 &amp;quot;ChatBot&amp;quot;), 房客们可以和它直接互动, 从而允许管理员在一个私有消息里键入命令参数 '/command parameter' 给那个机器人 &amp;quot;user&amp;quot;. 显然这种服务要求服务在房间创建时添加一个 'ChatBot' 用户到房间, 并且阻止任何房客在该房间使用房间昵称 'ChatBot' . 这可能在一些实现或布署中比较难以保证. 任何情况下, 任何这类接口是可选的 OPTIONAL.&lt;br /&gt;
# 如果服务接收到它之前发送给该用户的节相关的递送类错误，一个MUC服务应该 SHOULD 移除一个用户; 递送相关的错误即 &amp;lt;gone/&amp;gt;, &amp;lt;item-not-found/&amp;gt;, &amp;lt;recipient-unavailable/&amp;gt;, &amp;lt;redirect/&amp;gt;, &amp;lt;remote-server-not-found/&amp;gt;, 和 &amp;lt;remote-server-timeout/&amp;gt;.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择在反射出席信息变更给一个房间的房客们之前，抛弃附加在&amp;lt;presence/&amp;gt; 节上的扩展的出席信息. 也就是, 一个实现可以 MAY 选择只反射该出席信息节的 &amp;lt;show/&amp;gt;, &amp;lt;status/&amp;gt;, 和 &amp;lt;priority/&amp;gt; 子元素，如 'jabber:client' 名字空间描述的 XML 架构之中, 结果导致那个在扩展的名字空间中的出席信息变更 &amp;quot;changes&amp;quot; (例如, gabber:x:music:info) 不被传递给房客. 如果一个服务禁止特定的扩展名字空间, 它应该 SHOULD 在本文 [[XEP-0045#允许的通讯|允许的通讯]]章节描述的知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 提供一个允许的通讯的描述.&lt;br /&gt;
# 一个MUC服务可以 MAY 在反射消息给一个房间的房客之前选择抛弃附加在 &amp;lt;message/&amp;gt; 节的扩展信息. 一个这类扩展信息的例子是轻量级文本标记，定义于 [http://xmpp.org/extensions/xep-0071.html XHTML-IM]  [XEP-0045#附录G:备注|32]]. 如果一个服务禁止特定的扩展名字空间, 它应该 SHOULD 在本文 [[XEP-0045#允许的通讯|允许的通讯]]章节描述的知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 提供一个允许的通讯的描述.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择锁定 &amp;quot;lock down&amp;quot; 房间昵称 (例如, 硬编码房间昵称给该房客的纯JID). 如果这么干, 该服务必须 MUST 把被锁定的昵称看作一个保留的房间昵称并且必须 MUST 支持本文[[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]]章节定义的协议.&lt;br /&gt;
&lt;br /&gt;
====允许的通讯====&lt;br /&gt;
&lt;br /&gt;
大家知道, 一个服务 (更准确地说, 一个正确配置的房间)可以 MAY 抛弃一些或所有的扩展的附加在从发送者通过房间反射给所有房客的 &amp;lt;message/&amp;gt; 和 &amp;lt;presence/&amp;gt; 节的名字空间. 如果房间这么干, 它应该 SHOULD 允许发送者通过发送 disco#info 查询知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 来发现允许的扩展的列表, 在结果中返回支持的名字空间每个用一个 &amp;lt;feature/&amp;gt; 元素表示. 如果该房间不允许任何扩展的名字空间, 它必须 MUST 如 '''XEP-0030''' 所述返回一个空的 query . 如果该房间不支持 &amp;quot;#traffic&amp;quot; 节点, 它必须 MUST 返回一个 &amp;lt;feature-not-implemented/&amp;gt; 错误应答给查询发送到 'http://jabber.org/protocol/muc#traffic' 节点的查询.&lt;br /&gt;
&lt;br /&gt;
以下例子展示一个只允许 'http://jabber.org/protocol/xhtml-im' 和 'http://jabber.org/protocol/rosterx' 名字空间的房间, 而不包括其他的名字空间.&lt;br /&gt;
&lt;br /&gt;
'''例子 209. 用户查询服务关于允许的名字空间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 210. 服务返回允许的名字空间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/xhtml-im'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/rosterx'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个服务不抛弃任何名字空间或不实现这个特性, 它必须 MUST 返回一个 &amp;lt;service-unavailable/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 211. 服务返回服务不可用错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===客户端===&lt;br /&gt;
&lt;br /&gt;
# Jabber客户端可以 MAY 展示房间角色，通过在一个房间名册里为每个角色显示特定的群. 这将使房客清楚图形化的知道哪个房客是主持人, 参与者, 和游客. 无论如何, 这样一个展示是可选的 OPTIONAL.&lt;br /&gt;
# Jabber客户端可以 MAY 实现多样化的界面以提供快捷方式 &amp;quot;shortcuts&amp;quot; 给功能，例如修改某人昵称, 踢人或禁止用户, 发现一个房客的全JID, 或修改主题. 一个选项包含了类IRC 的命令例如 '/nick', '/kick', '/ban', 和 '/whois'; 另一个是使用户能用鼠标右击房间名册里的项目. 所有这些界面形式是可选的 OPTIONAL. 然而, 为方便起见, 下面提供了一个 IRC 命令到 MUC 协议的映射.&lt;br /&gt;
&lt;br /&gt;
====IRC命令映射====&lt;br /&gt;
&lt;br /&gt;
IRC 客户端使用大量常用的快捷方式 &amp;quot;shortcut&amp;quot; 命令，以一个斜杠开始, 例如 '/nick' and '/ban'. 下表提供一个 类IRC 命令到 MUC 协议的映射, 用于希望支持类似功能的 Jabber 客户端.&lt;br /&gt;
&lt;br /&gt;
'''表10: IRC命令映射'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!命令 !!功能 !!MUC协议&lt;br /&gt;
|-&lt;br /&gt;
|/ban &amp;lt;roomnick&amp;gt; [comment] ||在房间里以房间昵称禁止用户(客户端翻译房间昵称为纯JID) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;iq id='someid'&lt;br /&gt;
    to='room@service'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='bare-jid-of-user'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/invite &amp;lt;jid&amp;gt; [comment] ||以JID邀请用户到此房间 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='jid'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
|/join &amp;lt;roomname&amp;gt; [pass] ||在服务里加入房间(房间昵称同本房间内的昵称) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/nick'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;pass&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/kick &amp;lt;roomnick&amp;gt; [comment] ||以房间昵称从房间里踢人 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;iq id='someid'&lt;br /&gt;
    to='room@service'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='roomnick' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|/msg &amp;lt;roomnick&amp;gt; &amp;lt;foo&amp;gt; ||发送私有消息&amp;quot;foo&amp;quot;给房间昵称 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service/nick' type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;foo&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/nick &amp;lt;newnick&amp;gt; ||变更在此房间内的昵称为&amp;quot;newnick&amp;quot; ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/newnick'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/part [comment] ||退出本房间(一些 IRC 客户端也支持 /leave) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/nick'&lt;br /&gt;
          type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;comment&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/topic &amp;lt;foo&amp;gt; ||变更此房间主题为&amp;quot;foo&amp;quot; ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service' type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;foo&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 因为 MUC 房间昵称遵循stringprep的Resourceprep脚本, 它们被允许包含一个空格字符, 而 IRC 昵称不允许. 尽管一个给定的客户端可以 MAY 支持引用字符串用于这个目的 (导致命令类似 '/ban &amp;quot;king lear&amp;quot; insanity is no defense'), 最常见的引用字符(类似 &amp;quot; 和 ') 也是被Resourceprep允许的 , 从而导致增加了复杂性和包含空格和引号的房间昵称中引号的潜在问题. 所以不建议 NOT RECOMMENDED Jabber客户端支持包含了空格符的房间昵称的类IRC的快捷方式命令.&lt;br /&gt;
&lt;br /&gt;
注意: 很多Jabber客户端也实现了 '/me ' 命令，如 [http://xmpp.org/extensions/xep-0245.html The /me Command] [[XEP-0045#附录G:备注|33]] 所述. 这个命令不会导致任何 MUC 或 IRC 协议的动作所以不显式在上表中.&lt;br /&gt;
&lt;br /&gt;
==XML架构==&lt;br /&gt;
===http://jabber.org/protocol/muc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='x'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='history' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='history'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='maxchars' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='maxstanzas' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='seconds' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='since' type='xs:dateTime' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#user===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#user'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#user'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='x'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:choice minOccurs='0' maxOccurs='unbounded'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='decline' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='destroy' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='invite' minOccurs='0' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='item' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='status' minOccurs='0' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='decline'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='destroy'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='invite'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='item'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='actor' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='continue' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='affiliation' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='admin'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='member'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='outcast'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='owner'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='nick' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='role' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='moderator'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='participant'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='visitor'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='actor'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='jid' type='xs:string' use='required'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='continue'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='thread' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='status'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='code' use='required'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:int'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:minInclusive value='100'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:maxInclusive value='999'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='reason' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#admin===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#admin'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#admin'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='query'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='item' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='item'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='actor' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='affiliation' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='admin'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='member'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='outcast'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='owner'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='nick' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='role' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='moderator'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='participant'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='visitor'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='actor'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='jid' type='xs:string' use='required'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='reason' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#owner===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#owner'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#owner'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:import &lt;br /&gt;
      namespace='jabber:x:data'&lt;br /&gt;
      schemaLocation='http://www.xmpp.org/schemas/x-data.xsd'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='query'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:choice xmlns:xdata='jabber:x:data' minOccurs='0'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='xdata:x'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='destroy'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='destroy'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='reason' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#unique===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#unique'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#unique'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='unique' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==鸣谢==&lt;br /&gt;
&lt;br /&gt;
作者感谢以下个人，为他们很多对于本协议草案的帮助性的评论: David Sutton, Peter Millard, Joe Hildebrand, Craig Kaes, Alexey Shchepin, David Waite, Jean-Louis Seguineau, Jacek Konieczny, Gaston Dombiak, 以及其他在 jdev@conference.jabber.org 会议室和在 Standards 邮件列表里的人.&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
&lt;br /&gt;
系列：[http://xmpp.org/extensions/ XEP]&lt;br /&gt;
&lt;br /&gt;
序号：0045&lt;br /&gt;
&lt;br /&gt;
发布者：[http://xmpp.org/xsf/ XMPP标准基金会]&lt;br /&gt;
&lt;br /&gt;
状态：[http://xmpp.org/extensions/xep-0001.html#states-Draft 草案 ]&lt;br /&gt;
&lt;br /&gt;
类型：[http://www.xmpp.org/extensions/xep-0001.html#types-Standards%20Track 标准跟踪]&lt;br /&gt;
&lt;br /&gt;
版本：1.24&lt;br /&gt;
&lt;br /&gt;
最后更新：2008-07-16&lt;br /&gt;
&lt;br /&gt;
批准机构：[http://xmpp.org/council/ XMPP理事会]&lt;br /&gt;
&lt;br /&gt;
依赖标准：XMPP Core, XMPP IM, XEP-0004, XEP-0030, XEP-0068, XEP-0082, XEP-0128&lt;br /&gt;
&lt;br /&gt;
替代标准：无&lt;br /&gt;
&lt;br /&gt;
被替代标准：无&lt;br /&gt;
&lt;br /&gt;
缩略名：muc&lt;br /&gt;
&lt;br /&gt;
muc名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#admin名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-admin.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#owner名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-owner.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#unique名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-unique.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#user名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-user.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注册表: &amp;lt;http://www.xmpp.org/registrar/muc.html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原文控制： [http://svn.xmpp.org:18080/browse/XMPP/trunk/extensions/xep-0045.xml HTML] [http://svn.xmpp.org:18080//changelog/~rss/XMPP/trunk/extensions/xep-0045.xml/rss.xml RSS]&lt;br /&gt;
&lt;br /&gt;
本文的其它格式： [http://xmpp.org/extensions/xep-0045.xml XML] [http://xmpp.org/extensions/xep-0045.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
URI: https://stpeter.im/&lt;br /&gt;
&lt;br /&gt;
{{Template:XEP附录CDEF}}&lt;br /&gt;
&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
&lt;br /&gt;
# RFC 1459: Internet Relay Chat &amp;lt;http://tools.ietf.org/html/rfc1459&amp;gt;.&lt;br /&gt;
# RFC 2810: Internet Relay Chat: Architecture &amp;lt;http://tools.ietf.org/html/rfc2810&amp;gt;.&lt;br /&gt;
# RFC 2811: Internet Relay Chat: Channel Management &amp;lt;http://tools.ietf.org/html/rfc2811&amp;gt;.&lt;br /&gt;
# RFC 2812: Internet Relay Chat: Client Protocol &amp;lt;http://tools.ietf.org/html/rfc2812&amp;gt;.&lt;br /&gt;
# RFC 2813: Internet Relay Chat: Server Protocol &amp;lt;http://tools.ietf.org/html/rfc2813&amp;gt;.&lt;br /&gt;
# XEP-0133: Service Administration &amp;lt;http://xmpp.org/extensions/xep-0133.html&amp;gt;.&lt;br /&gt;
# XEP-0030: Service Discovery &amp;lt;http://xmpp.org/extensions/xep-0030.html&amp;gt;.&lt;br /&gt;
# XEP-0059: Result Set Management &amp;lt;http://xmpp.org/extensions/xep-0059.html&amp;gt;.&lt;br /&gt;
# XEP-0128: Service Discovery Extensions &amp;lt;http://xmpp.org/extensions/xep-0128.html&amp;gt;.&lt;br /&gt;
# RFC 3920: 可扩展的消息和出席信息协议 (XMPP): Core &amp;lt;http://tools.ietf.org/html/rfc3920&amp;gt;.&lt;br /&gt;
# XEP-0203: Delayed Delivery &amp;lt;http://xmpp.org/extensions/xep-0203.html&amp;gt;.&lt;br /&gt;
# XEP-0091: Legacy Delayed Delivery &amp;lt;http://xmpp.org/extensions/xep-0091.html&amp;gt;.&lt;br /&gt;
# XEP-0082: XMPP Date and Time Profiles &amp;lt;http://xmpp.org/extensions/xep-0082.html&amp;gt;.&lt;br /&gt;
# RFC 3921: 可扩展的消息和出席信息协议 (XMPP): Instant Messaging and Presence &amp;lt;http://tools.ietf.org/html/rfc3921&amp;gt;.&lt;br /&gt;
# XEP-0249: Direct MUC Invitations &amp;lt;http://xmpp.org/extensions/xep-0249.html&amp;gt;.&lt;br /&gt;
# XEP-0077: In-Band Registration &amp;lt;http://xmpp.org/extensions/xep-0077.html&amp;gt;.&lt;br /&gt;
# XEP-0004: Data Forms &amp;lt;http://xmpp.org/extensions/xep-0004.html&amp;gt;.&lt;br /&gt;
# 一些评论者抱怨公开房间的所有者和管理员存在潜在的滥用; 很不幸的, 能力越大责任越大.&lt;br /&gt;
# XEP-0050: Ad-Hoc Commands &amp;lt;http://xmpp.org/extensions/xep-0050.html&amp;gt;.&lt;br /&gt;
# XEP-0060: Publish-Subscribe &amp;lt;http://xmpp.org/extensions/xep-0060.html&amp;gt;.&lt;br /&gt;
# 这和房间配置的行为不同, 这里 'muc#roomconfig_roomowners' 字段指定房间所有者的完整列表, 不是delta.&lt;br /&gt;
# 这和房间配置的行为不同, 这里 'muc#roomconfig_roomadmins' 字段指定房间管理眼的完整列表, 不是delta.&lt;br /&gt;
# XEP-0086: Error Condition Mappings &amp;lt;http://xmpp.org/extensions/xep-0086.html&amp;gt;.&lt;br /&gt;
# RFC 2616: Hypertext Transport Protocol -- HTTP/1.1 &amp;lt;http://tools.ietf.org/html/rfc2616&amp;gt;.&lt;br /&gt;
# RFC 1893: Enhanced Mail System Status Codes &amp;lt;http://tools.ietf.org/html/rfc1893&amp;gt;.&lt;br /&gt;
# 互联网编号分配机构 (IANA) 是用于互联网协议的唯一性参数值分配的核心协调者, 例如号码和URI计划. 更多信息, 见 &amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
# XMPP登记员 XMPP Registrar 维护着一个保留的协议名字空间以及用于由XMPP标准基金会批准的XMPP扩展协议的上下文参数的注册项的列表. 更多信息, 见 &amp;lt;http://xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
# XEP-0068: Field Data Standardization for Data Forms &amp;lt;http://xmpp.org/extensions/xep-0068.html&amp;gt;.&lt;br /&gt;
# XEP-0147: XMPP URI Query Components &amp;lt;http://xmpp.org/extensions/xep-0147.html&amp;gt;.&lt;br /&gt;
# XEP-0022: Message Events &amp;lt;http://xmpp.org/extensions/xep-0022.html&amp;gt;.&lt;br /&gt;
# XEP-0085: Chat State Notifications &amp;lt;http://xmpp.org/extensions/xep-0085.html&amp;gt;.&lt;br /&gt;
# XEP-0071: XHTML-IM &amp;lt;http://xmpp.org/extensions/xep-0071.html&amp;gt;.&lt;br /&gt;
# XEP-0245: The /me Command &amp;lt;http://xmpp.org/extensions/xep-0245.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===附录H: 修订历史===&lt;br /&gt;
&lt;br /&gt;
注意: 本协议的旧版本可能在 http://xmpp.org/extensions/attic/ 还可用&lt;br /&gt;
&lt;br /&gt;
'''版本 1.24 (2008-07-16)'''&lt;br /&gt;
&lt;br /&gt;
增加了更多原因reason元素的例子; 移除了关于黑名单包含的昵称部分; 增加了拒绝服务注意事项.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.23 (2008-01-14)'''&lt;br /&gt;
&lt;br /&gt;
* 定义了 getmemberlist 房间配置选项&lt;br /&gt;
* 增加了直接邀请协议&lt;br /&gt;
* 修正了当房间满的时候房间承认所有者/管理员的逻辑&lt;br /&gt;
* 定义了和LDAP群关联的服务发现扩展字段&lt;br /&gt;
* 指定了房间配置字段能被列入扩展的房间信息之中&lt;br /&gt;
* 指定了消息格式用于用户不在房间时的岗位变更&lt;br /&gt;
* 增加了例子展示结果集管理&lt;br /&gt;
* 推荐出席信息错误中包含的MUC子元素&lt;br /&gt;
* 为一对一聊天和多用户聊天的连续性描述了ThreadID的使用, 包括在邀请中为 continue 元素定义 thread 属性.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.22 (2007-04-10)'''&lt;br /&gt;
&lt;br /&gt;
更新了延迟消息递送以反映 XEP-0203 演化到草案和 XEP-0091 的过时.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.21 (2006-09-13)'''&lt;br /&gt;
&lt;br /&gt;
* 澄清了MUC扩展的介入，在房间加入/创建请求触发数据表单流但没有MUC扩展可导致自动房间创建以向后兼容旧的 groupchat 1.0 协议.&lt;br /&gt;
* 指定昵称变更时如果昵称被锁定则返回 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
* 要求客户端在进入房间之前发现房间配置并指定相关的安全事项, 包括使用隐私相关的状态码 170, 171, 172, 173, 和 174.&lt;br /&gt;
* 指定在房间配置选项不能被执行或违反服务策略时使用 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
* 强制要求房间昵称不能只包含空格.&lt;br /&gt;
* 移除所有服务发现用例到专用章节.&lt;br /&gt;
* 修改 urn:xmpp:delay 支持从 SHOULD 改为 MUST.&lt;br /&gt;
* 澄清 _whois 房间配置选项定义房间类型.&lt;br /&gt;
* 定义 XEP-0128 房间信息字段用于讨论记录, 关联的 pubsub 节点, 以及联系人 JID.&lt;br /&gt;
* 指出修改角色到主持人导致岗位变更为管理员或所有者成为推荐的, 而不是必需的.&lt;br /&gt;
* 增加了国际化事项中关于数据表单的本地化的部分.&lt;br /&gt;
* 指出实现可以持久化角色括月整个访问并且应该在被主持的房间里这样做.&lt;br /&gt;
* 增加了协议和服务发现特性用于在新建房间之前请求唯一的房间名.&lt;br /&gt;
* 更多澄清保留的房间昵称和昵称锁定的性质.&lt;br /&gt;
* 定义数据表单用于请求发言权和批准发言申请.&lt;br /&gt;
* 增加了多个邀请的例子用于XMPP URI.&lt;br /&gt;
* 澄清了出席信息，讨论历史的顺序, 等等.&lt;br /&gt;
* 增加了状态码用于房客拥有的房间昵称, 服务修改的房间昵称, 并警告房间讨论被公开记录.&lt;br /&gt;
* 澄清关于房间记录和非匿名房间的隐私和匿名事项.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.20 (2005-09-08)'''&lt;br /&gt;
&lt;br /&gt;
同意了踢人和禁止用户的能力, 并定义了一个用户不能被一个比自己岗位低的主持人或管理员踢或禁止.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.19 (2005-04-21)'''&lt;br /&gt;
&lt;br /&gt;
定义了怎样发送并发多邀请; 纠正了一些和岗位变更状态一致性的错误; 修改了消息事件禁令表单从 MUST NOT 到 SHOULD NOT; 修正了和 #traffic disco 节点相关的错误处理; 允许了 &amp;lt;password/&amp;gt; 作为&amp;lt;destroy/&amp;gt;的一个子元素; 修改了最大用户数错误从 &amp;lt;not-allowed/&amp;gt; 到 &amp;lt;service-unavailable/&amp;gt;; 指定了 maxchars 属性的字符数是指完整的 XML 节; 为 FORM_TYPEs;增加了 disco 特性 为状态码定义了注册表; 为遵守协议分开了新建即时房间的用例; 调整了 XML 架构以反映之前的修改; 重写了绪论; 澄清了小的文本错误.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
Version 1.18 (2004-11-02)&lt;br /&gt;
&lt;br /&gt;
Corrected several errors in the affiliation state chart and in the examples (wrong FORM_TYPE values); mentioned /me command.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.17 (2004-10-04)&lt;br /&gt;
&lt;br /&gt;
Added text about allowable extension namespaces and related service discovery mechanisms; specified well-known service discovery nodes; added conformance terms to clarify some descriptions; modified affiliation state chart to allow more flexible state changes; per list dicussion, added ability to convert a one-to-one chat into a conference, including sending of history; specified error to use when max users limit is reached; specified form for admin approval of user registration requests and modified FORM_TYPE from http://jabber.org/protocol/muc#user to http://jabber.org/protocol/muc#register; modified FORM_TYPE for room configuration from http://jabber.org/protocol/muc#owner to http://jabber.org/protocol/muc#roomconfig.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.16 (2004-06-30)&lt;br /&gt;
&lt;br /&gt;
Added example and registry submission for service discovery extension.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.15 (2004-06-24)&lt;br /&gt;
&lt;br /&gt;
Removed jabber:iq:browse references; clarified order of presence stanzas sent to new occupant on entering room; specified format of in-room messages (type='groupchat', from='room@service'); clarified allowable attributes in various list-related operations; made admin/owner revocation text and examples consistent with state chart; clarified ownership revocation conflict scenarios; changed the 'muc#roomconfig_inviteonly' field to 'muc#roomconfig_membersonly'; changed attribute order in examples to match XML canonicalization rules; corrected several errors in the schemas.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.14 (2004-05-03)&lt;br /&gt;
&lt;br /&gt;
Corrected discovery of registered roomnicks; added note about error to return if nicks are locked down.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.13 (2004-03-31)&lt;br /&gt;
&lt;br /&gt;
Fixed an error in the muc#user schema.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.12 (2004-03-01)&lt;br /&gt;
&lt;br /&gt;
Corrected a few errors in the examples; added IQ results in order to clarify workflows.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.11 (2004-02-05)&lt;br /&gt;
&lt;br /&gt;
Clarified JID matching rules (same as for privacy lists in XMPP IM).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.10 (2004-01-07)&lt;br /&gt;
&lt;br /&gt;
Added XMPP error handling; fully specified all conformance terms.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.9 (2003-12-14)&lt;br /&gt;
&lt;br /&gt;
Removed protocol for requesting voice in a moderated room (should be performed using Ad-Hoc Commands).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.8 (2003-12-04)&lt;br /&gt;
&lt;br /&gt;
Added protocol for requesting voice in a moderated room; added (informational) mapping of IRC commands to MUC protocols.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.7 (2003-10-21)&lt;br /&gt;
&lt;br /&gt;
Added room configuration option for restricting presence broadcast to certain roles.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.6 (2003-10-03)&lt;br /&gt;
&lt;br /&gt;
Added history management protocol on entering a room.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.5 (2003-09-11)&lt;br /&gt;
&lt;br /&gt;
Specified that ban occurs by JID, not roomnick; allowed privileged users to send messages to the room even if not present in the room; added note that service should remove occupant if a delivery-related stanza error occurs; enabled user to disco the room in order to discover registered roomnick; specified that &amp;quot;banning&amp;quot; by domain or regex is a service-level configuration matter and therefore out of scope for MUC; specified that role should be decremented as appropriate if affiliation is lowered; added some clarifying text to room creation workflow; added implementation note about sending an out-of-band message if a user's affiliation changes while the user is not in the room; fixed stringprep references (room nicks use Resourceprep); clarified relationship between Room ID (i.e., node identifier of Room JID, which may be opaque) and natural-language Room Name; specified Field Standardization profile per XEP-0068; defined XMPP Registrar submissions; added schema locations.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.4 (2003-02-16)&lt;br /&gt;
&lt;br /&gt;
Added XML schemas.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.3 (2003-02-11)&lt;br /&gt;
&lt;br /&gt;
Added reference to nodeprep Internet-Draft.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.2 (2003-01-30)&lt;br /&gt;
&lt;br /&gt;
Commented out revision history prior to version 1.0 (too long); clarified business rules regarding when nicks, full JIDs, and bare JIDs are used in reference to roles and affiliations; consistently specified that extended presence information in the muc#user namespace must include the full JID as the value of the 'jid' attribute in all cases; cleaned up text and examples throughout; added open issue regarding syntax of room nicknames.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.1 (2002-12-16)&lt;br /&gt;
&lt;br /&gt;
Added protocol for declining an invitation; replaced &amp;lt;created/&amp;gt; element with status code 201; modified the destroy room protocol so that &amp;lt;destroy/&amp;gt; is a child of &amp;lt;query/&amp;gt;; clarified usage of 'nick' attribute when adding members; prohibited use of message events.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.0 (2002-11-21)&lt;br /&gt;
&lt;br /&gt;
Per a vote of the Jabber Council, revision 0.23 was advanced to Draft on 2002-11-21. (For earlier revision history, refer to XML source.)&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.23 (2002-11-06)&lt;br /&gt;
&lt;br /&gt;
Added examples for disco#items queries sent to a room; prohibited 'type' attribute on invite messages sent from client to room; added dependencies on browse and disco; changed 'room user' to 'occupant'; fixed many small errors throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.22 (2002-11-04)&lt;br /&gt;
&lt;br /&gt;
Added example for disco#items; added support for cancellation of room configuration using type='cancel' from XEP-0004; noted 403 error for invites sent by non-admins in members-only room.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.21 (2002-11-01)&lt;br /&gt;
&lt;br /&gt;
Clarified several small ambiguities; made &amp;lt;body/&amp;gt; optional on invites sent from the service to the invitee; added error scenarios for changing nickname and for destroying the room; specified that the service must return the full member list for a members-only room (not only the members in the room); updated the disco examples to track protocol changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.20 (2002-10-29)&lt;br /&gt;
&lt;br /&gt;
Specified that messages sent to change the room subject must be of type &amp;quot;groupchat&amp;quot;; updated the legal notice to conform to the XSF IPR policy.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.19 (2002-10-28)&lt;br /&gt;
&lt;br /&gt;
Added ability to create an instant room within MUC (not by using gc-1.0 protocol); cleaned up disco examples.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.18 (2002-10-27)&lt;br /&gt;
&lt;br /&gt;
Added experimental support for disco; added sections for security, IANA, and JANA considerations; corrected typographical errors; cleaned up some DocBook formatting.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.17 (2002-10-23)&lt;br /&gt;
&lt;br /&gt;
Added the optional &amp;lt;actor/&amp;gt; element (with 'jid' attribute) to &amp;lt;item/&amp;gt; elements inside presence stanzas of type &amp;quot;unavailable&amp;quot; that are sent to users who are kicked or banned, as well as within IQs for tracking purposes; reverted all list editing use cases (ban, voice, member, moderator, admin, owner) to use of MUC format rather than 'jabber:x:data' namespace; added several guidelines regarding generation and handling of XML stanzas; cleaned up the change room subject use case; changed several ambiguous uses of 'would', 'can', and 'will' to 'should', 'may', or 'must'; fixed several small errors in the text, examples, and DTDs.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.16 (2002-10-20)&lt;br /&gt;
&lt;br /&gt;
Added the &amp;lt;item/&amp;gt; element to presence stanzas of type &amp;quot;unavailable&amp;quot; in order to improve the tracking of user states in the room; consolidated &amp;lt;invitee/&amp;gt; and &amp;lt;invitor/&amp;gt; elements into an &amp;lt;invite/&amp;gt; element with 'from' and 'to' attributes; made &amp;lt;reason/&amp;gt; element always a child of &amp;lt;item/&amp;gt; or &amp;lt;invite/&amp;gt; in the muc#user namespace; moved the alternate room location in room destruction to a 'jid' attribute of the &amp;lt;alt/&amp;gt; element; further specified several error messages; disallowed simultaneous modifications of both affiliations and roles by a moderator or admin; added several more rules regarding handling of XML stanzas; added use cases for granting and revoking administrative privileges; adjusted DTD to track all changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.15 (2002-10-18)&lt;br /&gt;
&lt;br /&gt;
Fully incorporated the change to affiliations + roles; moved a number of admin use cases to a new section for moderator use cases; added participant use case for requesting membership; added admin use cases for adding members, removing members, granting and revoking moderator privileges, and modifying the moderator list; organized the sections in a more logical manner.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.14 (2002-10-17)&lt;br /&gt;
&lt;br /&gt;
Significantly modified the privileges model by distinguishing between in-room &amp;quot;roles&amp;quot; and long-lived &amp;quot;affiliations&amp;quot;; specified the privileges of the various roles and affiliations; included state transition charts for both roles and affiliations; removed use of MUC protocol for editing ban, voice, and admin lists (but not for the actions of banning users and granting/revoking voice); added delivery rule regarding IQ stanzas; changed kick so that the action is based on changing the role to &amp;quot;none&amp;quot;.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.13 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Corrected the change nickname examples (newnick sent on unavailable, no nick sent on available).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.12 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Removed SHA1 passwords; specified that room shall add passwords on invitations to password-protected rooms (not supplied by invitor).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.11 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Changed 'participant' to 'room user' and 'discussant' to 'participant'; clarified presence rule about client generation of extended presence information; added role of 'none'.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.10 (2002-10-15)&lt;br /&gt;
&lt;br /&gt;
Fixed extended presence on entering or creating a room (plain '...muc' with no fragment); harmonized #user with #admin regarding the use of the &amp;lt;item/&amp;gt; element and associated attributes (jid, nick, etc.), and added 'role' attribute; modified management of voice, ban, admin, and member lists to use &amp;lt;query/&amp;gt; wrapper and new &amp;lt;item/&amp;gt; structure; changed the 'member' role to 'discussant', added 'outcast' role for banned users, and added new 'member' role to enable management of member lists; changed invitation-only rooms to members-only rooms and made appropriate adjustments to apply member lists to both members-only rooms and open rooms; modified nickname change protocol slightly to send the old nickname in the unavailable presence and the new nickname in the available presence; removed prohibition on members-only rooms that are password-protected; removed the &amp;lt;query/&amp;gt; wrapper for the &amp;lt;destroy/&amp;gt; element; updated the DTDs.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.9 (2002-10-13)&lt;br /&gt;
&lt;br /&gt;
Added extended presence ('...#user') on entering a room for MUC clients; changed namespace on room creation request to '...#owner'; added a service discovery example using jabber:iq:browse; added information about discussion history; made small fixes to several examples; further defined the presence rules; transferred all implementation notes to a dedicated section; added a Terminology section.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.8 (2002-10-10)&lt;br /&gt;
&lt;br /&gt;
Made further changes to the room creation workflow (finally correct); removed feature discovery use case (this needs to be addressed by a real service discovery protocol!); added ability for room owners to edit the admin list; removed &amp;lt;body/&amp;gt; from invitations generated by the service; removed messages sent to kicked and banned users (handled by unavailable presence with status code); added a number of implementation notes; converted all examples to Shakespeare style.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.6 (2002-10-09)&lt;br /&gt;
&lt;br /&gt;
Fixed the room creation workflow; changed some terminology (&amp;quot;join&amp;quot; to &amp;quot;enter&amp;quot; and &amp;quot;leave&amp;quot; to &amp;quot;exit&amp;quot;).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.5 (2002-10-08)&lt;br /&gt;
&lt;br /&gt;
Specified and improved the handling of invitation-only rooms. In particular, added the ability for room admins to edit the invitation list and added a configuration option that limits the ability to send invitations to room admins only.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.4 (2002-10-07)&lt;br /&gt;
&lt;br /&gt;
Changed namespaces from http://jabber.org/protocol/muc/owner etc. to http://jabber.org/protocol/muc#owner etc. per Jabber Council discussion.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.3 (2002-10-07)&lt;br /&gt;
&lt;br /&gt;
Changed namespaces to HTTP URIs; left role handling up to the implementation; further clarified presence rules.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.2 (2002-10-06)&lt;br /&gt;
&lt;br /&gt;
Disallowed kicking, banning, and revoking voice with respect to room admins and room owners; replaced &amp;lt;x/&amp;gt; with &amp;lt;query/&amp;gt; in the Discovering Room Features and Destroying a Room use cases; corrected some small errors and made many clarifications throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.1 (2002-10-04)&lt;br /&gt;
&lt;br /&gt;
Removed &amp;lt;whois/&amp;gt; command (unnecessary since participants with appropriate privileges receive the full JID of all participants in presence stanzas); completed many small fixes throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7 (2002-10-03)&lt;br /&gt;
&lt;br /&gt;
More clearly delineated participant roles and defined the hierarchy thereof (owner, admin, member, visitor); replaced &amp;lt;voice/&amp;gt; element in extended presence with &amp;lt;item role='member'/&amp;gt;; changed initial room configuration to use IQ rather than message; adjusted presence rules (especially regarding extended presence information); cleaned up examples throughout; updated DTD to track changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.6 (2002-09-21)&lt;br /&gt;
&lt;br /&gt;
More clearly defined the scope; removed fully anonymous rooms; changed meaning of semi-anonymous rooms and of non-anonymous rooms; added mechanism for notification of full JIDs in non-anonymous rooms; replaced the &amp;lt;admin/&amp;gt; element in extended presence with a &amp;lt;role/&amp;gt; element (more extensible); changed room passwords to cleartext; added status codes for various messages received from the service; added lists of valid error and status codes associated with the 'http://jabber.org/protocol/muc#user' namespace; added a &amp;lt;reason/&amp;gt; element for invitations; made kick and ban reasons child elements rather than attributes; replaced stopgap feature discovery mechanism with jabber:iq:negotiate; added extended presence element to room creation request and clarified the room creation process; specified presence reflection rules; added method for destroying a room; adjusted DTDs to track all changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.5.1 (2002-09-20)&lt;br /&gt;
&lt;br /&gt;
Added DTDs; changed feature discovery to use &amp;lt;x/&amp;gt; element rather than query and made service response come in IQ result; fixed reference to JID spec; changed 'grant' to 'add' and 'revoke' to 'remove' for consistency in the item attributes; made several other small changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.5 (2002-09-19)&lt;br /&gt;
&lt;br /&gt;
Changed the kick, ban, and voice protocols; added a few more configuration options; specified the restrictions for roomnicks; and added a stopgap service discovery protocol.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.4 (2002-09-18)&lt;br /&gt;
&lt;br /&gt;
Changed all non-GC-1.0 use cases to jabber:gc:* namespaces or jabber:x:data; added use cases for ban list management and room moderation; added protocol for sending notice of admin and voice privileges in presence; cleaned up text and many examples.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.3 (2002-09-17)&lt;br /&gt;
&lt;br /&gt;
Changed admin use cases; cleaned up participant and owner use cases.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.2 (2002-09-12)&lt;br /&gt;
&lt;br /&gt;
Broke content out into three actors (participant, owner, and admin) and added more detail to owner and admin use cases.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.1 (2002-09-09)&lt;br /&gt;
&lt;br /&gt;
Initial version.&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
END&lt;/div&gt;</summary>
		<author><name>Zyhserry</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0045</id>
		<title>XEP-0045</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0045"/>
				<updated>2013-12-27T07:25:53Z</updated>
		
		<summary type="html">&lt;p&gt;Zyhserry: /* 默认角色 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0045.html XEP-0045]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0045: 多用户聊天'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本文定义了一个XMPP协议扩展用于多用户文本会议.即多个XMPP可以在一个房间或频道互相交流信息, 类似互联网中继聊天系统(IRC).还有标准聊天室功能如聊天室的主题和邀请，本协议定义了一个强有力的房间控制模型，包括能够踢和禁止用户，任命主持人和管理员，要求会员或密码才能加入房间，等等。&lt;br /&gt;
&lt;br /&gt;
作者:	Peter Saint-Andre&lt;br /&gt;
&lt;br /&gt;
XMPP扩展协议的版权(1999-2008)归XMPP标准化基金会(XSF)所有&lt;br /&gt;
&lt;br /&gt;
版权:	© 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0045#法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.24&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2008-07-16&lt;br /&gt;
&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个草案标准.对本协议的执行是被鼓励的,也适于部署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
传统上, 即时消息被视为由一对一的聊天构成而不是多对多聊天(即所谓&amp;quot;群聊&amp;quot;或&amp;quot;文本会议&amp;quot;). 群聊功能常见于一些系统如 Internet Relay Chat (IRC) 和 流行的IM服务所提供的聊天室功能. Jabber社区早在1999年开发和实施了一个基本的群聊协议. 这个 &amp;quot;groupchat 1.0&amp;quot; 协议为聊天室提供了一个最小功能集但是范围很有限. 本协议(多用户聊天或简称MUC)建立在向后兼容旧的&amp;quot;groupchat 1.0&amp;quot;协议的基础上但是提供高级功能如邀请, 房间主持和管理, 以及专门的房间类型.&lt;br /&gt;
&lt;br /&gt;
==范围==&lt;br /&gt;
&lt;br /&gt;
本文着重于和配置,参与以及管理一个独立的基于文本的会议室相关的通用需求. 这里所指出的需求是应用于单个房间级别的并且是&amp;quot;通用的&amp;quot;, 某种意义上它们是在Jabber社区广泛讨论的或在现有的Jabber之外的基于文本的会议环境(例如, 定义在 [http://tools.ietf.org/html/rfc1459 RFC 1459] [[XEP-0045#附录G:备注|1]]中的Internet Relay Chat 和它的继承者: [http://tools.ietf.org/html/rfc2810 RFC 2810] [[XEP-0045#附录G:备注|2]], [http://tools.ietf.org/html/rfc2811 RFC 2811] [[XEP-0045#附录G:备注|3]], [http://tools.ietf.org/html/rfc2812 RFC 2812] [[XEP-0045#附录G:备注|4]], [http://tools.ietf.org/html/rfc2813 RFC 2813] [[XEP-0045#附录G:备注|5]])中已经存在的.&lt;br /&gt;
&lt;br /&gt;
本文明确地不涉及以下需求:&lt;br /&gt;
&lt;br /&gt;
* 房间之间的关系(例如, 房间的层次结构)&lt;br /&gt;
&lt;br /&gt;
* 多用户聊天服务的管理(例如, 管理跨越整个服务级别的权限或注册一个全局可用的房间昵称)；这些用例定义在[http://xmpp.org/extensions/xep-0133.html Service Administration] [[XEP-0045#附录G:备注|6]]&lt;br /&gt;
&lt;br /&gt;
* 个别消息的主持&lt;br /&gt;
&lt;br /&gt;
* 通过房间发送的消息的加密&lt;br /&gt;
&lt;br /&gt;
* 高级特性, 如附加文件给一个房间, 集成白板, 以及和语音或视频聊天服务的接口&lt;br /&gt;
&lt;br /&gt;
* MUC部署和外来的聊天系统(例如, 和IRC网关或现有的其他IM系统)之间的交互&lt;br /&gt;
&lt;br /&gt;
* 在多个MUC部署之间进行镜像或复制&lt;br /&gt;
&lt;br /&gt;
这一受限的范围并非蔑视这些都很有用的主题; 无论如何, 这意味着本文专注于讨论和介绍一个易于理解的协议能够被类似的Jabber客户端和组件开发者实现. 将来的协议当然可能涉及以上提到的这些主题.&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
本文描述了由Jabber现有的多用户聊天服务提供的最小功能集. 为了向后兼容性起见, 本文使用原来的&amp;quot;groupchat 1.0&amp;quot;协议作为基本功能, 包括以下这些:&lt;br /&gt;
&lt;br /&gt;
* 每个房间被标识为 &amp;lt;room@service&amp;gt; (例如, &amp;lt;jdev@conference.jabber.org&amp;gt;), 这里 &amp;quot;room&amp;quot; 是房间的名称而 &amp;quot;service&amp;quot; 是多用户聊天服务运行所在的主机名.&lt;br /&gt;
&lt;br /&gt;
* 在一个房间里每个房客被标识为 &amp;lt;room@service/nick&amp;gt;, 这里 &amp;quot;nick&amp;quot; 是这个房客在这个房间里的昵称,定义于刚加入这个房间的时候，也可以在房客驻留改房间期间修改.&lt;br /&gt;
&lt;br /&gt;
* 一个用户通过发送出席信息给 &amp;lt;room@service/nick&amp;gt; 来加入一个房间（也就是成为房客）.&lt;br /&gt;
&lt;br /&gt;
* 在多用户聊天房间里发送的消息使用特殊的类型&amp;quot;groupchat&amp;quot;并且被寻址于房间本身 (room@service), 然后反映给所有房客.&lt;br /&gt;
&lt;br /&gt;
* 通过发送出席信息给 &amp;lt;room@service/newnick&amp;gt;，一个房客可以改变他或她的房间昵称以及在房间中的可用性状态 .&lt;br /&gt;
&lt;br /&gt;
* 通过发送一个类型为&amp;quot;unavailable&amp;quot;的出席信息给当前的&amp;lt;room@service/nick&amp;gt;，一个房客可以退出房间.&lt;br /&gt;
&lt;br /&gt;
本文追加的特性和功能包括以下这些:&lt;br /&gt;
&lt;br /&gt;
# 本地会话日志(不需要房间内的机器人)&lt;br /&gt;
# 允许用户申请房间成员&lt;br /&gt;
# 在一个非匿名房间里, 允许房客可以察看(另)一个房客的全JID&lt;br /&gt;
# 在一个半匿名房间里, 允许主持人可以察看一个房客的全JID&lt;br /&gt;
# 允许只有主持人修改房间主题&lt;br /&gt;
# 允许主持人从房间里踢出与会者和游客&lt;br /&gt;
# 在一个被主持的房间里,主持人可以授予和撤销发言权(也就是说, 发言的权力), 并且管理发言权列表&lt;br /&gt;
# 允许管理员授权和取消主持人权力, 并且管理主持人列表&lt;br /&gt;
# 允许管理员在房间禁止用户, 并管理黑名单&lt;br /&gt;
# 允许管理员授予和撤销成员权力, 并且管理一个仅限成员的房间的成员列表&lt;br /&gt;
# 允许所有者限制房客的数量&lt;br /&gt;
# 允许所有者指定其他的所有者(们)&lt;br /&gt;
# 允许所有者授予或撤销管理特权, 并管理管理员列表&lt;br /&gt;
# 允许所有者销毁房间&lt;br /&gt;
&lt;br /&gt;
另外, 本文提供了协议元素用于支持以下房间类型:&lt;br /&gt;
&lt;br /&gt;
# 公共的或隐藏的&lt;br /&gt;
# 持久的或临时的&lt;br /&gt;
# 密码保护的或不安全的&lt;br /&gt;
# 仅限成员的或开放的&lt;br /&gt;
# 主持的或非主持的&lt;br /&gt;
# 非匿名的或半匿名的&lt;br /&gt;
&lt;br /&gt;
为了实现这些需求, 本扩展协议需要满足 'http://jabber.org/protocol/muc' 名字空间(以及 在主名字空间URI加上 #owner, #admin, 和 #user 片断).&lt;br /&gt;
&lt;br /&gt;
==术语==&lt;br /&gt;
&lt;br /&gt;
===通用术语===&lt;br /&gt;
&lt;br /&gt;
Affiliation(岗位) -- 一个长期存在的和房间之间的联系或连接; 可能的岗位有 &amp;quot;owner&amp;quot;(所有者), &amp;quot;admin&amp;quot;(管理者), &amp;quot;member&amp;quot;(成员), 以及 &amp;quot;outcast&amp;quot;(被排斥者) (当然也可能没有岗位); 岗位(affiliation)和角色(role)是有区别的. 一个岗位跨越了用户对一个房间的访问期间.&lt;br /&gt;
&lt;br /&gt;
Ban(禁止) -- 从一个房间移除一个用户以使这个用户不能够再进入这个房间 (直到这个禁令被废除为止). 一个被禁止的用户的岗位(affiliation)为 &amp;quot;outcast&amp;quot;(被排斥者).&lt;br /&gt;
&lt;br /&gt;
Bare JID(纯JID) -- 一个用户的标识符 &amp;lt;user@host&amp;gt;, 不同于任何已有会话或资源的上下文, 与之相对的是全JID和房间JID.&lt;br /&gt;
&lt;br /&gt;
Full JID(全JID) -- 一个在线用户的标识符 &amp;lt;user@host/resource&amp;gt; , 不同于一个房间的上下文; 与之相对的是纯JID和房间JID.&lt;br /&gt;
&lt;br /&gt;
GC -- 最小的 &amp;quot;groupchat 1.0&amp;quot; 协议[7], Jabber社区于1999年开发; MUC 向后兼容GC.&lt;br /&gt;
&lt;br /&gt;
History(历史) -- 有限数量的消息节, 由当前讨论的上下文提供发送给一个新的房客.&lt;br /&gt;
&lt;br /&gt;
Invitation(邀请) -- 从一个用户发出的特殊消息给另一个用户, 邀请对方加入房间.; the invitation can be sent directly (see Direct MUC Invitations [8]) or mediated through the room (as described under Inviting Another User to a Room).&lt;br /&gt;
&lt;br /&gt;
IRC -- Internet Relay Chat.&lt;br /&gt;
&lt;br /&gt;
Kick(踢人) -- 临时从一个房间移除一个与会者或游客; 这个用户任何时候都可以再次进入这个房间. 一个被踢的用户的角色是&amp;quot;none&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Logging(记录) -- 存储发生在一个房间的讨论内容用于公开发布到房间上下文之外的地方.&lt;br /&gt;
&lt;br /&gt;
Member(成员) -- 一个用户在一个仅限会员的房间内处于&amp;quot;white list&amp;quot;(白名单)内，或已经注册到一个公开的房间. 一个成员的岗位是&amp;quot;member&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Moderator(主持人) -- 一个房间角色,通常和房间的管理有关但是这个角色可以被赋予非管理员; 可以踢人, 可以授予和撤销发言权, 等等. 一个主持人的角色是&amp;quot;moderator&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
MUC -- 本文所定义的基于文本会议的多用户聊天协议.&lt;br /&gt;
&lt;br /&gt;
Occupant(房客) -- 一个房间里的任何Jabber用户 (这是一个 &amp;quot;抽象类&amp;quot; 并且不对应任何特定的角色).&lt;br /&gt;
&lt;br /&gt;
Occupant JID(房客JID) -- 在一个房间上下文中的一个房客，以 &amp;lt;room@service/nick&amp;gt; 来标识; 与之相对的是纯JID和全JID.&lt;br /&gt;
&lt;br /&gt;
Outcast(被排斥者) -- 一个被某个房间禁止的用户. 一个被排斥者的岗位是 &amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Participant(与会者) -- 一个没有管理权限的房客; 在一个被主持的房间里, 参与者更多地被定义为有发言权的 (与之相反的是游客). 一个与会者的角色是&amp;quot;participant&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Private Message(私有消息) -- 从一个房客直接发给另一个房间JID的消息(不是房间本身广播给所有房客的消息).&lt;br /&gt;
&lt;br /&gt;
Role(角色) -- 在一个房间里的一个临时的地位或者权限级别, 对于这个房间中的用户的长期岗位来说是唯一的; 可能的角色有 &amp;quot;moderator&amp;quot;（主持人）, &amp;quot;participant&amp;quot;(与会者), 和 &amp;quot;visitor&amp;quot;(游客) (也可能没有预定义的角色). 一个角色仅仅存在于一个房客访问一个房间的期间.&lt;br /&gt;
&lt;br /&gt;
Room(房间) -- 一个虚拟的地方, Jabber用户象征性地加入它, 来和其他用户一起参与一个实时的基于文本的会议.&lt;br /&gt;
&lt;br /&gt;
Room Administrator(房间管理员) -- 一个由房间所有者授权的用户, 可以执行管理功能, 如禁止用户等等; 无论如何, 不允许改变定义的房间特性. 一个管理员的岗位是&amp;quot;admin&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
Room ID(房间ID) -- 一个房间JID的节点标识符部分, 它可以是不透明的因而对人类用户没有什么含义(见  语法的商业规则Business Rules for syntax); 与之相对的是房间名.&lt;br /&gt;
&lt;br /&gt;
Room JID(房间JID) -- 房间地址，如 &amp;lt;room@service&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Room Name(房间名) -- 一个用户友好的, 自然语言的房间名字, 由房间所有者配置并在服务查询中展示; 与之相对的是房间ID.&lt;br /&gt;
&lt;br /&gt;
Room Nickname(房间昵称) -- 房间JID的资源标识符部分(见语法的商业规则); 这是一个房客在这个房间中所呈现的&amp;quot;友好的名字&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Room Owner(房间所有者) -- 建立某个房间的Jabber用户或一个被房间创建者或所有者指派拥有所有者权限(如果允许的话)的Jabber用户; 它被允许改变定义好的房间特性, 也可以执行全部的管理功能. 一个所有者的岗位为&amp;quot;owner&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Room Roster(房间名册) -- 一个房间中的所有房客在一个Jabber客户端的展现.&lt;br /&gt;
&lt;br /&gt;
Server(服务器) -- 一个Jabber服务器，可以关联或不关联一个基于文本的会议服务.&lt;br /&gt;
&lt;br /&gt;
Service(服务) -- 一个主机, 提供基于文本的会议的能力; 通常但不必须是一个Jabber服务器的子域(例如, conference.jabber.org).&lt;br /&gt;
&lt;br /&gt;
Subject(主题) -- 一个房间的临时讨论标题.&lt;br /&gt;
&lt;br /&gt;
Visit(访问) -- 一个房间的一个用户的&amp;quot;session&amp;quot;(会话), 当用户进入这个房间时开始(也就是说, 成为一个房客) , 结束于用户离开房间之时.&lt;br /&gt;
&lt;br /&gt;
Visitor(游客) -- 在一个被主持的房间里的一个没有发言权的房客(相反则是一个与会者). 一个游客的角色是&amp;quot;visitor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Voice(发言权) -- 在一个被主持的房间里, 发送消息给全部房客的权限.&lt;br /&gt;
&lt;br /&gt;
===房间类型===&lt;br /&gt;
&lt;br /&gt;
Hidden Room(隐藏房间) -- 一个无法被任何用户以普通方法如搜索和服务查询来发现的房间; 反义词: 公开(public)房间.&lt;br /&gt;
&lt;br /&gt;
Members-Only Room(仅限会员的房间) -- 如果一个用户不在成员列表中则无法加入的一个房间; 反义词: 开放(open)房间.&lt;br /&gt;
&lt;br /&gt;
Moderated Room(被主持的房间) -- 只有有&amp;quot;发言权&amp;quot;的用户才可以发送消息给所有房客的房间; 反义词: 非主持的(Unmoderated)房间.&lt;br /&gt;
&lt;br /&gt;
Non-Anonymous Room(非匿名房间) -- 一个房客的全JID会暴露给所有其他房客的房间, 尽管房客可以选择任何期望的房间昵称; 相对的是半匿名(Semi-Anonymous)房间.&lt;br /&gt;
&lt;br /&gt;
Open Room(开放房间) -- 任何人可以加入而不需要在成员列表中的房间; 反义词: 仅限会员的房间.&lt;br /&gt;
&lt;br /&gt;
Password-Protected Room(密码保护房间) -- 一个用户必须提供正确密码才能加入的房间; 反义词: 非保密房间.&lt;br /&gt;
&lt;br /&gt;
Persistent Room(持久房间) -- 如果最后一个房客退出也不会被销毁的房间; 反义词: 临时房间.&lt;br /&gt;
&lt;br /&gt;
Public Room(公开房间) -- 用户可以通过普通方法如搜索和服务查询来发现的房间; 反义词: 隐藏房间.&lt;br /&gt;
&lt;br /&gt;
Semi-Anonymous Room(半匿名房间) -- 一个房客的全JID只能被房间管理员发现的房间; 相对的是非匿名(Non-Anonymous)房间.&lt;br /&gt;
&lt;br /&gt;
Temporary Room(临时房间) -- 如果最后一个房客退出就会被销毁的房间; 反义词: 持久房间.&lt;br /&gt;
&lt;br /&gt;
Unmoderated Room(非主持的房间) -- 任何房客都被允许发送消息给所有房客的房间; 反义词: 被主持的房间.&lt;br /&gt;
&lt;br /&gt;
Unsecured Room(非保密房间) -- 任何人不需要提供密码就可以进入的房间; 反义词: 密码保护房间.&lt;br /&gt;
&lt;br /&gt;
===登场人物===&lt;br /&gt;
&lt;br /&gt;
本文的大部分例子使用了莎士比亚的《麦克白》中第四幕第一场开头女巫在黑洞中开会的场景，在这里使用&amp;quot;coven@chat.shakespeare.lit&amp;quot;代表聊天室. 人物如下:&lt;br /&gt;
&lt;br /&gt;
'''表1: 剧中人'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!Room Nickname !!Full JID!!Affiliation&lt;br /&gt;
|-&lt;br /&gt;
|firstwitch ||crone1@shakespeare.lit/desktop ||Owner&lt;br /&gt;
|-&lt;br /&gt;
|secondwitch ||wiccarocks@shakespeare.lit/laptop ||Admin&lt;br /&gt;
|-&lt;br /&gt;
|thirdwitch ||hag66@shakespeare.lit/pda ||None&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==角色(Roles)，岗位(Affiliations)和权限(Privileges)==&lt;br /&gt;
&lt;br /&gt;
A user might be allowed to perform any number of actions in a room, from joining or sending a message to changing configuration options or destroying the room altogether. We call each permitted action a &amp;quot;privilege&amp;quot;. There are two ways we might structure privileges:&lt;br /&gt;
&lt;br /&gt;
1. Define each privilege atomically and explicitly define each user's particular privileges; this is flexible but can be confusing to manage.&lt;br /&gt;
&lt;br /&gt;
2. Define bundles of privileges that are generally applicable and assign a user-friendly &amp;quot;shortcut&amp;quot; to each bundle (e.g., &amp;quot;moderator&amp;quot; or &amp;quot;admin&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
MUC使用第2种方式。&lt;br /&gt;
&lt;br /&gt;
有两个尺度我们可以用来衡量一个用户的连接或在一个房间的地位. 一个是用户和一个房间的长期的联系 -- 例如, 用户的状态是一个所有者或一个被排斥者. 另一个是当用户驻留于一个聊天室的时候的角色 -- 例如, 一个房客的地位是主持人,有权踢出游客和与会者. 这两个尺度各自都是唯一的, 因为一个岗位是跨越访问的, 而一个角色只存在于一次访问期间. 另外, 在角色和岗位之间没有一对一的对应关系; 例如, 某个不从属于某房间的人可能成为一个(临时的)主持人, 一个成员可能在一个被主持的房间中是一个与会者或游客者. 这些概念以下全面解释.&lt;br /&gt;
&lt;br /&gt;
===角色===&lt;br /&gt;
&lt;br /&gt;
以下是已定义的角色:&lt;br /&gt;
&lt;br /&gt;
'''表2: 角色'''&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!名称 !!支持&lt;br /&gt;
|-&lt;br /&gt;
| 主持人Moderator   ||必需的 &lt;br /&gt;
|-&lt;br /&gt;
| 无None       ||缺少角色&lt;br /&gt;
|-&lt;br /&gt;
| 与会者Participant   ||必需的&lt;br /&gt;
|-&lt;br /&gt;
| 游客Visitor     ||推荐的&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
角色是临时的,它不一定要在用户对房间的访问中持久化,它可以(MAY)在一个房客访问房间期间改变. 一个实现可以(MAY)在一次访问期间持久化角色并且应该(SHOULD)在被主持的房间这样做 (因为在游客和与会者之间,唯一性对一个被主持的房间是很关键的).&lt;br /&gt;
&lt;br /&gt;
在角色和岗位之间没有一对一的映射(例如, 一个成员可以是一个与会者或一个游客).&lt;br /&gt;
&lt;br /&gt;
在房间会话中,一个主持人是最有权力的房客, 它能在某种程度走上管理房间的其他房客的角色. 一个与会者的权力小于一个主持人, 尽管他或她有权发言. 在一个被主持的房间会话中游客是一个更受限制的角色, 因为访问者不允许发送消息给所有房客.&lt;br /&gt;
&lt;br /&gt;
角色的授予,撤销, 和维护是基于房客的房间昵称或全JID,而不是纯JID. 和这些角色相关的权限，还有角色改变触发的动作, 定义在下文中.&lt;br /&gt;
&lt;br /&gt;
所有在房间中生成或反射的出席信息中关于角色的信息必须(MUST)被发送,从而发送给房客们.&lt;br /&gt;
&lt;br /&gt;
====权限====&lt;br /&gt;
&lt;br /&gt;
大部分情况下, 角色存在于一个层次中. 例如, 一个与会者可以做任何游客能做的事, 而一个主持人可以做任何与会者能做的事. 每个角色拥有下一级角色所没有的权限; 这些权限定义于下表作为缺省值(一个实现可以(MAY)提供配置选项来重载这些缺省值).&lt;br /&gt;
&lt;br /&gt;
'''表3: 和角色相关的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!权限 !!无 !!游客 !!与会者 !!主持人&lt;br /&gt;
|-&lt;br /&gt;
|在房间中出席 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|接收消息 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|接收房客出席信息 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|出席信息广播到房间 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|改变可用性状态 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|改变房间昵称 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|发送私人消息 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|邀请其他用户 ||否 ||是* ||是* ||是&lt;br /&gt;
|-&lt;br /&gt;
|发送消息给所有人 ||否 ||否** ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|修改标题 ||否 ||否* ||是* ||是&lt;br /&gt;
|-&lt;br /&gt;
|踢出与会者和游客 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|授予发言权 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|撤销发言权 ||否 ||否 ||否 ||是***&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 缺省; 设定配置时可以(MAY)修改这个权限.&lt;br /&gt;
&lt;br /&gt;
** 一个实现可以(MAY)在非主持的房间里缺省地授予发言权给游客.&lt;br /&gt;
&lt;br /&gt;
*** 主持人不能(MUST NOT)从一个管理员或所有者收回发言权.&lt;br /&gt;
&lt;br /&gt;
====默认角色====&lt;br /&gt;
&lt;br /&gt;
服务必须（SHOULD）根据用户的岗位信息来设置房客在房间里的初始角色（没有与岗位（“outcast”）关联的角色，因为outcast用户不允许进入房间）。下表对每个岗位对应的初始角色进行了总结。&lt;br /&gt;
&lt;br /&gt;
表4: 基于岗位的初始角色&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!Room Type !!None !!Member !!Admin !!Owner&lt;br /&gt;
|-&lt;br /&gt;
|Moderated ||Visitor ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Unmoderated ||Participant ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Members-Only ||N/A * ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Open	||Participant ||Participant ||Moderator ||Moderator&lt;br /&gt;
|}&lt;br /&gt;
* Entry is not permitted.&lt;br /&gt;
&lt;br /&gt;
====变更角色====&lt;br /&gt;
&lt;br /&gt;
一个房客的角色变更方法是定义好的. 有时候房客自己的动作导致变更 (例如, 加入或退出房间), 反之有时候由主持人,管理员或所有者的动作导致变更. 如果一个房客的角色改变了, 一个 MUC 服务实现必须(MUST)变更这个房客的角色来反映这个变更并且传达这个变更给所有房客. 角色的变更和它们触发的动作定义于下表.&lt;br /&gt;
&lt;br /&gt;
'''表4: 角色状态表'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!&amp;gt; !!无 !!游客 !!与会者 !!主持人&lt;br /&gt;
|-&lt;br /&gt;
|无 ||-- ||进入被主持的房间 ||进入非主持的房间 ||管理员或所有者进入房间&lt;br /&gt;
|-&lt;br /&gt;
|游客 ||退出房间或被主持人踢出房间 ||-- ||主持人授予发言权 ||管理员或所有者授予主持人权限&lt;br /&gt;
|-&lt;br /&gt;
|与会者 ||退出房间或被主持人踢出房间 ||主持人撤销发言权	||--  ||管理员或所有者授予主持人权限 &lt;br /&gt;
|-&lt;br /&gt;
|主持人	||退出房间 ||管理员或所有者改变角色成为游客* ||管理员或所有者改变角色成为与会者或撤销主持人权限* ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 一个主持人不能(MUST NOT)从一个岗位等于或高于主持人的房客那里收回主持人权限.&lt;br /&gt;
&lt;br /&gt;
注意: 特定的角色一般暗含特定的权限. 例如, 一个管理员或所有者自动成为一个主持人, 所以如果一个房客被授予管理员地位那么这个房客事实上将被授予主持人权限; 类似的, 当一个房客成为一个被主持的房间的成员, 这个房客自动拥有一个与会者的角色. 无论如何, 失去管理员地位并不足以意味这个房客不再是主持人 (因为只要是与会者就可能成为一个主持人). 因此, 当一个房客被授予特定的岗位的时候所拥有的角色是固定的, 反之当一个房客失去一个特定的岗位时它的角色是不确定的并取决于(服务的)实现. 因为一个客户端无法预料是否在撤销某个岗位之后这个角色成为什么, 如果它不想同时移除管理员/所有者权限和主持人角色, 那么除了岗位变更之外它还必须特意请求角色变更.&lt;br /&gt;
&lt;br /&gt;
===岗位===&lt;br /&gt;
&lt;br /&gt;
已定义了以下岗位:&lt;br /&gt;
&lt;br /&gt;
# 所有者&lt;br /&gt;
# 管理员&lt;br /&gt;
# 成员&lt;br /&gt;
# 被排斥者&lt;br /&gt;
# 无 (缺少岗位)&lt;br /&gt;
&lt;br /&gt;
必须支持&amp;quot;所有者&amp;quot;这个岗位,推荐支持&amp;quot;管理员&amp;quot;,&amp;quot;成员&amp;quot;,&amp;quot;被排斥者&amp;quot;的岗位.（&amp;quot;无&amp;quot;表示缺少岗位)&lt;br /&gt;
&lt;br /&gt;
这些岗位是长时间的跨越一个用户对这个房间的访问期间的并且不受房间里事件的影响. 而且, 这些岗位和一个房客在房间中的角色之间没有一对一的映射关系. 岗位被授予,撤销, 和维护都是基于这个用户的纯 JID.&lt;br /&gt;
&lt;br /&gt;
如果一个没有已定义的岗位的用户进入一个房间, 这个用户的岗位被定义为&amp;quot;无&amp;quot;; 无论如何, 这个岗位不能跨越(多次的)访问 (也就是说, 一个服务不会跨越访问维护一个 &amp;quot;无 列表&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;quot;成员&amp;quot;岗位为房间所有者或管理员提供了一个方法来指定一个&amp;quot;白名单&amp;quot;,其中的用户被允许加入一个仅供会员的房间. 当一个成员加入了一个仅供会员的房间, 他或她的岗位不会改变, 无论他或她的角色是什么. 成员岗位也为用户提供一个方法来高效地注册一个开放的房间并在某种方式意义上保持和那个房间的联系(例如可能在房间里预留那个用户的昵称).&lt;br /&gt;
&lt;br /&gt;
一个被排斥者就是一个被从房间踢出来并且不允许进入那个房间的用户.&lt;br /&gt;
&lt;br /&gt;
关于岗位的信息必须(MUST)由房间生成或反射到所有的出席信息节之中发送给房客们.&lt;br /&gt;
&lt;br /&gt;
====权限====&lt;br /&gt;
&lt;br /&gt;
大部分情况下, 岗位存在一个层次结构. 例如, 一个所有者可以做任何管理员能做的事情, 而一个管理员可以做任何成员能做的事情. 每个岗位拥有其下一级岗位所没有的权限; 这些权限定义在下表中.&lt;br /&gt;
&lt;br /&gt;
'''表5: 和岗位相关的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!权限 !!Outcast(被排斥者) !!None(无) !!Member(成员) !!Admin(管理员) !!Owner(所有者)&lt;br /&gt;
|-&lt;br /&gt;
|进入房间 ||否 ||是* ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|注册一个开放的房间 ||否 ||是 ||N/A ||N/A ||N/A&lt;br /&gt;
|-&lt;br /&gt;
|接收成员列表 ||否 ||否** ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|加入一个仅限会员的房间 ||否 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|禁止成员并把用户的岗位删除	||否 ||否 ||否 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑成员列表 ||否 ||否 ||否 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑主持人列表 ||否 ||否 ||否 ||是** ||是**&lt;br /&gt;
|-&lt;br /&gt;
|编辑管理员列表 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑所有者列表 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|变更房间定义 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|销毁房间	||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 作为缺省值, 一个无岗位的用户进入一个被主持的房间的角色是一个游客, 而进入一个开放的房间的角色是一个与会者. 一个成员进入一个房间的角色是与会者. 一个管理员或所有者进入房间的角色是一个主持人.&lt;br /&gt;
&lt;br /&gt;
** 一个管理员或所有者不能(MUST NOT)撤销另一个管理员或所有者的权限.&lt;br /&gt;
&lt;br /&gt;
====变更岗位====&lt;br /&gt;
&lt;br /&gt;
一个用户的岗位变更方法已经定义得很完善. 有时用户自己的动作导致这些变更(例如, 注册为一个房间的新成员), 反之有时候一个管理员或所有者的动作导致了这些变更. 如果一个用户的岗位改变了, 一个MUC服务实现必须(MUST)变更这个用户的岗位来反射这一变更并通知所有房客. 岗位变更和他们触发的动作定义在下表中.&lt;br /&gt;
&lt;br /&gt;
'''表6: 岗位状态表'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|  ||被排斥者(Outcast) ||无(None) ||成员(Member) ||管理员(Admin) ||所有者(Owner)&lt;br /&gt;
|-&lt;br /&gt;
|被排斥者(Outcast) ||-- ||管理员或所有者移除屏蔽 ||管理员或所有者增加用户到成员列表 ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|无(None) ||管理员或所有者使用屏蔽 ||-- ||管理员或所有者增加用户到成员列表, 或用户注册一个成员(如果允许) ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|成员(Member) ||管理员或所有者使用屏蔽 ||管理员或所有者变更岗位为&amp;quot;none&amp;quot; ||-- ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|管理员(Admin) ||所有者使用屏蔽 ||所有者变更岗位为&amp;quot;none&amp;quot; ||所有者变更岗位为&amp;quot;member&amp;quot; ||-- ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|所有者(Owner) ||所有者使用屏蔽 ||所有者变更岗位为&amp;quot;none&amp;quot; ||所有者变更岗位为&amp;quot;member&amp;quot; ||所有者变更岗位为&amp;quot;admin&amp;quot; ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==实体用例==&lt;br /&gt;
&lt;br /&gt;
一个MUC实现必须(MUST)支持[http://xmpp.org/extensions/xep-0030.html 服务发现] [[XEP-0045#附录G:备注|7]].&lt;br /&gt;
&lt;br /&gt;
===MUC的发现组件支持===&lt;br /&gt;
&lt;br /&gt;
一个Jabber实体可能希望发现是否一个服务实现了多用户聊天协议; 为了达到这个目的, 它发送一个服务发现信息(&amp;quot;disco#info&amp;quot;)查询给这组件的JID:&lt;br /&gt;
&lt;br /&gt;
'''例子 1. 用户通过Disco查询聊天服务是否支持MUC'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco1'&lt;br /&gt;
    to='macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须(MUST)返回它的的身份和它所支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 2. 服务返回Disco Info结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='Macbeth Chat Service'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 因为MUC是旧的&amp;quot;groupchat 1.0&amp;quot;协议的超集, 一个MUC服务不应该(SHOULD NOT)返回一个&amp;lt;feature var='gc-1.0'/&amp;gt;条目在一个disco#info结果中.&lt;br /&gt;
&lt;br /&gt;
===发现房间===&lt;br /&gt;
&lt;br /&gt;
发现服务条目(&amp;quot;disco#items&amp;quot;)协议使得一个用户可以向一个服务查询相关的条目列表, 在一个聊天服务中这包含这个服务所承载的所有特定房间的集合.&lt;br /&gt;
&lt;br /&gt;
'''例子 3. 用户向聊天服务查询房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco2'&lt;br /&gt;
    to='macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务应该(SHOULD)返回它承载的所有房间的列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 4. 服务返回Disco Item结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='heath@macbeth.shakespeare.lit'&lt;br /&gt;
          name='A Lonely Heath'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
          name='A Dark Cave'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='forres@macbeth.shakespeare.lit'&lt;br /&gt;
          name='The Palace'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='inverness@macbeth.shakespeare.lit'&lt;br /&gt;
          name='Macbeth&amp;amp;apos;s Castle'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果全部房间的列表太大(详见[[XEP-0030]]), 服务可以(MAY)只返回部分的房间列表.如果这样做了, 它应该 SHOULD 包含一个 &amp;lt;set/&amp;gt; 元素 (定义在 [http://xmpp.org/extensions/xep-0059.html Result Set Management] [[XEP-0045#附录G:备注|8]]) 以表明这个列表不是全部的结果集.&lt;br /&gt;
&lt;br /&gt;
'''例子 5. 服务返回Disco Item结果的部分列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='rooms.shakespeare.lit'&lt;br /&gt;
    id='disco-rsm-1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='alls-well-that-ends-well@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='as-you-like-it@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='cleopatra@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='comedy-of-errors@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='coriolanus@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='cymbeline@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hamlet@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fourth-one@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fourth-two@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fifth@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;set xmlns='http://jabber.org/protocol/rsm'&amp;gt;&lt;br /&gt;
      &amp;lt;first index='0'&amp;gt;alls-well-that-ends-well@rooms.shakespeare.lit&amp;lt;/first&amp;gt;&lt;br /&gt;
      &amp;lt;last&amp;gt;henry-the-fifth@rooms.shakespeare.lit&amp;lt;/last&amp;gt;&lt;br /&gt;
      &amp;lt;count&amp;gt;37&amp;lt;/count&amp;gt;&lt;br /&gt;
    &amp;lt;/set&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===查询房间信息===&lt;br /&gt;
&lt;br /&gt;
使用 disco#info 协议, 一个用户也可以查询一个特定房间的详情. 为了在进入房间之间确定这个房间的隐私和安全配置用户应该(SHOULD)这样做(详见[[XEP-0045#安全事项|安全事项]]).&lt;br /&gt;
&lt;br /&gt;
'''例子 6. 用户查询特定聊天室的信息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco3'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间必须(MUST)返回它的标识并且应该(SHOULD)返回它支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 7. 房间返回查询信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco3'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='A Dark Cave'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_passwordprotected'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_hidden'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_temporary'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_open'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_unmoderated'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_nonanonymous'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 因为 MUC 是旧的 &amp;quot;groupchat 1.0&amp;quot; 协议的超集, 一个 MUC 房间不应该(SHOULD NOT)在一个disco#info结果中返回&amp;lt;feature var='gc-1.0'/&amp;gt;条目. 房间应该(SHOULD)返回它支持的实质的有意义的特性, 例如密码保护和房间主持(这些特性被完整地列入了特性注册, 由[http://xmpp.org/registrar/ XMPP Registrar]维护; 也见于本文的[[XEP-0045#registrar|XMPP注册]] 章节).&lt;br /&gt;
&lt;br /&gt;
一个聊天室可以(MAY)使用[http://xmpp.org/extensions/xep-0128.html 服务查询扩展] [[XEP-0045#附录G:备注|9]]在它的disco#info应答中返回更详细的信息, 通过包含一个隐含的FORM_TYPE属性值&amp;quot;http://jabber.org/protocol/muc#roominfo&amp;quot;来标识. 这些信息可能包括关于一个房间的更详细的描述, 当前的房间标题, 以及这个房间当前的房客数量:&lt;br /&gt;
&lt;br /&gt;
'''例子 8. 房间返回扩展的查询信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco3a'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='A Dark Cave'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_passwordprotected'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_hidden'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_temporary'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_open'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_unmoderated'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_nonanonymous'/&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_description' label='Description'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_changesubject' label='Whether Occupants May Change the Subject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_contactjid' label='Contact Addresses'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;crone1@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_subject' label='Subject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Spells&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_occupants' label='Number of occupants'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;3&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_lang' label='Language of discussion'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_logs' label='URL for discussion logs'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://www.shakespeare.lit/chatlogs/darkcave/&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_pubsub' label='Associated pubsub node'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;xmpp:pubsub.shakespeare.lit?node=chatrooms/darkcave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
某些扩展的房间信息可能是动态生成的(例如, 讨论记录的URL地址, 它可能取决于服务器那一层的配置); 反之另一些信息则可能基于房间那一层的配置,任何定义在[[XEP-0045#附录G:备注|muc#roomconfig FORM_TYPE]] 里的字段都可以用于扩展服务发现的字段(如上文所示的 muc#roomconfig_changesubject 字段).&lt;br /&gt;
&lt;br /&gt;
注意: 前述 'http://jabber.org/protocol/muc#roominfo' FORM_TYPE的扩展服务发现字段将来还可以扩充(通过本文的[[XEP-0045#附录G:备注|字段标准化]]章节描述的机制).&lt;br /&gt;
&lt;br /&gt;
===查询房间条目===&lt;br /&gt;
&lt;br /&gt;
一个用户也可以(MAY)向一个特定的聊天室查询和它相关的条目:&lt;br /&gt;
&lt;br /&gt;
'''例子 9. 用户查询和一个特定聊天室相关的条目'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个实现可以(MAY)返回现有房客的列表(如果那信息是可公开的), 或不返回列表(如果那信息是私有的).&lt;br /&gt;
&lt;br /&gt;
'''例子 10. 房间返回查询条目结果(条目是公开的)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit/firstwitch'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit/secondwitch'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 这些 &amp;lt;item/&amp;gt; 元素由 disco#items 名字空间限定, 而不是 muc 名字空间; 这意味着他们不能拥有 'affiliation' 或 'role' 属性, 例如.&lt;br /&gt;
&lt;br /&gt;
'''例子 11. 房间返回空的查询条目结果(条目是私有的)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===查询一个房间的房客===&lt;br /&gt;
&lt;br /&gt;
如果一个非房客试图发送一个查询请求给一个&amp;lt;room@service/nick&amp;gt;类型的地址, 一个 MUC 服务应该(SHOULD)返回这个请求给这个实体并指明一个&amp;lt;bad-request/&amp;gt;错误条件. 如果一个房客发送这样一个请求, 服务可以(MAY)把它传递给指定的接收者; 详见本文的 [[XEP-0045#实现注意事项|实现注意事项]]章节.&lt;br /&gt;
&lt;br /&gt;
===发现客户端对MUC的支持===&lt;br /&gt;
&lt;br /&gt;
一个 Jabber 用户可能想发现这个用户的某个联系人是否支持多用户聊天协议. 这可以使用服务发现(协议)来完成.&lt;br /&gt;
&lt;br /&gt;
'''例子 12. 用户查询联系人对于 MUC 的支持'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco5'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
客户端应该(SHOULD)返回它的标识和它支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 13. 联系人返回发现信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='disco5'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='client'&lt;br /&gt;
        type='pc'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个用户也可能查询一个联系人在哪个房间. 这可以通过特定服务发现节点 'http://jabber.org/protocol/muc#rooms' 查询联系人的全JID(&amp;lt;user@host/resource&amp;gt;)来完成 :&lt;br /&gt;
&lt;br /&gt;
'''例子 14. 用户在当前房间查询联系人'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='rooms1'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#rooms'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 15. 联系人返回房间查询结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='rooms1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#rooms'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='characters@conference.shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可选的, 联系人可以(MAY)把它的房间昵称作为'name'属性的值返回:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
          name='secondwitch'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==房客用例==&lt;br /&gt;
&lt;br /&gt;
在一个多用户聊天环境中主要的行为者是房客, 它可以被认为存在于一个多用户聊天室&amp;quot;之内&amp;quot;并且参与那个房间的讨论 (在本协议中, 与会者和游客&amp;quot;仅仅&amp;quot;被认为是房客, 因为他们不拥有管理员权限). 为了更加清晰起见, 本文中的协议元素中涉及到驻留者的用例分为以下三类:&lt;br /&gt;
&lt;br /&gt;
# 现存于 &amp;quot;groupchat 1.0&amp;quot; 协议的最小功能集&lt;br /&gt;
# 对于 &amp;quot;groupchat 1.0&amp;quot; 协议直接的应用, 如处理一些和新房间类型有关的错误&lt;br /&gt;
# 用来处理&amp;quot;groupchat 1.0&amp;quot;协议未涉及的功能的额外的协议元素(房间邀请, 房间密码, 和房间角色及岗位相关的扩展出席信息); 在'http://jabber.org/protocol/muc#user'名字空间&lt;br /&gt;
&lt;br /&gt;
注意: 这里所有客户端生成的例子是从服务的角度来展示的, 所以所有由服务收到的节都包含一个'from'属性来表达发送者的全JID(这个from属性是由一个通用的Jabber路由或会话管理者加入的). 另外, 通常的表示请求已被完成的 IQ 结果节(如 [[RFC 3920]] [10]中所要求的)未显示在这里.&lt;br /&gt;
&lt;br /&gt;
===进入一个房间===&lt;br /&gt;
&lt;br /&gt;
====Groupchat 1.0协议====&lt;br /&gt;
&lt;br /&gt;
为了参加一个多用户聊天室的讨论, 一个Jabber用户必须(MUST)首先进入一个房间成为一个房客. 在旧的&amp;quot;groupchat 1.0&amp;quot;协议中, 这是通过发送出席信息&amp;lt;room@service/nick&amp;gt;来实现的, 这里&amp;quot;room&amp;quot;是房间的 ID, &amp;quot;service&amp;quot; 是聊天服务的主机名, &amp;quot;nick&amp;quot; 是这个用户在这房间里预期的昵称:&lt;br /&gt;
&lt;br /&gt;
'''例子 16. Jabber用户进入一个房间(Groupchat 1.0)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit/thirdwitch'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子中, 一个全JID为&amp;quot;hag66@shakespeare.lit/pda&amp;quot;的用户请求用昵称&amp;quot;thirdwitch&amp;quot;进入位于&amp;quot;macbeth.shakespeare.lit&amp;quot;聊天服务的房间&amp;quot;darkcave&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
如果用户未指定一个房间昵称, 服务应该(SHOULD)返回一个&amp;lt;jid-malformed/&amp;gt;错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 17. Jabber用户进入一个房间(Groupchat 1.0)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error code='400' type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;jid-malformed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====基本MUC协议====&lt;br /&gt;
&lt;br /&gt;
兼容的多用户聊天服务必须（MUST）接受知道&amp;quot;groupchat 1.0&amp;quot; (GC)协议或multi-user chat (MUC)协议的任何客户端发出上述请求进入会议室; 无论如何, MUC 客户端应该(SHOULD)声明他们的有能力支持 MUC 协议, 方法是在出席信息节里面包含一个空的 &amp;lt;x/&amp;gt; 元素, 满足名字空间 'http://jabber.org/protocol/muc'  (注意不需要 '#user' 部分):&lt;br /&gt;
&lt;br /&gt;
'''例子 18. Jabber用户准备进入一个房间(Multi-User Chat)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from=&amp;quot;hag66@shakespeare.lit/pda&amp;quot;&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 如果发生了一个和加入房间有关的错误, 服务应该 SHOULD 返回一个包含 MUC 子元素 (i.e., &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;) 的 &amp;lt;presence/&amp;gt; 节，其 type 为 &amp;quot;error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
在尝试进入房间之间, 一个兼容MUC的客户端应该(SHOULD)首先查询它的保留的房间昵称 (如果有的话), 接下来的协议本文中的 [[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]] 章节对此作了定义.&lt;br /&gt;
&lt;br /&gt;
====出席信息广播====&lt;br /&gt;
&lt;br /&gt;
如果服务能够添加用户到房间, 它必须(MUST)从所有现存的房客的房间JID发送出席信息给新的房客的全JID, 包括扩展的关于角色的出席信息, 一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;moderator&amp;quot;, &amp;quot;participant&amp;quot;, 或&amp;quot;visitor&amp;quot;, 这个子元素的'affiliation'属性值设为&amp;quot;owner&amp;quot;, &amp;quot;admin&amp;quot;, &amp;quot;member&amp;quot;, 或 &amp;quot;none&amp;quot; 中的一个:&lt;br /&gt;
&lt;br /&gt;
'''例子 19. 服务从现有的房客发送出席信息给新的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个示例中, 用户已从前一个例子进入房间, 有两个人已经在房间里: 一个是昵称为&amp;quot;firstwitch&amp;quot;的(房间拥有者), 另一个是昵称为&amp;quot;secondwitch&amp;quot;的(房间管理员).&lt;br /&gt;
&lt;br /&gt;
服务也必须(MUST)从新进入的房客的房间JID向所有房客的全JID发送出席信息(含新房客):&lt;br /&gt;
&lt;br /&gt;
'''例子 20. 服务发送新房客的出席信息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
在这个例子里, 初始的房间出席信息从新房客(thirdwitch)发送给所有房客, 包括这个新房客自己. 看看上面最后一个节, 由房间以房客的名义发送给用户自己的出席信息,应该 SHOULD 包含一个 110 状态码，这样用户就知道这个出席信息来自于作为房客的那个他自己.&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 重写新房客的房间昵称 (例如, 如果房间昵称被锁定). 如果服务不接受新房客请求的房间昵称，而是分配一个新的房间昵称, 它必须 MUST 包含一个 &amp;quot;210&amp;quot; 状态码在发送给这个新房客的出席信息广播里.&lt;br /&gt;
&lt;br /&gt;
'''例子 21. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
注意: 发送给新房客的出席信息的顺序是很重要的. 服务必须 MUST 首先发送现有房客的完整列表给这个新房客,然后只发送新房客自己的出席信息给新房客. 这有助于客户端知道什么时候它收到了完整的房间名册( &amp;quot;room roster&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
发送出席信息广播之后(并且只在这之后), 服务可以发送讨论历史, 即时消息, 出席信息更新, 以及其他房间内的流量.&lt;br /&gt;
&lt;br /&gt;
====缺省角色====&lt;br /&gt;
&lt;br /&gt;
下表总结了初始缺省的角色，一个服务应该根据用户的岗位来设置它们(没有和 被排斥者 &amp;quot;outcast&amp;quot; 岗位相关的角色, 因为这些用户不允许进入房间).&lt;br /&gt;
&lt;br /&gt;
'''表7: 基于岗位的初始角色'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!房间类型 !!无 !!成员 !!管理员 !!所有者&lt;br /&gt;
|-&lt;br /&gt;
|被主持的 ||游客 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|非主持的 ||与会者 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|仅限会员的 ||N/A * ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|开放的 ||与会者 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 实体不被允许.&lt;br /&gt;
&lt;br /&gt;
====非匿名房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是非匿名的, 服务必须 MUST 发送新房客的全JID给所有房客,使用满足 'http://jabber.org/protocol/muc#user' 名字空间的扩展出席信息,其中带有 &amp;lt;x/&amp;gt; 元素并包含一个 &amp;lt;item/&amp;gt; 子元素,其 'jid' 属性值为这个房客的全JID:&lt;br /&gt;
&lt;br /&gt;
'''例子 22. 服务发送全JID给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这个用户正在进入一个非匿名房间(即, 它如上所示,向所有房客通报每个房客的全JID), 服务应该 SHOULD 允许该用户加入本房间,但是必须 MUST 同时警告该用户本房间是非匿名的. 应该 SHOULD 在房间发送给这个新房客的初始出席信息种包含状态码 &amp;quot;100&amp;quot; 来实现这一点:&lt;br /&gt;
&lt;br /&gt;
'''例子 23. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 也可以 MAY 发送一个 &amp;quot;groupchat&amp;quot; 类型的消息给新房客来达到上述目的,这个消息应该包含一个 &amp;lt;x/&amp;gt; 子元素,并拥有 &amp;lt;status/&amp;gt; 子元素,并且其'code'属性值为&amp;quot;100&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 24. 服务警告新房客(该房间)非匿名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;This room is not anonymous.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
附带的状态码协助客户端展示它们自己的通知消息 (例如, 和用户所在地方有关的信息).&lt;br /&gt;
&lt;br /&gt;
====半匿名房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是半匿名的, 服务必须 MUST 如上文所述从新房客发送出席信息给所有房客, 但是必须 MUST 只在发给&amp;quot;主持人&amp;quot;的时候发送新房客的全JID,而非主持人则不发(全JID).&lt;br /&gt;
&lt;br /&gt;
(注意: 所有随后的例子中，涉及的&amp;lt;item/&amp;gt;元素都带有'jid'属性, 即使这个信息在半匿名房间里不被发送给非主持人.)&lt;br /&gt;
&lt;br /&gt;
====密码保护房间====&lt;br /&gt;
&lt;br /&gt;
如果房间要求密码验证而用户不能提供(或密码错误), 服务必须 MUST 拒绝访问这个房间并且通知该用户它们是未被授权的; 具体方法是返回一个类型为&amp;quot;error&amp;quot;的出席信息节并标明 &amp;lt;not-authorized/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 25. 服务拒绝访问,因为(用户)未提供密码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
密码应该 SHOULD 通过进入房间时发送的出席信息节来提供, 包含在满足 'http://jabber.org/protocol/muc' 名字空间的 &amp;lt;x/&amp;gt; 元素的&amp;lt;password/&amp;gt; 子元素里. 密码以明码方式发送; 目前不支持其它验证方法, 而且任何这类的验证或授权方法都将会定义在一个独立的协议里(参见本文的[[XEP-0045#安全事项|安全事项]]章节).&lt;br /&gt;
&lt;br /&gt;
'''例子 26. 用户进入房间时提供密码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====仅限会员房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限会员的,但用户不是(该房间的)成员, 服务必须 MUST 拒绝访问这个房间并通知用户它们不被允许进入房间; 具体方法是返回一个&amp;quot;error&amp;quot;类型的出席信息节，并包含一个 &amp;lt;registration-required/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 27. 服务拒绝访问，因为用户不在成员列表中'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;registration-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====被禁止的用户====&lt;br /&gt;
&lt;br /&gt;
如果用户已经被房间禁止(即, 其岗位为被排斥者 &amp;quot;outcast&amp;quot;), 服务必须 MUST 拒绝访问这个房间并通知用户他(她)被禁止了; 具体方法是返回一个出席信息节,类型为&amp;quot;error&amp;quot;，标明 &amp;lt;forbidden/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 28. 服务拒绝访问，因为用户被禁止了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====昵称冲突====&lt;br /&gt;
&lt;br /&gt;
如果房间里已经有别的用户使用了准备进入房间的新用户预期的昵称(或如果这个昵称被保留给另一个成员列表里面的用户), 服务必须 MUST 拒绝访问这个房间并通知用户这个冲突; 具体方法是返回一个出席信息节,类型为&amp;quot;error&amp;quot;，标明 &amp;lt;conflict/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 29. 服务拒绝访问，因为昵称冲突'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 如果现有房客的纯 JID &amp;lt;localpart@domain.tld&amp;gt; 和准备进入房间的用户的纯 JID 相同, 那么服务应该 SHOULD 允许这个用户的进入, 所以这个用户就有两个(或更多) 房间内的会话 &amp;quot;sessions&amp;quot; 使用同一个房间昵称, 每一个对应一个资源. 如果一个服务允许相同纯JID可以同时存在多个房客并使用同一个房间的房间昵称, 它应该 SHOULD 路由房间内的消息给该用户的所有资源并允许用户的所有资源发送消息给房间; 视实现而定，服务来决定如何适当的处理从用户的资源发送的出席信息以及如何路由私有消息到所有或某个资源(基于出席信息优先级或其他机制).&lt;br /&gt;
&lt;br /&gt;
如何确定昵称冲突取决于实现(例如, 该服务是否应用于一个特定的惯例, 一个 stringprep 规则如 Resourceprep 或 Nodeprep, 等等).&lt;br /&gt;
&lt;br /&gt;
====最大用户数====&lt;br /&gt;
&lt;br /&gt;
如果房间达到它的最大房客数量, 服务应该 SHOULD 拒绝访问这个房间并通知该用户这个限制; 方法是返回一个出席信息节，类型为&amp;quot;error&amp;quot;，标明 &amp;lt;service-unavailable/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 30. 服务通知用户该房间已达到房客数量极限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='wait'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 房间可以踢出空闲用户(&amp;quot;idle user&amp;quot;)以腾出空间.&lt;br /&gt;
&lt;br /&gt;
如果房间的房客数量已达到最大值但是一个房间管理员或所有者试图进入，该房间应该允许管理员或所有者加入，为了使得额外的房客达到一个合理的数目，该数量可以 MAY 做成可配置的。&lt;br /&gt;
&lt;br /&gt;
====锁住的房间====&lt;br /&gt;
&lt;br /&gt;
如果一个用户尝试进入一个房间而该房间是锁住的 &amp;quot;locked&amp;quot; (即, 在房间创建者提供初始的配置之前以及也就是在房间正式存在之前), 服务必须 MUST 拒绝进入并返回一个 &amp;lt;item-not-found/&amp;gt; 错误给该用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 31. 服务拒绝访问，因为房间不存在'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====不存在的房间====&lt;br /&gt;
&lt;br /&gt;
如果用户准备进入房间时，该房间已经不存在了, 服务应该 SHOULD 建立它; 无论如何, 这不是必需的, 因为一个实现或部署可以 MAY 选择限制建立房间的权限. 详见本文的[[XEP-0045#新建房间|新建房间]]章节.&lt;br /&gt;
&lt;br /&gt;
====房间记录====&lt;br /&gt;
&lt;br /&gt;
如果用户进入一个房间，该房间的讨论是被记录到一个公开的存档里面(经常可以通过HTTP访问的), 服务应该 SHOULD 允许该用户加入该房间但是必须 MUST 同时警告该用户讨论已被记录. 方法是应该 SHOULD 在房间发送给该新房客的初始出席信息中包含一个状态码 &amp;quot;170&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 32. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='170'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====讨论历史====&lt;br /&gt;
&lt;br /&gt;
如上发送完初始出席信息之后, 一个房间可以 MAY 发送讨论历史给这个新房客. (在完成按照本文[[XEP-0045#出席信息广播|出席信息广播]]章节规定的发送房间出席信息之前，该房间不能 MUST NOT 发送任何讨论历史.) 是否这个历史要被发送, 以及这个历史里面包含多少条消息, 将由聊天服务实现或特定的部署来决定.&lt;br /&gt;
&lt;br /&gt;
'''例子 33. 讨论历史的发送'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2002-10-13T23:58:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2002-10-13T23:58:43Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries 'Tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='hag66@shakespeare.lit/pda'&lt;br /&gt;
     stamp='2002-10-13T23:58:49Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
讨论历史消息必须 MUST 标为[http://xmpp.org/extensions/xep-0203.html Delayed Delivery] [[XEP-0045#附录G:备注|11]]信息，满足'urn:xmpp:delay' 名字空间，以表明它们是被延迟发送的并且标明它们最初发出的时间. (注意: 'urn:xmpp:delay' 名字空间定义在 XEP-0203 里面，取代了旧的定义在 [http://xmpp.org/extensions/xep-0091.html Legacy Delayed Delivery] [[XEP-0045#附录G:备注|12]] 里的 'jabber:x:delay' 名字空间 ; XEP-0091状态更改为已过时之前, 实现应该 SHOULD 包含两种日期时间(datetime)格式.). 在非匿名房间里，'from'属性应该 SHOULD 是原始发送者的全JID, 但不能 MUST NOT 在半匿名房间里(在那里'from'属性应该 SHOULD 设置为房间本身的JID). 服务应该 SHOULD 在进入该房间之后，发送任何即时(&amp;quot;live&amp;quot;)消息之前，发送完所有讨论历史消息.&lt;br /&gt;
&lt;br /&gt;
====管理讨论历史====&lt;br /&gt;
&lt;br /&gt;
用户可能 MAY 希望管理进入房间时(由房间)提供的讨论历史(可能因为用户带宽比较低或正在使用迷你客户端). 他必须 MUST 在加入房间时发出的初始出席信息节里包含一个 &amp;lt;history/&amp;gt; 子元素. 这个元素有四个可用的属性:&lt;br /&gt;
&lt;br /&gt;
'''表8: 历史管理属性'''&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!属性 !!数据类型 !!含义&lt;br /&gt;
|-&lt;br /&gt;
| maxchars   ||int    ||限制历史中的字符总数为&amp;quot;X&amp;quot; (这里的字符数量是全部 XML 节的字符数, 不只是它们的 XML 字符数据). &lt;br /&gt;
|-&lt;br /&gt;
| maxstanzas    ||int    ||限制历史中的消息总数为&amp;quot;X&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| seconds   ||int   ||仅发送最后 &amp;quot;X&amp;quot; 秒收到的消息.&lt;br /&gt;
|-&lt;br /&gt;
| since     ||dateTime     ||仅发送从指定日期时间 datetime 之后收到的消息 (这个datatime必须 MUST 符合[http://xmpp.org/extensions/xep-0082.html XMPP Date and Time Profiles] [[XEP-0045#附录G:备注|13]] 定义的DateTime 规则，).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 发送满足以上条件组合的最小数量的消息, 还要顾及服务级别和房间级别的缺省设置. 服务必须 MUST 只发送完整的消息节(即, 它不能 MUST not 按特定字符数把历史从字面上截断, 但是必须 MUST 发送最大数量的完整节,这使得字符数小于或等于 'maxchars' 属性的值). 如果客户端不希望收到历史, 它必须 MUST 把'maxchars' 属性值设为&amp;quot;0&amp;quot; (zero).&lt;br /&gt;
&lt;br /&gt;
以下例子展示如何使用这个协议.&lt;br /&gt;
&lt;br /&gt;
'''例子 34. 用户请求在历史中限制消息数量'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history maxstanzas='20'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 35. 用户请求最后三分钟的历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history seconds='180'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 36. 用户请求从Unix时代到现在的所有历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history since='1970-01-01T00:00:00Z'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务绝对不应该 SHOULD NOT 返回从Unix时代开始到现在的所有消息, 而应该 SHOULD 基于服务或房间的缺省值返回适当的有限数量的历史给用户.&lt;br /&gt;
&lt;br /&gt;
'''例子 37. 用户请求不发送历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history maxchars='0'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===退出一个房间===&lt;br /&gt;
&lt;br /&gt;
为了退出一个多用户聊天房间, 一个房客发送一个类型为&amp;quot;unavailable&amp;quot;的出席信息节给正在使用这个房间的 &amp;lt;room@service/nick&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
'''例子 38. 房客退出一个房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着从要离开的房客的房间JID发送&amp;quot;unavailable&amp;quot;类型的出席信息节给这个要离开的房客的全JID们以及留在房间的房客们:&lt;br /&gt;
&lt;br /&gt;
'''例子 39. 服务发送和离开的房客有关的出席信息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
由房间反射的类型为&amp;quot;unavailable&amp;quot;的出席信息节必须 MUST 包含扩展的关于角色和岗位的出席信息; 'role'属性值应该 SHOULD 被设为 &amp;quot;none&amp;quot; 以表示这个人不再是一个房客了.&lt;br /&gt;
&lt;br /&gt;
房客可以 MAY 在出席信息节包含一个常规的 &amp;lt;status/&amp;gt; 信息; 这使房客能在必要的情况下提供一个自定的退出消息:&lt;br /&gt;
&lt;br /&gt;
'''例子 40. 自定的退出消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
常规的出席信息节生成规则定义在 [[RFC3921|XMPP IM]] [[XEP-0045#附录G;备注|14]], 所以如果用户发送一个一般的不可用出席信息节, 用户的服务器将广播那个节到 &amp;lt;room@service/nick&amp;gt; ，而该用户之前曾经发送过直接出席信息给这个&amp;lt;room@service/nick&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
有可能一个用户不能正常地通过直接发送不可用信息给一个房间来退出该房间. 如果该用户没有发送不可用出席信息就下线了, 用户的服务器负责代替该用户发送不可用出席信息 (依据 RFC 3921). 如果该用户的服务器下线或该用户的服务器和该用户连接的MUC服务失去连接(例如, 在联邦通信), 这个MUC服务负责监视它收到的错误信息节以确定该用户是否下线. 如果该MUC服务确定该用户已下线, 它必须 must 当成该用户自己发送了不可用信息一样地处理这个用户.&lt;br /&gt;
&lt;br /&gt;
注意: 如果房间不是持久的并且该房客是最后一个退出的, 服务负责销毁这个房间.&lt;br /&gt;
&lt;br /&gt;
===更改昵称===&lt;br /&gt;
&lt;br /&gt;
多用户聊天室的一个常用功能是一个房客能修改自己在房间里的昵称. 在 MUC 里这需要发送一个更新出席信息给房间, 具体来说是在相同的房间里发送出席信息给一个新的房间JID (变更的只是这个房间JID的资源).&lt;br /&gt;
&lt;br /&gt;
'''例子 41. 房客修改昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务接着发送两个出席信息节给每个房客的全JID(包括修改自己昵称的房客本身), 一个是类型为&amp;quot;unavailable&amp;quot;的用于旧的昵称另一个指明新昵称可用了.&lt;br /&gt;
&lt;br /&gt;
这个不可用出席信息必须 MUST 在一个满足'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 子元素里面包含以下扩展的出席信息 :&lt;br /&gt;
&lt;br /&gt;
* 新昵称(在这个例子中, nick='oldhag')&lt;br /&gt;
* 一个状态码 303&lt;br /&gt;
&lt;br /&gt;
这使接受者能从旧昵称关联到新昵称.&lt;br /&gt;
&lt;br /&gt;
'''例子 42. 服务更新昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户尝试修改他或她的房间昵称,但这个昵称已经被其他用户使用了 (或者这个昵称是被这房间的其他用户岗位保留的, 例如, 一个成员或者所有者), 服务必须 MUST 拒绝这次昵称修改并通知该用户这一冲突; 也就是返回一个类型为 &amp;quot;error&amp;quot; 的出席信息节指明 &amp;lt;conflict/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 43. 服务拒绝昵称修改，因为昵称冲突'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 如果现有房客的纯JID &amp;lt;localpart@domain.tld&amp;gt; 和尝试变更昵称的房客的纯JID相同, 那么服务可以 MAY 允许昵称变更. 详见本文的[[XEP-0045#昵称冲突|昵称冲突]]章节.&lt;br /&gt;
&lt;br /&gt;
如果该用户尝试变更自己的昵称但是房间昵称被锁定了(&amp;quot;locked down&amp;quot;), 服务必须 MUST 拒绝这个昵称变更请求并返回一个&amp;quot;error&amp;quot;类型的出席信息节，指明一个 &amp;lt;not-acceptable/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 44. 服务拒绝昵称变更，因为房间昵称被锁定'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户应该 SHOULD 接着发现它的保留昵称，如本文的 [[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]]章节所述.&lt;br /&gt;
&lt;br /&gt;
===更改可用性状态===&lt;br /&gt;
&lt;br /&gt;
在一个多用户聊天系统里例如IRC, 一个常用的修改某人房间昵称的行为也意味着变更某人的可用性(例如, 变更某人的房间昵称为&amp;quot;thirdwitch|away&amp;quot;). 在Jabber里面, 可用性当然是通过出席信息 (中 &amp;lt;show/&amp;gt; 和 &amp;lt;status/&amp;gt; 元素)的变更来通知的, 这能提供重要的上下文给聊天室. 一个房客通过发送更新的出席信息给它自己的&amp;lt;room@service/nick&amp;gt;来改变他在房间内的可用性状态.&lt;br /&gt;
&lt;br /&gt;
'''例子 45. 房客变更可用性状态'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'&amp;gt;&lt;br /&gt;
  &amp;lt;show&amp;gt;xa&amp;lt;/show&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务然后从该房客发送一个出席信息节来修改他或她的出席信息给每个房客的全JID, 包含扩展的出席信息，包括这个房客的角色和全JID(给那些有权知道的人):&lt;br /&gt;
&lt;br /&gt;
'''例子 46. 服务传递修改的出席信息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;show&amp;gt;xa&amp;lt;/show&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===邀请其他用户进入一个房间===&lt;br /&gt;
====直接邀请====&lt;br /&gt;
&lt;br /&gt;
一个办法是发送一个直接的邀请(而不是由房间本身来间接邀请),定义在[http://xmpp.org/extensions/xep-0249.html Direct MUC Invitations] [[XEP-0045#附录G:备注|15]]. 直接发送邀请有助于适应被邀请者那一边的通信阻塞(对方可能拒绝和和不在好友名单中的实体通信).&lt;br /&gt;
&lt;br /&gt;
====间接邀请====&lt;br /&gt;
&lt;br /&gt;
邀请别的用户到一个房间成为房客是很有用的. 为了做到这一点, 一个 MUC 客户端必须 MUST 发送以下格式的 XML 给 &amp;lt;room@service&amp;gt; 本身 (原因(reason)是可选的 OPTIONAL 而消息(message)的类型必须 MUST 是显式或隐式的&amp;quot;normal&amp;quot;类型):&lt;br /&gt;
&lt;br /&gt;
'''例子 47. 房客通过房间发送一个邀请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;room@service&amp;gt; 本身必须 MUST 接着增加一个 'from' 地址到 &amp;lt;invite/&amp;gt; 元素，其值为邀请者的纯JID, 全JID, 或房间JID，并发送邀请给 'to' 地址所指明的被邀请者(为了旧的客户端，服务可以 MAY 包含一个消息主体&amp;quot;message body&amp;quot;解释这个邀请或包含一个原因&amp;quot;reason&amp;quot;(子元素); 另外, 房间应该 SHOULD 增加 password 如果该房间是密码保护的):&lt;br /&gt;
&lt;br /&gt;
'''例子 48. 房间代表邀请者发送邀请给被邀请者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限成员的, 服务可以 MAY 同时把这个被邀请者加入成员列表. (注意: 在仅限成员的房间里邀请的权力应该 SHOULD 由房间管理员限定; 如果一个没有权限的成员修改成员列表试图邀请别的用户, 服务应该 SHOULD 返回一个 &amp;lt;forbidden/&amp;gt; 错误给该房客; 详见本文的[[XEP-0045#修改成员列表|修改成员列表]]章节.)&lt;br /&gt;
&lt;br /&gt;
如果邀请者提供了一个不存在的JID, 房间应该 SHOULD 返回一个 &amp;lt;item-not-found/&amp;gt; 错误给邀请者.&lt;br /&gt;
&lt;br /&gt;
被邀请者可以 MAY 选择正式地拒绝 (反之则忽略) 邀请; 这是发送者希望看到的正式的通知. 为了拒绝这个邀请, 被邀请者必须 MUST 发送以下格式的消息给 &amp;lt;room@service&amp;gt; 本身:&lt;br /&gt;
&lt;br /&gt;
'''例子 49. 被邀请者谢绝邀请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='hecate@shakespeare.lit/broom'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;decline to='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Sorry, I'm too busy right now.&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/decline&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 50. 房间通知邀请者邀请被拒绝了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;decline from='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Sorry, I'm too busy right now.&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/decline&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能(有人)想知道为什么被邀请者不直接发送拒绝消息给访问者. 主要原因是特定的实现可能 MAY 选择让邀请基于房间JIDs而不是纯JIDs (所以, 例如, 一个房客可能从一个房间邀请某人到另一个房间而不需要知道这个人的纯JID). 因而服务必须 MUST 同时处理邀请和拒绝.&lt;br /&gt;
&lt;br /&gt;
===把一对一聊天转为多用户会议===&lt;br /&gt;
&lt;br /&gt;
有时候人们需要把一个一对一的聊天转成一个多用户的会议. 以下例子展示了这个流程.&lt;br /&gt;
&lt;br /&gt;
首先, 两个用户开始一个一对一聊天.&lt;br /&gt;
&lt;br /&gt;
'''例子 51. 一个一对一聊天'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在第一个用户决定加入第三个人到这个讨论, 所以她 (或, 更准确地说, 她的客户端) 做以下事情:&lt;br /&gt;
&lt;br /&gt;
# 新建一个多用户聊天室&lt;br /&gt;
# 可选地发送一对一聊天的历史到房间&lt;br /&gt;
# 发送一个邀请给第二个人和第三个人, 包含一个 &amp;lt;continue/&amp;gt; 元素 (可选地包含一个 'thread' 属性).&lt;br /&gt;
&lt;br /&gt;
注意: 新房间应该 SHOULD 是非匿名的, 可以 MAY 是一个即时房间(定义于本文的[[XEP-0045#新建即时房间|新建即时房间]]章节), 也可以 MAY 有一个从服务接收的唯一房间名(定义于本文的[[XEP-0045#请求唯一的房间名|请求唯一的房间名]]章节.&lt;br /&gt;
&lt;br /&gt;
注意: 如果这个一对一的聊天消息包含了一个 &amp;lt;thread/&amp;gt; 元素, 这个新建房间的人应该 SHOULD 在历史消息中包含这个 ThreadID, 在邀请中把这个 ThreadID 的值赋予 &amp;lt;continue/&amp;gt; 元素的 'thread' 属性, 并把这 ThreadID 包含在任何新的消息中发送到房间. ThreadIDs 的使用是推荐的 RECOMMENDED ，因为它帮助提供一对一聊天和多用户聊天的连续性.&lt;br /&gt;
&lt;br /&gt;
'''例子 52. 继续讨论 I: 用户新建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 53. 继续讨论 II: 所有者发送历史到房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2004-09-29T01:54:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2004-09-29T01:55:21Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 使用 Delayed Delivery 协议使房间创建者能够从他一对一聊天历史指明每个消息的日期时间 datetime (通过 'stamp' 属性), 以及每个消息的原始发送者的 JID (通过'from' 属性). 房间创建者应该 SHOULD 在邀请额外的用户到房间之前发送完整的一对一聊天历史, 并且也应该 SHOULD 把第二个人加入该房间之前和第一个人在一对一聊天界面中出现的任何消息当成历史来发送; 如果这个一对一历史特别的大, 发送的客户端可能希望在数秒内发送这个历史而不是一次性发送所有历史(以to 避免触发频率限制). 服务不应该 SHOULD NOT 在从房间所有者接收的历史消息之前添加它自己的延迟元素&amp;quot;delay elements&amp;quot; (见本文的[[XEP-0045#讨论历史|讨论历史]]章节) .&lt;br /&gt;
&lt;br /&gt;
'''例子 54. 继续讨论 III: 所有者发送邀请(们), 包含 Continue 标志'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 当邀请者的客户端一知道和它一对一聊天的那个人的全JID之后, 它就应该 SHOULD 在邀请中包含这个全JID (而不是纯JID).&lt;br /&gt;
&lt;br /&gt;
邀请被递送到被邀请者:&lt;br /&gt;
&lt;br /&gt;
'''例子 55. 邀请被递送'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
    to='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当客户端被 &amp;lt;wiccarocks@shakespeare.lit/laptop&amp;gt; 用来接收邀请, 它应该 SHOULD 自动加入或提示用户是否加入 (取决于用户的选项配置) 并且随后无缝地把现有的一对一聊天窗口转到一个多用户会议的窗口:&lt;br /&gt;
&lt;br /&gt;
'''例子 56. 被邀请者接受邀请, 加入房间, 并接收出席信息和历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/secondwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2004-09-29T01:54:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2004-09-29T01:55:21Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 事实上,这些消息从 &amp;lt;room@service&amp;gt; 本身而不是 &amp;lt;room@service/nick&amp;gt; 发出，告诉这些接收的客户端这些消息是优先的聊天历史, 因为任何来自房客的消息的 'from' 地址应该等于发送者的房间JID.&lt;br /&gt;
&lt;br /&gt;
===房客修改房间标题===&lt;br /&gt;
&lt;br /&gt;
如果房间配置允许, 一个房客可以 MAY 被允许修改一个房间的主题. 详见本文的[[XEP-0045#修改房间主题|修改房间主题]]章节.&lt;br /&gt;
&lt;br /&gt;
===发送私有消息===&lt;br /&gt;
&lt;br /&gt;
因为每个房客有一个唯一的房间JID, 一个房客可以 MAY 发送一个私有消息 &amp;quot;private message&amp;quot; 给选定的房客，即通过服务发送一个消息给那房客的房间JID. 这个消息类型应该 SHOULD 是 &amp;quot;chat&amp;quot; 并且不能 MUST NOT 是 &amp;quot;groupchat&amp;quot;, 但是可以 MAY 不表明 (即, 一个常规&amp;quot;normal&amp;quot;消息). 这个权力应该 SHOULD 被任何房客允许 (甚至在一个被主持的房间里的游客).&lt;br /&gt;
&lt;br /&gt;
'''例子 57. 房客发送私有消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务负责把'from'地址改为发送者的房间JID并递送这个消息到预期的接收者的全JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 58. 接收者接收私有消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者尝试发送一个类型为 &amp;quot;groupchat&amp;quot; 的私有消息给特定的房客, 服务必须 MUST 拒绝递送这个消息 (因为接收者的客户端期望的房间内的消息类型为&amp;quot;groupchat&amp;quot;) 并且返回一个 &amp;lt;bad-request/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 59. 房客尝试发送类型为&amp;quot;Groupchat&amp;quot;的私有消息给特定的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者尝试发送一个私有消息给一个不存在的房间JID, 服务必须 MUST 返回一个 &amp;lt;item-not-found/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
如果发送者不是预期的接收者正在访问的那个房间的房客, 服务必须 MUST 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
===发送消息给所有房客===&lt;br /&gt;
&lt;br /&gt;
房客发送一个消息给所有房间内的房客的方法，是发送一个类型为 &amp;quot;groupchat&amp;quot; 的消息到 &amp;lt;room@service&amp;gt; 本身 (服务可以 MAY 忽略或拒绝类型不是 &amp;quot;groupchat&amp;quot; 的消息). 在一个被主持的房间, 这个权力限于角色为与会者或更高的房客拥有.&lt;br /&gt;
&lt;br /&gt;
'''例子 60. 房客发送一个消息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者在这个房间有发言权 (在被主持的房间里缺省是这样期望), 服务必须 MUST 修改发送者的 'from' 属性成为房间JID并反射这个消息到每个房客的全JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 61. 服务反射消息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者是个游客 即, 在一个被主持的房间里没有发言权), 服务可以 MAY 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者并且不能 MUST NOT 反射这个消息给所有房客. 如果发送者不是该房间的房客, 服务应该 SHOULD 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给发送者并且不应该 SHOULD NOT 反射这个消息给所有房客; 这个规则的唯一的例外是，一个实现可以 MAY 允许用户们拥有特定的权限 (例如, 一个房间拥有者, 房间管理员, 或服务级别的管理员) 发送消息到这个房间，即使那些用户不是房客.&lt;br /&gt;
&lt;br /&gt;
===注册到房间===&lt;br /&gt;
&lt;br /&gt;
一个实现可以 MAY 允许一个无岗位的用户(在一个被主持的房间里, 通常是一个与会者) 注册一个房间从而成为该房间的一个成员 (反之, 一个实现也可以 MAY 限制这个权力并且只允许房间管理员添加新的成员). 特别是, 不在成员列表的人是无法加入一个仅限会员的房间的, 所以为了加入这样一个房间，实体需要申请会籍.&lt;br /&gt;
&lt;br /&gt;
如果允许, 这个功能应该 SHOULD 这样被实现。让用户使用 'jabber:iq:register' 名字空间[[XEP-0077|带内注册]] [[XEP-0045#附录G:备注|16]]提出注册申请给房间,:&lt;br /&gt;
&lt;br /&gt;
'''例子 62. 用户提出注册申请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='reg1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果用户提出的注册申请不被允许注册该房间 (例如, 因为那个权限被限制了), 该房间必须 MUST 返回一个 &amp;lt;not-allowed/&amp;gt; 错误给该用户. 如果该用户已经注册过了, 房间必须 MUST 返回一个类型为&amp;quot;result&amp;quot;的IQ节并包含一个空的&amp;lt;register/&amp;gt;元素(定义于'''XEP-0077'''). 如果该房间不存在, 服务必须 MUST 返回一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
否则, 房间必须 MUST 接着返回一个数据表单&amp;quot;Data Form&amp;quot;给该用户 (定义于[[XEP-0004|数据表单]] [[XEP-0045#附录G:备注|17]]). 注册需要的信息可以 MAY 根据实现和部署的不同而不同并且没有完全定义在本文中 (例如, 本文根据 'http://jabber.org/protocol/muc#register' 名字空间采用的注册字段  FORM_TYPE 可能将来会根据[[XEP-0045#字段标准化|字段标准化]]章节里描述的得到补充，). 以下是一个典型的例子:&lt;br /&gt;
&lt;br /&gt;
'''例子 63. 服务返回注册表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To register on the web, visit http://shakespeare.lit/&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Dark Cave Registration&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
        Please provide the following information&lt;br /&gt;
        to register with this room.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Given Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_first'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Family Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_last'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Desired Nickname'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_roomnick'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Your URL'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_url'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Email Address'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_email'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='FAQ Entry'&lt;br /&gt;
          type='text-multi'&lt;br /&gt;
          var='muc#register_faqentry'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户应该 SHOULD 接着提交这个表单:&lt;br /&gt;
&lt;br /&gt;
'''例子 64. 用户提交注册表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_first'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Brunhilde&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_last'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Entwhistle-Throckmorton&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_roomnick'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_url'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://witchesonline/~hag66/&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_email'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hag66@witchesonline&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_faqentry'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Just another witch.&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果期望的房间昵称已经被那个房间保留, 房间必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 65. 房间返回冲突错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该房间或服务不支持注册, 它必须 MUST 返回一个 &amp;lt;service-unavailable/&amp;gt; 错误给用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 66. 房间返回服务不可用错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果用户没有提交合法的数据表格, 房间必须 MUST 返回一个 &amp;lt;bad-request/&amp;gt; 错误给用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 67. 房间返回&amp;quot;服务错误的请求&amp;quot;错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
否则, 该房间必须 MUST 通知用户注册请求被成功地接收到了:&lt;br /&gt;
&lt;br /&gt;
'''例子 68. 房间通知用户注册请求已经被处理了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户提交表单之后, 服务可以 MAY 向一个房间 管理员/所有者 请求批准该申请 (参见本文的[[XEP-0045#批准注册申请|批准注册申请]]章节) 或也可以 MAY 立刻把该用户的岗位从&amp;quot;none&amp;quot;变更为&amp;quot;member&amp;quot;来添加此用户到成员列表. 如果服务变更了该用户的岗位并且该用户在房间里, 它必须 MUST 从这个用户发送更新的出席信息给所有房客, 声明岗位的变更，这个更新的出席信息应包含一个满足 'http://jabber.org/protocol/muc#user' 名字空间 &amp;lt;x/&amp;gt; 元素并包含一个'affiliation' 属性值设为&amp;quot;member&amp;quot;的 &amp;lt;item/&amp;gt; 子元素.&lt;br /&gt;
&lt;br /&gt;
'''例子 69. 服务发送成员变更通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个用户已经注册到一个房间, 该房间可以 MAY 选择限制这个用户在那个房间仅能使用已注册的昵称. 如果它这样做, 当用户尝试以不同于该用户之前已注册的房间昵称来加入该房间 (这使房间锁定&amp;quot;lock down&amp;quot;房间昵称以保证房客身份的一致性)的时候，它应该 SHOULD 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给该用户.&lt;br /&gt;
&lt;br /&gt;
===获取成员列表===&lt;br /&gt;
&lt;br /&gt;
根据房间配置如果允许的话, 一个房客可以 MAY 被允许接收房间成员的列表. 详见本文的[[XEP-0045#修改成员列表|修改成员列表]]章节.&lt;br /&gt;
&lt;br /&gt;
===发现保留的房间昵称===&lt;br /&gt;
&lt;br /&gt;
一个用户可以 MAY 有一个保留的房间昵称, 例如通过显式的房间注册, 数据库集成, 或昵称锁定 &amp;quot;lockdown&amp;quot;. 用户应该 SHOULD 在尝试进入该房间之前发现自己的保留昵称. 这可以通过发送一个发现服务信息请求并指定一个服务发现节点&amp;quot;x-roomuser-item&amp;quot;给房间JID来做到.&lt;br /&gt;
&lt;br /&gt;
'''例子 70. 用户请求保留的昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='getnick1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='x-roomuser-item'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
对一个多用户聊天服务来说，对上述的服务发现节点的支持是可选的 OPTIONAL . 如果房间或服务不支持上述的服务发现节点, 它必须 MUST 返回一个 &amp;lt;feature-not-implemented/&amp;gt; 错误给用户. 如果它支持这个特性并且该用户有一个已注册的昵称, 它必须 MUST 返回这个昵称给这个用户，方法是发送一个服务发现的&amp;lt;identity/&amp;gt;元素，其'name'属性值为这个昵称 (此处 category/type 应该 SHOULD 是 &amp;quot;conference/text&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
'''例子 71. 房间返回昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='getnick1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='x-roomuser-item'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='thirdwitch'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户没有已注册的昵称, 房间必须 MUST 返回一个空的服务发现 &amp;lt;query/&amp;gt; 元素 (根据 '''XEP-0030''').&lt;br /&gt;
&lt;br /&gt;
即使一个用户已经注册了一个房间昵称, 服务应该 SHOULD 允许该用户在加入该房间时指定一个不同的昵称 (例如, 为了从不同的客户端资源加入), 尽管该服务可以 MAY 选择通过一个 &amp;lt;not-acceptable/&amp;gt; 错误来锁定 &amp;quot;lock down&amp;quot; 昵称并拒绝该用户 . 如果该用户的客户端在加入该房间之后发送上述请求，服务不能 MUST NOT 返回一个错误给该用户, 而应该 SHOULD 返回上文所述.&lt;br /&gt;
&lt;br /&gt;
如果另一个用户尝试以第一个用户保留的房间昵称来加入房间, 服务必须 MUST 拒绝第二个用户并返回一个前文所述的 &amp;lt;conflict/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
===申请发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里游客是不能发言的 (即, 发送一个消息给所有房客). 为了申请发言权, 一个游客应该 SHOULD 发送包含一个数据表格的 &amp;lt;message/&amp;gt; 节给房间本身, 这个数据表格仅仅是一个 'muc#role' 字段，值为 &amp;quot;participant&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 72. 房客申请发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='hag66@shakespeare.lit/pda'&lt;br /&gt;
         to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Requested role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务接着应该 SHOULD 转发这个请求给房间主持人(们) ，定义于本文的[[XEP-0045#批准发言权申请|批准发言权申请]].&lt;br /&gt;
&lt;br /&gt;
==主持人用例==&lt;br /&gt;
&lt;br /&gt;
一个主持人有权在房间里执行特定的动作 (例如, 变更某些房客的角色) 但无权变更岗位的持久信息 (它只能被管理员或所有者) 或定义关于这个房间的信息. 具体哪些动作可由主持人执行，取决于配置. 无论如何, 对于 MUC 框架来说, 主持人被规定有权执行以下动作:&lt;br /&gt;
&lt;br /&gt;
# 在一个半匿名的房间里发现一个房客的全JID(如上文所述缺省会发生)&lt;br /&gt;
# 修改主题&lt;br /&gt;
# 从该房间踢出一个与会者或游客&lt;br /&gt;
# 在一个被主持的房间里授予或撤销发言权&lt;br /&gt;
# 在一个被主持的房间里修改拥有发言权的房客列表&lt;br /&gt;
&lt;br /&gt;
这些特性将通过一个基于 &amp;lt;iq/&amp;gt; 元素的 请求/应答 交换来实现，这个IQ元素包含一个满足 'http://jabber.org/protocol/muc#admin' 名字空间的子元素. 以下例子展示这个协议和实现如何互动达到期望的功能. (以下除非显式地提及, 任何接下来的管理请求必须 MUST 被拒绝,如果该请求的'from'地址 &amp;lt;user@host&amp;gt; 和主持人的纯JID不符的话; 在这种情况下, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误.)&lt;br /&gt;
&lt;br /&gt;
===修改房间主题===&lt;br /&gt;
&lt;br /&gt;
多用户聊天室的一个常用特性是变更房间主题的能力. 缺省地, 一个房间里只有角色为主持人 &amp;quot;moderator&amp;quot; 的用户应该 SHOULD 被允许变更主题 (尽管这应该 SHOULD 是可配置的, 结果是如果需要的话，仅仅与会者或甚至游客都被允许修改主题). 主题变更是通过发送一个类型为 &amp;quot;groupchat&amp;quot; 的消息给 &amp;lt;room@service&amp;gt;来实现的, 在这里 &amp;lt;message/&amp;gt; 必须 MUST 包含一个 &amp;lt;subject/&amp;gt; 元素以指定新的主题，但不应该 SHOULD NOT 包含其他元素 (例如, 不应该有 &amp;lt;body/&amp;gt; 元素或 &amp;lt;thread/&amp;gt; 元素).&lt;br /&gt;
&lt;br /&gt;
'''例子 73. 主持人变更主题'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个 MUC 服务接收到这样一个消息, 它必须 MUST 以发送这个变更主题消息的那个用户的房间JID作为'from'地址来反射这个消息给所有其他房客:&lt;br /&gt;
&lt;br /&gt;
'''例子 74. 服务通知所有房客主题变更'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 当一个新的房客加入房间时，该房间应该 SHOULD 在被发送的讨论历史中包含最后的主题变更.&lt;br /&gt;
&lt;br /&gt;
一个接收到这类信息的 MUC 客户端可以 MAY 选择显示一个房间内的消息, 如下:&lt;br /&gt;
&lt;br /&gt;
'''例子 75. 客户端显式房间主题变更消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
* secondwitch has changed the subject to: Fire Burn and Cauldron Bubble!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一些没有适当权限的人尝试变更房间主题, 服务必须 MUST 返回一个 &amp;quot;error&amp;quot; 类型的消息指明一个 &amp;lt;forbidden/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 76. 服务返回未被授权变更主题的错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
为了移除现有的主题而不是提供一个新主题 (即, 设置主题为空), 客户端应该发送一个空的 &amp;lt;subject/&amp;gt; 元素 (即,  &amp;quot;&amp;lt;subject/&amp;gt;&amp;quot; 或 &amp;quot;&amp;lt;subject&amp;gt;&amp;lt;/subject&amp;gt;&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 77. 主持人设置空的主题'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===踢出房客===&lt;br /&gt;
&lt;br /&gt;
主持人有权从一个房间踢出特定种类的房客 (哪些房客是可被踢的 &amp;quot;kickable&amp;quot; 取决于服务规定, 房间配置, 以及主持人的岗位 -- 见下文). 踢人通常基于房客的房间昵称来执行 (尽管可以 MAY 基于全JID) 并且完全是通过把与会者或游客的角色设为 &amp;quot;none&amp;quot; 来实现的.&lt;br /&gt;
&lt;br /&gt;
'''例子 78. 主持人踢出房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='fluellen@shakespeare.lit/pda'&lt;br /&gt;
    id='kick1'&lt;br /&gt;
    to='harfleur@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='pistol' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Avaunt, you cullion!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 移除被踢的用户，通过发送一个类型为 &amp;quot;unavailable&amp;quot; 的出席信息节给每个被踢的房客, 这个出席信息应在其扩展出席信息中包含状态码 307 , 或(可选地)包含 reason 子元素(如果提供了) 以及踢人的执行者的纯JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 79. 服务移除被踢的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='harfleur@henryv.shakespeare.lit/pistol'&lt;br /&gt;
    to='pistol@shakespeare.lit/harfleur'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='fluellen@shakespeare.lit'/&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Avaunt, you cullion!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='307'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
包含状态码可使客户端能够提交他们自己的通知消息 (例如, 适当的用户位置的信息). 可选的包含原因 reason 元素以及执行者 actor 使得被踢的用户能理解为什么他或她被踢了, 以及被踢的用户可以找谁去理论. [[XEP-0045#附录G:备注|18]]&lt;br /&gt;
&lt;br /&gt;
移除被踢的房客(们)之后, 服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 80. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='harfleur@henryv.shakespeare.lit'&lt;br /&gt;
    id='kick1'&lt;br /&gt;
    to='fluellen@shakespeare.lit/pda'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
通知主持人之后, 服务必须 MUST 接着通知剩余的房客那个被踢的房客已经不在房间里了,即从被踢者的房间昵称(&amp;lt;room@service/nick&amp;gt;)发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给所有剩余的房客 (就像房客自愿退出房间时所做的一样), 包含状态码 status 以及可选的原因 reason 和执行者 actor.&lt;br /&gt;
&lt;br /&gt;
'''例子 81. 服务通知剩余的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='harfleur@henryv.shakespeare.lit/pistol'&lt;br /&gt;
    to='gower@shakespeare.lit/cell'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='307'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个用户不能被比自己岗位低的主持人踢出. 所以, 如果一个身为与会者的主持人尝试踢出一个管理员，或一个身为与会者的主持人或管理员尝试踢出一个所有者, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 82. 服务对于尝试踢出更高岗位的用户返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='kicktest'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='firstwitch' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Be gone!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个主持人尝试踢出他自己, 服务可以 MAY 拒绝这个请求并返回一个 &amp;lt;conflict/&amp;gt; 错误给发送者. (尽管这个踢出自己的行为可能看起来怪异, 它在 IRC 里很常见，用于在房间里为某人的行为道歉.)&lt;br /&gt;
&lt;br /&gt;
===授予游客发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里, 主持人可能希望管理房间内谁有水没有发言权 &amp;quot;voice&amp;quot; (即, 发送消息给所有房客的能力). 发言权的授予是基于游客的房间昵称来的, 服务将从内部把这个房间昵称转成游客的全JID. 主持人通过把游客的角色变更为与会者 &amp;quot;participant&amp;quot;来给一个游客授予权限.&lt;br /&gt;
&lt;br /&gt;
'''例子 83. 主持人授予权限给一个游客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 84. 主持人授予权限给一个游客(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 85. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个人的&amp;lt;room@service/nick&amp;gt;发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'role'属性值为&amp;quot;participant&amp;quot;，指明添加了发言权.&lt;br /&gt;
&lt;br /&gt;
'''例子 86. 服务发送发言权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销与会者发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里, 主持人可能希望撤销一个与会者发言的权力,主持人通过把与会者的角色变更为游客 &amp;quot;visitor&amp;quot;来撤销一个游客的发言权:&lt;br /&gt;
&lt;br /&gt;
'''例子 87. 主持人撤销一个与会者的发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 88. 主持人撤销一个与会者的发言权(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='visitor'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 89. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个人的&amp;lt;room@service/nick&amp;gt;发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'role'属性值为&amp;quot;visitor&amp;quot;，指明移除了发言权.&lt;br /&gt;
&lt;br /&gt;
'''例子 90. 服务通知失去发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个主持人不能 MUST NOT 从一个岗位等于或高于主持人岗位的用户撤销发言权. 另外, 服务不能 MUST NOT 允许一个管理员或所有者的发言权被任何人撤销. 如果一个主持人尝试撤销这些人的发言权, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 的错误给发送者(通过以下的违规条目):&lt;br /&gt;
&lt;br /&gt;
'''例子 91. 服务对于尝试从管理员，所有者或更高岗位的用户撤销权限返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voicetest'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='secondwitch' role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改发言权列表===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里主持人可能希望管理发言权列表. 为了达到这个目的, 主持人首先查询房间所有角色为'participant'的房客列表来请求发言权列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 92. 主持人请求发言权列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='voice3'&lt;br /&gt;
    to='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回发言权列表给主持人; 每个条目必须 MUST 包含 'nick' 和 'role' 属性并且应该 SHOULD 包含 'affiliation' 和 'jid' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 93. 服务发送发言权列表给主持人'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voice3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='polonius@hamlet/castle'&lt;br /&gt;
          nick='Polo'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='horatio@hamlet/castle'&lt;br /&gt;
          nick='horotoro'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
主持人可以 MAY 接着修改发言权列表. 为了达到这个目的, 主持人必须 MUST 发送变更了的条目 (即, 只有 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'nick' 属性和 'role' 属性 (通常设置值为 &amp;quot;participant&amp;quot; 或 &amp;quot;visitor&amp;quot;) 但是不应该 SHOULD NOT 包含 'jid' 属性并且不能 MUST NOT 包含 'affiliation' 属性 (它用于管理如所有者那样的岗位而不是与会者那样的角色):&lt;br /&gt;
&lt;br /&gt;
'''例子 94. 主持人发送修改的发言权列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='voice4'&lt;br /&gt;
    to='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='Hecate'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='rosencrantz'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy fellow.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='guildenstern'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy fellow.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 95. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着为任何受影响的人发送更新的出席信息给所有房客, 如前文的用例所述，发送适当的扩展出席信息来指明发言权的变更.&lt;br /&gt;
&lt;br /&gt;
大家知道, 不能撤销一个房间所有者或管理员的发言权, 也不能撤销比发出请求的主持人岗位高的用户的发言权. 如果一个房间管理员尝试通过修改发言权列表来撤销这类用户的发言权, 服务必须 MUST 拒绝请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 96. 服务返回错误给试图撤销管理员，所有者或比发送者岗位更高的用户的发言权的发送者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voicetest'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===批准发言权申请===&lt;br /&gt;
&lt;br /&gt;
在本文的[[XEP-0045#申请发言权|申请发言权]]章节提到, 当服务接受到一个来自房客的请求，它应该 SHOULD 转发那个请求给房间的主持人(们). 为了达到这个目的, 服务应该 SHOULD 发送一个 &amp;lt;message/&amp;gt; 节给房间主持人(们), 这里 &amp;lt;message/&amp;gt; 节包含一个数据表格data form来批准或拒绝这个申请, 如下所示.&lt;br /&gt;
&lt;br /&gt;
'''例子 97. 申请批准发言权表格''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='crone1@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Voice request&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To approve this request for voice, select &lt;br /&gt;
      the &amp;amp;quot;Grant voice to this person?&amp;amp;quot;&lt;br /&gt;
      checkbox and click OK. To skip this request, &lt;br /&gt;
      click the cancel button.&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Requested role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#jid'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='User ID'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@shakespeare.lit/pda&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#roomnick'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Room Nickname'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#request_allow'&lt;br /&gt;
           type='boolean'&lt;br /&gt;
           label='Grant voice to this person?'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
为了批准这个申请, 主持人将提交此表格:&lt;br /&gt;
&lt;br /&gt;
'''例子 98. 批准发言权申请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='crone1@shakespeare.lit/pda'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#jid'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@shakespeare.lit/pda&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#roomnick'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#request_allow'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果主持人批准了这个发言权申请, 服务将授予发言权给该房客并发送一个出席信息更新，如本文[[XEP-0045#授予游客发言权|授予游客发言权]]章节所述.&lt;br /&gt;
&lt;br /&gt;
==管理员用例==&lt;br /&gt;
&lt;br /&gt;
一个房间管理员有权修改用户岗位的持久信息 (例如, 通过禁止用户) 并授予和撤销主持人权限, 但是无权修改房间的定义, 那是唯一属于房间所有者(们)的权力. 具体哪些动作是管理员可以执行的则取决于配置. 无论如何, 在 MUC 框架中的用途, 规定房间管理员最少拥有执行以下操作的权限:&lt;br /&gt;
&lt;br /&gt;
# 在房间里禁止一个用户&lt;br /&gt;
# 在房间里修改黑名单&lt;br /&gt;
# 授予或撤销成员资格&lt;br /&gt;
# 修改成员列表&lt;br /&gt;
# 授予或撤销主持人权力&lt;br /&gt;
# 修改主持人列表&lt;br /&gt;
&lt;br /&gt;
这些特性将由一个 请求/应答 request/response 式的交换来实现，使用 &amp;lt;iq/&amp;gt; 元素，包含满足 'http://jabber.org/protocol/muc#admin' 名字空间的子元素. 以下例子展示协议如何与实现互动以得到期望的功能. (以下除非显示地声明, 如果发送方的'from'地址中的&amp;lt;user@host&amp;gt;和任何房间管理员的纯JID都不同，接下来的任何管理请求必须 MUST 被拒绝; 这种情况下, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误.)&lt;br /&gt;
&lt;br /&gt;
===禁止用户===&lt;br /&gt;
&lt;br /&gt;
在房间里一个管理员或所有者可以禁止一个或多个用户. 这动作必须 MUST 基于房客的纯JID来执行. 为了禁止一个用户, 管理员必须 MUST 把该用户的岗位改为&amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 99. 管理员禁止用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 100. 管理员禁止用户(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把那个纯JID添加到黑名单, 应该 SHOULD 把被排斥者的昵称从已注册的昵称列表中移除, 并且必须 MUST 通知管理员或所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 101. 服务通知管理员或所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也移除任何还在房间中的被禁止的用户，通过发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给每个被禁止的房客, 在扩展的出席信息中包含一个状态码 301 , 可选地带上 reason (如果服务提供的话) 以及执行这个禁止动作的用户的纯JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 102. 服务移除被禁止的用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='southampton@henryv.shakespeare.lit/cambridge'&lt;br /&gt;
    to='earlofcambridge@shakespeare.lit/stabber'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='kinghenryv@shakespeare.lit'/&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='301'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
包含状态码可使客户端能够提交他们自己的通知消息 (例如, 适当的用户位置的信息). 可选的包含原因 reason 元素以及执行者 actor 使得被踢的用户能理解为什么他或她被踢了, 以及被踢的用户可以找谁去理论.&lt;br /&gt;
&lt;br /&gt;
通知主持人之后, 服务必须 MUST 接着通知剩余的房客那个被禁止的房客已经不在房间里了,即从被禁止用户发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给所有剩余的房客 (就像房客自愿退出房间时所做的一样), 包含状态码 status 以及可选的原因 reason 和执行者 actor. &lt;br /&gt;
&lt;br /&gt;
'''例子 103. 服务通知剩余的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    type='unavailable'&lt;br /&gt;
    from='southampton@henryv.shakespeare.lit/cambridge'&lt;br /&gt;
    to='exeter@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit/stabber'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='301'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
就像[[XEP-0045#踢出房客|踢出房客]]一样, 一个用户不能被自己岗位低的管理员禁止. 所以, 如果一个管理员尝试禁止一个所有者， 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者: &lt;br /&gt;
&lt;br /&gt;
'''例子 104. 服务对尝试禁止更高岗位用户返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个管理员或所有者尝试禁止他自己, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;conflict/&amp;gt; 错误给发送者. (注意:这和踢出自己时推荐的服务行为不同, 踢自己的行为服务是允许的.)&lt;br /&gt;
&lt;br /&gt;
===修改黑名单===&lt;br /&gt;
&lt;br /&gt;
房间管理员可能希望修改黑名单. 注意: 黑名单总是基于用户的纯JID. 要修改黑名单, 管理员首先向房间查询所有岗位为'outcast'的用户以得到黑名单.&lt;br /&gt;
&lt;br /&gt;
'''例子 105. 管理员请求黑名单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban2'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回黑名单给管理员; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性但不应该 SHOULD NOT 包含 'nick' 和 'role' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 106. 服务发送黑名单给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban2'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改黑名单. 为此, 管理员必须 MUST 发送变更的条目 (即, 仅是 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'affiliation' 属性 (通常设为&amp;quot;outcast&amp;quot;来禁止或&amp;quot;none&amp;quot;来取消禁止) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用来管理角色，例如与会者，而不是被排斥者岗位); 另外, reason 和 actor 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 107. 管理员发送修改的黑名单给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban3'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&amp;gt;&lt;br /&gt;
          jid='lordscroop@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='sirthomasgrey@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更新黑名单之后, 服务必须 MUST 通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 108. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban3'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着移除受影响的房客 (如果他们在房间里) 并从他们发送更新的出席信息 (包含适当的状态码) 给所有剩余的房客，如 &amp;quot;禁止用户&amp;quot; 用例所述. (服务应该 SHOULD 也移除从保留房间昵称列表中移除每个被禁止的用户的保留昵称, 如果必要.)&lt;br /&gt;
&lt;br /&gt;
当一个实体被一个房间禁止, 实现应该 SHOULD 按以下顺序匹配 JIDs (这些匹配规则和'''RFC 3921'''中定义的隐私列表的匹配规则是相同的):&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;user@domain/resource&amp;gt; (仅匹配特定的资源)&lt;br /&gt;
# &amp;lt;user@domain&amp;gt; (匹配任何资源)&lt;br /&gt;
# &amp;lt;domain/resource&amp;gt; (仅匹配特定资源)&lt;br /&gt;
# &amp;lt;domain&amp;gt; (匹配域名本身, 就像任何 user@domain 或 domain/resource 一样)&lt;br /&gt;
&lt;br /&gt;
一些管理员可能希望在一个 MUC 服务中的所有房间里禁止所有和特定域名相关的用户. 这个功能是一个服务级的特性，所以超过了本文的范围, 它定义在 '''XEP-0133'''里.&lt;br /&gt;
&lt;br /&gt;
===授予成员资格===&lt;br /&gt;
&lt;br /&gt;
管理员可以授予成员资格给一个用户; 方法是把用户的岗位改为 &amp;quot;member&amp;quot; (通常如果用户在房间里，基于昵称，如果用户不在房间里，则基于纯JID; 在这两种情况下如果提供了昵称, 那么这个昵称就是用户在这个房间的缺省昵称，如果实现支持那个功能的话):&lt;br /&gt;
&lt;br /&gt;
'''例子 109. 管理员授予成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 110. 管理员授予成员资格(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把这个用户添加到成员列表，然后通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 111. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;member&amp;quot;，指明授予了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 112. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间里, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 在这个消息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;member&amp;quot;，指明授予了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 113. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销成员资格===&lt;br /&gt;
&lt;br /&gt;
一个管理员可能想撤销一个用户的成员资格; 通过把该用户的岗位改为&amp;quot;none&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 114. 管理员撤销成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 115. 管理员撤销成员资格(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 从成员列表中移除该用户然后通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 116. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个用户的名义发送更新的出席信息节给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;none&amp;quot;，指明失去了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 117. 服务通知失去成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限会员的, 服务必须 MUST 从房间移除这个用户, 包含一个状态码 321 来指明用户被移除是因为岗位变更, 并通知所有剩余的房客:&lt;br /&gt;
&lt;br /&gt;
'''例子 118. 服务移除非会员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='321'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='321'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改成员列表===&lt;br /&gt;
&lt;br /&gt;
在一个仅限会员的房间的上下文里, 成员列表本质上是一个允许人们加入房间的白名单 &amp;quot;whitelist&amp;quot;. 任何不是成员的人等于是被禁止加入该房间, 即使他们的岗位不是&amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
在一个开放房间的上下文里, 成员列表只是一个注册了这个房间的用户 (纯JID和保留的昵称) 的列表. 这些用户可以出现在一个房间名册里, 有他们自己的保留房间昵称, 在搜索结果或类似FAQ里被返回给(查询者).&lt;br /&gt;
&lt;br /&gt;
推荐 RECOMMENDED 在仅限会员的房间里只让房间管理员拥有修改成员列表的权力. 为此, 管理员首先请求成员列表，通过查询房间里所有岗位为&amp;quot;member&amp;quot;的用户来实现:&lt;br /&gt;
&lt;br /&gt;
'''例子 119. 管理员请求成员列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 在一个仅限会员的房间里，服务也应该 SHOULD 返回成员列表给任何房客; 即, 当一个房间的成员请求房间列表时，它不应该 SHOULD NOT 生成一个 &amp;lt;forbidden/&amp;gt; 错误. 这个功能可帮助客户端展示所有现有的成员，即使他们中的一些人不在房间里, 例如. 帮助成员确定是否另一个用户应该被邀请. 服务也应该 SHOULD 允许任何成员接收成员列表，即使还不是一个房客（译注：即未进入房间）.&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回全部的成员列表给管理员，遵循 'http://jabber.org/protocol/muc#admin' 名字空间; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，每个正在房间里的成员可以 MAY 包含 'nick' 和 'role' 属性.&lt;br /&gt;
&lt;br /&gt;
'''例子 120. 服务发送成员列表给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member3'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改成员列表. 为此, 管理员必须 MUST 发送变更的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'affiliation' 属性(通常值设为 &amp;quot;member&amp;quot; 或 &amp;quot;none&amp;quot;) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，并且不能 MUST NOT 包含 'role' 属性(它是用来管理角色的，例如与会者，而不是成员的岗位):&lt;br /&gt;
&lt;br /&gt;
'''例子 121. 管理员发送修改的成员列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 修改成员列表然后通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 122. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 变更任何受影响的用户的岗位. 如果该用户已经从成员列表中移除了, 服务必须 MUST 把该用户的岗位从 &amp;quot;member&amp;quot; 变更为 &amp;quot;none&amp;quot;. 如果该用户已经被加入到成员列表, 服务必须 MUST 把该用户的岗位改成 &amp;quot;member&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
如果一个被移除的成员正在一个仅限会员的房间, 服务应该 SHOULD 踢出这个房客，如前文所述，通过把被移除的成员的角色改成 &amp;quot;none&amp;quot; 并发送适当的出席信息给这个被移除的成员来实现. 无论是否被移除的那个用户在或不在一个仅限会员的房间里, 服务必须 MUST 随后拒绝这个用户的进入.&lt;br /&gt;
&lt;br /&gt;
对所有的房间类型来说, 服务必须 MUST 以这个用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'affiliation'属性值设为&amp;quot;none&amp;quot;,以指明这个岗位的变更.&lt;br /&gt;
&lt;br /&gt;
'''例子 123. 服务发送失去成员资格的通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 服务必须 SHOULD 发送一个邀请给任何已加入到仅限会员的房间里的成员名单中的用户，如果该用户目前在该房间还没有岗位, 例如作为一个管理员或所有者(这类用户在定义时不在房间里; 同时要注意这个例子里使用了一个密码password而不是原因reason -- 这两个子元素都是可选的 OPTIONAL):&lt;br /&gt;
&lt;br /&gt;
'''例子 124. 房间发送邀请给新成员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
因为只有管理员们和所有者们应该 SHOULD 被允许修改成员列表, 一个实现可以 MAY 提供一个配置选项，在仅限会员的房间里开放邀请权限给任何成员. 这种情况下, 任何被发送的邀请都应该 SHOULD 自动触发被邀请者加入成员列表. 无论如何, 如果邀请权限被限于管理员们，而普通成员尝试发送邀请, 服务必须 MUST 拒绝这个邀请的的请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 125. 服务在普通成员尝试邀请其他人加入仅限会员的房间时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从开放房间发送的邀请不能 MUST NOT 触发被邀请者加入成员列表.&lt;br /&gt;
&lt;br /&gt;
如果一个用户被加入一个开放房间的成员列表并且该用户在该房间内, 服务必须 MUST 以该用户的名义发送更新的出席信息给所有房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'affiliation'属性值设为&amp;quot;member&amp;quot;,以指明这个岗位的变更.&lt;br /&gt;
&lt;br /&gt;
'''例子 126. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/hecate'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===授予主持人权限===&lt;br /&gt;
&lt;br /&gt;
管理员可能想授予主持人权限给一个与会者或游客; 通过把用户的角色改为 &amp;quot;moderator&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 127. 管理员授予主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 128. 管理员授予主持人权限(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='moderator'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 添加这个用户到主持人列表然后通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 129. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以该用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;moderator&amp;quot;,以指明添加了主持人权限.&lt;br /&gt;
&lt;br /&gt;
'''例子 130. 服务发送主持人权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销主持人权限===&lt;br /&gt;
&lt;br /&gt;
管理员可能想撤销用户的主持人权限. 一个管理员只可以 MAY 撤销岗位为&amp;quot;member&amp;quot; 或 &amp;quot;none&amp;quot; (也就是, 非管理员和所有者)的用户的主持人权限. 权限的撤销是通过把用户的角色改为 &amp;quot;participant&amp;quot;实现的:&lt;br /&gt;
&lt;br /&gt;
'''例子 131. 管理员撤销主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 132. 管理员撤销主持人权限(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 从主持人列表移除这个用户然后通知管理员成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 133. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以该用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user'  名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;participant&amp;quot;,以指明移除了主持人权限. &lt;br /&gt;
&lt;br /&gt;
'''例子 134. 服务通知失去了主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
大家知道, 管理员不 MUST NOT 被允许从岗位为 &amp;quot;owner&amp;quot; 或 &amp;quot;admin&amp;quot;的用户撤销主持人权限. 如果一个管理员尝试撤销这类用户的权限, 服务必须MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 135. 服务在用户尝试撤销管理员或所有者的主持人权限时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='modtest'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='secondwitch' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改主持人列表===&lt;br /&gt;
&lt;br /&gt;
管理员可能希望修改主持人列表. 为此, 管理员首先通过请求房间内所有角色为'moderator'的用户来请求主持人列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 136. 管理员请求主持人列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回主持人列表给管理员; 每个条目必须 MUST 包含 'jid', 'nick', 'role' 属性并应该 SHOULD 包含 'affiliation' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 137. 服务发送主持人列表给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod3'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改主持人列表. 为此, 管理员必须 MUST发送修改的条目(即, 仅&amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'jid' 属性和'role' 属性(通常值设为 &amp;quot;member&amp;quot; 或 &amp;quot;participant&amp;quot;) 但不应该 SHOULD NOT 包含 'nick' 属性并且不能 MUST NOT 包含 'affiliation' 属性(它被用于管理类似管理员这样的岗位而不是主持人这样的角色):&lt;br /&gt;
&lt;br /&gt;
'''例子 138. 管理员发送修改了的主持人列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 修改主持人列表并通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 139. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 随后以所有受影响的用户发送更新的出席信息给所有的房客, 支出主持人权限的变更，通过发送前面用例所述的适当的扩展出席信息.&lt;br /&gt;
&lt;br /&gt;
显然, 房间所有者或房间管理员的主持人权限不能被撤销. 如果一个房间管理员尝试通过修改主持人列表来撤销这类用户的主持人权限, 服务必须 MUST 拒绝请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 140. 服务在用户尝试撤销管理员或所有者的主持人权限时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='modtest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===批准注册申请===&lt;br /&gt;
&lt;br /&gt;
如果一个服务不自动接受注册到房间的请求, 它可以 MAY 为房间管理员提供一个方法来批准或拒绝来自 Jabber 的注册请求(替代方案是, 它可能提供一个 web 接口或一些其他管理工具). 对这个服务来说，最简单的办法就是，当接收到注册请求时发送一个 &amp;lt;message/&amp;gt; 节给房间管理员(们), 这里的&amp;lt;message/&amp;gt; 节包含一个数据表格 Data Form asking 用来询问管理员是否批准用户的注册申请. 推荐 RECOMMENDED 以下数据表格 Data Form，但是实现可以 MAY 使用完全不同的表格, 或or 在下面的表格基础上补充字段.&lt;br /&gt;
&lt;br /&gt;
'''例子 141. 注册申请批准表格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='crone1@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Registration request&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To approve this registration request, select the&lt;br /&gt;
      &amp;amp;quot;Allow this person to register with the room?&amp;amp;quot;&lt;br /&gt;
      checkbox and click OK. To skip this request, click the &lt;br /&gt;
      cancel button.&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_first'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Given Name'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Brunhilde&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_last'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Family Name&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Entwhistle-Throckmorton&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_roomnick'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Desired Nickname&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_url'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;User URL&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;http://witchesonline/~hag66/&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_email'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Email Address&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@witchesonline&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_faqentry'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;FAQ Entry&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Just another witch.&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_allow'&lt;br /&gt;
           type='boolean'&lt;br /&gt;
           label='Allow this person to register with the room?'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果管理员批准了注册申请, 服务将把该用户注册到房间.&lt;br /&gt;
&lt;br /&gt;
更多高级的批准机制(例如, 使用特定命令[http://xmpp.org/extensions/xep-0050.html Ad-Hoc Commands] [[XEP-0045#附录G:备注|19]]来接收注册申请列表,就像 [http://xmpp.org/extensions/xep-0060.html Publish-Subscribe] [[XEP-0045#附录G:备注|20]]里所做的一样) 超出了本文的范围.&lt;br /&gt;
&lt;br /&gt;
==所有者用例==&lt;br /&gt;
&lt;br /&gt;
每个房间必须 MUST 至少有一个所有者, 而所有者(或一个成功者)在一个房间的生命周期里是这个房间长期存在的属性(例如, 所有者在退出一个持久性的房间时不会失去所有权). 本文假定(初始的) 房间所有者是那个新建了该房间的用户并且有一个房间所有者有权修改房间配置选项的定义，例如房间类型. 理想情况下, 房间所有者不仅能指定房间类型(密码保护的, 仅限会员的, 等等) 而且包括如本文的 [XEP-0045#需求|需求]章节所述的房间特定属性. 另外, 如果所有者能指定其他所有者们的JID也是不错的, 但那将取决于具体实现.&lt;br /&gt;
&lt;br /&gt;
为了让配置选项更加广泛提供必要的伸缩性, 房间配置将使用 Data Forms ('''XEP-0004'''), 通过使用由 'http://jabber.org/protocol/muc' 名字空间触发. 也就是, 如果一个实体在它请求加入房间的 join/request 里不包含 MUC 名字空间, 那么服务将立刻新建房间，在新建房间之前不等待通过数据表格进行配置(这保证了和旧的&amp;quot;groupchat 1.0&amp;quot;协议的向后兼容); 无论如何, 如果房间的 join/create 请求包含了 MUC 扩展, 那么服务在新建和解锁该房间之前将通过数据表格请求配置.&lt;br /&gt;
&lt;br /&gt;
注意: 以下展示的配置选项列出了本文的需求章节的所有特性和房间类型; 无论如何, 实际的配置选项和表格布局将取决于实现和具体的布署. 而且, 这些只是例子，不代表这些就是房间可以拥有的所有允许或需要的配置选项. 一个特定的实现或布署可以 MAY 选择提供额外的配置选项(敏感词过滤, 设置房间的缺省语言, 消息记录, 等等), 这就是为什么在这里使用 'jabber:x:data' 协议是很有价值的.&lt;br /&gt;
&lt;br /&gt;
===新建房间===&lt;br /&gt;
====一般注意事项====&lt;br /&gt;
&lt;br /&gt;
新建房间的权限可以 MAY 限制在特定的用户群或可以 MAY 保留给一个服务级别的管理员. 如果访问被拒绝而一个用户试图新建一个房间, 服务必须MUST 返回一个 &amp;lt;not-allowed/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 142. 服务通知用户不能新建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果访问不限制, 服务必须 MUST 允许用户按以下步骤新建房间.&lt;br /&gt;
&lt;br /&gt;
从房间创建的视角来看, 本质上有两种房间:&lt;br /&gt;
&lt;br /&gt;
* 即时房间&amp;quot;Instant rooms&amp;quot; -- 可以立刻访问并基于某些缺省配置自动创建.&lt;br /&gt;
* 保留房间&amp;quot;Reserved rooms&amp;quot; -- 在任何人访问之前由房间配置者手动创建.&lt;br /&gt;
&lt;br /&gt;
新建和配置这些房间的流程如下:&lt;br /&gt;
&lt;br /&gt;
# 用户必须 MUST 发送出席信息到 &amp;lt;room@service/nick&amp;gt; 并声明他或她对MUC协议的支持，通过包含一个扩展的出席信息,并包含在一个空的满足'http://jabber.org/protocol/muc'名字空间的 &amp;lt;x/&amp;gt; 子元素里(注意这里不包含 '#owner' 或 '#user' 后缀).&lt;br /&gt;
# 如果用户被允许新建房间并且房间还不存在, 服务必须 MUST 根据一些缺省配置新建此房间, 指定请求的用户成为初始的房间拥有者, 并增加这个拥有者到该房间但不允许任何别的用户进入该房间(有效地锁定 &amp;quot;locking&amp;quot;该房间). 从房间发送由所有者收到的初始的出席信息节必须 MUST 包含扩展的出席信息以指出该用户的状态为一个所有者并承认房间已经被创建了(通过状态码 201) 并等待配置.&lt;br /&gt;
# 如果初始的房间所有者想新建和配置一个保留房间, 房间所有者必须 MUST 接着请求一个配置，通过发送类型为&amp;quot;get&amp;quot;的IQ节并包含一个空的满足'http://jabber.org/protocol/muc#owner'名字空间的&amp;lt;query/&amp;gt;元素给该房间 ,然后完成第4和第5步. 如果房间所有者喜欢新建一个即时房间, 该房间所有者必须 MUST 发送一个遵循'http://jabber.org/protocol/muc#owner'名字空间的 query 元素并包含一个遵循 'jabber:x:data' 名字空间的空的类型为 &amp;quot;submit&amp;quot; 的 &amp;lt;x/&amp;gt; 元素, 然后跳到第6步.&lt;br /&gt;
# 如果房间所有者请求了一个配置表格, 服务必须 MUST 发送一个包含配置表格并遵循 'jabber:x:data'名字空间的 IQ 给房间拥有者. 如果没有配置选项可用, 房间必须 MUST 返回一个空的 query 元素给房间所有者.&lt;br /&gt;
# 初始的房间所有者应该 SHOULD 为该房间提供一个开始的配置(或接受缺省配置)，通过发送&amp;quot;set&amp;quot;类型并包含完整的配置表格的 IQ . 另外, 房间所有者可以 MAY 取消配置过程. (实现可以 MAY 设置一个初始化配置的超时, 这样如果房间所有者再给定的超时时间内不配置房间, 房间所有者就被假定已经接受了缺省得配置或取消了配置过程.)&lt;br /&gt;
# 一旦服务从初始房间所有者接收了完整的配置表格(或接收到了一个即时房间的请求), 服务必须 MUST 解锁 &amp;quot;unlock&amp;quot; 这个房间 (即, 允许其他用户进入此房间) 并发送&amp;quot;result&amp;quot;类型的 IQ  给房间所有者. 如果服务接收到了取消（指令）, 它必须 MUST 销毁这个房间.&lt;br /&gt;
&lt;br /&gt;
以下例子展示了这个协议流程.&lt;br /&gt;
&lt;br /&gt;
首先, Jabber用户必须 MUST 发送出席信息给房间, 包含空的 &amp;lt;x/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc' 名字空间(当他寻求进入一个房间时也发送和这同样的节).&lt;br /&gt;
&lt;br /&gt;
'''例子 143. Jabber用户新建一个房间并声明对多用户聊天的支持'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该房间不存在, 服务应该 SHOULD 新建这个房间(取决于关于新建房间的本地策略), 指定发出请求的用户的纯JID成为所有者, 添加这个所有者到房间, 并通过发送以下格式的出席信息节承认房间新建成功:&lt;br /&gt;
&lt;br /&gt;
'''例子 144. 服务承认房间新建成功'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='201'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接收到该房间已经创建的通知之后, 房间所有者需要决定是否接受缺省的房间配置(即, 新建一个即时房间 &amp;quot;instant room&amp;quot;) 还是做一些不同于缺省房间设置的配置 (即, 新建一个保留房间&amp;quot;reserved room&amp;quot;). 完成这两个用例的协议流程展示如下.&lt;br /&gt;
&lt;br /&gt;
注意: 如果如上的发送到一个不存在的房间里的出席信息节没有包含一个遵循 'http://jabber.org/protocol/muc'名字空间的 &amp;lt;x/&amp;gt; 元素, 服务应该SHOULD 立刻新建一个缺省的房间(即, 它必须 MUST 假定客户端支持 &amp;quot;groupchat 1.0&amp;quot; 而不是 Multi-User Chat, 所以在等待房间创建者决定是创建即时房间还是保留房间的时候,它不能 MUST NOT 锁定这个房间).&lt;br /&gt;
&lt;br /&gt;
====新建即时房间====&lt;br /&gt;
&lt;br /&gt;
如果初始的房间所有者想接受缺省的房间配置(即, 新建一个即时房间&amp;quot;instant room&amp;quot;), 房间所有者必须 MUST 拒绝初始配置表格,通过发送一个 IQ set 给 &amp;lt;room@service&amp;gt; 本身,包含一个遵循'http://jabber.org/protocol/muc#owner'名字空间的 &amp;lt;query/&amp;gt; 元素, 这里 &amp;lt;query/&amp;gt; 的唯一子元素是一个空的遵循'jabber:x:data'名字空间的 &amp;lt;x/&amp;gt; 元素并且拥有一个 'type'属性值为 &amp;quot;submit&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 145. 所有者请求即时房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着解锁该房间并允许其他实体加入它.&lt;br /&gt;
&lt;br /&gt;
====新建保留房间====&lt;br /&gt;
&lt;br /&gt;
如果初始的房间所有者想新建并配置一个保留房间, 这个房间所有者必须 MUST 请求初始配置表格,通过发送一个 IQ get 给 &amp;lt;room@service&amp;gt; 本身,包含一个空的遵循 'http://jabber.org/protocol/muc#owner' 名字空间的 &amp;lt;query/&amp;gt; 元素 :&lt;br /&gt;
&lt;br /&gt;
'''例子 146. 所有者请求配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间还不存在, 服务必须 MUST 返回一个初始的房间配置表单给该用户. (注意: 以下例子展示一个配置选项的典型例子. 已登记用于房间创建和配置的所有 x:data 字段列表由 XMPP Registrar 维护; 参见本文的 [[XEP-0045#XMPP注册项事项|XMPP注册项事项]] 章节.)&lt;br /&gt;
&lt;br /&gt;
'''例子 147. 服务发送配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Configuration for &amp;quot;darkcave&amp;quot; Room&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
          Your room darkcave@macbeth has been created!&lt;br /&gt;
          The default configuration is as follows:&lt;br /&gt;
            - No logging&lt;br /&gt;
            - No moderation&lt;br /&gt;
            - Up to 20 occupants&lt;br /&gt;
            - No password required&lt;br /&gt;
            - No invitation required&lt;br /&gt;
            - Room is not persistent&lt;br /&gt;
            - Only admins may change the subject&lt;br /&gt;
            - Presence broadcasted for all users&lt;br /&gt;
          To accept the default configuration, click OK. To&lt;br /&gt;
          select a different configuration, please complete&lt;br /&gt;
          this form.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural-Language Room Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomname'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Short Description of Room'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomdesc'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural Language for Room Discussions'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_lang'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Enable Public Logging?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Change Subject?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Invite Others?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Maximum Number of Occupants'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='10'&amp;gt;&amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='20'&amp;gt;&amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='30'&amp;gt;&amp;lt;value&amp;gt;30&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='50'&amp;gt;&amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='100'&amp;gt;&amp;lt;value&amp;gt;100&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='None'&amp;gt;&amp;lt;value&amp;gt;none&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles for which Presence is Broadcast'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_presencebroadcast'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles and Affiliations that May Retrieve Member List'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_getmemberlist'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Publicly Searchable?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Persistent?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Moderated?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Members-Only?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password Required to Enter?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          If a password is required to enter this room,&lt;br /&gt;
          you must specify the password below.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password'&lt;br /&gt;
          type='text-private'&lt;br /&gt;
          var='muc#roomconfig_roomsecret'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Who May Discover Real JIDs?'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderators Only'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Anyone'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;anyone&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional people who have&lt;br /&gt;
          administrative privileges in the room. Please&lt;br /&gt;
          provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Admins'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomadmins'/&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional owners for this&lt;br /&gt;
          room. Please provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Owners'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomowners'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: _whois 配置选项指定该房间是非匿名的(值为 &amp;quot;anyone&amp;quot;), 半匿名的(值为&amp;quot;moderators&amp;quot;), 还是全匿名的(值为&amp;quot;none&amp;quot;, 不显示在这).&lt;br /&gt;
&lt;br /&gt;
如果没有配置选项可用, 服务必须 MUST 返回空的 query 元素给房间所有者:&lt;br /&gt;
&lt;br /&gt;
'''例子 148. 服务通知所有者没有配置可用'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间所有者应该 SHOULD 接着填好表单并提交给服务.&lt;br /&gt;
&lt;br /&gt;
'''例子 149. 所有者提交配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomname'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;A Dark Cave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomdesc'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomsecret'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;cauldronburn&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomadmins'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;wiccarocks@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hecate@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间创建成功, 服务必须 MUST 通知新的房间所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 150. 服务通知新房间所有者成功'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果因为指定的房间配置违反了一个或多个服务策略而导致房间创建失败 (例如, 因为密码保护房间的密码为空), 服务必须 MUST 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
'''例子 151. 服务通知所有者请求的配置选项不被接受'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一方面, 房间所有者可以 MAY 取消配置过程:&lt;br /&gt;
&lt;br /&gt;
'''例子 152. 所有者取消初始的配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='cancel'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间所有者取消了初始的房间配置, 服务应该 SHOULD 销毁房间, 确保发送不可用出席信息给房间所有者 (详见 &amp;quot;销毁房间&amp;quot; 用例).&lt;br /&gt;
&lt;br /&gt;
如果房间所有者在提交表单之前因为任何原因下线了(例如, 失去连接), 服务将接收到一个类型为 &amp;quot;unavailable&amp;quot; 的出席信息节，从所有者到所有者的 &amp;lt;room@service/nick&amp;gt; 或到 &amp;lt;room@service&amp;gt; (或两者). 服务必须 MUST 接着销毁这个房间, 发送一个 &amp;quot;unavailable&amp;quot; 类型的出席信息节，从房间到所有者，包含一个 &amp;lt;destroy/&amp;gt; 元素以及 reason (子元素)(如果提供了) ，参见本文的 [[XEP-0045#销毁房间|销毁房间]]章节.&lt;br /&gt;
&lt;br /&gt;
====申请唯一房间名====&lt;br /&gt;
&lt;br /&gt;
在一些场合 (例如, 当 [[XEP-0045#把一对一聊天转为多用户会议|把一对一聊天转为会议]]), 房间创建者可能想在尝试新建房间之前请求一个唯一的房间名 (例如, 避免可能的房间冲突). 为此, 服务可以 MAY 如本章所述支持这个特性. (如果服务支持这个特性, 它必须 MUST 在对服务发现信息请求应答时返回一个 &amp;quot;http://jabber.org/protocol/muc#unique&amp;quot; 特性.)&lt;br /&gt;
&lt;br /&gt;
房间创建者通过发送一个 IQ-get 给服务本身来请求唯一房间名, 这个IQ节中包含一个空的 &amp;lt;unique/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc#unique' 名字空间:&lt;br /&gt;
&lt;br /&gt;
'''例子 153. 实体请求唯一房间名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='unique1'&lt;br /&gt;
    to='chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;unique xmlns='http://jabber.org/protocol/muc#unique'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果服务支持这个特性, 它应该 SHOULD 以 XML 字符数据的方式返回一个唯一房间名，包含一个 &amp;lt;unique/&amp;gt; 元素 (但不创建该房间):&lt;br /&gt;
&lt;br /&gt;
'''例子 154. 服务返回唯一房间名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='chat.shakespeare.lit'&lt;br /&gt;
    id='unique1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;unique xmlns='http://jabber.org/protocol/muc#unique'&amp;gt;&lt;br /&gt;
    6d9423a55f499b29ad20bf7b2bdea4f4b885ead1&lt;br /&gt;
  &amp;lt;/unique&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 拒绝返回一个唯一房间名给一个没有资格创建房间的实体, 或那些发送请求唯一房间名过多次数的实体, 等等.&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 使用算法保证房间名的创建在服务上下文中是唯一的 (例如, 对发出请求的JID,datetime,和random salt的SHA-1 哈希运算).&lt;br /&gt;
&lt;br /&gt;
房间创建者将接着使用 XML 字符数据 &amp;lt;unique/&amp;gt; 元素作为它请求的房间JID的节点标识符(ID):&lt;br /&gt;
&lt;br /&gt;
'''例子 155. 所有者以唯一名创建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence &lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='6d9423a55f499b29ad20bf7b2bdea4f4b885ead1@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===随后的房间配置===&lt;br /&gt;
&lt;br /&gt;
在指定房间的初始配置之后的任何时间, 房间所有者可能想修改房间配置. 为此, 房间所有者必须 MUST 向房间发出一个新的配置表单请求,通过发送一个 IQ 到 &amp;lt;room@service&amp;gt; ，包含一个空的 &amp;lt;query/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc#owner' 名字空间.&lt;br /&gt;
&lt;br /&gt;
'''例子 156. 所有者请求配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='config1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 157. 服务禁止非所有者的访问配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='configures'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 服务必须 MUST 以当前使用的选项组作为缺省值发送一个配置表单给房间所有者:&lt;br /&gt;
&lt;br /&gt;
'''例子 158. 服务发送配置表单给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='config1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Configuration for &amp;quot;darkcave&amp;quot; Room&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
        Complete this form to make changes to&lt;br /&gt;
        the configuration of your room.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural-Language Room Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomname'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;A Dark Cave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Short Description of Room'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomdesc'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Enable Public Logging?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Change Subject?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Invite Others?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Maximum Number of Occupants'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='10'&amp;gt;&amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='20'&amp;gt;&amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='30'&amp;gt;&amp;lt;value&amp;gt;30&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='50'&amp;gt;&amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='100'&amp;gt;&amp;lt;value&amp;gt;100&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='None'&amp;gt;&amp;lt;value&amp;gt;none&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles for which Presence is Broadcast'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_presencebroadcast'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles and Affiliations that May Retrieve Member List'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_getmemberlist'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Publicly Searchable?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Persistent?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Moderated?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Members Only?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password Required for Entry?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          If a password is required to enter this room,&lt;br /&gt;
          you must specify the password below.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password'&lt;br /&gt;
          type='text-private'&lt;br /&gt;
          var='muc#roomconfig_roomsecret'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;cauldronburn&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Who May Discover Real JIDs?'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderators Only'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Anyone'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;anyone&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional people who have&lt;br /&gt;
          administrative privileges in the room. Please&lt;br /&gt;
          provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Admins'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomadmins'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;wiccarocks@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hecate@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional owners for this&lt;br /&gt;
          room. Please provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Owners'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomowners'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有配置选项可用, 服务必须 MUST 返回一个空的 query 元素给房间所有者，如前面的用例所示.&lt;br /&gt;
&lt;br /&gt;
该房间所有者应该 SHOULD 接着以更新的配置信息提交表单.&lt;br /&gt;
&lt;br /&gt;
另外, 房间所有者可以 MAY 取消这次配置过程:&lt;br /&gt;
&lt;br /&gt;
'''例子 159. 所有者取消随后的配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='config2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='cancel'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间所有者取消随后的配置, 服务必须 MUST 让该房间的配置保持和房间所有者请求这次配置之前一样.&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个房间管理员失去管理权限，而这个管理员正在房间里, 该房间必须 MUST 为那个管理员发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;member&amp;quot; 或 'role' 属性值为 &amp;quot;participant&amp;quot; 或 &amp;quot;visitor&amp;quot; ，以适当地表达岗位级别和房间类型:&lt;br /&gt;
&lt;br /&gt;
'''例子 160. 服务通知失去管理员岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个用户获得管理员权限，而这个用户正在房间里, 房间必须 MUST 为那个用户发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 或 'role' 属性值为 &amp;quot;admin&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
'''例子 161. 服务通知所有用户有人获得管理员岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个房间所有者失去所有者权限，而这个所有者正在房间里, 该房间必须 MUST 为那个所有者发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 或 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 162. 服务通知失去所有者岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有其他所有者，服务不能 MUST NOT 允许一个所有者撤销他或她自己的所有权; 如果一个所有者企图这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给这个所有者. 然而, 如果没有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有者权限.&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个用户获得所有者权限，而这个用户正在房间里, 房间必须 MUST 为那个用户发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; 或 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 163. 服务通知所有用户有人获得所有者权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致房间类型变成仅限会员，但还有非成员在房间里, 服务必须 MUST 从房间移除任何非成员，并在发送给那些剩余的房客的 '不可用' 出席信息节里包含状态码 322.&lt;br /&gt;
&lt;br /&gt;
====配置变更通知====&lt;br /&gt;
&lt;br /&gt;
当一个房间的配置变更会对房间的隐私和安全策略产生影响时，该房间必须 MUST 发送通知给所有房客. 这个通知将包括一个 &amp;lt;message/&amp;gt; 节，包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 元素,  &amp;lt;x/&amp;gt; 元素则只有一个 &amp;lt;status/&amp;gt; 子元素，其 'code' 属性为一个适当的值. 这是例子:&lt;br /&gt;
&lt;br /&gt;
'''例子 164. 配置状态码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
         type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;status code='170'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间配置中和隐私相关的策略变更导致生成这些状态码，如下:&lt;br /&gt;
&lt;br /&gt;
* 如果房间日志功能可用了, 状态码 170.&lt;br /&gt;
* 如果房间日志现在禁止了, 状态码 171.&lt;br /&gt;
* 如果房间现在是非匿名的了, 状态码 172.&lt;br /&gt;
* 如果房间现在是半匿名的了, 状态码 173.&lt;br /&gt;
* 如果房间现在是全匿名的了, 状态码 174.&lt;br /&gt;
&lt;br /&gt;
对更多其他配置变更, 房间应该 SHOULD 发送状态码 104 这样感兴趣的房客如果想要的话可以接受到更新的房间配置.&lt;br /&gt;
&lt;br /&gt;
===授予所有者权限===&lt;br /&gt;
&lt;br /&gt;
如果实现允许, 一个所有者可以 MAY 授予所有权给其他用户; 只要把用户的岗位改成&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 165. 所有者授予所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 166. 所有者授予所有权(饱含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把用户添加到所有者列表并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 167. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已授予所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
'''例子 168. 服务发送所有权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/hecate'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已授予所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; . &lt;br /&gt;
&lt;br /&gt;
'''例子 169. 服务发送所有权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销所有者权限===&lt;br /&gt;
&lt;br /&gt;
实现可以 MAY 允许一个所有者撤销其他用户的所有权; 只要把用户的岗位改成非&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 170. 所有者撤销所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt;元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 171. 所有者撤销所有权(包含一个原因)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有其它所有者，服务不能 MUST NOT 允许一个所有者撤销他或她自己的所有权; 如果一个所有者尝试这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该所有者. 然而, 如果有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有权.&lt;br /&gt;
&lt;br /&gt;
如果一个实现不允许所有者撤销另一个用户的所有权, 实现必须 MUST 返回一个 &amp;lt;not-authorized/&amp;gt; 错误给做出这个请求的所有者.&lt;br /&gt;
&lt;br /&gt;
注意: 允许一个所有者移除其它用户的所有权能给房间管理一个折衷的控制模式; 所以这个特性是可选的 OPTIONAL, 并且鼓励实现支持通过一个只有拥有服务范围管理权限的用户使用的接口来移除所有者.&lt;br /&gt;
&lt;br /&gt;
其它情况下, 服务必须 MUST 把用户从所有者列表移除并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 172. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;owner&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值:&lt;br /&gt;
&lt;br /&gt;
'''例子 173. 服务通知失去所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;owner&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
'''例子 174. 服务发送失去所有权通知给所有房客 '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改所有者列表===&lt;br /&gt;
&lt;br /&gt;
如果实现允许, 一个房间所有者可能想修改所有者列表. 为此, 所有者首先请求所有者列表，通过向房间请求所有岗位为 'owner'的用户.&lt;br /&gt;
&lt;br /&gt;
'''例子 175. 所有者请求所有者列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='owner3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 接着返回所有者列表给所有者; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，对任何正是一名房客（也就是正在房间里）的所有者可以 MAY 包含 'nick' 和 'role' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 176. 服务发送所有者列表给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='crone1@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
所有者可以 MAY 接着修改所有者列表. 为此, 所有者必须 MUST 发送修改的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; [[XEP-0045#附录G:备注|21]]每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用于管理参与者之类的角色，而不是所有者之类的岗位):&lt;br /&gt;
&lt;br /&gt;
'''例子 177. 所有者发送修改过的所有者列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='owner4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
只有所有者被允许修改所有者列表. 如果一个非所有者试图察看或修改所有者列表, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 178. 服务对于非所有者试图修改所有者列表返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='ownertest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' &lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有别的所有者，服务不能 MUST NOT 允许一个所有者撤销自己的所有权; 如果一个所有者尝试这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该所有者. 然而, 如果有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有权. &lt;br /&gt;
&lt;br /&gt;
其它情况下, 服务必须 MUST 修改所有者列表并通知所有者成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 179. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也为任何因前述所有者列表修改而导致的岗位变化而发送出席信息通知.&lt;br /&gt;
&lt;br /&gt;
===授予管理员权限===&lt;br /&gt;
&lt;br /&gt;
一个所有者可以授予管理员权限给一个成员或无岗位的用户; 只要把用户的岗位改成&amp;quot;admin&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 180. 所有者授予管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL. &lt;br /&gt;
&lt;br /&gt;
'''例子 181. 所有者授予管理员权限(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把用户添加到管理员列表并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 182. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已授予管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值. &lt;br /&gt;
&lt;br /&gt;
'''例子 183. 服务发送管理员权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已授予管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 184. 服务发送管理员权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销管理员权限===&lt;br /&gt;
&lt;br /&gt;
一个所有者可能想撤销一个用户的管理员权限; 只要把用户的岗位改成非&amp;quot;admin&amp;quot;和非&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 185. 所有者撤销管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt;元素是可选的 OPTIONAL. &lt;br /&gt;
&lt;br /&gt;
'''例子 186. 所有者撤销管理员权限(包含一个原因)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把该用户从管理员列表移除并接着通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 187. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已失去管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非&amp;quot;admin&amp;quot;非&amp;quot;owner&amp;quot;, 并且 'role' 属性值为根据岗位和房间类型确定的适当的值: &lt;br /&gt;
&lt;br /&gt;
'''例子 188. 服务通知失去管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;admin&amp;quot; . &lt;br /&gt;
&lt;br /&gt;
'''例子 189. 服务通知失去管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改管理员列表===&lt;br /&gt;
&lt;br /&gt;
一个房间所有者可能想修改管理员列表. 为此, 所有者首先请求管理员列表，通过向房间请求所有岗位为 'admin'的用户. &lt;br /&gt;
&lt;br /&gt;
'''例子 190. 所有者请求管理员列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/desktopaffiliation&lt;br /&gt;
    id='admin3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 接着返回管理员列表给所有者; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，对任何正是一名房客（也就是正在房间里）的管理员可以 MAY 包含 'nick' 和 'role' 属性: &lt;br /&gt;
&lt;br /&gt;
'''例子 191. 服务发送管理员列表给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          nick='secondwitch'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
所有者可以 MAY 接着修改管理员列表. 为此, 所有者必须 MUST 发送修改的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; [[XEP-0045#附录G:备注|22]] 每个条目必须 MUST 包含 'affiliation'属性(通常值为 &amp;quot;admin&amp;quot; 或 &amp;quot;none&amp;quot;) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用于管理参与者之类的角色，而不是管理员之类的岗位): &lt;br /&gt;
&lt;br /&gt;
'''例子 192. 所有者发送修改的管理员列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='admin4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
只有所有者被允许修改管理员列表. 如果一个非所有者试图察看或修改所有者列表, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者: &lt;br /&gt;
&lt;br /&gt;
'''例子 193. 服务对于非所有者试图修改管理员列表返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admintest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin' &lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 修改管理员列表并通知所有者成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 194. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也为任何因前述管理员列表修改而导致的岗位变化而发送出席信息通知.&lt;br /&gt;
&lt;br /&gt;
===销毁房间===&lt;br /&gt;
&lt;br /&gt;
房间所有者必须 MUST 能够销毁一个房间, 特别是如果这个房间不是持久房间的时候. 流程如下:&lt;br /&gt;
&lt;br /&gt;
# 房间所有者请求销毁房间, 如果必要的话指出一个原因 reason 和一个备用场地.&lt;br /&gt;
# 该房间移除所有房客(包含适当的关于备用场地和被移除的原因的信息) 并销毁房间, 即使它被定义为持久房间.&lt;br /&gt;
&lt;br /&gt;
不像前述的, 本文不指定一个MUC服务实现收到一个销毁房间请求之后将会如何做. 例如, 如果房间定义为持久地, 一个实现可以 MAY 选择锁定房间I，这样它不能被重用, 把加入该房间的请求重定向到替代场地, 或邀请当前的参与者到新的房间; 无论如何, 这些行为是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
为了销毁一个房间, 房间所有者必须 MUST 发送一个 IQ set 指令到要销毁的房间的地址. 这个 &amp;lt;iq/&amp;gt; 节将包含一个遵循 'http://jabber.org/protocol/muc#owner' 名字空间的 &amp;lt;query/&amp;gt; 元素，它将包含一个 &amp;lt;destroy/&amp;gt; 元素. 替代场地的地址可以 MAY 用这个 &amp;lt;destroy/&amp;gt; 元素的 'jid' 属性来提供. 一个密码保护的替代场地可以 MAY 通过 &amp;lt;destroy/&amp;gt; 元素的 &amp;lt;password/&amp;gt; 子元素的 XML 字符数据来提供. 摧毁房间的原因可以 MAY 通过 &amp;lt;destroy/&amp;gt; 元素的 &amp;lt;reason/&amp;gt; 子元素的 XML 字符数据来提供.&lt;br /&gt;
&lt;br /&gt;
以下例子展示了协议发送和接收的元素:&lt;br /&gt;
&lt;br /&gt;
'''例子 195. 所有者提交房间摧毁请求'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='begone'&lt;br /&gt;
    to='heath@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务负责移除所有房客. 它不应该 SHOULD NOT 广播类型为&amp;quot;unavailable&amp;quot;的出席信息节给所有房客, 只需要发送一个&amp;quot;unavailable&amp;quot;类型的出席信息节给每个房客，这样该用户知道他或她已经从房间移除了. 如果所有者的扩展出席信息指定了一个替代场地的 JID 以及房间销毁的原因, 这个出席信息节必须 MUST 包含那些信息.&lt;br /&gt;
&lt;br /&gt;
'''例子 196. 服务移除每个房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 197. 服务通知所有者成功销毁房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='begone'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果在一个销毁请求中接收到的'from'地址的 &amp;lt;user@host&amp;gt; 和一个房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 198. 服务拒绝由非所有者提交的销毁请求'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='destroytest'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==错误和状态码==&lt;br /&gt;
===错误码===&lt;br /&gt;
&lt;br /&gt;
和'http://jabber.org/protocol/muc#user' 名字空间相关的错误码相当简单, 总结于下表之中. 关于传统的错误码到XMPP格式的错误之间的映射的详细信息, 参见 [http://xmpp.org/extensions/xep-0086.html 错误条件映射] [[XEP-0045#附录G:备注|23]]; 实现应该 SHOULD 支持传统和XMPP错误处理两者.&lt;br /&gt;
&lt;br /&gt;
'''表9: http://jabber.org/protocol/muc#user 名字空间的错误码'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!码 !!类型 !!元素 !!上下文 !!目的&lt;br /&gt;
|-&lt;br /&gt;
|401 ||Error ||Presence  ||进入一个房间 ||通知用户需要密码&lt;br /&gt;
|-&lt;br /&gt;
|403 ||Error ||Presence  ||进入一个房间 ||通知用户他或她被房间禁止了&lt;br /&gt;
|-&lt;br /&gt;
|404 ||Error ||Presence  ||进入一个房间 ||通知用户房间不存在&lt;br /&gt;
|-&lt;br /&gt;
|405 ||Error ||Presence  ||进入一个房间 ||通知用户限制创建房间&lt;br /&gt;
|-&lt;br /&gt;
|406 ||Error ||Presence  ||进入一个房间 ||通知用户必须使用保留的房间昵称&lt;br /&gt;
|-&lt;br /&gt;
|407 ||Error ||Presence  ||进入一个房间 ||通知用户他或她不在成员列表中&lt;br /&gt;
|-&lt;br /&gt;
|409 ||Error ||Presence  ||进入一个房间 ||通知用户他或她的房间昵称正在使用或被别的用户注册了&lt;br /&gt;
|-&lt;br /&gt;
|503 ||Error ||Presence  ||进入一个房间 ||通知用户已经达到最大用户数&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
本文不规定和上述错误条件相关的文本字符串(即, XMPP &amp;lt;text/&amp;gt; 元素值).&lt;br /&gt;
&lt;br /&gt;
===状态码===&lt;br /&gt;
&lt;br /&gt;
多用户聊天的使用一个 &amp;lt;status/&amp;gt; 元素(特指, &amp;lt;status/&amp;gt; 元素的的 'code' 属性  ) 来传达关于用户在一个房间里的状态的信息. 随着时间的推移, 状态码的数量已经增加了很多, 而新的状态码继续被作者申请. 所以, 这些状态码现在记录在一个由XMPP登记处维护的注册表里. 细节可参考本文的 [[XEP-0045#状态码注册表|状态码注册表]].&lt;br /&gt;
&lt;br /&gt;
注意: 通常, MUC 状态码倾向于沿用[http://tools.ietf.org/html/rfc2616 RFC 2616] [[XEP-0045#附录G:备注|24]] 和 [http://tools.ietf.org/html/rfc1893 RFC 1893] [[XEP-0045#附录G:备注|25]] (1xx 码表示信息, 2xx 码说明情况良好可继续, 3xx 码指定重定向被踢或被禁止的用户, x3x 码指系统状态, x7x 码指安全或策略事务, 等等) 里面的状态码的 &amp;quot;抽象&amp;quot;含义.&lt;br /&gt;
&lt;br /&gt;
注意: 如果今天来定义 MUC 协议, 它将指定一个更有弹性的, XML-友好的 途径而不是硬编码的状态数字; 然而, 现在修改状态汇报系统带来的痛苦将远大于好处, 这是为什么状态码数字保持使用至今. 本文的未来版本可能定义一个更 类XMPP 的途径来表示状态条件, 保留状态码数字但是给它们补充更多的描述性的子元素,就像 '''RFC 3920 '''里那样.&lt;br /&gt;
&lt;br /&gt;
==国际化事项==&lt;br /&gt;
&lt;br /&gt;
如 '''RFC 3920''' 中所定义的, XMPP 实体 (包括 MUC 房间和 MUC 服务) 应该 SHOULD 遵守任何给定的节提供的 'xml:lang' 属性. 然而, 群聊消息的同声翻译超出了本文的范围.&lt;br /&gt;
&lt;br /&gt;
这里定义的状态和错误码允许一个客户端实现展示一个本地化的界面; 然而, 任何给定语言社区的本地化文本字符串的定义超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
尽管这里的很多数据表单字段的标签显示为英文, MUC 客户端应该 SHOULD 把这些字段展示为本地化的文本而不是英文文本.&lt;br /&gt;
&lt;br /&gt;
==安全事项==&lt;br /&gt;
===用户验证和授权===&lt;br /&gt;
&lt;br /&gt;
本文没有定义或要求比明文密码更安全的房间准入验证或授权方法. 然而, 这些潜在的风险可能使用 '''RFC 3920''' 描述的通过使用 TLS 和 SASL 加密通道来减轻.&lt;br /&gt;
&lt;br /&gt;
===端到端加密===&lt;br /&gt;
&lt;br /&gt;
这里没有定义没有端到端消息或会话加密方法. 用户不应该 SHOULD NOT 相信一个服务能保持通过房间发送的任何文本的安全.&lt;br /&gt;
&lt;br /&gt;
===隐私===&lt;br /&gt;
&lt;br /&gt;
取决于房间配置, 一个房间可以公开地记录房间里发生的所有讨论. 服务必须 MUST 警告用户该房间是公开记录的，通过在该用户的初始出席信息中返回一个状态码 &amp;quot;170&amp;quot; , 并且如果房间讨论被记录 (用户的客户端也应该 SHOULD 在允许用户进入之前查询房间的配置，以&amp;quot;预先发现&amp;quot;房间是否被记录)，该用户的客户端也必须 MUST 警告用户. 如果房间的配置随后修改成允许房间记录(当房间发送状态码 170 时客户端将发现)，客户端也必须 MUST 警告用户 . 注意: 房间内的历史和公开房间记录是不同的, 并且很自然的一个房间不能有效地阻止房客独立维护的自有的房间记录, 它可能被公开; 用户应该 SHOULD 谨慎操作并认识到任何房间讨论可能被有效地公开.&lt;br /&gt;
&lt;br /&gt;
===匿名===&lt;br /&gt;
&lt;br /&gt;
取决于房间配置, 一个房间可以 MAY 暴光每个房客的真实 JID 给其他房客 (如果该房间是非匿名的) 并且将几乎肯定地暴光每个房客的真实 JID 给该房间的所有者和管理员(如果该房间不是全匿名的).服务必须 MUST 警告用户真实 JIDs 在房间被暴光，通过在该用户的初始出席信息中包含状态码 &amp;quot;100&amp;quot; , 并且用户的客户端必须 MUST 警告该用户 (一个用户的客户端应该 SHOULD 也在允许用户进入房间之前查询房间配置以 &amp;quot;预先发现&amp;quot; 是否真实 JIDs 会在房间中暴光). 如果房间配置随后从半匿名或全匿名修改成非匿名(当房间发送状态码 172 时客户端将发现) ，客户端必须 MUST 也警告用户，如果房间的配置随后从全匿名改成半匿名时(当房间发送状态码 173 时客户端将发现)，客户端也应该 SHOULD 警告用户.&lt;br /&gt;
&lt;br /&gt;
===拒绝服务===&lt;br /&gt;
&lt;br /&gt;
公开的 MUC 房间能承受一定数量的攻击, 大部分能减少拒绝服务攻击. 这些攻击包括但不限于:&lt;br /&gt;
&lt;br /&gt;
# 向房间里塞进大量的非法房客从而阻止合法用户加入房间.&lt;br /&gt;
# 发送侮辱性的消息接着在被踢或被禁止之前离开房间; 这些侮辱性的消息包含但不限于，大量消息以阻止参与者正常跟踪会话线索或房间历史, 对参与者的人身攻击 (特别是房间管理员和主持人), 攻击性的文字, 以及垃圾网站链接.&lt;br /&gt;
# 高频率的制造出席信息变更.&lt;br /&gt;
# 使用过长的昵称导致无法看到完整的发言.&lt;br /&gt;
# 辱骂房间管理员或其他房间房客.&lt;br /&gt;
# 在一个服务里注册很多昵称然后禁止这些昵称的使用.&lt;br /&gt;
# 模仿别的房客的昵称(例如, 通过在尾部增加一个空格或看起来相似的字符串), 然后以那个房间昵称发送消息用于欺骗房客.&lt;br /&gt;
&lt;br /&gt;
这些攻击可能被减轻不能完全被阻止，通过灵活地使用管理员操作。例如禁止用户, 有管理员权限的自动的房间机器人出席信息, 智能内容过滤的实现, 检查连接的用户的 IP 地址(在分布式的系统里不一定能实现), 应用发言规则到出席信息以及消息, 使用比Resourceprep profile of stringprep更严格的规则匹配房间昵称, 等等. 然而, 经验表明无法完全阻止这类攻击.&lt;br /&gt;
&lt;br /&gt;
===其它事项===&lt;br /&gt;
&lt;br /&gt;
关于延迟递送符号的列入和流程的更多安全事项参见 '''XEP-0203'''.&lt;br /&gt;
&lt;br /&gt;
==IANA事项==&lt;br /&gt;
&lt;br /&gt;
本文档与[http://www.iana.org/ 互联网编号分配授权机构] [[XEP-0045#附录G:备注|26]]无关。&lt;br /&gt;
&lt;br /&gt;
==XMPP登记事项==&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/registrar/ XMPP登记处] [[XEP-0045#附录G:备注|27]]在它的登记处包含了以下信息.&lt;br /&gt;
&lt;br /&gt;
===协议名字空间===&lt;br /&gt;
&lt;br /&gt;
XMPP登记处在它的协议名字空间注册表里包含了以下 MUC相关的名字空间:&lt;br /&gt;
&lt;br /&gt;
* http://jabber.org/protocol/muc&lt;br /&gt;
* http://jabber.org/protocol/muc#admin&lt;br /&gt;
* http://jabber.org/protocol/muc#owner&lt;br /&gt;
* http://jabber.org/protocol/muc#user&lt;br /&gt;
&lt;br /&gt;
===服务发现种类/类型===&lt;br /&gt;
&lt;br /&gt;
一个多用户聊天服务或房间在服务发现里是用 &amp;quot;conference&amp;quot; 种类categary 和 &amp;quot;text&amp;quot; 类型type 来标识的.&lt;br /&gt;
&lt;br /&gt;
===服务发现特性===&lt;br /&gt;
&lt;br /&gt;
有很多和MUC相关的服务或房间相关的特性可以被&amp;quot;服务发现&amp;quot;来发现. 这里面最基本的是 'http://jabber.org/protocol/muc' 名字空间. 另外, 一个MUC房间应该 SHOULD 提供关于它实现的特定房间特性的信息, 例如密码保护和房间主持.&lt;br /&gt;
&lt;br /&gt;
'''注册提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#register FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#roomconfig FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#roominfo FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_hidden&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Hidden room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_membersonly&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Members-only room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_moderated&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Moderated room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_nonanonymous&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Non-anonymous room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_open&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Open room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_passwordprotected&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Password-protected room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_persistent&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Persistent room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_public&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Public room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_rooms&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;List of MUC rooms (each as a separate item)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_semianonymous&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Semi-anonymous room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_temporary&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Temporary room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_unmoderated&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Unmoderated room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_unsecured&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Unsecured room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===知名服务发现节点===&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'http://jabber.org/protocol/muc#rooms' 允许发现一个用户是哪个房间的房客.&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'x-roomuser-item' 允许一个用户从房间外发现自己的已注册房间昵称.&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'http://jabber.org/protocol/muc#traffic' 允许发现通过一个房间能发送哪些名字空间的通讯(参见本文允许的 [[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
&lt;br /&gt;
===字段标准化===&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/extensions/xep-0068.html 数据表单的字段标准化] [[XEP-0045#附录G:备注|28]] 定义了用于遵循特定名字空间的数据表单的字段标准化的过程. 在 MUC 里面, 使用了四种这类表单: 房间注册 ( &amp;quot;muc#register&amp;quot; FORM_TYPE), 请求发言权和批准请求 (&amp;quot;muc#request&amp;quot;), 房间配置 (&amp;quot;muc#roomconfig&amp;quot;), 以及用于房间信息的服务发现扩展 (&amp;quot;muc#roominfo&amp;quot;). 这些保留的字段定义如下.&lt;br /&gt;
&lt;br /&gt;
====muc#register FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling user registration with a&lt;br /&gt;
    Multi-User Chat (MUC) room or admin approval&lt;br /&gt;
    of user registration requests.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field &lt;br /&gt;
     var='muc#register_allow'&lt;br /&gt;
     type='boolean'&lt;br /&gt;
     label='Allow this person to register with the room?'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_email'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Email Address'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_faqentry'&lt;br /&gt;
      type='text-multi'&lt;br /&gt;
      label='FAQ Entry'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_first'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Given Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_last'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Family Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_roomnick'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Desired Nickname'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_url'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Your URL'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#request FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling voice requests in a &lt;br /&gt;
    Multi-User Chat (MUC) room or admin&lt;br /&gt;
    approval of such requests.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#role'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='Requested role'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#jid'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='User ID'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#roomnick'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='Room Nickname'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#request_allow'&lt;br /&gt;
         type='boolean'&lt;br /&gt;
         label='Whether to grant voice'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#roomconfig FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling creation and configuration of&lt;br /&gt;
    a Multi-User Chat (MUC) room.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_allowinvites'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Occupants to Invite Others'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_changesubject'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Occupants to Change Subject'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_enablelogging'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Enable Public Logging of Room Conversations'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_getmemberlist'&lt;br /&gt;
      type='list-multi'&lt;br /&gt;
      label='Roles and Affiliations that May Retrieve Member List'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_lang'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural Language for Room Discussions'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_pubsub'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='XMPP URI of Associated Publish-Subcribe Node'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_maxusers'&lt;br /&gt;
      type='list-single'&lt;br /&gt;
      label='Maximum Number of Room Occupants'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_membersonly'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether an Make Room Members-Only'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_moderatedroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Make Room Moderated'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_passwordprotectedroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether a Password is Required to Enter'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_persistentroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Make Room Persistent'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_presencebroadcast'&lt;br /&gt;
      type='list-multi'&lt;br /&gt;
      label='Roles for which Presence is Broadcast'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_publicroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Public Searching for Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomadmins'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Full List of Room Admins'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomdesc'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Short Description of Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomname'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural-Language Room Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomowners'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Full List of Room Owners'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomsecret'&lt;br /&gt;
      type='text-private'&lt;br /&gt;
      label='The Room Password'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_whois'&lt;br /&gt;
      type='list-single'&lt;br /&gt;
      label='Affiliations that May Discover Real JIDs of Occupants'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#roominfo FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling the communication of extended service discovery&lt;br /&gt;
    information about a Multi-User Chat (MUC) room.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_contactjid'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Contact Addresses (normally, room owner or owners)'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_description'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Short Description of Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_lang'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural Language for Room Discussions'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_ldapgroup'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='An associated LDAP group that defines room membership; &lt;br /&gt;
             this should be an LDAP Distinguished Name according to an&lt;br /&gt;
             implementation-specific or deployment-specific definition&lt;br /&gt;
             of a group.'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_logs'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='URL for Archived Discussion Logs'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_occupants'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Current Number of Occupants in Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_subject'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Current Subject or Discussion Topic in Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_subjectmod'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='The room subject can be modified by participants'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===状态码登记处===&lt;br /&gt;
====过程====&lt;br /&gt;
&lt;br /&gt;
XMPP注册员为遵循 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;status/&amp;gt; 元素的 'code' 属性维护注册表中的值 .&lt;br /&gt;
&lt;br /&gt;
为了提交新值给这个注册表, 注册人将按以下格式定义一个XML段并把它包含在相关的XMPP扩展协议中，或者发到&amp;lt;registrar@xmpp.org&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;the three-digit code number&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;the stanza type of which it is a child (message or presence)&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;the use case or situation in which the status is used&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;a natural-language description of the meaning&amp;lt;/purpose&amp;gt;&lt;br /&gt;
  &amp;lt;child&amp;gt;the descriptive child element (reserved for future use)&amp;lt;/child&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注册人可一次注册多个状态码，每个状态码包含在独立的&amp;lt;statuscode/&amp;gt;元素中。&lt;br /&gt;
&lt;br /&gt;
====初始提交====&lt;br /&gt;
&lt;br /&gt;
作为本文的一部分, 以下状态码已被注册了:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;100&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message or presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that any occupant is allowed to see the user's full JID&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;101&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message (out of band)&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Affiliation change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that his or her affiliation changed while not in the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;102&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room now shows unavailable members&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;103&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room now does not show unavailable members&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;104&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;&lt;br /&gt;
    Inform occupants that a non-privacy-related room configuration change has occurred&lt;br /&gt;
  &amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;110&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Any room presence&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that presence refers to one of its own room occupants&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;170&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message or initial presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room logging is now enabled&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;171&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room logging is now disabled&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;172&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now non-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;173&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now semi-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;174&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now fully-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;201&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that a new room has been created&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;210&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that service has assigned or modified occupant's roomnick&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;301&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she has been banned from the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;303&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Exiting a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform all occupants of new room nickname&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;307&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she has been kicked from the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;321&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because of an affiliation change&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;322&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because the room has been changed to members-only and the user &lt;br /&gt;
    is not a member&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;332&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because of a system shutdown&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===URI查询类型===&lt;br /&gt;
&lt;br /&gt;
作为由[http://www.xmpp.org/extensions/xep-0147.html XMPP URI Query Components] [[XEP-00450#附录G:备注|29]]授权的机构，XMPP注册员维护着一个用于 XMPP URIs 的查询和键-值对的注册表（见&amp;lt;[http://www.xmpp.org/registrar/querytypes.html http://www.xmpp.org/registrar/querytypes.html]&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
====join====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;join&amp;quot; 查询类型被注册为一个 MUC相关的动作, 伴随一个可选的键 &amp;quot;password&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 199. Join动作: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?join&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
应用必须 MUST 要么展示一个界面允许用户提供一个房间昵称，要么基于配置好的选项或昵称发现来获取这个房间昵称.&lt;br /&gt;
&lt;br /&gt;
'''例子 200. Join动作: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
join 动作可以 MAY 为这房间包含一个密码. 自然的, 对一个包含了房间密码的 URI 的访问必须 MUST 得到适当的控制.&lt;br /&gt;
&lt;br /&gt;
'''例子 201. Join动作包含密码: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?join;password=cauldronburn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 202. Join动作包含密码: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下提交注册 &amp;quot;join&amp;quot; 查询类型.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;querytype&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;join&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;proto&amp;gt;http://jabber.org/protocol/muc&amp;lt;/proto&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;enables joining a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;keys&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;password&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the password required to enter a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
  &amp;lt;/keys&amp;gt;&lt;br /&gt;
&amp;lt;/querytype&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====invite====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;invite&amp;quot; 查询类型被注册为一个 MUC相关的动作, 伴随一个可选的键 &amp;quot;jid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 203. Invite动作: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果加入中的用户还未在房间里, 应用必须 MUST 发送两个节: 第一个加入房间，第二个邀请另一个人. 如果加入中的用户已经在房间里, 应用将只发送邀请节.&lt;br /&gt;
&lt;br /&gt;
'''例子 204. Invite动作: 结果节(s)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
URI 可以包含多个邀请:&lt;br /&gt;
&lt;br /&gt;
'''例子 205. Invite动作包含多个邀请: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit;jid=bard@shakespeare.lit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 206. Invite动作包含多个邀请: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
URI 也可以包含一个密码:&lt;br /&gt;
&lt;br /&gt;
'''例子 207. Invite动作包含密码: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit;password=cauldronburn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果加入中的用户还未在房间里, 应用必须 MUST 发送两个节: 第一个加入房间，第二个邀请另一个人. 如果加入中的用户已经在房间里, 应用将只发送邀请节.&lt;br /&gt;
&lt;br /&gt;
'''例子 208. Invite动作包含密码: 结果节(s)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下提交注册 &amp;quot;invite&amp;quot; 查询类型.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;querytype&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;invite&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;proto&amp;gt;http://jabber.org/protocol/muc&amp;lt;/proto&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;enables simultaneously joining a groupchat room and inviting others&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;keys&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;jid&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the Jabber ID of the invitee&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;password&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the password required to enter a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
  &amp;lt;/keys&amp;gt;&lt;br /&gt;
&amp;lt;/querytype&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==商业规则==&lt;br /&gt;
===Addresses===&lt;br /&gt;
&lt;br /&gt;
为了提供关于从房间JIDs抓获的地址的一致性, Room IDs 必须 MUST 遵循 Stringprep 的 Nodeprep 规范并且 Room Nicknames 必须 MUST 符合 Stringprep (这些都定义在 '''RFC 3920''') 的 Resourceprep 规范. 尽管在 '''RFC 3920''' 中没有显式的说明 , 一个 Room JID 的 Room ID (node) 和 Room Nickname (resource) 部分都必须 MUST 长度不为零. 另外, 一个 MUC 服务不能 MUST NOT 允许空的或不可见的房间昵称 Room Nicknames (即, 房间昵称Room Nicknames 只包含一个或多个空格).&lt;br /&gt;
&lt;br /&gt;
取决于服务实现，是否更多地限制房间昵称 (例如, 通过应用情景例程, stringprep的Nodeprep规范, 或其他限制).&lt;br /&gt;
&lt;br /&gt;
===Message===&lt;br /&gt;
&lt;br /&gt;
# 如果一个房客想发送一个消息给所有其他房客, MUC 客户端必须 MUST 把 'type' 属性值设为 &amp;quot;groupchat&amp;quot;. 服务可以 MAY 忽略不正确的消息类型, 或用 &amp;lt;bad-request/&amp;gt; 错误弹回.&lt;br /&gt;
# 如果一个MUC服务从一个角色为&amp;quot;none&amp;quot;的Jabber用户收到一个发送给该房间的消息或给某个房客的消息, 服务不能 MUST NOT 递送这个消息并应该 SHOULD 返回给这个消息给发送者并伴随一个 &amp;lt;forbidden/&amp;gt; 错误.&lt;br /&gt;
# 如果一个MUC服务 接收到一个发送给不存在的或尚未解锁的房间的消息, 服务应该 SHOULD 返回这个消息给发送者并伴随一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
# 一个MUC服务应该 SHOULD 不做修改地传递扩展的消息 (例如, 一个消息主体的 XHTML 版本) 给房客; 然而, 一个 MUC 服务可以 MAY 不允许消息的特定扩展(参见本文的[[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
# 一个MUC客户端可以 MAY 生成扩展以满足 [http://xmpp.org/extensions/xep-0022.html 消息事件] [[XEP-0045#附录G:备注|30]] 或 [http://xmpp.org/extensions/xep-0085.html 聊天状态通知] [[XEP-0045#附录G:备注|31]] 规范; 然而, 一个 MUC 服务可以 MAY 不允许这些扩展 (参见本文的[[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
&lt;br /&gt;
===Presence===&lt;br /&gt;
&lt;br /&gt;
# 一个房间必须 MUST 安静地忽略从一个角色为&amp;quot;none&amp;quot;的用户发来的不可用出席信息信息.&lt;br /&gt;
# 只有MUC服务自身应该 SHOULD 生成关于角色，岗位，全JIDs或遵循 'http://jabber.org/protocol/muc#user' 名字空间的状态码的扩展的出席信息 (基于服务所知道的关于房客的信息, 例如, 角色, 或由一个主持人或房间管理员的动作所产生的结果). 一个客户端不应该 SHOULD NOT 推定生成这类信息. 如果一个 MUC 服务从一个房客接收到这类扩展的出席信息, 它不能 MUST NOT 反射它给其他房客们. (一个客户端可以 MAY 为了提供一个密码而生成遵循 'http://jabber.org/protocol/muc#user' 名字空间的扩展的出席信息, 但自然的这是不反射给其他房客的.)&lt;br /&gt;
# 一个MUC服务应该 SHOULD 允许所有其他出席信息通过, 尽管它可以 MAY 选择阻塞扩展的出席信息; 参见本文的 [[XEP-0045#允许的通讯|允许的通讯]]章节.&lt;br /&gt;
# 为了适当地通知房客角色和岗位, 并使之更易于Jabber客户端跟踪房间里所有用户的当前状态, MUC服务实现必须 MUST 在所有出席信息节里提供关于角色和岗位的扩展的出席信息, 包括一个用户因为任何原因退出该房间时被发送的类型为&amp;quot;unavailable&amp;quot;的出席信息节.&lt;br /&gt;
# 如果一个权限被撤销, 服务必须 MUST 通知这件事，通过发送一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 元素并包含一个 &amp;lt;item/&amp;gt; 子元素，该&amp;lt;item/&amp;gt; 子元素的 'role' 和/或 'affiliation' 属性值的设定指明是去了有关的权限. 所有将来的为这个房客发出的出席信息节必须 MUST 包含这个更新的角色和岗位, 直到除非它们再次改变.&lt;br /&gt;
# 一个MUC服务必须 MUST 发送扩展的出席信息给一个客户端，即使客户端在进入该房间时没有发送一个空的遵循 'http://jabber.org/protocol/muc' 名字空间的 &amp;lt;x/&amp;gt; 元素 ; 自然的, 一个客户端必须 MUST 忽略这类信息，如果它不懂得它的话(根据 '''RFC 3920''').&lt;br /&gt;
# 在 muc#user 名字空间中被发送的关于角色和岗位的扩展的出席信息必须 MUST 包含全JID (不是纯JID) 作为 'jid' 属性的值.&lt;br /&gt;
# 如果想要，一个客户端可以 MAY 发送一个客户化的退出消息 (就像 IRC 频道里经常出现的那样) ，通过在退出时被发送的&amp;quot;unavailable&amp;quot;类型的出席信息节里包含一个 &amp;lt;status/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
===IQ===&lt;br /&gt;
&lt;br /&gt;
# MUC被设计用于分享消息和出席信息, 而不是 IQs. 一个被发送的到房间本身JID的 IQ 由房间本身来处理并且不反射给所有房客.&lt;br /&gt;
# 如果一个房客想在一个非匿名房间发送一个 IQ 节给其他用户, 发送者应该 SHOULD 直接发送请求给接收者的纯JID或全JID, 而不是试图通过房间发送请求(即, 通过接收者的房间JID).&lt;br /&gt;
# 如果一个房客想在一个半匿名房间发送一个 IQ 节给其他用户, 发送者能直接发送这个节给接受者的房间JID并且服务可以 MAY 转发这个节给接收者的真实JID. 然而, 任何时候一个MUC服务不能 MUST NOT 泄露这个发送者的真实JID给接收者, 也不能泄露接收者的真实JID给发送者.&lt;br /&gt;
# 一个MUC客户端必须 MUST 在IQ set 中的遵循 'http://jabber.org/protocol/muc#admin' &amp;lt;item/&amp;gt; 子元素中只发送 'affiliation' 属性或 'role' 属性; 如果一个主持人, 管理员, 或所有者试图在相同的IQ set中修改相同条目的岗位或角色, 服务必须 MUST 返回一个 &amp;lt;bad-request/&amp;gt; 错误给发送者. 无论如何, 一个MUC服务可以 MAY 基于一个岗位的变更来修改一个角色，从而可以 MAY 发送出席信息更新，同时包含一个修改的角色和一个修改的岗位.&lt;br /&gt;
# 在关于角色的 IQ sets中, 一个MUC客户端必须 MUST 只包含 'nick' 属性; 在关于角色的 IQ results中, 一个 MUC 服务必须 MUST 包含 'nick', 'role', 'affiliation', 和'jid' 属性 (值为后来设置的用户的全JID).&lt;br /&gt;
# 在关于岗位的 IQ sets中, 一个MUC客户端必须 MUST 只包含 'jid' 属性(值为纯JID); 在关于岗位的 IQ results中, 一个MUC服务不能 MUST NOT 包含 'role' 属性, 必须MUST 包含 'affiliation' 属性和 'jid' 属性 (值为纯JID), 并且应该 SHOULD 包含 'nick' 属性 (除非岗位为 &amp;quot;outcast&amp;quot;, 以为被排斥者不应该 SHOULD NOT 有保留的房间昵称).&lt;br /&gt;
&lt;br /&gt;
==实现注意事项==&lt;br /&gt;
&lt;br /&gt;
以下方针有助于客户端和组件开发者建立 MUC 实现.&lt;br /&gt;
&lt;br /&gt;
===服务端===&lt;br /&gt;
&lt;br /&gt;
# 在处理一个被主持的房间里游客发送的消息时, 一个MUC服务可以 MAY 通过一个主持人让每个消息排队等待批准并且可以 MAY 通知发送者消息正在等待批准; 然而, 这一行为是可选的 OPTIONAL, 并且一个消息批准协议的定义 (例如, 使用'''XEP-0004'''定义的数据表单) 超出了本文的范围.&lt;br /&gt;
# 对于一个 MUC 服务来说，在特定时间发生时提供房间内的消息是很常见的, 例如当标题变更时, 当一个房客加入或退出时, 或当一个房间被销毁时. 这类消息完全是可选的 OPTIONAL 并且留给实现或布署来决定, 但如果使用了，则必须 MUST 是从房间JID本身(&amp;lt;room@service&amp;gt;) 而不是从一个特定的&lt;br /&gt;
房客(&amp;lt;room@service/nick&amp;gt;)发送的类型为 &amp;quot;groupchat&amp;quot; 类型的消息. 无论如何, 通常接收的客户端倾向于基于房间的事件以及MUC提供的特定状态码来生成类似的消息(例如, 用户加入或退出) ; 这将帮助确保这类消息的正确的本地化.&lt;br /&gt;
# 出于礼貌, 一个MUC服务可以 MAY 发送一个房间外的 &amp;lt;message/&amp;gt; 给一个被踢的或被禁止的房客, 并且可以 MAY 广播一个房间内的 &amp;lt;message/&amp;gt; 给所有剩余的房客通知他们该房客已被该房间踢出或禁止. 无论如何, 这类消息是可选的 OPTIONAL, 并且事实上是多余的，因为接收的客户端生成这类消息所必需的信息已经通过MUC服务发送的出席信息节(特别是状态码)得到了.&lt;br /&gt;
# 出于礼貌, 如果一个用户的岗位变更了而该用户不在房间里，一个MUC服务可以MAY发送一个房间外的 &amp;lt;message/&amp;gt; ; 这消息应该 SHOULD 被从房间发送给该用户的纯JID, 可以 MAY 包含一个 &amp;lt;body/&amp;gt; 元素描述岗位变更, 并且必须 MUST 包含一个状态码 101.&lt;br /&gt;
# 没有需求要一个MUC服务将为旧的&amp;quot;groupchat 1.0&amp;quot;用户提供特别的治疗, 例如包含等价于扩展的遵循 'http://jabber.org/protocol/muc#user' 名字空间的出席信息的消息.&lt;br /&gt;
# 房间类型可以 MAY 被配置成任何组合. 一个MUC服务可以 MAY 支持或允许任何想要的房间类型或它们的组合.&lt;br /&gt;
# 一个MUC服务可以 MAY 限制在初始配置完成之后配置选项展示给一个所有者的次数, 例如因为特定的选项除非重启服务无法生效.&lt;br /&gt;
# 一个MUC服务可以 MAY 提供一个接口给房间创建和配置(例如, 以一个特定的Jabber表单或一个网页), 这样表面上房间所有者是一个应用而不是一个自然人用户.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择让一个特定的房间内资源提供接口给管理功能 (例如, 一个 &amp;quot;user&amp;quot; 名的机器人 &amp;quot;ChatBot&amp;quot;), 房客们可以和它直接互动, 从而允许管理员在一个私有消息里键入命令参数 '/command parameter' 给那个机器人 &amp;quot;user&amp;quot;. 显然这种服务要求服务在房间创建时添加一个 'ChatBot' 用户到房间, 并且阻止任何房客在该房间使用房间昵称 'ChatBot' . 这可能在一些实现或布署中比较难以保证. 任何情况下, 任何这类接口是可选的 OPTIONAL.&lt;br /&gt;
# 如果服务接收到它之前发送给该用户的节相关的递送类错误，一个MUC服务应该 SHOULD 移除一个用户; 递送相关的错误即 &amp;lt;gone/&amp;gt;, &amp;lt;item-not-found/&amp;gt;, &amp;lt;recipient-unavailable/&amp;gt;, &amp;lt;redirect/&amp;gt;, &amp;lt;remote-server-not-found/&amp;gt;, 和 &amp;lt;remote-server-timeout/&amp;gt;.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择在反射出席信息变更给一个房间的房客们之前，抛弃附加在&amp;lt;presence/&amp;gt; 节上的扩展的出席信息. 也就是, 一个实现可以 MAY 选择只反射该出席信息节的 &amp;lt;show/&amp;gt;, &amp;lt;status/&amp;gt;, 和 &amp;lt;priority/&amp;gt; 子元素，如 'jabber:client' 名字空间描述的 XML 架构之中, 结果导致那个在扩展的名字空间中的出席信息变更 &amp;quot;changes&amp;quot; (例如, gabber:x:music:info) 不被传递给房客. 如果一个服务禁止特定的扩展名字空间, 它应该 SHOULD 在本文 [[XEP-0045#允许的通讯|允许的通讯]]章节描述的知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 提供一个允许的通讯的描述.&lt;br /&gt;
# 一个MUC服务可以 MAY 在反射消息给一个房间的房客之前选择抛弃附加在 &amp;lt;message/&amp;gt; 节的扩展信息. 一个这类扩展信息的例子是轻量级文本标记，定义于 [http://xmpp.org/extensions/xep-0071.html XHTML-IM]  [XEP-0045#附录G:备注|32]]. 如果一个服务禁止特定的扩展名字空间, 它应该 SHOULD 在本文 [[XEP-0045#允许的通讯|允许的通讯]]章节描述的知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 提供一个允许的通讯的描述.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择锁定 &amp;quot;lock down&amp;quot; 房间昵称 (例如, 硬编码房间昵称给该房客的纯JID). 如果这么干, 该服务必须 MUST 把被锁定的昵称看作一个保留的房间昵称并且必须 MUST 支持本文[[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]]章节定义的协议.&lt;br /&gt;
&lt;br /&gt;
====允许的通讯====&lt;br /&gt;
&lt;br /&gt;
大家知道, 一个服务 (更准确地说, 一个正确配置的房间)可以 MAY 抛弃一些或所有的扩展的附加在从发送者通过房间反射给所有房客的 &amp;lt;message/&amp;gt; 和 &amp;lt;presence/&amp;gt; 节的名字空间. 如果房间这么干, 它应该 SHOULD 允许发送者通过发送 disco#info 查询知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 来发现允许的扩展的列表, 在结果中返回支持的名字空间每个用一个 &amp;lt;feature/&amp;gt; 元素表示. 如果该房间不允许任何扩展的名字空间, 它必须 MUST 如 '''XEP-0030''' 所述返回一个空的 query . 如果该房间不支持 &amp;quot;#traffic&amp;quot; 节点, 它必须 MUST 返回一个 &amp;lt;feature-not-implemented/&amp;gt; 错误应答给查询发送到 'http://jabber.org/protocol/muc#traffic' 节点的查询.&lt;br /&gt;
&lt;br /&gt;
以下例子展示一个只允许 'http://jabber.org/protocol/xhtml-im' 和 'http://jabber.org/protocol/rosterx' 名字空间的房间, 而不包括其他的名字空间.&lt;br /&gt;
&lt;br /&gt;
'''例子 209. 用户查询服务关于允许的名字空间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 210. 服务返回允许的名字空间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/xhtml-im'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/rosterx'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个服务不抛弃任何名字空间或不实现这个特性, 它必须 MUST 返回一个 &amp;lt;service-unavailable/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 211. 服务返回服务不可用错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===客户端===&lt;br /&gt;
&lt;br /&gt;
# Jabber客户端可以 MAY 展示房间角色，通过在一个房间名册里为每个角色显示特定的群. 这将使房客清楚图形化的知道哪个房客是主持人, 参与者, 和游客. 无论如何, 这样一个展示是可选的 OPTIONAL.&lt;br /&gt;
# Jabber客户端可以 MAY 实现多样化的界面以提供快捷方式 &amp;quot;shortcuts&amp;quot; 给功能，例如修改某人昵称, 踢人或禁止用户, 发现一个房客的全JID, 或修改主题. 一个选项包含了类IRC 的命令例如 '/nick', '/kick', '/ban', 和 '/whois'; 另一个是使用户能用鼠标右击房间名册里的项目. 所有这些界面形式是可选的 OPTIONAL. 然而, 为方便起见, 下面提供了一个 IRC 命令到 MUC 协议的映射.&lt;br /&gt;
&lt;br /&gt;
====IRC命令映射====&lt;br /&gt;
&lt;br /&gt;
IRC 客户端使用大量常用的快捷方式 &amp;quot;shortcut&amp;quot; 命令，以一个斜杠开始, 例如 '/nick' and '/ban'. 下表提供一个 类IRC 命令到 MUC 协议的映射, 用于希望支持类似功能的 Jabber 客户端.&lt;br /&gt;
&lt;br /&gt;
'''表10: IRC命令映射'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!命令 !!功能 !!MUC协议&lt;br /&gt;
|-&lt;br /&gt;
|/ban &amp;lt;roomnick&amp;gt; [comment] ||在房间里以房间昵称禁止用户(客户端翻译房间昵称为纯JID) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;iq id='someid'&lt;br /&gt;
    to='room@service'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='bare-jid-of-user'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/invite &amp;lt;jid&amp;gt; [comment] ||以JID邀请用户到此房间 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='jid'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
|/join &amp;lt;roomname&amp;gt; [pass] ||在服务里加入房间(房间昵称同本房间内的昵称) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/nick'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;pass&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/kick &amp;lt;roomnick&amp;gt; [comment] ||以房间昵称从房间里踢人 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;iq id='someid'&lt;br /&gt;
    to='room@service'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='roomnick' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|/msg &amp;lt;roomnick&amp;gt; &amp;lt;foo&amp;gt; ||发送私有消息&amp;quot;foo&amp;quot;给房间昵称 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service/nick' type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;foo&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/nick &amp;lt;newnick&amp;gt; ||变更在此房间内的昵称为&amp;quot;newnick&amp;quot; ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/newnick'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/part [comment] ||退出本房间(一些 IRC 客户端也支持 /leave) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/nick'&lt;br /&gt;
          type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;comment&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/topic &amp;lt;foo&amp;gt; ||变更此房间主题为&amp;quot;foo&amp;quot; ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service' type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;foo&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 因为 MUC 房间昵称遵循stringprep的Resourceprep脚本, 它们被允许包含一个空格字符, 而 IRC 昵称不允许. 尽管一个给定的客户端可以 MAY 支持引用字符串用于这个目的 (导致命令类似 '/ban &amp;quot;king lear&amp;quot; insanity is no defense'), 最常见的引用字符(类似 &amp;quot; 和 ') 也是被Resourceprep允许的 , 从而导致增加了复杂性和包含空格和引号的房间昵称中引号的潜在问题. 所以不建议 NOT RECOMMENDED Jabber客户端支持包含了空格符的房间昵称的类IRC的快捷方式命令.&lt;br /&gt;
&lt;br /&gt;
注意: 很多Jabber客户端也实现了 '/me ' 命令，如 [http://xmpp.org/extensions/xep-0245.html The /me Command] [[XEP-0045#附录G:备注|33]] 所述. 这个命令不会导致任何 MUC 或 IRC 协议的动作所以不显式在上表中.&lt;br /&gt;
&lt;br /&gt;
==XML架构==&lt;br /&gt;
===http://jabber.org/protocol/muc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='x'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='history' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='history'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='maxchars' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='maxstanzas' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='seconds' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='since' type='xs:dateTime' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#user===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#user'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#user'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='x'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:choice minOccurs='0' maxOccurs='unbounded'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='decline' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='destroy' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='invite' minOccurs='0' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='item' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='status' minOccurs='0' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='decline'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='destroy'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='invite'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='item'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='actor' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='continue' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='affiliation' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='admin'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='member'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='outcast'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='owner'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='nick' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='role' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='moderator'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='participant'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='visitor'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='actor'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='jid' type='xs:string' use='required'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='continue'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='thread' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='status'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='code' use='required'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:int'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:minInclusive value='100'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:maxInclusive value='999'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='reason' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#admin===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#admin'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#admin'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='query'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='item' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='item'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='actor' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='affiliation' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='admin'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='member'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='outcast'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='owner'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='nick' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='role' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='moderator'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='participant'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='visitor'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='actor'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='jid' type='xs:string' use='required'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='reason' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#owner===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#owner'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#owner'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:import &lt;br /&gt;
      namespace='jabber:x:data'&lt;br /&gt;
      schemaLocation='http://www.xmpp.org/schemas/x-data.xsd'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='query'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:choice xmlns:xdata='jabber:x:data' minOccurs='0'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='xdata:x'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='destroy'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='destroy'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='reason' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#unique===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#unique'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#unique'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='unique' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==鸣谢==&lt;br /&gt;
&lt;br /&gt;
作者感谢以下个人，为他们很多对于本协议草案的帮助性的评论: David Sutton, Peter Millard, Joe Hildebrand, Craig Kaes, Alexey Shchepin, David Waite, Jean-Louis Seguineau, Jacek Konieczny, Gaston Dombiak, 以及其他在 jdev@conference.jabber.org 会议室和在 Standards 邮件列表里的人.&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
&lt;br /&gt;
系列：[http://xmpp.org/extensions/ XEP]&lt;br /&gt;
&lt;br /&gt;
序号：0045&lt;br /&gt;
&lt;br /&gt;
发布者：[http://xmpp.org/xsf/ XMPP标准基金会]&lt;br /&gt;
&lt;br /&gt;
状态：[http://xmpp.org/extensions/xep-0001.html#states-Draft 草案 ]&lt;br /&gt;
&lt;br /&gt;
类型：[http://www.xmpp.org/extensions/xep-0001.html#types-Standards%20Track 标准跟踪]&lt;br /&gt;
&lt;br /&gt;
版本：1.24&lt;br /&gt;
&lt;br /&gt;
最后更新：2008-07-16&lt;br /&gt;
&lt;br /&gt;
批准机构：[http://xmpp.org/council/ XMPP理事会]&lt;br /&gt;
&lt;br /&gt;
依赖标准：XMPP Core, XMPP IM, XEP-0004, XEP-0030, XEP-0068, XEP-0082, XEP-0128&lt;br /&gt;
&lt;br /&gt;
替代标准：无&lt;br /&gt;
&lt;br /&gt;
被替代标准：无&lt;br /&gt;
&lt;br /&gt;
缩略名：muc&lt;br /&gt;
&lt;br /&gt;
muc名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#admin名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-admin.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#owner名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-owner.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#unique名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-unique.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#user名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-user.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注册表: &amp;lt;http://www.xmpp.org/registrar/muc.html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原文控制： [http://svn.xmpp.org:18080/browse/XMPP/trunk/extensions/xep-0045.xml HTML] [http://svn.xmpp.org:18080//changelog/~rss/XMPP/trunk/extensions/xep-0045.xml/rss.xml RSS]&lt;br /&gt;
&lt;br /&gt;
本文的其它格式： [http://xmpp.org/extensions/xep-0045.xml XML] [http://xmpp.org/extensions/xep-0045.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
URI: https://stpeter.im/&lt;br /&gt;
&lt;br /&gt;
{{Template:XEP附录CDEF}}&lt;br /&gt;
&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
&lt;br /&gt;
# RFC 1459: Internet Relay Chat &amp;lt;http://tools.ietf.org/html/rfc1459&amp;gt;.&lt;br /&gt;
# RFC 2810: Internet Relay Chat: Architecture &amp;lt;http://tools.ietf.org/html/rfc2810&amp;gt;.&lt;br /&gt;
# RFC 2811: Internet Relay Chat: Channel Management &amp;lt;http://tools.ietf.org/html/rfc2811&amp;gt;.&lt;br /&gt;
# RFC 2812: Internet Relay Chat: Client Protocol &amp;lt;http://tools.ietf.org/html/rfc2812&amp;gt;.&lt;br /&gt;
# RFC 2813: Internet Relay Chat: Server Protocol &amp;lt;http://tools.ietf.org/html/rfc2813&amp;gt;.&lt;br /&gt;
# XEP-0133: Service Administration &amp;lt;http://xmpp.org/extensions/xep-0133.html&amp;gt;.&lt;br /&gt;
# XEP-0030: Service Discovery &amp;lt;http://xmpp.org/extensions/xep-0030.html&amp;gt;.&lt;br /&gt;
# XEP-0059: Result Set Management &amp;lt;http://xmpp.org/extensions/xep-0059.html&amp;gt;.&lt;br /&gt;
# XEP-0128: Service Discovery Extensions &amp;lt;http://xmpp.org/extensions/xep-0128.html&amp;gt;.&lt;br /&gt;
# RFC 3920: 可扩展的消息和出席信息协议 (XMPP): Core &amp;lt;http://tools.ietf.org/html/rfc3920&amp;gt;.&lt;br /&gt;
# XEP-0203: Delayed Delivery &amp;lt;http://xmpp.org/extensions/xep-0203.html&amp;gt;.&lt;br /&gt;
# XEP-0091: Legacy Delayed Delivery &amp;lt;http://xmpp.org/extensions/xep-0091.html&amp;gt;.&lt;br /&gt;
# XEP-0082: XMPP Date and Time Profiles &amp;lt;http://xmpp.org/extensions/xep-0082.html&amp;gt;.&lt;br /&gt;
# RFC 3921: 可扩展的消息和出席信息协议 (XMPP): Instant Messaging and Presence &amp;lt;http://tools.ietf.org/html/rfc3921&amp;gt;.&lt;br /&gt;
# XEP-0249: Direct MUC Invitations &amp;lt;http://xmpp.org/extensions/xep-0249.html&amp;gt;.&lt;br /&gt;
# XEP-0077: In-Band Registration &amp;lt;http://xmpp.org/extensions/xep-0077.html&amp;gt;.&lt;br /&gt;
# XEP-0004: Data Forms &amp;lt;http://xmpp.org/extensions/xep-0004.html&amp;gt;.&lt;br /&gt;
# 一些评论者抱怨公开房间的所有者和管理员存在潜在的滥用; 很不幸的, 能力越大责任越大.&lt;br /&gt;
# XEP-0050: Ad-Hoc Commands &amp;lt;http://xmpp.org/extensions/xep-0050.html&amp;gt;.&lt;br /&gt;
# XEP-0060: Publish-Subscribe &amp;lt;http://xmpp.org/extensions/xep-0060.html&amp;gt;.&lt;br /&gt;
# 这和房间配置的行为不同, 这里 'muc#roomconfig_roomowners' 字段指定房间所有者的完整列表, 不是delta.&lt;br /&gt;
# 这和房间配置的行为不同, 这里 'muc#roomconfig_roomadmins' 字段指定房间管理眼的完整列表, 不是delta.&lt;br /&gt;
# XEP-0086: Error Condition Mappings &amp;lt;http://xmpp.org/extensions/xep-0086.html&amp;gt;.&lt;br /&gt;
# RFC 2616: Hypertext Transport Protocol -- HTTP/1.1 &amp;lt;http://tools.ietf.org/html/rfc2616&amp;gt;.&lt;br /&gt;
# RFC 1893: Enhanced Mail System Status Codes &amp;lt;http://tools.ietf.org/html/rfc1893&amp;gt;.&lt;br /&gt;
# 互联网编号分配机构 (IANA) 是用于互联网协议的唯一性参数值分配的核心协调者, 例如号码和URI计划. 更多信息, 见 &amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
# XMPP登记员 XMPP Registrar 维护着一个保留的协议名字空间以及用于由XMPP标准基金会批准的XMPP扩展协议的上下文参数的注册项的列表. 更多信息, 见 &amp;lt;http://xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
# XEP-0068: Field Data Standardization for Data Forms &amp;lt;http://xmpp.org/extensions/xep-0068.html&amp;gt;.&lt;br /&gt;
# XEP-0147: XMPP URI Query Components &amp;lt;http://xmpp.org/extensions/xep-0147.html&amp;gt;.&lt;br /&gt;
# XEP-0022: Message Events &amp;lt;http://xmpp.org/extensions/xep-0022.html&amp;gt;.&lt;br /&gt;
# XEP-0085: Chat State Notifications &amp;lt;http://xmpp.org/extensions/xep-0085.html&amp;gt;.&lt;br /&gt;
# XEP-0071: XHTML-IM &amp;lt;http://xmpp.org/extensions/xep-0071.html&amp;gt;.&lt;br /&gt;
# XEP-0245: The /me Command &amp;lt;http://xmpp.org/extensions/xep-0245.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===附录H: 修订历史===&lt;br /&gt;
&lt;br /&gt;
注意: 本协议的旧版本可能在 http://xmpp.org/extensions/attic/ 还可用&lt;br /&gt;
&lt;br /&gt;
'''版本 1.24 (2008-07-16)'''&lt;br /&gt;
&lt;br /&gt;
增加了更多原因reason元素的例子; 移除了关于黑名单包含的昵称部分; 增加了拒绝服务注意事项.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.23 (2008-01-14)'''&lt;br /&gt;
&lt;br /&gt;
* 定义了 getmemberlist 房间配置选项&lt;br /&gt;
* 增加了直接邀请协议&lt;br /&gt;
* 修正了当房间满的时候房间承认所有者/管理员的逻辑&lt;br /&gt;
* 定义了和LDAP群关联的服务发现扩展字段&lt;br /&gt;
* 指定了房间配置字段能被列入扩展的房间信息之中&lt;br /&gt;
* 指定了消息格式用于用户不在房间时的岗位变更&lt;br /&gt;
* 增加了例子展示结果集管理&lt;br /&gt;
* 推荐出席信息错误中包含的MUC子元素&lt;br /&gt;
* 为一对一聊天和多用户聊天的连续性描述了ThreadID的使用, 包括在邀请中为 continue 元素定义 thread 属性.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.22 (2007-04-10)'''&lt;br /&gt;
&lt;br /&gt;
更新了延迟消息递送以反映 XEP-0203 演化到草案和 XEP-0091 的过时.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.21 (2006-09-13)'''&lt;br /&gt;
&lt;br /&gt;
* 澄清了MUC扩展的介入，在房间加入/创建请求触发数据表单流但没有MUC扩展可导致自动房间创建以向后兼容旧的 groupchat 1.0 协议.&lt;br /&gt;
* 指定昵称变更时如果昵称被锁定则返回 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
* 要求客户端在进入房间之前发现房间配置并指定相关的安全事项, 包括使用隐私相关的状态码 170, 171, 172, 173, 和 174.&lt;br /&gt;
* 指定在房间配置选项不能被执行或违反服务策略时使用 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
* 强制要求房间昵称不能只包含空格.&lt;br /&gt;
* 移除所有服务发现用例到专用章节.&lt;br /&gt;
* 修改 urn:xmpp:delay 支持从 SHOULD 改为 MUST.&lt;br /&gt;
* 澄清 _whois 房间配置选项定义房间类型.&lt;br /&gt;
* 定义 XEP-0128 房间信息字段用于讨论记录, 关联的 pubsub 节点, 以及联系人 JID.&lt;br /&gt;
* 指出修改角色到主持人导致岗位变更为管理员或所有者成为推荐的, 而不是必需的.&lt;br /&gt;
* 增加了国际化事项中关于数据表单的本地化的部分.&lt;br /&gt;
* 指出实现可以持久化角色括月整个访问并且应该在被主持的房间里这样做.&lt;br /&gt;
* 增加了协议和服务发现特性用于在新建房间之前请求唯一的房间名.&lt;br /&gt;
* 更多澄清保留的房间昵称和昵称锁定的性质.&lt;br /&gt;
* 定义数据表单用于请求发言权和批准发言申请.&lt;br /&gt;
* 增加了多个邀请的例子用于XMPP URI.&lt;br /&gt;
* 澄清了出席信息，讨论历史的顺序, 等等.&lt;br /&gt;
* 增加了状态码用于房客拥有的房间昵称, 服务修改的房间昵称, 并警告房间讨论被公开记录.&lt;br /&gt;
* 澄清关于房间记录和非匿名房间的隐私和匿名事项.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.20 (2005-09-08)'''&lt;br /&gt;
&lt;br /&gt;
同意了踢人和禁止用户的能力, 并定义了一个用户不能被一个比自己岗位低的主持人或管理员踢或禁止.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.19 (2005-04-21)'''&lt;br /&gt;
&lt;br /&gt;
定义了怎样发送并发多邀请; 纠正了一些和岗位变更状态一致性的错误; 修改了消息事件禁令表单从 MUST NOT 到 SHOULD NOT; 修正了和 #traffic disco 节点相关的错误处理; 允许了 &amp;lt;password/&amp;gt; 作为&amp;lt;destroy/&amp;gt;的一个子元素; 修改了最大用户数错误从 &amp;lt;not-allowed/&amp;gt; 到 &amp;lt;service-unavailable/&amp;gt;; 指定了 maxchars 属性的字符数是指完整的 XML 节; 为 FORM_TYPEs;增加了 disco 特性 为状态码定义了注册表; 为遵守协议分开了新建即时房间的用例; 调整了 XML 架构以反映之前的修改; 重写了绪论; 澄清了小的文本错误.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
Version 1.18 (2004-11-02)&lt;br /&gt;
&lt;br /&gt;
Corrected several errors in the affiliation state chart and in the examples (wrong FORM_TYPE values); mentioned /me command.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.17 (2004-10-04)&lt;br /&gt;
&lt;br /&gt;
Added text about allowable extension namespaces and related service discovery mechanisms; specified well-known service discovery nodes; added conformance terms to clarify some descriptions; modified affiliation state chart to allow more flexible state changes; per list dicussion, added ability to convert a one-to-one chat into a conference, including sending of history; specified error to use when max users limit is reached; specified form for admin approval of user registration requests and modified FORM_TYPE from http://jabber.org/protocol/muc#user to http://jabber.org/protocol/muc#register; modified FORM_TYPE for room configuration from http://jabber.org/protocol/muc#owner to http://jabber.org/protocol/muc#roomconfig.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.16 (2004-06-30)&lt;br /&gt;
&lt;br /&gt;
Added example and registry submission for service discovery extension.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.15 (2004-06-24)&lt;br /&gt;
&lt;br /&gt;
Removed jabber:iq:browse references; clarified order of presence stanzas sent to new occupant on entering room; specified format of in-room messages (type='groupchat', from='room@service'); clarified allowable attributes in various list-related operations; made admin/owner revocation text and examples consistent with state chart; clarified ownership revocation conflict scenarios; changed the 'muc#roomconfig_inviteonly' field to 'muc#roomconfig_membersonly'; changed attribute order in examples to match XML canonicalization rules; corrected several errors in the schemas.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.14 (2004-05-03)&lt;br /&gt;
&lt;br /&gt;
Corrected discovery of registered roomnicks; added note about error to return if nicks are locked down.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.13 (2004-03-31)&lt;br /&gt;
&lt;br /&gt;
Fixed an error in the muc#user schema.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.12 (2004-03-01)&lt;br /&gt;
&lt;br /&gt;
Corrected a few errors in the examples; added IQ results in order to clarify workflows.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.11 (2004-02-05)&lt;br /&gt;
&lt;br /&gt;
Clarified JID matching rules (same as for privacy lists in XMPP IM).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.10 (2004-01-07)&lt;br /&gt;
&lt;br /&gt;
Added XMPP error handling; fully specified all conformance terms.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.9 (2003-12-14)&lt;br /&gt;
&lt;br /&gt;
Removed protocol for requesting voice in a moderated room (should be performed using Ad-Hoc Commands).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.8 (2003-12-04)&lt;br /&gt;
&lt;br /&gt;
Added protocol for requesting voice in a moderated room; added (informational) mapping of IRC commands to MUC protocols.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.7 (2003-10-21)&lt;br /&gt;
&lt;br /&gt;
Added room configuration option for restricting presence broadcast to certain roles.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.6 (2003-10-03)&lt;br /&gt;
&lt;br /&gt;
Added history management protocol on entering a room.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.5 (2003-09-11)&lt;br /&gt;
&lt;br /&gt;
Specified that ban occurs by JID, not roomnick; allowed privileged users to send messages to the room even if not present in the room; added note that service should remove occupant if a delivery-related stanza error occurs; enabled user to disco the room in order to discover registered roomnick; specified that &amp;quot;banning&amp;quot; by domain or regex is a service-level configuration matter and therefore out of scope for MUC; specified that role should be decremented as appropriate if affiliation is lowered; added some clarifying text to room creation workflow; added implementation note about sending an out-of-band message if a user's affiliation changes while the user is not in the room; fixed stringprep references (room nicks use Resourceprep); clarified relationship between Room ID (i.e., node identifier of Room JID, which may be opaque) and natural-language Room Name; specified Field Standardization profile per XEP-0068; defined XMPP Registrar submissions; added schema locations.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.4 (2003-02-16)&lt;br /&gt;
&lt;br /&gt;
Added XML schemas.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.3 (2003-02-11)&lt;br /&gt;
&lt;br /&gt;
Added reference to nodeprep Internet-Draft.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.2 (2003-01-30)&lt;br /&gt;
&lt;br /&gt;
Commented out revision history prior to version 1.0 (too long); clarified business rules regarding when nicks, full JIDs, and bare JIDs are used in reference to roles and affiliations; consistently specified that extended presence information in the muc#user namespace must include the full JID as the value of the 'jid' attribute in all cases; cleaned up text and examples throughout; added open issue regarding syntax of room nicknames.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.1 (2002-12-16)&lt;br /&gt;
&lt;br /&gt;
Added protocol for declining an invitation; replaced &amp;lt;created/&amp;gt; element with status code 201; modified the destroy room protocol so that &amp;lt;destroy/&amp;gt; is a child of &amp;lt;query/&amp;gt;; clarified usage of 'nick' attribute when adding members; prohibited use of message events.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.0 (2002-11-21)&lt;br /&gt;
&lt;br /&gt;
Per a vote of the Jabber Council, revision 0.23 was advanced to Draft on 2002-11-21. (For earlier revision history, refer to XML source.)&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.23 (2002-11-06)&lt;br /&gt;
&lt;br /&gt;
Added examples for disco#items queries sent to a room; prohibited 'type' attribute on invite messages sent from client to room; added dependencies on browse and disco; changed 'room user' to 'occupant'; fixed many small errors throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.22 (2002-11-04)&lt;br /&gt;
&lt;br /&gt;
Added example for disco#items; added support for cancellation of room configuration using type='cancel' from XEP-0004; noted 403 error for invites sent by non-admins in members-only room.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.21 (2002-11-01)&lt;br /&gt;
&lt;br /&gt;
Clarified several small ambiguities; made &amp;lt;body/&amp;gt; optional on invites sent from the service to the invitee; added error scenarios for changing nickname and for destroying the room; specified that the service must return the full member list for a members-only room (not only the members in the room); updated the disco examples to track protocol changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.20 (2002-10-29)&lt;br /&gt;
&lt;br /&gt;
Specified that messages sent to change the room subject must be of type &amp;quot;groupchat&amp;quot;; updated the legal notice to conform to the XSF IPR policy.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.19 (2002-10-28)&lt;br /&gt;
&lt;br /&gt;
Added ability to create an instant room within MUC (not by using gc-1.0 protocol); cleaned up disco examples.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.18 (2002-10-27)&lt;br /&gt;
&lt;br /&gt;
Added experimental support for disco; added sections for security, IANA, and JANA considerations; corrected typographical errors; cleaned up some DocBook formatting.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.17 (2002-10-23)&lt;br /&gt;
&lt;br /&gt;
Added the optional &amp;lt;actor/&amp;gt; element (with 'jid' attribute) to &amp;lt;item/&amp;gt; elements inside presence stanzas of type &amp;quot;unavailable&amp;quot; that are sent to users who are kicked or banned, as well as within IQs for tracking purposes; reverted all list editing use cases (ban, voice, member, moderator, admin, owner) to use of MUC format rather than 'jabber:x:data' namespace; added several guidelines regarding generation and handling of XML stanzas; cleaned up the change room subject use case; changed several ambiguous uses of 'would', 'can', and 'will' to 'should', 'may', or 'must'; fixed several small errors in the text, examples, and DTDs.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.16 (2002-10-20)&lt;br /&gt;
&lt;br /&gt;
Added the &amp;lt;item/&amp;gt; element to presence stanzas of type &amp;quot;unavailable&amp;quot; in order to improve the tracking of user states in the room; consolidated &amp;lt;invitee/&amp;gt; and &amp;lt;invitor/&amp;gt; elements into an &amp;lt;invite/&amp;gt; element with 'from' and 'to' attributes; made &amp;lt;reason/&amp;gt; element always a child of &amp;lt;item/&amp;gt; or &amp;lt;invite/&amp;gt; in the muc#user namespace; moved the alternate room location in room destruction to a 'jid' attribute of the &amp;lt;alt/&amp;gt; element; further specified several error messages; disallowed simultaneous modifications of both affiliations and roles by a moderator or admin; added several more rules regarding handling of XML stanzas; added use cases for granting and revoking administrative privileges; adjusted DTD to track all changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.15 (2002-10-18)&lt;br /&gt;
&lt;br /&gt;
Fully incorporated the change to affiliations + roles; moved a number of admin use cases to a new section for moderator use cases; added participant use case for requesting membership; added admin use cases for adding members, removing members, granting and revoking moderator privileges, and modifying the moderator list; organized the sections in a more logical manner.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.14 (2002-10-17)&lt;br /&gt;
&lt;br /&gt;
Significantly modified the privileges model by distinguishing between in-room &amp;quot;roles&amp;quot; and long-lived &amp;quot;affiliations&amp;quot;; specified the privileges of the various roles and affiliations; included state transition charts for both roles and affiliations; removed use of MUC protocol for editing ban, voice, and admin lists (but not for the actions of banning users and granting/revoking voice); added delivery rule regarding IQ stanzas; changed kick so that the action is based on changing the role to &amp;quot;none&amp;quot;.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.13 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Corrected the change nickname examples (newnick sent on unavailable, no nick sent on available).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.12 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Removed SHA1 passwords; specified that room shall add passwords on invitations to password-protected rooms (not supplied by invitor).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.11 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Changed 'participant' to 'room user' and 'discussant' to 'participant'; clarified presence rule about client generation of extended presence information; added role of 'none'.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.10 (2002-10-15)&lt;br /&gt;
&lt;br /&gt;
Fixed extended presence on entering or creating a room (plain '...muc' with no fragment); harmonized #user with #admin regarding the use of the &amp;lt;item/&amp;gt; element and associated attributes (jid, nick, etc.), and added 'role' attribute; modified management of voice, ban, admin, and member lists to use &amp;lt;query/&amp;gt; wrapper and new &amp;lt;item/&amp;gt; structure; changed the 'member' role to 'discussant', added 'outcast' role for banned users, and added new 'member' role to enable management of member lists; changed invitation-only rooms to members-only rooms and made appropriate adjustments to apply member lists to both members-only rooms and open rooms; modified nickname change protocol slightly to send the old nickname in the unavailable presence and the new nickname in the available presence; removed prohibition on members-only rooms that are password-protected; removed the &amp;lt;query/&amp;gt; wrapper for the &amp;lt;destroy/&amp;gt; element; updated the DTDs.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.9 (2002-10-13)&lt;br /&gt;
&lt;br /&gt;
Added extended presence ('...#user') on entering a room for MUC clients; changed namespace on room creation request to '...#owner'; added a service discovery example using jabber:iq:browse; added information about discussion history; made small fixes to several examples; further defined the presence rules; transferred all implementation notes to a dedicated section; added a Terminology section.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.8 (2002-10-10)&lt;br /&gt;
&lt;br /&gt;
Made further changes to the room creation workflow (finally correct); removed feature discovery use case (this needs to be addressed by a real service discovery protocol!); added ability for room owners to edit the admin list; removed &amp;lt;body/&amp;gt; from invitations generated by the service; removed messages sent to kicked and banned users (handled by unavailable presence with status code); added a number of implementation notes; converted all examples to Shakespeare style.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.6 (2002-10-09)&lt;br /&gt;
&lt;br /&gt;
Fixed the room creation workflow; changed some terminology (&amp;quot;join&amp;quot; to &amp;quot;enter&amp;quot; and &amp;quot;leave&amp;quot; to &amp;quot;exit&amp;quot;).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.5 (2002-10-08)&lt;br /&gt;
&lt;br /&gt;
Specified and improved the handling of invitation-only rooms. In particular, added the ability for room admins to edit the invitation list and added a configuration option that limits the ability to send invitations to room admins only.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.4 (2002-10-07)&lt;br /&gt;
&lt;br /&gt;
Changed namespaces from http://jabber.org/protocol/muc/owner etc. to http://jabber.org/protocol/muc#owner etc. per Jabber Council discussion.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.3 (2002-10-07)&lt;br /&gt;
&lt;br /&gt;
Changed namespaces to HTTP URIs; left role handling up to the implementation; further clarified presence rules.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.2 (2002-10-06)&lt;br /&gt;
&lt;br /&gt;
Disallowed kicking, banning, and revoking voice with respect to room admins and room owners; replaced &amp;lt;x/&amp;gt; with &amp;lt;query/&amp;gt; in the Discovering Room Features and Destroying a Room use cases; corrected some small errors and made many clarifications throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.1 (2002-10-04)&lt;br /&gt;
&lt;br /&gt;
Removed &amp;lt;whois/&amp;gt; command (unnecessary since participants with appropriate privileges receive the full JID of all participants in presence stanzas); completed many small fixes throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7 (2002-10-03)&lt;br /&gt;
&lt;br /&gt;
More clearly delineated participant roles and defined the hierarchy thereof (owner, admin, member, visitor); replaced &amp;lt;voice/&amp;gt; element in extended presence with &amp;lt;item role='member'/&amp;gt;; changed initial room configuration to use IQ rather than message; adjusted presence rules (especially regarding extended presence information); cleaned up examples throughout; updated DTD to track changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.6 (2002-09-21)&lt;br /&gt;
&lt;br /&gt;
More clearly defined the scope; removed fully anonymous rooms; changed meaning of semi-anonymous rooms and of non-anonymous rooms; added mechanism for notification of full JIDs in non-anonymous rooms; replaced the &amp;lt;admin/&amp;gt; element in extended presence with a &amp;lt;role/&amp;gt; element (more extensible); changed room passwords to cleartext; added status codes for various messages received from the service; added lists of valid error and status codes associated with the 'http://jabber.org/protocol/muc#user' namespace; added a &amp;lt;reason/&amp;gt; element for invitations; made kick and ban reasons child elements rather than attributes; replaced stopgap feature discovery mechanism with jabber:iq:negotiate; added extended presence element to room creation request and clarified the room creation process; specified presence reflection rules; added method for destroying a room; adjusted DTDs to track all changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.5.1 (2002-09-20)&lt;br /&gt;
&lt;br /&gt;
Added DTDs; changed feature discovery to use &amp;lt;x/&amp;gt; element rather than query and made service response come in IQ result; fixed reference to JID spec; changed 'grant' to 'add' and 'revoke' to 'remove' for consistency in the item attributes; made several other small changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.5 (2002-09-19)&lt;br /&gt;
&lt;br /&gt;
Changed the kick, ban, and voice protocols; added a few more configuration options; specified the restrictions for roomnicks; and added a stopgap service discovery protocol.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.4 (2002-09-18)&lt;br /&gt;
&lt;br /&gt;
Changed all non-GC-1.0 use cases to jabber:gc:* namespaces or jabber:x:data; added use cases for ban list management and room moderation; added protocol for sending notice of admin and voice privileges in presence; cleaned up text and many examples.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.3 (2002-09-17)&lt;br /&gt;
&lt;br /&gt;
Changed admin use cases; cleaned up participant and owner use cases.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.2 (2002-09-12)&lt;br /&gt;
&lt;br /&gt;
Broke content out into three actors (participant, owner, and admin) and added more detail to owner and admin use cases.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.1 (2002-09-09)&lt;br /&gt;
&lt;br /&gt;
Initial version.&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
END&lt;/div&gt;</summary>
		<author><name>Zyhserry</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0045</id>
		<title>XEP-0045</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0045"/>
				<updated>2013-12-27T07:24:56Z</updated>
		
		<summary type="html">&lt;p&gt;Zyhserry: /* 默认角色 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0045.html XEP-0045]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0045: 多用户聊天'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本文定义了一个XMPP协议扩展用于多用户文本会议.即多个XMPP可以在一个房间或频道互相交流信息, 类似互联网中继聊天系统(IRC).还有标准聊天室功能如聊天室的主题和邀请，本协议定义了一个强有力的房间控制模型，包括能够踢和禁止用户，任命主持人和管理员，要求会员或密码才能加入房间，等等。&lt;br /&gt;
&lt;br /&gt;
作者:	Peter Saint-Andre&lt;br /&gt;
&lt;br /&gt;
XMPP扩展协议的版权(1999-2008)归XMPP标准化基金会(XSF)所有&lt;br /&gt;
&lt;br /&gt;
版权:	© 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0045#法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.24&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2008-07-16&lt;br /&gt;
&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个草案标准.对本协议的执行是被鼓励的,也适于部署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
传统上, 即时消息被视为由一对一的聊天构成而不是多对多聊天(即所谓&amp;quot;群聊&amp;quot;或&amp;quot;文本会议&amp;quot;). 群聊功能常见于一些系统如 Internet Relay Chat (IRC) 和 流行的IM服务所提供的聊天室功能. Jabber社区早在1999年开发和实施了一个基本的群聊协议. 这个 &amp;quot;groupchat 1.0&amp;quot; 协议为聊天室提供了一个最小功能集但是范围很有限. 本协议(多用户聊天或简称MUC)建立在向后兼容旧的&amp;quot;groupchat 1.0&amp;quot;协议的基础上但是提供高级功能如邀请, 房间主持和管理, 以及专门的房间类型.&lt;br /&gt;
&lt;br /&gt;
==范围==&lt;br /&gt;
&lt;br /&gt;
本文着重于和配置,参与以及管理一个独立的基于文本的会议室相关的通用需求. 这里所指出的需求是应用于单个房间级别的并且是&amp;quot;通用的&amp;quot;, 某种意义上它们是在Jabber社区广泛讨论的或在现有的Jabber之外的基于文本的会议环境(例如, 定义在 [http://tools.ietf.org/html/rfc1459 RFC 1459] [[XEP-0045#附录G:备注|1]]中的Internet Relay Chat 和它的继承者: [http://tools.ietf.org/html/rfc2810 RFC 2810] [[XEP-0045#附录G:备注|2]], [http://tools.ietf.org/html/rfc2811 RFC 2811] [[XEP-0045#附录G:备注|3]], [http://tools.ietf.org/html/rfc2812 RFC 2812] [[XEP-0045#附录G:备注|4]], [http://tools.ietf.org/html/rfc2813 RFC 2813] [[XEP-0045#附录G:备注|5]])中已经存在的.&lt;br /&gt;
&lt;br /&gt;
本文明确地不涉及以下需求:&lt;br /&gt;
&lt;br /&gt;
* 房间之间的关系(例如, 房间的层次结构)&lt;br /&gt;
&lt;br /&gt;
* 多用户聊天服务的管理(例如, 管理跨越整个服务级别的权限或注册一个全局可用的房间昵称)；这些用例定义在[http://xmpp.org/extensions/xep-0133.html Service Administration] [[XEP-0045#附录G:备注|6]]&lt;br /&gt;
&lt;br /&gt;
* 个别消息的主持&lt;br /&gt;
&lt;br /&gt;
* 通过房间发送的消息的加密&lt;br /&gt;
&lt;br /&gt;
* 高级特性, 如附加文件给一个房间, 集成白板, 以及和语音或视频聊天服务的接口&lt;br /&gt;
&lt;br /&gt;
* MUC部署和外来的聊天系统(例如, 和IRC网关或现有的其他IM系统)之间的交互&lt;br /&gt;
&lt;br /&gt;
* 在多个MUC部署之间进行镜像或复制&lt;br /&gt;
&lt;br /&gt;
这一受限的范围并非蔑视这些都很有用的主题; 无论如何, 这意味着本文专注于讨论和介绍一个易于理解的协议能够被类似的Jabber客户端和组件开发者实现. 将来的协议当然可能涉及以上提到的这些主题.&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
本文描述了由Jabber现有的多用户聊天服务提供的最小功能集. 为了向后兼容性起见, 本文使用原来的&amp;quot;groupchat 1.0&amp;quot;协议作为基本功能, 包括以下这些:&lt;br /&gt;
&lt;br /&gt;
* 每个房间被标识为 &amp;lt;room@service&amp;gt; (例如, &amp;lt;jdev@conference.jabber.org&amp;gt;), 这里 &amp;quot;room&amp;quot; 是房间的名称而 &amp;quot;service&amp;quot; 是多用户聊天服务运行所在的主机名.&lt;br /&gt;
&lt;br /&gt;
* 在一个房间里每个房客被标识为 &amp;lt;room@service/nick&amp;gt;, 这里 &amp;quot;nick&amp;quot; 是这个房客在这个房间里的昵称,定义于刚加入这个房间的时候，也可以在房客驻留改房间期间修改.&lt;br /&gt;
&lt;br /&gt;
* 一个用户通过发送出席信息给 &amp;lt;room@service/nick&amp;gt; 来加入一个房间（也就是成为房客）.&lt;br /&gt;
&lt;br /&gt;
* 在多用户聊天房间里发送的消息使用特殊的类型&amp;quot;groupchat&amp;quot;并且被寻址于房间本身 (room@service), 然后反映给所有房客.&lt;br /&gt;
&lt;br /&gt;
* 通过发送出席信息给 &amp;lt;room@service/newnick&amp;gt;，一个房客可以改变他或她的房间昵称以及在房间中的可用性状态 .&lt;br /&gt;
&lt;br /&gt;
* 通过发送一个类型为&amp;quot;unavailable&amp;quot;的出席信息给当前的&amp;lt;room@service/nick&amp;gt;，一个房客可以退出房间.&lt;br /&gt;
&lt;br /&gt;
本文追加的特性和功能包括以下这些:&lt;br /&gt;
&lt;br /&gt;
# 本地会话日志(不需要房间内的机器人)&lt;br /&gt;
# 允许用户申请房间成员&lt;br /&gt;
# 在一个非匿名房间里, 允许房客可以察看(另)一个房客的全JID&lt;br /&gt;
# 在一个半匿名房间里, 允许主持人可以察看一个房客的全JID&lt;br /&gt;
# 允许只有主持人修改房间主题&lt;br /&gt;
# 允许主持人从房间里踢出与会者和游客&lt;br /&gt;
# 在一个被主持的房间里,主持人可以授予和撤销发言权(也就是说, 发言的权力), 并且管理发言权列表&lt;br /&gt;
# 允许管理员授权和取消主持人权力, 并且管理主持人列表&lt;br /&gt;
# 允许管理员在房间禁止用户, 并管理黑名单&lt;br /&gt;
# 允许管理员授予和撤销成员权力, 并且管理一个仅限成员的房间的成员列表&lt;br /&gt;
# 允许所有者限制房客的数量&lt;br /&gt;
# 允许所有者指定其他的所有者(们)&lt;br /&gt;
# 允许所有者授予或撤销管理特权, 并管理管理员列表&lt;br /&gt;
# 允许所有者销毁房间&lt;br /&gt;
&lt;br /&gt;
另外, 本文提供了协议元素用于支持以下房间类型:&lt;br /&gt;
&lt;br /&gt;
# 公共的或隐藏的&lt;br /&gt;
# 持久的或临时的&lt;br /&gt;
# 密码保护的或不安全的&lt;br /&gt;
# 仅限成员的或开放的&lt;br /&gt;
# 主持的或非主持的&lt;br /&gt;
# 非匿名的或半匿名的&lt;br /&gt;
&lt;br /&gt;
为了实现这些需求, 本扩展协议需要满足 'http://jabber.org/protocol/muc' 名字空间(以及 在主名字空间URI加上 #owner, #admin, 和 #user 片断).&lt;br /&gt;
&lt;br /&gt;
==术语==&lt;br /&gt;
&lt;br /&gt;
===通用术语===&lt;br /&gt;
&lt;br /&gt;
Affiliation(岗位) -- 一个长期存在的和房间之间的联系或连接; 可能的岗位有 &amp;quot;owner&amp;quot;(所有者), &amp;quot;admin&amp;quot;(管理者), &amp;quot;member&amp;quot;(成员), 以及 &amp;quot;outcast&amp;quot;(被排斥者) (当然也可能没有岗位); 岗位(affiliation)和角色(role)是有区别的. 一个岗位跨越了用户对一个房间的访问期间.&lt;br /&gt;
&lt;br /&gt;
Ban(禁止) -- 从一个房间移除一个用户以使这个用户不能够再进入这个房间 (直到这个禁令被废除为止). 一个被禁止的用户的岗位(affiliation)为 &amp;quot;outcast&amp;quot;(被排斥者).&lt;br /&gt;
&lt;br /&gt;
Bare JID(纯JID) -- 一个用户的标识符 &amp;lt;user@host&amp;gt;, 不同于任何已有会话或资源的上下文, 与之相对的是全JID和房间JID.&lt;br /&gt;
&lt;br /&gt;
Full JID(全JID) -- 一个在线用户的标识符 &amp;lt;user@host/resource&amp;gt; , 不同于一个房间的上下文; 与之相对的是纯JID和房间JID.&lt;br /&gt;
&lt;br /&gt;
GC -- 最小的 &amp;quot;groupchat 1.0&amp;quot; 协议[7], Jabber社区于1999年开发; MUC 向后兼容GC.&lt;br /&gt;
&lt;br /&gt;
History(历史) -- 有限数量的消息节, 由当前讨论的上下文提供发送给一个新的房客.&lt;br /&gt;
&lt;br /&gt;
Invitation(邀请) -- 从一个用户发出的特殊消息给另一个用户, 邀请对方加入房间.; the invitation can be sent directly (see Direct MUC Invitations [8]) or mediated through the room (as described under Inviting Another User to a Room).&lt;br /&gt;
&lt;br /&gt;
IRC -- Internet Relay Chat.&lt;br /&gt;
&lt;br /&gt;
Kick(踢人) -- 临时从一个房间移除一个与会者或游客; 这个用户任何时候都可以再次进入这个房间. 一个被踢的用户的角色是&amp;quot;none&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Logging(记录) -- 存储发生在一个房间的讨论内容用于公开发布到房间上下文之外的地方.&lt;br /&gt;
&lt;br /&gt;
Member(成员) -- 一个用户在一个仅限会员的房间内处于&amp;quot;white list&amp;quot;(白名单)内，或已经注册到一个公开的房间. 一个成员的岗位是&amp;quot;member&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Moderator(主持人) -- 一个房间角色,通常和房间的管理有关但是这个角色可以被赋予非管理员; 可以踢人, 可以授予和撤销发言权, 等等. 一个主持人的角色是&amp;quot;moderator&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
MUC -- 本文所定义的基于文本会议的多用户聊天协议.&lt;br /&gt;
&lt;br /&gt;
Occupant(房客) -- 一个房间里的任何Jabber用户 (这是一个 &amp;quot;抽象类&amp;quot; 并且不对应任何特定的角色).&lt;br /&gt;
&lt;br /&gt;
Occupant JID(房客JID) -- 在一个房间上下文中的一个房客，以 &amp;lt;room@service/nick&amp;gt; 来标识; 与之相对的是纯JID和全JID.&lt;br /&gt;
&lt;br /&gt;
Outcast(被排斥者) -- 一个被某个房间禁止的用户. 一个被排斥者的岗位是 &amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Participant(与会者) -- 一个没有管理权限的房客; 在一个被主持的房间里, 参与者更多地被定义为有发言权的 (与之相反的是游客). 一个与会者的角色是&amp;quot;participant&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Private Message(私有消息) -- 从一个房客直接发给另一个房间JID的消息(不是房间本身广播给所有房客的消息).&lt;br /&gt;
&lt;br /&gt;
Role(角色) -- 在一个房间里的一个临时的地位或者权限级别, 对于这个房间中的用户的长期岗位来说是唯一的; 可能的角色有 &amp;quot;moderator&amp;quot;（主持人）, &amp;quot;participant&amp;quot;(与会者), 和 &amp;quot;visitor&amp;quot;(游客) (也可能没有预定义的角色). 一个角色仅仅存在于一个房客访问一个房间的期间.&lt;br /&gt;
&lt;br /&gt;
Room(房间) -- 一个虚拟的地方, Jabber用户象征性地加入它, 来和其他用户一起参与一个实时的基于文本的会议.&lt;br /&gt;
&lt;br /&gt;
Room Administrator(房间管理员) -- 一个由房间所有者授权的用户, 可以执行管理功能, 如禁止用户等等; 无论如何, 不允许改变定义的房间特性. 一个管理员的岗位是&amp;quot;admin&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
Room ID(房间ID) -- 一个房间JID的节点标识符部分, 它可以是不透明的因而对人类用户没有什么含义(见  语法的商业规则Business Rules for syntax); 与之相对的是房间名.&lt;br /&gt;
&lt;br /&gt;
Room JID(房间JID) -- 房间地址，如 &amp;lt;room@service&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Room Name(房间名) -- 一个用户友好的, 自然语言的房间名字, 由房间所有者配置并在服务查询中展示; 与之相对的是房间ID.&lt;br /&gt;
&lt;br /&gt;
Room Nickname(房间昵称) -- 房间JID的资源标识符部分(见语法的商业规则); 这是一个房客在这个房间中所呈现的&amp;quot;友好的名字&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Room Owner(房间所有者) -- 建立某个房间的Jabber用户或一个被房间创建者或所有者指派拥有所有者权限(如果允许的话)的Jabber用户; 它被允许改变定义好的房间特性, 也可以执行全部的管理功能. 一个所有者的岗位为&amp;quot;owner&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Room Roster(房间名册) -- 一个房间中的所有房客在一个Jabber客户端的展现.&lt;br /&gt;
&lt;br /&gt;
Server(服务器) -- 一个Jabber服务器，可以关联或不关联一个基于文本的会议服务.&lt;br /&gt;
&lt;br /&gt;
Service(服务) -- 一个主机, 提供基于文本的会议的能力; 通常但不必须是一个Jabber服务器的子域(例如, conference.jabber.org).&lt;br /&gt;
&lt;br /&gt;
Subject(主题) -- 一个房间的临时讨论标题.&lt;br /&gt;
&lt;br /&gt;
Visit(访问) -- 一个房间的一个用户的&amp;quot;session&amp;quot;(会话), 当用户进入这个房间时开始(也就是说, 成为一个房客) , 结束于用户离开房间之时.&lt;br /&gt;
&lt;br /&gt;
Visitor(游客) -- 在一个被主持的房间里的一个没有发言权的房客(相反则是一个与会者). 一个游客的角色是&amp;quot;visitor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Voice(发言权) -- 在一个被主持的房间里, 发送消息给全部房客的权限.&lt;br /&gt;
&lt;br /&gt;
===房间类型===&lt;br /&gt;
&lt;br /&gt;
Hidden Room(隐藏房间) -- 一个无法被任何用户以普通方法如搜索和服务查询来发现的房间; 反义词: 公开(public)房间.&lt;br /&gt;
&lt;br /&gt;
Members-Only Room(仅限会员的房间) -- 如果一个用户不在成员列表中则无法加入的一个房间; 反义词: 开放(open)房间.&lt;br /&gt;
&lt;br /&gt;
Moderated Room(被主持的房间) -- 只有有&amp;quot;发言权&amp;quot;的用户才可以发送消息给所有房客的房间; 反义词: 非主持的(Unmoderated)房间.&lt;br /&gt;
&lt;br /&gt;
Non-Anonymous Room(非匿名房间) -- 一个房客的全JID会暴露给所有其他房客的房间, 尽管房客可以选择任何期望的房间昵称; 相对的是半匿名(Semi-Anonymous)房间.&lt;br /&gt;
&lt;br /&gt;
Open Room(开放房间) -- 任何人可以加入而不需要在成员列表中的房间; 反义词: 仅限会员的房间.&lt;br /&gt;
&lt;br /&gt;
Password-Protected Room(密码保护房间) -- 一个用户必须提供正确密码才能加入的房间; 反义词: 非保密房间.&lt;br /&gt;
&lt;br /&gt;
Persistent Room(持久房间) -- 如果最后一个房客退出也不会被销毁的房间; 反义词: 临时房间.&lt;br /&gt;
&lt;br /&gt;
Public Room(公开房间) -- 用户可以通过普通方法如搜索和服务查询来发现的房间; 反义词: 隐藏房间.&lt;br /&gt;
&lt;br /&gt;
Semi-Anonymous Room(半匿名房间) -- 一个房客的全JID只能被房间管理员发现的房间; 相对的是非匿名(Non-Anonymous)房间.&lt;br /&gt;
&lt;br /&gt;
Temporary Room(临时房间) -- 如果最后一个房客退出就会被销毁的房间; 反义词: 持久房间.&lt;br /&gt;
&lt;br /&gt;
Unmoderated Room(非主持的房间) -- 任何房客都被允许发送消息给所有房客的房间; 反义词: 被主持的房间.&lt;br /&gt;
&lt;br /&gt;
Unsecured Room(非保密房间) -- 任何人不需要提供密码就可以进入的房间; 反义词: 密码保护房间.&lt;br /&gt;
&lt;br /&gt;
===登场人物===&lt;br /&gt;
&lt;br /&gt;
本文的大部分例子使用了莎士比亚的《麦克白》中第四幕第一场开头女巫在黑洞中开会的场景，在这里使用&amp;quot;coven@chat.shakespeare.lit&amp;quot;代表聊天室. 人物如下:&lt;br /&gt;
&lt;br /&gt;
'''表1: 剧中人'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!Room Nickname !!Full JID!!Affiliation&lt;br /&gt;
|-&lt;br /&gt;
|firstwitch ||crone1@shakespeare.lit/desktop ||Owner&lt;br /&gt;
|-&lt;br /&gt;
|secondwitch ||wiccarocks@shakespeare.lit/laptop ||Admin&lt;br /&gt;
|-&lt;br /&gt;
|thirdwitch ||hag66@shakespeare.lit/pda ||None&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==角色(Roles)，岗位(Affiliations)和权限(Privileges)==&lt;br /&gt;
&lt;br /&gt;
A user might be allowed to perform any number of actions in a room, from joining or sending a message to changing configuration options or destroying the room altogether. We call each permitted action a &amp;quot;privilege&amp;quot;. There are two ways we might structure privileges:&lt;br /&gt;
&lt;br /&gt;
1. Define each privilege atomically and explicitly define each user's particular privileges; this is flexible but can be confusing to manage.&lt;br /&gt;
&lt;br /&gt;
2. Define bundles of privileges that are generally applicable and assign a user-friendly &amp;quot;shortcut&amp;quot; to each bundle (e.g., &amp;quot;moderator&amp;quot; or &amp;quot;admin&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
MUC使用第2种方式。&lt;br /&gt;
&lt;br /&gt;
有两个尺度我们可以用来衡量一个用户的连接或在一个房间的地位. 一个是用户和一个房间的长期的联系 -- 例如, 用户的状态是一个所有者或一个被排斥者. 另一个是当用户驻留于一个聊天室的时候的角色 -- 例如, 一个房客的地位是主持人,有权踢出游客和与会者. 这两个尺度各自都是唯一的, 因为一个岗位是跨越访问的, 而一个角色只存在于一次访问期间. 另外, 在角色和岗位之间没有一对一的对应关系; 例如, 某个不从属于某房间的人可能成为一个(临时的)主持人, 一个成员可能在一个被主持的房间中是一个与会者或游客者. 这些概念以下全面解释.&lt;br /&gt;
&lt;br /&gt;
===角色===&lt;br /&gt;
&lt;br /&gt;
以下是已定义的角色:&lt;br /&gt;
&lt;br /&gt;
'''表2: 角色'''&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!名称 !!支持&lt;br /&gt;
|-&lt;br /&gt;
| 主持人Moderator   ||必需的 &lt;br /&gt;
|-&lt;br /&gt;
| 无None       ||缺少角色&lt;br /&gt;
|-&lt;br /&gt;
| 与会者Participant   ||必需的&lt;br /&gt;
|-&lt;br /&gt;
| 游客Visitor     ||推荐的&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
角色是临时的,它不一定要在用户对房间的访问中持久化,它可以(MAY)在一个房客访问房间期间改变. 一个实现可以(MAY)在一次访问期间持久化角色并且应该(SHOULD)在被主持的房间这样做 (因为在游客和与会者之间,唯一性对一个被主持的房间是很关键的).&lt;br /&gt;
&lt;br /&gt;
在角色和岗位之间没有一对一的映射(例如, 一个成员可以是一个与会者或一个游客).&lt;br /&gt;
&lt;br /&gt;
在房间会话中,一个主持人是最有权力的房客, 它能在某种程度走上管理房间的其他房客的角色. 一个与会者的权力小于一个主持人, 尽管他或她有权发言. 在一个被主持的房间会话中游客是一个更受限制的角色, 因为访问者不允许发送消息给所有房客.&lt;br /&gt;
&lt;br /&gt;
角色的授予,撤销, 和维护是基于房客的房间昵称或全JID,而不是纯JID. 和这些角色相关的权限，还有角色改变触发的动作, 定义在下文中.&lt;br /&gt;
&lt;br /&gt;
所有在房间中生成或反射的出席信息中关于角色的信息必须(MUST)被发送,从而发送给房客们.&lt;br /&gt;
&lt;br /&gt;
====权限====&lt;br /&gt;
&lt;br /&gt;
大部分情况下, 角色存在于一个层次中. 例如, 一个与会者可以做任何游客能做的事, 而一个主持人可以做任何与会者能做的事. 每个角色拥有下一级角色所没有的权限; 这些权限定义于下表作为缺省值(一个实现可以(MAY)提供配置选项来重载这些缺省值).&lt;br /&gt;
&lt;br /&gt;
'''表3: 和角色相关的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!权限 !!无 !!游客 !!与会者 !!主持人&lt;br /&gt;
|-&lt;br /&gt;
|在房间中出席 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|接收消息 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|接收房客出席信息 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|出席信息广播到房间 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|改变可用性状态 ||否 ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|改变房间昵称 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|发送私人消息 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|邀请其他用户 ||否 ||是* ||是* ||是&lt;br /&gt;
|-&lt;br /&gt;
|发送消息给所有人 ||否 ||否** ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|修改标题 ||否 ||否* ||是* ||是&lt;br /&gt;
|-&lt;br /&gt;
|踢出与会者和游客 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|授予发言权 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|撤销发言权 ||否 ||否 ||否 ||是***&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 缺省; 设定配置时可以(MAY)修改这个权限.&lt;br /&gt;
&lt;br /&gt;
** 一个实现可以(MAY)在非主持的房间里缺省地授予发言权给游客.&lt;br /&gt;
&lt;br /&gt;
*** 主持人不能(MUST NOT)从一个管理员或所有者收回发言权.&lt;br /&gt;
&lt;br /&gt;
====默认角色====&lt;br /&gt;
&lt;br /&gt;
服务必须（SHOULD）根据用户的岗位信息来设置房客在房间里的初始角色（没有与岗位（“outcast”）关联的角色，因为outcast用户不允许进入房间）。下表对每个岗位对应的初始角色进行了总结。&lt;br /&gt;
&lt;br /&gt;
Table 4: 基于岗位的初始角色&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!Room Type !!None !!Member !!Admin !!Owner&lt;br /&gt;
|-&lt;br /&gt;
|Moderated ||Visitor ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Unmoderated ||Participant ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Members-Only ||N/A * ||Participant ||Moderator ||Moderator&lt;br /&gt;
|-&lt;br /&gt;
|Open	||Participant ||Participant ||Moderator ||Moderator&lt;br /&gt;
|}&lt;br /&gt;
* Entry is not permitted.&lt;br /&gt;
&lt;br /&gt;
====变更角色====&lt;br /&gt;
&lt;br /&gt;
一个房客的角色变更方法是定义好的. 有时候房客自己的动作导致变更 (例如, 加入或退出房间), 反之有时候由主持人,管理员或所有者的动作导致变更. 如果一个房客的角色改变了, 一个 MUC 服务实现必须(MUST)变更这个房客的角色来反映这个变更并且传达这个变更给所有房客. 角色的变更和它们触发的动作定义于下表.&lt;br /&gt;
&lt;br /&gt;
'''表4: 角色状态表'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!&amp;gt; !!无 !!游客 !!与会者 !!主持人&lt;br /&gt;
|-&lt;br /&gt;
|无 ||-- ||进入被主持的房间 ||进入非主持的房间 ||管理员或所有者进入房间&lt;br /&gt;
|-&lt;br /&gt;
|游客 ||退出房间或被主持人踢出房间 ||-- ||主持人授予发言权 ||管理员或所有者授予主持人权限&lt;br /&gt;
|-&lt;br /&gt;
|与会者 ||退出房间或被主持人踢出房间 ||主持人撤销发言权	||--  ||管理员或所有者授予主持人权限 &lt;br /&gt;
|-&lt;br /&gt;
|主持人	||退出房间 ||管理员或所有者改变角色成为游客* ||管理员或所有者改变角色成为与会者或撤销主持人权限* ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 一个主持人不能(MUST NOT)从一个岗位等于或高于主持人的房客那里收回主持人权限.&lt;br /&gt;
&lt;br /&gt;
注意: 特定的角色一般暗含特定的权限. 例如, 一个管理员或所有者自动成为一个主持人, 所以如果一个房客被授予管理员地位那么这个房客事实上将被授予主持人权限; 类似的, 当一个房客成为一个被主持的房间的成员, 这个房客自动拥有一个与会者的角色. 无论如何, 失去管理员地位并不足以意味这个房客不再是主持人 (因为只要是与会者就可能成为一个主持人). 因此, 当一个房客被授予特定的岗位的时候所拥有的角色是固定的, 反之当一个房客失去一个特定的岗位时它的角色是不确定的并取决于(服务的)实现. 因为一个客户端无法预料是否在撤销某个岗位之后这个角色成为什么, 如果它不想同时移除管理员/所有者权限和主持人角色, 那么除了岗位变更之外它还必须特意请求角色变更.&lt;br /&gt;
&lt;br /&gt;
===岗位===&lt;br /&gt;
&lt;br /&gt;
已定义了以下岗位:&lt;br /&gt;
&lt;br /&gt;
# 所有者&lt;br /&gt;
# 管理员&lt;br /&gt;
# 成员&lt;br /&gt;
# 被排斥者&lt;br /&gt;
# 无 (缺少岗位)&lt;br /&gt;
&lt;br /&gt;
必须支持&amp;quot;所有者&amp;quot;这个岗位,推荐支持&amp;quot;管理员&amp;quot;,&amp;quot;成员&amp;quot;,&amp;quot;被排斥者&amp;quot;的岗位.（&amp;quot;无&amp;quot;表示缺少岗位)&lt;br /&gt;
&lt;br /&gt;
这些岗位是长时间的跨越一个用户对这个房间的访问期间的并且不受房间里事件的影响. 而且, 这些岗位和一个房客在房间中的角色之间没有一对一的映射关系. 岗位被授予,撤销, 和维护都是基于这个用户的纯 JID.&lt;br /&gt;
&lt;br /&gt;
如果一个没有已定义的岗位的用户进入一个房间, 这个用户的岗位被定义为&amp;quot;无&amp;quot;; 无论如何, 这个岗位不能跨越(多次的)访问 (也就是说, 一个服务不会跨越访问维护一个 &amp;quot;无 列表&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;quot;成员&amp;quot;岗位为房间所有者或管理员提供了一个方法来指定一个&amp;quot;白名单&amp;quot;,其中的用户被允许加入一个仅供会员的房间. 当一个成员加入了一个仅供会员的房间, 他或她的岗位不会改变, 无论他或她的角色是什么. 成员岗位也为用户提供一个方法来高效地注册一个开放的房间并在某种方式意义上保持和那个房间的联系(例如可能在房间里预留那个用户的昵称).&lt;br /&gt;
&lt;br /&gt;
一个被排斥者就是一个被从房间踢出来并且不允许进入那个房间的用户.&lt;br /&gt;
&lt;br /&gt;
关于岗位的信息必须(MUST)由房间生成或反射到所有的出席信息节之中发送给房客们.&lt;br /&gt;
&lt;br /&gt;
====权限====&lt;br /&gt;
&lt;br /&gt;
大部分情况下, 岗位存在一个层次结构. 例如, 一个所有者可以做任何管理员能做的事情, 而一个管理员可以做任何成员能做的事情. 每个岗位拥有其下一级岗位所没有的权限; 这些权限定义在下表中.&lt;br /&gt;
&lt;br /&gt;
'''表5: 和岗位相关的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!权限 !!Outcast(被排斥者) !!None(无) !!Member(成员) !!Admin(管理员) !!Owner(所有者)&lt;br /&gt;
|-&lt;br /&gt;
|进入房间 ||否 ||是* ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|注册一个开放的房间 ||否 ||是 ||N/A ||N/A ||N/A&lt;br /&gt;
|-&lt;br /&gt;
|接收成员列表 ||否 ||否** ||是 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|加入一个仅限会员的房间 ||否 ||否 ||是* ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|禁止成员并把用户的岗位删除	||否 ||否 ||否 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑成员列表 ||否 ||否 ||否 ||是 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑主持人列表 ||否 ||否 ||否 ||是** ||是**&lt;br /&gt;
|-&lt;br /&gt;
|编辑管理员列表 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|编辑所有者列表 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|变更房间定义 ||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|-&lt;br /&gt;
|销毁房间	||否 ||否 ||否 ||否 ||是&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 作为缺省值, 一个无岗位的用户进入一个被主持的房间的角色是一个游客, 而进入一个开放的房间的角色是一个与会者. 一个成员进入一个房间的角色是与会者. 一个管理员或所有者进入房间的角色是一个主持人.&lt;br /&gt;
&lt;br /&gt;
** 一个管理员或所有者不能(MUST NOT)撤销另一个管理员或所有者的权限.&lt;br /&gt;
&lt;br /&gt;
====变更岗位====&lt;br /&gt;
&lt;br /&gt;
一个用户的岗位变更方法已经定义得很完善. 有时用户自己的动作导致这些变更(例如, 注册为一个房间的新成员), 反之有时候一个管理员或所有者的动作导致了这些变更. 如果一个用户的岗位改变了, 一个MUC服务实现必须(MUST)变更这个用户的岗位来反射这一变更并通知所有房客. 岗位变更和他们触发的动作定义在下表中.&lt;br /&gt;
&lt;br /&gt;
'''表6: 岗位状态表'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|  ||被排斥者(Outcast) ||无(None) ||成员(Member) ||管理员(Admin) ||所有者(Owner)&lt;br /&gt;
|-&lt;br /&gt;
|被排斥者(Outcast) ||-- ||管理员或所有者移除屏蔽 ||管理员或所有者增加用户到成员列表 ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|无(None) ||管理员或所有者使用屏蔽 ||-- ||管理员或所有者增加用户到成员列表, 或用户注册一个成员(如果允许) ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|成员(Member) ||管理员或所有者使用屏蔽 ||管理员或所有者变更岗位为&amp;quot;none&amp;quot; ||-- ||所有者增加用户到管理员列表 ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|管理员(Admin) ||所有者使用屏蔽 ||所有者变更岗位为&amp;quot;none&amp;quot; ||所有者变更岗位为&amp;quot;member&amp;quot; ||-- ||所有者增加用户到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|所有者(Owner) ||所有者使用屏蔽 ||所有者变更岗位为&amp;quot;none&amp;quot; ||所有者变更岗位为&amp;quot;member&amp;quot; ||所有者变更岗位为&amp;quot;admin&amp;quot; ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==实体用例==&lt;br /&gt;
&lt;br /&gt;
一个MUC实现必须(MUST)支持[http://xmpp.org/extensions/xep-0030.html 服务发现] [[XEP-0045#附录G:备注|7]].&lt;br /&gt;
&lt;br /&gt;
===MUC的发现组件支持===&lt;br /&gt;
&lt;br /&gt;
一个Jabber实体可能希望发现是否一个服务实现了多用户聊天协议; 为了达到这个目的, 它发送一个服务发现信息(&amp;quot;disco#info&amp;quot;)查询给这组件的JID:&lt;br /&gt;
&lt;br /&gt;
'''例子 1. 用户通过Disco查询聊天服务是否支持MUC'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco1'&lt;br /&gt;
    to='macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须(MUST)返回它的的身份和它所支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 2. 服务返回Disco Info结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='Macbeth Chat Service'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 因为MUC是旧的&amp;quot;groupchat 1.0&amp;quot;协议的超集, 一个MUC服务不应该(SHOULD NOT)返回一个&amp;lt;feature var='gc-1.0'/&amp;gt;条目在一个disco#info结果中.&lt;br /&gt;
&lt;br /&gt;
===发现房间===&lt;br /&gt;
&lt;br /&gt;
发现服务条目(&amp;quot;disco#items&amp;quot;)协议使得一个用户可以向一个服务查询相关的条目列表, 在一个聊天服务中这包含这个服务所承载的所有特定房间的集合.&lt;br /&gt;
&lt;br /&gt;
'''例子 3. 用户向聊天服务查询房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco2'&lt;br /&gt;
    to='macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务应该(SHOULD)返回它承载的所有房间的列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 4. 服务返回Disco Item结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='heath@macbeth.shakespeare.lit'&lt;br /&gt;
          name='A Lonely Heath'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
          name='A Dark Cave'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='forres@macbeth.shakespeare.lit'&lt;br /&gt;
          name='The Palace'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='inverness@macbeth.shakespeare.lit'&lt;br /&gt;
          name='Macbeth&amp;amp;apos;s Castle'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果全部房间的列表太大(详见[[XEP-0030]]), 服务可以(MAY)只返回部分的房间列表.如果这样做了, 它应该 SHOULD 包含一个 &amp;lt;set/&amp;gt; 元素 (定义在 [http://xmpp.org/extensions/xep-0059.html Result Set Management] [[XEP-0045#附录G:备注|8]]) 以表明这个列表不是全部的结果集.&lt;br /&gt;
&lt;br /&gt;
'''例子 5. 服务返回Disco Item结果的部分列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='rooms.shakespeare.lit'&lt;br /&gt;
    id='disco-rsm-1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='alls-well-that-ends-well@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='as-you-like-it@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='cleopatra@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='comedy-of-errors@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='coriolanus@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='cymbeline@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hamlet@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fourth-one@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fourth-two@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='henry-the-fifth@rooms.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;set xmlns='http://jabber.org/protocol/rsm'&amp;gt;&lt;br /&gt;
      &amp;lt;first index='0'&amp;gt;alls-well-that-ends-well@rooms.shakespeare.lit&amp;lt;/first&amp;gt;&lt;br /&gt;
      &amp;lt;last&amp;gt;henry-the-fifth@rooms.shakespeare.lit&amp;lt;/last&amp;gt;&lt;br /&gt;
      &amp;lt;count&amp;gt;37&amp;lt;/count&amp;gt;&lt;br /&gt;
    &amp;lt;/set&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===查询房间信息===&lt;br /&gt;
&lt;br /&gt;
使用 disco#info 协议, 一个用户也可以查询一个特定房间的详情. 为了在进入房间之间确定这个房间的隐私和安全配置用户应该(SHOULD)这样做(详见[[XEP-0045#安全事项|安全事项]]).&lt;br /&gt;
&lt;br /&gt;
'''例子 6. 用户查询特定聊天室的信息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco3'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间必须(MUST)返回它的标识并且应该(SHOULD)返回它支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 7. 房间返回查询信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco3'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='A Dark Cave'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_passwordprotected'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_hidden'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_temporary'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_open'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_unmoderated'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_nonanonymous'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 因为 MUC 是旧的 &amp;quot;groupchat 1.0&amp;quot; 协议的超集, 一个 MUC 房间不应该(SHOULD NOT)在一个disco#info结果中返回&amp;lt;feature var='gc-1.0'/&amp;gt;条目. 房间应该(SHOULD)返回它支持的实质的有意义的特性, 例如密码保护和房间主持(这些特性被完整地列入了特性注册, 由[http://xmpp.org/registrar/ XMPP Registrar]维护; 也见于本文的[[XEP-0045#registrar|XMPP注册]] 章节).&lt;br /&gt;
&lt;br /&gt;
一个聊天室可以(MAY)使用[http://xmpp.org/extensions/xep-0128.html 服务查询扩展] [[XEP-0045#附录G:备注|9]]在它的disco#info应答中返回更详细的信息, 通过包含一个隐含的FORM_TYPE属性值&amp;quot;http://jabber.org/protocol/muc#roominfo&amp;quot;来标识. 这些信息可能包括关于一个房间的更详细的描述, 当前的房间标题, 以及这个房间当前的房客数量:&lt;br /&gt;
&lt;br /&gt;
'''例子 8. 房间返回扩展的查询信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco3a'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='A Dark Cave'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_passwordprotected'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_hidden'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_temporary'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_open'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_unmoderated'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='muc_nonanonymous'/&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_description' label='Description'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_changesubject' label='Whether Occupants May Change the Subject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_contactjid' label='Contact Addresses'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;crone1@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_subject' label='Subject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Spells&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_occupants' label='Number of occupants'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;3&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_lang' label='Language of discussion'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_logs' label='URL for discussion logs'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://www.shakespeare.lit/chatlogs/darkcave/&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roominfo_pubsub' label='Associated pubsub node'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;xmpp:pubsub.shakespeare.lit?node=chatrooms/darkcave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
某些扩展的房间信息可能是动态生成的(例如, 讨论记录的URL地址, 它可能取决于服务器那一层的配置); 反之另一些信息则可能基于房间那一层的配置,任何定义在[[XEP-0045#附录G:备注|muc#roomconfig FORM_TYPE]] 里的字段都可以用于扩展服务发现的字段(如上文所示的 muc#roomconfig_changesubject 字段).&lt;br /&gt;
&lt;br /&gt;
注意: 前述 'http://jabber.org/protocol/muc#roominfo' FORM_TYPE的扩展服务发现字段将来还可以扩充(通过本文的[[XEP-0045#附录G:备注|字段标准化]]章节描述的机制).&lt;br /&gt;
&lt;br /&gt;
===查询房间条目===&lt;br /&gt;
&lt;br /&gt;
一个用户也可以(MAY)向一个特定的聊天室查询和它相关的条目:&lt;br /&gt;
&lt;br /&gt;
'''例子 9. 用户查询和一个特定聊天室相关的条目'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个实现可以(MAY)返回现有房客的列表(如果那信息是可公开的), 或不返回列表(如果那信息是私有的).&lt;br /&gt;
&lt;br /&gt;
'''例子 10. 房间返回查询条目结果(条目是公开的)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit/firstwitch'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit/secondwitch'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 这些 &amp;lt;item/&amp;gt; 元素由 disco#items 名字空间限定, 而不是 muc 名字空间; 这意味着他们不能拥有 'affiliation' 或 'role' 属性, 例如.&lt;br /&gt;
&lt;br /&gt;
'''例子 11. 房间返回空的查询条目结果(条目是私有的)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    id='disco4'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===查询一个房间的房客===&lt;br /&gt;
&lt;br /&gt;
如果一个非房客试图发送一个查询请求给一个&amp;lt;room@service/nick&amp;gt;类型的地址, 一个 MUC 服务应该(SHOULD)返回这个请求给这个实体并指明一个&amp;lt;bad-request/&amp;gt;错误条件. 如果一个房客发送这样一个请求, 服务可以(MAY)把它传递给指定的接收者; 详见本文的 [[XEP-0045#实现注意事项|实现注意事项]]章节.&lt;br /&gt;
&lt;br /&gt;
===发现客户端对MUC的支持===&lt;br /&gt;
&lt;br /&gt;
一个 Jabber 用户可能想发现这个用户的某个联系人是否支持多用户聊天协议. 这可以使用服务发现(协议)来完成.&lt;br /&gt;
&lt;br /&gt;
'''例子 12. 用户查询联系人对于 MUC 的支持'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='disco5'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
客户端应该(SHOULD)返回它的标识和它支持的特性:&lt;br /&gt;
&lt;br /&gt;
'''例子 13. 联系人返回发现信息结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='disco5'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='client'&lt;br /&gt;
        type='pc'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个用户也可能查询一个联系人在哪个房间. 这可以通过特定服务发现节点 'http://jabber.org/protocol/muc#rooms' 查询联系人的全JID(&amp;lt;user@host/resource&amp;gt;)来完成 :&lt;br /&gt;
&lt;br /&gt;
'''例子 14. 用户在当前房间查询联系人'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='rooms1'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#rooms'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 15. 联系人返回房间查询结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='rooms1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#rooms'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='characters@conference.shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可选的, 联系人可以(MAY)把它的房间昵称作为'name'属性的值返回:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;item jid='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
          name='secondwitch'/&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==房客用例==&lt;br /&gt;
&lt;br /&gt;
在一个多用户聊天环境中主要的行为者是房客, 它可以被认为存在于一个多用户聊天室&amp;quot;之内&amp;quot;并且参与那个房间的讨论 (在本协议中, 与会者和游客&amp;quot;仅仅&amp;quot;被认为是房客, 因为他们不拥有管理员权限). 为了更加清晰起见, 本文中的协议元素中涉及到驻留者的用例分为以下三类:&lt;br /&gt;
&lt;br /&gt;
# 现存于 &amp;quot;groupchat 1.0&amp;quot; 协议的最小功能集&lt;br /&gt;
# 对于 &amp;quot;groupchat 1.0&amp;quot; 协议直接的应用, 如处理一些和新房间类型有关的错误&lt;br /&gt;
# 用来处理&amp;quot;groupchat 1.0&amp;quot;协议未涉及的功能的额外的协议元素(房间邀请, 房间密码, 和房间角色及岗位相关的扩展出席信息); 在'http://jabber.org/protocol/muc#user'名字空间&lt;br /&gt;
&lt;br /&gt;
注意: 这里所有客户端生成的例子是从服务的角度来展示的, 所以所有由服务收到的节都包含一个'from'属性来表达发送者的全JID(这个from属性是由一个通用的Jabber路由或会话管理者加入的). 另外, 通常的表示请求已被完成的 IQ 结果节(如 [[RFC 3920]] [10]中所要求的)未显示在这里.&lt;br /&gt;
&lt;br /&gt;
===进入一个房间===&lt;br /&gt;
&lt;br /&gt;
====Groupchat 1.0协议====&lt;br /&gt;
&lt;br /&gt;
为了参加一个多用户聊天室的讨论, 一个Jabber用户必须(MUST)首先进入一个房间成为一个房客. 在旧的&amp;quot;groupchat 1.0&amp;quot;协议中, 这是通过发送出席信息&amp;lt;room@service/nick&amp;gt;来实现的, 这里&amp;quot;room&amp;quot;是房间的 ID, &amp;quot;service&amp;quot; 是聊天服务的主机名, &amp;quot;nick&amp;quot; 是这个用户在这房间里预期的昵称:&lt;br /&gt;
&lt;br /&gt;
'''例子 16. Jabber用户进入一个房间(Groupchat 1.0)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit/thirdwitch'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子中, 一个全JID为&amp;quot;hag66@shakespeare.lit/pda&amp;quot;的用户请求用昵称&amp;quot;thirdwitch&amp;quot;进入位于&amp;quot;macbeth.shakespeare.lit&amp;quot;聊天服务的房间&amp;quot;darkcave&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
如果用户未指定一个房间昵称, 服务应该(SHOULD)返回一个&amp;lt;jid-malformed/&amp;gt;错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 17. Jabber用户进入一个房间(Groupchat 1.0)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error code='400' type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;jid-malformed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====基本MUC协议====&lt;br /&gt;
&lt;br /&gt;
兼容的多用户聊天服务必须（MUST）接受知道&amp;quot;groupchat 1.0&amp;quot; (GC)协议或multi-user chat (MUC)协议的任何客户端发出上述请求进入会议室; 无论如何, MUC 客户端应该(SHOULD)声明他们的有能力支持 MUC 协议, 方法是在出席信息节里面包含一个空的 &amp;lt;x/&amp;gt; 元素, 满足名字空间 'http://jabber.org/protocol/muc'  (注意不需要 '#user' 部分):&lt;br /&gt;
&lt;br /&gt;
'''例子 18. Jabber用户准备进入一个房间(Multi-User Chat)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from=&amp;quot;hag66@shakespeare.lit/pda&amp;quot;&lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 如果发生了一个和加入房间有关的错误, 服务应该 SHOULD 返回一个包含 MUC 子元素 (i.e., &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;) 的 &amp;lt;presence/&amp;gt; 节，其 type 为 &amp;quot;error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
在尝试进入房间之间, 一个兼容MUC的客户端应该(SHOULD)首先查询它的保留的房间昵称 (如果有的话), 接下来的协议本文中的 [[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]] 章节对此作了定义.&lt;br /&gt;
&lt;br /&gt;
====出席信息广播====&lt;br /&gt;
&lt;br /&gt;
如果服务能够添加用户到房间, 它必须(MUST)从所有现存的房客的房间JID发送出席信息给新的房客的全JID, 包括扩展的关于角色的出席信息, 一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;moderator&amp;quot;, &amp;quot;participant&amp;quot;, 或&amp;quot;visitor&amp;quot;, 这个子元素的'affiliation'属性值设为&amp;quot;owner&amp;quot;, &amp;quot;admin&amp;quot;, &amp;quot;member&amp;quot;, 或 &amp;quot;none&amp;quot; 中的一个:&lt;br /&gt;
&lt;br /&gt;
'''例子 19. 服务从现有的房客发送出席信息给新的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个示例中, 用户已从前一个例子进入房间, 有两个人已经在房间里: 一个是昵称为&amp;quot;firstwitch&amp;quot;的(房间拥有者), 另一个是昵称为&amp;quot;secondwitch&amp;quot;的(房间管理员).&lt;br /&gt;
&lt;br /&gt;
服务也必须(MUST)从新进入的房客的房间JID向所有房客的全JID发送出席信息(含新房客):&lt;br /&gt;
&lt;br /&gt;
'''例子 20. 服务发送新房客的出席信息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
在这个例子里, 初始的房间出席信息从新房客(thirdwitch)发送给所有房客, 包括这个新房客自己. 看看上面最后一个节, 由房间以房客的名义发送给用户自己的出席信息,应该 SHOULD 包含一个 110 状态码，这样用户就知道这个出席信息来自于作为房客的那个他自己.&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 重写新房客的房间昵称 (例如, 如果房间昵称被锁定). 如果服务不接受新房客请求的房间昵称，而是分配一个新的房间昵称, 它必须 MUST 包含一个 &amp;quot;210&amp;quot; 状态码在发送给这个新房客的出席信息广播里.&lt;br /&gt;
&lt;br /&gt;
'''例子 21. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
注意: 发送给新房客的出席信息的顺序是很重要的. 服务必须 MUST 首先发送现有房客的完整列表给这个新房客,然后只发送新房客自己的出席信息给新房客. 这有助于客户端知道什么时候它收到了完整的房间名册( &amp;quot;room roster&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
发送出席信息广播之后(并且只在这之后), 服务可以发送讨论历史, 即时消息, 出席信息更新, 以及其他房间内的流量.&lt;br /&gt;
&lt;br /&gt;
====缺省角色====&lt;br /&gt;
&lt;br /&gt;
下表总结了初始缺省的角色，一个服务应该根据用户的岗位来设置它们(没有和 被排斥者 &amp;quot;outcast&amp;quot; 岗位相关的角色, 因为这些用户不允许进入房间).&lt;br /&gt;
&lt;br /&gt;
'''表7: 基于岗位的初始角色'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!房间类型 !!无 !!成员 !!管理员 !!所有者&lt;br /&gt;
|-&lt;br /&gt;
|被主持的 ||游客 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|非主持的 ||与会者 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|仅限会员的 ||N/A * ||与会者 ||主持人 ||主持人&lt;br /&gt;
|-&lt;br /&gt;
|开放的 ||与会者 ||与会者 ||主持人 ||主持人&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 实体不被允许.&lt;br /&gt;
&lt;br /&gt;
====非匿名房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是非匿名的, 服务必须 MUST 发送新房客的全JID给所有房客,使用满足 'http://jabber.org/protocol/muc#user' 名字空间的扩展出席信息,其中带有 &amp;lt;x/&amp;gt; 元素并包含一个 &amp;lt;item/&amp;gt; 子元素,其 'jid' 属性值为这个房客的全JID:&lt;br /&gt;
&lt;br /&gt;
'''例子 22. 服务发送全JID给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这个用户正在进入一个非匿名房间(即, 它如上所示,向所有房客通报每个房客的全JID), 服务应该 SHOULD 允许该用户加入本房间,但是必须 MUST 同时警告该用户本房间是非匿名的. 应该 SHOULD 在房间发送给这个新房客的初始出席信息种包含状态码 &amp;quot;100&amp;quot; 来实现这一点:&lt;br /&gt;
&lt;br /&gt;
'''例子 23. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 也可以 MAY 发送一个 &amp;quot;groupchat&amp;quot; 类型的消息给新房客来达到上述目的,这个消息应该包含一个 &amp;lt;x/&amp;gt; 子元素,并拥有 &amp;lt;status/&amp;gt; 子元素,并且其'code'属性值为&amp;quot;100&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 24. 服务警告新房客(该房间)非匿名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;This room is not anonymous.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
附带的状态码协助客户端展示它们自己的通知消息 (例如, 和用户所在地方有关的信息).&lt;br /&gt;
&lt;br /&gt;
====半匿名房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是半匿名的, 服务必须 MUST 如上文所述从新房客发送出席信息给所有房客, 但是必须 MUST 只在发给&amp;quot;主持人&amp;quot;的时候发送新房客的全JID,而非主持人则不发(全JID).&lt;br /&gt;
&lt;br /&gt;
(注意: 所有随后的例子中，涉及的&amp;lt;item/&amp;gt;元素都带有'jid'属性, 即使这个信息在半匿名房间里不被发送给非主持人.)&lt;br /&gt;
&lt;br /&gt;
====密码保护房间====&lt;br /&gt;
&lt;br /&gt;
如果房间要求密码验证而用户不能提供(或密码错误), 服务必须 MUST 拒绝访问这个房间并且通知该用户它们是未被授权的; 具体方法是返回一个类型为&amp;quot;error&amp;quot;的出席信息节并标明 &amp;lt;not-authorized/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 25. 服务拒绝访问,因为(用户)未提供密码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
密码应该 SHOULD 通过进入房间时发送的出席信息节来提供, 包含在满足 'http://jabber.org/protocol/muc' 名字空间的 &amp;lt;x/&amp;gt; 元素的&amp;lt;password/&amp;gt; 子元素里. 密码以明码方式发送; 目前不支持其它验证方法, 而且任何这类的验证或授权方法都将会定义在一个独立的协议里(参见本文的[[XEP-0045#安全事项|安全事项]]章节).&lt;br /&gt;
&lt;br /&gt;
'''例子 26. 用户进入房间时提供密码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====仅限会员房间====&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限会员的,但用户不是(该房间的)成员, 服务必须 MUST 拒绝访问这个房间并通知用户它们不被允许进入房间; 具体方法是返回一个&amp;quot;error&amp;quot;类型的出席信息节，并包含一个 &amp;lt;registration-required/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 27. 服务拒绝访问，因为用户不在成员列表中'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;registration-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====被禁止的用户====&lt;br /&gt;
&lt;br /&gt;
如果用户已经被房间禁止(即, 其岗位为被排斥者 &amp;quot;outcast&amp;quot;), 服务必须 MUST 拒绝访问这个房间并通知用户他(她)被禁止了; 具体方法是返回一个出席信息节,类型为&amp;quot;error&amp;quot;，标明 &amp;lt;forbidden/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 28. 服务拒绝访问，因为用户被禁止了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====昵称冲突====&lt;br /&gt;
&lt;br /&gt;
如果房间里已经有别的用户使用了准备进入房间的新用户预期的昵称(或如果这个昵称被保留给另一个成员列表里面的用户), 服务必须 MUST 拒绝访问这个房间并通知用户这个冲突; 具体方法是返回一个出席信息节,类型为&amp;quot;error&amp;quot;，标明 &amp;lt;conflict/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 29. 服务拒绝访问，因为昵称冲突'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 如果现有房客的纯 JID &amp;lt;localpart@domain.tld&amp;gt; 和准备进入房间的用户的纯 JID 相同, 那么服务应该 SHOULD 允许这个用户的进入, 所以这个用户就有两个(或更多) 房间内的会话 &amp;quot;sessions&amp;quot; 使用同一个房间昵称, 每一个对应一个资源. 如果一个服务允许相同纯JID可以同时存在多个房客并使用同一个房间的房间昵称, 它应该 SHOULD 路由房间内的消息给该用户的所有资源并允许用户的所有资源发送消息给房间; 视实现而定，服务来决定如何适当的处理从用户的资源发送的出席信息以及如何路由私有消息到所有或某个资源(基于出席信息优先级或其他机制).&lt;br /&gt;
&lt;br /&gt;
如何确定昵称冲突取决于实现(例如, 该服务是否应用于一个特定的惯例, 一个 stringprep 规则如 Resourceprep 或 Nodeprep, 等等).&lt;br /&gt;
&lt;br /&gt;
====最大用户数====&lt;br /&gt;
&lt;br /&gt;
如果房间达到它的最大房客数量, 服务应该 SHOULD 拒绝访问这个房间并通知该用户这个限制; 方法是返回一个出席信息节，类型为&amp;quot;error&amp;quot;，标明 &amp;lt;service-unavailable/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 30. 服务通知用户该房间已达到房客数量极限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='wait'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 房间可以踢出空闲用户(&amp;quot;idle user&amp;quot;)以腾出空间.&lt;br /&gt;
&lt;br /&gt;
如果房间的房客数量已达到最大值但是一个房间管理员或所有者试图进入，该房间应该允许管理员或所有者加入，为了使得额外的房客达到一个合理的数目，该数量可以 MAY 做成可配置的。&lt;br /&gt;
&lt;br /&gt;
====锁住的房间====&lt;br /&gt;
&lt;br /&gt;
如果一个用户尝试进入一个房间而该房间是锁住的 &amp;quot;locked&amp;quot; (即, 在房间创建者提供初始的配置之前以及也就是在房间正式存在之前), 服务必须 MUST 拒绝进入并返回一个 &amp;lt;item-not-found/&amp;gt; 错误给该用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 31. 服务拒绝访问，因为房间不存在'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====不存在的房间====&lt;br /&gt;
&lt;br /&gt;
如果用户准备进入房间时，该房间已经不存在了, 服务应该 SHOULD 建立它; 无论如何, 这不是必需的, 因为一个实现或部署可以 MAY 选择限制建立房间的权限. 详见本文的[[XEP-0045#新建房间|新建房间]]章节.&lt;br /&gt;
&lt;br /&gt;
====房间记录====&lt;br /&gt;
&lt;br /&gt;
如果用户进入一个房间，该房间的讨论是被记录到一个公开的存档里面(经常可以通过HTTP访问的), 服务应该 SHOULD 允许该用户加入该房间但是必须 MUST 同时警告该用户讨论已被记录. 方法是应该 SHOULD 在房间发送给该新房客的初始出席信息中包含一个状态码 &amp;quot;170&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 32. 服务发送新房客的出席信息给新房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='100'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='170'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='210'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====讨论历史====&lt;br /&gt;
&lt;br /&gt;
如上发送完初始出席信息之后, 一个房间可以 MAY 发送讨论历史给这个新房客. (在完成按照本文[[XEP-0045#出席信息广播|出席信息广播]]章节规定的发送房间出席信息之前，该房间不能 MUST NOT 发送任何讨论历史.) 是否这个历史要被发送, 以及这个历史里面包含多少条消息, 将由聊天服务实现或特定的部署来决定.&lt;br /&gt;
&lt;br /&gt;
'''例子 33. 讨论历史的发送'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2002-10-13T23:58:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2002-10-13T23:58:43Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hecate@shakespeare.lit/broom'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries 'Tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='hag66@shakespeare.lit/pda'&lt;br /&gt;
     stamp='2002-10-13T23:58:49Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
讨论历史消息必须 MUST 标为[http://xmpp.org/extensions/xep-0203.html Delayed Delivery] [[XEP-0045#附录G:备注|11]]信息，满足'urn:xmpp:delay' 名字空间，以表明它们是被延迟发送的并且标明它们最初发出的时间. (注意: 'urn:xmpp:delay' 名字空间定义在 XEP-0203 里面，取代了旧的定义在 [http://xmpp.org/extensions/xep-0091.html Legacy Delayed Delivery] [[XEP-0045#附录G:备注|12]] 里的 'jabber:x:delay' 名字空间 ; XEP-0091状态更改为已过时之前, 实现应该 SHOULD 包含两种日期时间(datetime)格式.). 在非匿名房间里，'from'属性应该 SHOULD 是原始发送者的全JID, 但不能 MUST NOT 在半匿名房间里(在那里'from'属性应该 SHOULD 设置为房间本身的JID). 服务应该 SHOULD 在进入该房间之后，发送任何即时(&amp;quot;live&amp;quot;)消息之前，发送完所有讨论历史消息.&lt;br /&gt;
&lt;br /&gt;
====管理讨论历史====&lt;br /&gt;
&lt;br /&gt;
用户可能 MAY 希望管理进入房间时(由房间)提供的讨论历史(可能因为用户带宽比较低或正在使用迷你客户端). 他必须 MUST 在加入房间时发出的初始出席信息节里包含一个 &amp;lt;history/&amp;gt; 子元素. 这个元素有四个可用的属性:&lt;br /&gt;
&lt;br /&gt;
'''表8: 历史管理属性'''&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!属性 !!数据类型 !!含义&lt;br /&gt;
|-&lt;br /&gt;
| maxchars   ||int    ||限制历史中的字符总数为&amp;quot;X&amp;quot; (这里的字符数量是全部 XML 节的字符数, 不只是它们的 XML 字符数据). &lt;br /&gt;
|-&lt;br /&gt;
| maxstanzas    ||int    ||限制历史中的消息总数为&amp;quot;X&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| seconds   ||int   ||仅发送最后 &amp;quot;X&amp;quot; 秒收到的消息.&lt;br /&gt;
|-&lt;br /&gt;
| since     ||dateTime     ||仅发送从指定日期时间 datetime 之后收到的消息 (这个datatime必须 MUST 符合[http://xmpp.org/extensions/xep-0082.html XMPP Date and Time Profiles] [[XEP-0045#附录G:备注|13]] 定义的DateTime 规则，).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 发送满足以上条件组合的最小数量的消息, 还要顾及服务级别和房间级别的缺省设置. 服务必须 MUST 只发送完整的消息节(即, 它不能 MUST not 按特定字符数把历史从字面上截断, 但是必须 MUST 发送最大数量的完整节,这使得字符数小于或等于 'maxchars' 属性的值). 如果客户端不希望收到历史, 它必须 MUST 把'maxchars' 属性值设为&amp;quot;0&amp;quot; (zero).&lt;br /&gt;
&lt;br /&gt;
以下例子展示如何使用这个协议.&lt;br /&gt;
&lt;br /&gt;
'''例子 34. 用户请求在历史中限制消息数量'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history maxstanzas='20'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 35. 用户请求最后三分钟的历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history seconds='180'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 36. 用户请求从Unix时代到现在的所有历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history since='1970-01-01T00:00:00Z'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务绝对不应该 SHOULD NOT 返回从Unix时代开始到现在的所有消息, 而应该 SHOULD 基于服务或房间的缺省值返回适当的有限数量的历史给用户.&lt;br /&gt;
&lt;br /&gt;
'''例子 37. 用户请求不发送历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;history maxchars='0'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===退出一个房间===&lt;br /&gt;
&lt;br /&gt;
为了退出一个多用户聊天房间, 一个房客发送一个类型为&amp;quot;unavailable&amp;quot;的出席信息节给正在使用这个房间的 &amp;lt;room@service/nick&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
'''例子 38. 房客退出一个房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    type='unavailable'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着从要离开的房客的房间JID发送&amp;quot;unavailable&amp;quot;类型的出席信息节给这个要离开的房客的全JID们以及留在房间的房客们:&lt;br /&gt;
&lt;br /&gt;
'''例子 39. 服务发送和离开的房客有关的出席信息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
由房间反射的类型为&amp;quot;unavailable&amp;quot;的出席信息节必须 MUST 包含扩展的关于角色和岗位的出席信息; 'role'属性值应该 SHOULD 被设为 &amp;quot;none&amp;quot; 以表示这个人不再是一个房客了.&lt;br /&gt;
&lt;br /&gt;
房客可以 MAY 在出席信息节包含一个常规的 &amp;lt;status/&amp;gt; 信息; 这使房客能在必要的情况下提供一个自定的退出消息:&lt;br /&gt;
&lt;br /&gt;
'''例子 40. 自定的退出消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
常规的出席信息节生成规则定义在 [[RFC3921|XMPP IM]] [[XEP-0045#附录G;备注|14]], 所以如果用户发送一个一般的不可用出席信息节, 用户的服务器将广播那个节到 &amp;lt;room@service/nick&amp;gt; ，而该用户之前曾经发送过直接出席信息给这个&amp;lt;room@service/nick&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
有可能一个用户不能正常地通过直接发送不可用信息给一个房间来退出该房间. 如果该用户没有发送不可用出席信息就下线了, 用户的服务器负责代替该用户发送不可用出席信息 (依据 RFC 3921). 如果该用户的服务器下线或该用户的服务器和该用户连接的MUC服务失去连接(例如, 在联邦通信), 这个MUC服务负责监视它收到的错误信息节以确定该用户是否下线. 如果该MUC服务确定该用户已下线, 它必须 must 当成该用户自己发送了不可用信息一样地处理这个用户.&lt;br /&gt;
&lt;br /&gt;
注意: 如果房间不是持久的并且该房客是最后一个退出的, 服务负责销毁这个房间.&lt;br /&gt;
&lt;br /&gt;
===更改昵称===&lt;br /&gt;
&lt;br /&gt;
多用户聊天室的一个常用功能是一个房客能修改自己在房间里的昵称. 在 MUC 里这需要发送一个更新出席信息给房间, 具体来说是在相同的房间里发送出席信息给一个新的房间JID (变更的只是这个房间JID的资源).&lt;br /&gt;
&lt;br /&gt;
'''例子 41. 房客修改昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务接着发送两个出席信息节给每个房客的全JID(包括修改自己昵称的房客本身), 一个是类型为&amp;quot;unavailable&amp;quot;的用于旧的昵称另一个指明新昵称可用了.&lt;br /&gt;
&lt;br /&gt;
这个不可用出席信息必须 MUST 在一个满足'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 子元素里面包含以下扩展的出席信息 :&lt;br /&gt;
&lt;br /&gt;
* 新昵称(在这个例子中, nick='oldhag')&lt;br /&gt;
* 一个状态码 303&lt;br /&gt;
&lt;br /&gt;
这使接受者能从旧昵称关联到新昵称.&lt;br /&gt;
&lt;br /&gt;
'''例子 42. 服务更新昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='oldhag'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='303'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/oldhag'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户尝试修改他或她的房间昵称,但这个昵称已经被其他用户使用了 (或者这个昵称是被这房间的其他用户岗位保留的, 例如, 一个成员或者所有者), 服务必须 MUST 拒绝这次昵称修改并通知该用户这一冲突; 也就是返回一个类型为 &amp;quot;error&amp;quot; 的出席信息节指明 &amp;lt;conflict/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 43. 服务拒绝昵称修改，因为昵称冲突'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 如果现有房客的纯JID &amp;lt;localpart@domain.tld&amp;gt; 和尝试变更昵称的房客的纯JID相同, 那么服务可以 MAY 允许昵称变更. 详见本文的[[XEP-0045#昵称冲突|昵称冲突]]章节.&lt;br /&gt;
&lt;br /&gt;
如果该用户尝试变更自己的昵称但是房间昵称被锁定了(&amp;quot;locked down&amp;quot;), 服务必须 MUST 拒绝这个昵称变更请求并返回一个&amp;quot;error&amp;quot;类型的出席信息节，指明一个 &amp;lt;not-acceptable/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 44. 服务拒绝昵称变更，因为房间昵称被锁定'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户应该 SHOULD 接着发现它的保留昵称，如本文的 [[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]]章节所述.&lt;br /&gt;
&lt;br /&gt;
===更改可用性状态===&lt;br /&gt;
&lt;br /&gt;
在一个多用户聊天系统里例如IRC, 一个常用的修改某人房间昵称的行为也意味着变更某人的可用性(例如, 变更某人的房间昵称为&amp;quot;thirdwitch|away&amp;quot;). 在Jabber里面, 可用性当然是通过出席信息 (中 &amp;lt;show/&amp;gt; 和 &amp;lt;status/&amp;gt; 元素)的变更来通知的, 这能提供重要的上下文给聊天室. 一个房客通过发送更新的出席信息给它自己的&amp;lt;room@service/nick&amp;gt;来改变他在房间内的可用性状态.&lt;br /&gt;
&lt;br /&gt;
'''例子 45. 房客变更可用性状态'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/oldhag'&amp;gt;&lt;br /&gt;
  &amp;lt;show&amp;gt;xa&amp;lt;/show&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务然后从该房客发送一个出席信息节来修改他或她的出席信息给每个房客的全JID, 包含扩展的出席信息，包括这个房客的角色和全JID(给那些有权知道的人):&lt;br /&gt;
&lt;br /&gt;
'''例子 46. 服务传递修改的出席信息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;show&amp;gt;xa&amp;lt;/show&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;gone where the goblins go&amp;lt;/status&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===邀请其他用户进入一个房间===&lt;br /&gt;
====直接邀请====&lt;br /&gt;
&lt;br /&gt;
一个办法是发送一个直接的邀请(而不是由房间本身来间接邀请),定义在[http://xmpp.org/extensions/xep-0249.html Direct MUC Invitations] [[XEP-0045#附录G:备注|15]]. 直接发送邀请有助于适应被邀请者那一边的通信阻塞(对方可能拒绝和和不在好友名单中的实体通信).&lt;br /&gt;
&lt;br /&gt;
====间接邀请====&lt;br /&gt;
&lt;br /&gt;
邀请别的用户到一个房间成为房客是很有用的. 为了做到这一点, 一个 MUC 客户端必须 MUST 发送以下格式的 XML 给 &amp;lt;room@service&amp;gt; 本身 (原因(reason)是可选的 OPTIONAL 而消息(message)的类型必须 MUST 是显式或隐式的&amp;quot;normal&amp;quot;类型):&lt;br /&gt;
&lt;br /&gt;
'''例子 47. 房客通过房间发送一个邀请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;room@service&amp;gt; 本身必须 MUST 接着增加一个 'from' 地址到 &amp;lt;invite/&amp;gt; 元素，其值为邀请者的纯JID, 全JID, 或房间JID，并发送邀请给 'to' 地址所指明的被邀请者(为了旧的客户端，服务可以 MAY 包含一个消息主体&amp;quot;message body&amp;quot;解释这个邀请或包含一个原因&amp;quot;reason&amp;quot;(子元素); 另外, 房间应该 SHOULD 增加 password 如果该房间是密码保护的):&lt;br /&gt;
&lt;br /&gt;
'''例子 48. 房间代表邀请者发送邀请给被邀请者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限成员的, 服务可以 MAY 同时把这个被邀请者加入成员列表. (注意: 在仅限成员的房间里邀请的权力应该 SHOULD 由房间管理员限定; 如果一个没有权限的成员修改成员列表试图邀请别的用户, 服务应该 SHOULD 返回一个 &amp;lt;forbidden/&amp;gt; 错误给该房客; 详见本文的[[XEP-0045#修改成员列表|修改成员列表]]章节.)&lt;br /&gt;
&lt;br /&gt;
如果邀请者提供了一个不存在的JID, 房间应该 SHOULD 返回一个 &amp;lt;item-not-found/&amp;gt; 错误给邀请者.&lt;br /&gt;
&lt;br /&gt;
被邀请者可以 MAY 选择正式地拒绝 (反之则忽略) 邀请; 这是发送者希望看到的正式的通知. 为了拒绝这个邀请, 被邀请者必须 MUST 发送以下格式的消息给 &amp;lt;room@service&amp;gt; 本身:&lt;br /&gt;
&lt;br /&gt;
'''例子 49. 被邀请者谢绝邀请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='hecate@shakespeare.lit/broom'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;decline to='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Sorry, I'm too busy right now.&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/decline&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 50. 房间通知邀请者邀请被拒绝了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;decline from='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Sorry, I'm too busy right now.&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/decline&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能(有人)想知道为什么被邀请者不直接发送拒绝消息给访问者. 主要原因是特定的实现可能 MAY 选择让邀请基于房间JIDs而不是纯JIDs (所以, 例如, 一个房客可能从一个房间邀请某人到另一个房间而不需要知道这个人的纯JID). 因而服务必须 MUST 同时处理邀请和拒绝.&lt;br /&gt;
&lt;br /&gt;
===把一对一聊天转为多用户会议===&lt;br /&gt;
&lt;br /&gt;
有时候人们需要把一个一对一的聊天转成一个多用户的会议. 以下例子展示了这个流程.&lt;br /&gt;
&lt;br /&gt;
首先, 两个用户开始一个一对一聊天.&lt;br /&gt;
&lt;br /&gt;
'''例子 51. 一个一对一聊天'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在第一个用户决定加入第三个人到这个讨论, 所以她 (或, 更准确地说, 她的客户端) 做以下事情:&lt;br /&gt;
&lt;br /&gt;
# 新建一个多用户聊天室&lt;br /&gt;
# 可选地发送一对一聊天的历史到房间&lt;br /&gt;
# 发送一个邀请给第二个人和第三个人, 包含一个 &amp;lt;continue/&amp;gt; 元素 (可选地包含一个 'thread' 属性).&lt;br /&gt;
&lt;br /&gt;
注意: 新房间应该 SHOULD 是非匿名的, 可以 MAY 是一个即时房间(定义于本文的[[XEP-0045#新建即时房间|新建即时房间]]章节), 也可以 MAY 有一个从服务接收的唯一房间名(定义于本文的[[XEP-0045#请求唯一的房间名|请求唯一的房间名]]章节.&lt;br /&gt;
&lt;br /&gt;
注意: 如果这个一对一的聊天消息包含了一个 &amp;lt;thread/&amp;gt; 元素, 这个新建房间的人应该 SHOULD 在历史消息中包含这个 ThreadID, 在邀请中把这个 ThreadID 的值赋予 &amp;lt;continue/&amp;gt; 元素的 'thread' 属性, 并把这 ThreadID 包含在任何新的消息中发送到房间. ThreadIDs 的使用是推荐的 RECOMMENDED ，因为它帮助提供一对一聊天和多用户聊天的连续性.&lt;br /&gt;
&lt;br /&gt;
'''例子 52. 继续讨论 I: 用户新建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 53. 继续讨论 II: 所有者发送历史到房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2004-09-29T01:54:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2004-09-29T01:55:21Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 使用 Delayed Delivery 协议使房间创建者能够从他一对一聊天历史指明每个消息的日期时间 datetime (通过 'stamp' 属性), 以及每个消息的原始发送者的 JID (通过'from' 属性). 房间创建者应该 SHOULD 在邀请额外的用户到房间之前发送完整的一对一聊天历史, 并且也应该 SHOULD 把第二个人加入该房间之前和第一个人在一对一聊天界面中出现的任何消息当成历史来发送; 如果这个一对一历史特别的大, 发送的客户端可能希望在数秒内发送这个历史而不是一次性发送所有历史(以to 避免触发频率限制). 服务不应该 SHOULD NOT 在从房间所有者接收的历史消息之前添加它自己的延迟元素&amp;quot;delay elements&amp;quot; (见本文的[[XEP-0045#讨论历史|讨论历史]]章节) .&lt;br /&gt;
&lt;br /&gt;
'''例子 54. 继续讨论 III: 所有者发送邀请(们), 包含 Continue 标志'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 当邀请者的客户端一知道和它一对一聊天的那个人的全JID之后, 它就应该 SHOULD 在邀请中包含这个全JID (而不是纯JID).&lt;br /&gt;
&lt;br /&gt;
邀请被递送到被邀请者:&lt;br /&gt;
&lt;br /&gt;
'''例子 55. 邀请被递送'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
    to='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='crone1@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;This coven needs both wiccarocks and hag66.&amp;lt;/reason&amp;gt;&lt;br /&gt;
      &amp;lt;continue thread='e0ffe42b28561960c6b12b944a092794b9683a38'/&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当客户端被 &amp;lt;wiccarocks@shakespeare.lit/laptop&amp;gt; 用来接收邀请, 它应该 SHOULD 自动加入或提示用户是否加入 (取决于用户的选项配置) 并且随后无缝地把现有的一对一聊天窗口转到一个多用户会议的窗口:&lt;br /&gt;
&lt;br /&gt;
'''例子 56. 被邀请者接受邀请, 加入房间, 并接收出席信息和历史'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/secondwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice the brinded cat hath mew'd.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
     stamp='2004-09-29T01:54:37Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;thread&amp;gt;e0ffe42b28561960c6b12b944a092794b9683a38&amp;lt;/thread&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Thrice and once the hedge-pig whined.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;delay xmlns='urn:xmpp:delay'&lt;br /&gt;
     from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
     stamp='2004-09-29T01:55:21Z'/&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 事实上,这些消息从 &amp;lt;room@service&amp;gt; 本身而不是 &amp;lt;room@service/nick&amp;gt; 发出，告诉这些接收的客户端这些消息是优先的聊天历史, 因为任何来自房客的消息的 'from' 地址应该等于发送者的房间JID.&lt;br /&gt;
&lt;br /&gt;
===房客修改房间标题===&lt;br /&gt;
&lt;br /&gt;
如果房间配置允许, 一个房客可以 MAY 被允许修改一个房间的主题. 详见本文的[[XEP-0045#修改房间主题|修改房间主题]]章节.&lt;br /&gt;
&lt;br /&gt;
===发送私有消息===&lt;br /&gt;
&lt;br /&gt;
因为每个房客有一个唯一的房间JID, 一个房客可以 MAY 发送一个私有消息 &amp;quot;private message&amp;quot; 给选定的房客，即通过服务发送一个消息给那房客的房间JID. 这个消息类型应该 SHOULD 是 &amp;quot;chat&amp;quot; 并且不能 MUST NOT 是 &amp;quot;groupchat&amp;quot;, 但是可以 MAY 不表明 (即, 一个常规&amp;quot;normal&amp;quot;消息). 这个权力应该 SHOULD 被任何房客允许 (甚至在一个被主持的房间里的游客).&lt;br /&gt;
&lt;br /&gt;
'''例子 57. 房客发送私有消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务负责把'from'地址改为发送者的房间JID并递送这个消息到预期的接收者的全JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 58. 接收者接收私有消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者尝试发送一个类型为 &amp;quot;groupchat&amp;quot; 的私有消息给特定的房客, 服务必须 MUST 拒绝递送这个消息 (因为接收者的客户端期望的房间内的消息类型为&amp;quot;groupchat&amp;quot;) 并且返回一个 &amp;lt;bad-request/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 59. 房客尝试发送类型为&amp;quot;Groupchat&amp;quot;的私有消息给特定的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;I'll give thee a wind.&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者尝试发送一个私有消息给一个不存在的房间JID, 服务必须 MUST 返回一个 &amp;lt;item-not-found/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
如果发送者不是预期的接收者正在访问的那个房间的房客, 服务必须 MUST 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
===发送消息给所有房客===&lt;br /&gt;
&lt;br /&gt;
房客发送一个消息给所有房间内的房客的方法，是发送一个类型为 &amp;quot;groupchat&amp;quot; 的消息到 &amp;lt;room@service&amp;gt; 本身 (服务可以 MAY 忽略或拒绝类型不是 &amp;quot;groupchat&amp;quot; 的消息). 在一个被主持的房间, 这个权力限于角色为与会者或更高的房客拥有.&lt;br /&gt;
&lt;br /&gt;
'''例子 60. 房客发送一个消息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者在这个房间有发言权 (在被主持的房间里缺省是这样期望), 服务必须 MUST 修改发送者的 'from' 属性成为房间JID并反射这个消息到每个房客的全JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 61. 服务反射消息给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Harpier cries: 'tis time, 'tis time.&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发送者是个游客 即, 在一个被主持的房间里没有发言权), 服务可以 MAY 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者并且不能 MUST NOT 反射这个消息给所有房客. 如果发送者不是该房间的房客, 服务应该 SHOULD 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给发送者并且不应该 SHOULD NOT 反射这个消息给所有房客; 这个规则的唯一的例外是，一个实现可以 MAY 允许用户们拥有特定的权限 (例如, 一个房间拥有者, 房间管理员, 或服务级别的管理员) 发送消息到这个房间，即使那些用户不是房客.&lt;br /&gt;
&lt;br /&gt;
===注册到房间===&lt;br /&gt;
&lt;br /&gt;
一个实现可以 MAY 允许一个无岗位的用户(在一个被主持的房间里, 通常是一个与会者) 注册一个房间从而成为该房间的一个成员 (反之, 一个实现也可以 MAY 限制这个权力并且只允许房间管理员添加新的成员). 特别是, 不在成员列表的人是无法加入一个仅限会员的房间的, 所以为了加入这样一个房间，实体需要申请会籍.&lt;br /&gt;
&lt;br /&gt;
如果允许, 这个功能应该 SHOULD 这样被实现。让用户使用 'jabber:iq:register' 名字空间[[XEP-0077|带内注册]] [[XEP-0045#附录G:备注|16]]提出注册申请给房间,:&lt;br /&gt;
&lt;br /&gt;
'''例子 62. 用户提出注册申请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='reg1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果用户提出的注册申请不被允许注册该房间 (例如, 因为那个权限被限制了), 该房间必须 MUST 返回一个 &amp;lt;not-allowed/&amp;gt; 错误给该用户. 如果该用户已经注册过了, 房间必须 MUST 返回一个类型为&amp;quot;result&amp;quot;的IQ节并包含一个空的&amp;lt;register/&amp;gt;元素(定义于'''XEP-0077'''). 如果该房间不存在, 服务必须 MUST 返回一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
否则, 房间必须 MUST 接着返回一个数据表单&amp;quot;Data Form&amp;quot;给该用户 (定义于[[XEP-0004|数据表单]] [[XEP-0045#附录G:备注|17]]). 注册需要的信息可以 MAY 根据实现和部署的不同而不同并且没有完全定义在本文中 (例如, 本文根据 'http://jabber.org/protocol/muc#register' 名字空间采用的注册字段  FORM_TYPE 可能将来会根据[[XEP-0045#字段标准化|字段标准化]]章节里描述的得到补充，). 以下是一个典型的例子:&lt;br /&gt;
&lt;br /&gt;
'''例子 63. 服务返回注册表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To register on the web, visit http://shakespeare.lit/&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Dark Cave Registration&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
        Please provide the following information&lt;br /&gt;
        to register with this room.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Given Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_first'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Family Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_last'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Desired Nickname'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_roomnick'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Your URL'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_url'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Email Address'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#register_email'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='FAQ Entry'&lt;br /&gt;
          type='text-multi'&lt;br /&gt;
          var='muc#register_faqentry'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户应该 SHOULD 接着提交这个表单:&lt;br /&gt;
&lt;br /&gt;
'''例子 64. 用户提交注册表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='jabber:iq:register'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_first'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Brunhilde&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_last'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Entwhistle-Throckmorton&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_roomnick'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_url'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://witchesonline/~hag66/&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_email'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hag66@witchesonline&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#register_faqentry'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;Just another witch.&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果期望的房间昵称已经被那个房间保留, 房间必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 65. 房间返回冲突错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该房间或服务不支持注册, 它必须 MUST 返回一个 &amp;lt;service-unavailable/&amp;gt; 错误给用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 66. 房间返回服务不可用错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果用户没有提交合法的数据表格, 房间必须 MUST 返回一个 &amp;lt;bad-request/&amp;gt; 错误给用户:&lt;br /&gt;
&lt;br /&gt;
'''例子 67. 房间返回&amp;quot;服务错误的请求&amp;quot;错误给用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
否则, 该房间必须 MUST 通知用户注册请求被成功地接收到了:&lt;br /&gt;
&lt;br /&gt;
'''例子 68. 房间通知用户注册请求已经被处理了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='reg2'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户提交表单之后, 服务可以 MAY 向一个房间 管理员/所有者 请求批准该申请 (参见本文的[[XEP-0045#批准注册申请|批准注册申请]]章节) 或也可以 MAY 立刻把该用户的岗位从&amp;quot;none&amp;quot;变更为&amp;quot;member&amp;quot;来添加此用户到成员列表. 如果服务变更了该用户的岗位并且该用户在房间里, 它必须 MUST 从这个用户发送更新的出席信息给所有房客, 声明岗位的变更，这个更新的出席信息应包含一个满足 'http://jabber.org/protocol/muc#user' 名字空间 &amp;lt;x/&amp;gt; 元素并包含一个'affiliation' 属性值设为&amp;quot;member&amp;quot;的 &amp;lt;item/&amp;gt; 子元素.&lt;br /&gt;
&lt;br /&gt;
'''例子 69. 服务发送成员变更通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个用户已经注册到一个房间, 该房间可以 MAY 选择限制这个用户在那个房间仅能使用已注册的昵称. 如果它这样做, 当用户尝试以不同于该用户之前已注册的房间昵称来加入该房间 (这使房间锁定&amp;quot;lock down&amp;quot;房间昵称以保证房客身份的一致性)的时候，它应该 SHOULD 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误给该用户.&lt;br /&gt;
&lt;br /&gt;
===获取成员列表===&lt;br /&gt;
&lt;br /&gt;
根据房间配置如果允许的话, 一个房客可以 MAY 被允许接收房间成员的列表. 详见本文的[[XEP-0045#修改成员列表|修改成员列表]]章节.&lt;br /&gt;
&lt;br /&gt;
===发现保留的房间昵称===&lt;br /&gt;
&lt;br /&gt;
一个用户可以 MAY 有一个保留的房间昵称, 例如通过显式的房间注册, 数据库集成, 或昵称锁定 &amp;quot;lockdown&amp;quot;. 用户应该 SHOULD 在尝试进入该房间之前发现自己的保留昵称. 这可以通过发送一个发现服务信息请求并指定一个服务发现节点&amp;quot;x-roomuser-item&amp;quot;给房间JID来做到.&lt;br /&gt;
&lt;br /&gt;
'''例子 70. 用户请求保留的昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='hag66@shakespeare.lit/pda'&lt;br /&gt;
    id='getnick1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='x-roomuser-item'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
对一个多用户聊天服务来说，对上述的服务发现节点的支持是可选的 OPTIONAL . 如果房间或服务不支持上述的服务发现节点, 它必须 MUST 返回一个 &amp;lt;feature-not-implemented/&amp;gt; 错误给用户. 如果它支持这个特性并且该用户有一个已注册的昵称, 它必须 MUST 返回这个昵称给这个用户，方法是发送一个服务发现的&amp;lt;identity/&amp;gt;元素，其'name'属性值为这个昵称 (此处 category/type 应该 SHOULD 是 &amp;quot;conference/text&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
'''例子 71. 房间返回昵称'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='getnick1'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='x-roomuser-item'&amp;gt;&lt;br /&gt;
    &amp;lt;identity&lt;br /&gt;
        category='conference'&lt;br /&gt;
        name='thirdwitch'&lt;br /&gt;
        type='text'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户没有已注册的昵称, 房间必须 MUST 返回一个空的服务发现 &amp;lt;query/&amp;gt; 元素 (根据 '''XEP-0030''').&lt;br /&gt;
&lt;br /&gt;
即使一个用户已经注册了一个房间昵称, 服务应该 SHOULD 允许该用户在加入该房间时指定一个不同的昵称 (例如, 为了从不同的客户端资源加入), 尽管该服务可以 MAY 选择通过一个 &amp;lt;not-acceptable/&amp;gt; 错误来锁定 &amp;quot;lock down&amp;quot; 昵称并拒绝该用户 . 如果该用户的客户端在加入该房间之后发送上述请求，服务不能 MUST NOT 返回一个错误给该用户, 而应该 SHOULD 返回上文所述.&lt;br /&gt;
&lt;br /&gt;
如果另一个用户尝试以第一个用户保留的房间昵称来加入房间, 服务必须 MUST 拒绝第二个用户并返回一个前文所述的 &amp;lt;conflict/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
===申请发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里游客是不能发言的 (即, 发送一个消息给所有房客). 为了申请发言权, 一个游客应该 SHOULD 发送包含一个数据表格的 &amp;lt;message/&amp;gt; 节给房间本身, 这个数据表格仅仅是一个 'muc#role' 字段，值为 &amp;quot;participant&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 72. 房客申请发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='hag66@shakespeare.lit/pda'&lt;br /&gt;
         to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Requested role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务接着应该 SHOULD 转发这个请求给房间主持人(们) ，定义于本文的[[XEP-0045#批准发言权申请|批准发言权申请]].&lt;br /&gt;
&lt;br /&gt;
==主持人用例==&lt;br /&gt;
&lt;br /&gt;
一个主持人有权在房间里执行特定的动作 (例如, 变更某些房客的角色) 但无权变更岗位的持久信息 (它只能被管理员或所有者) 或定义关于这个房间的信息. 具体哪些动作可由主持人执行，取决于配置. 无论如何, 对于 MUC 框架来说, 主持人被规定有权执行以下动作:&lt;br /&gt;
&lt;br /&gt;
# 在一个半匿名的房间里发现一个房客的全JID(如上文所述缺省会发生)&lt;br /&gt;
# 修改主题&lt;br /&gt;
# 从该房间踢出一个与会者或游客&lt;br /&gt;
# 在一个被主持的房间里授予或撤销发言权&lt;br /&gt;
# 在一个被主持的房间里修改拥有发言权的房客列表&lt;br /&gt;
&lt;br /&gt;
这些特性将通过一个基于 &amp;lt;iq/&amp;gt; 元素的 请求/应答 交换来实现，这个IQ元素包含一个满足 'http://jabber.org/protocol/muc#admin' 名字空间的子元素. 以下例子展示这个协议和实现如何互动达到期望的功能. (以下除非显式地提及, 任何接下来的管理请求必须 MUST 被拒绝,如果该请求的'from'地址 &amp;lt;user@host&amp;gt; 和主持人的纯JID不符的话; 在这种情况下, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误.)&lt;br /&gt;
&lt;br /&gt;
===修改房间主题===&lt;br /&gt;
&lt;br /&gt;
多用户聊天室的一个常用特性是变更房间主题的能力. 缺省地, 一个房间里只有角色为主持人 &amp;quot;moderator&amp;quot; 的用户应该 SHOULD 被允许变更主题 (尽管这应该 SHOULD 是可配置的, 结果是如果需要的话，仅仅与会者或甚至游客都被允许修改主题). 主题变更是通过发送一个类型为 &amp;quot;groupchat&amp;quot; 的消息给 &amp;lt;room@service&amp;gt;来实现的, 在这里 &amp;lt;message/&amp;gt; 必须 MUST 包含一个 &amp;lt;subject/&amp;gt; 元素以指定新的主题，但不应该 SHOULD NOT 包含其他元素 (例如, 不应该有 &amp;lt;body/&amp;gt; 元素或 &amp;lt;thread/&amp;gt; 元素).&lt;br /&gt;
&lt;br /&gt;
'''例子 73. 主持人变更主题'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个 MUC 服务接收到这样一个消息, 它必须 MUST 以发送这个变更主题消息的那个用户的房间JID作为'from'地址来反射这个消息给所有其他房客:&lt;br /&gt;
&lt;br /&gt;
'''例子 74. 服务通知所有房客主题变更'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 当一个新的房客加入房间时，该房间应该 SHOULD 在被发送的讨论历史中包含最后的主题变更.&lt;br /&gt;
&lt;br /&gt;
一个接收到这类信息的 MUC 客户端可以 MAY 选择显示一个房间内的消息, 如下:&lt;br /&gt;
&lt;br /&gt;
'''例子 75. 客户端显式房间主题变更消息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
* secondwitch has changed the subject to: Fire Burn and Cauldron Bubble!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一些没有适当权限的人尝试变更房间主题, 服务必须 MUST 返回一个 &amp;quot;error&amp;quot; 类型的消息指明一个 &amp;lt;forbidden/&amp;gt; 错误条件:&lt;br /&gt;
&lt;br /&gt;
'''例子 76. 服务返回未被授权变更主题的错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;Fire Burn and Cauldron Bubble!&amp;lt;/subject&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
为了移除现有的主题而不是提供一个新主题 (即, 设置主题为空), 客户端应该发送一个空的 &amp;lt;subject/&amp;gt; 元素 (即,  &amp;quot;&amp;lt;subject/&amp;gt;&amp;quot; 或 &amp;quot;&amp;lt;subject&amp;gt;&amp;lt;/subject&amp;gt;&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 77. 主持人设置空的主题'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===踢出房客===&lt;br /&gt;
&lt;br /&gt;
主持人有权从一个房间踢出特定种类的房客 (哪些房客是可被踢的 &amp;quot;kickable&amp;quot; 取决于服务规定, 房间配置, 以及主持人的岗位 -- 见下文). 踢人通常基于房客的房间昵称来执行 (尽管可以 MAY 基于全JID) 并且完全是通过把与会者或游客的角色设为 &amp;quot;none&amp;quot; 来实现的.&lt;br /&gt;
&lt;br /&gt;
'''例子 78. 主持人踢出房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='fluellen@shakespeare.lit/pda'&lt;br /&gt;
    id='kick1'&lt;br /&gt;
    to='harfleur@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='pistol' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Avaunt, you cullion!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 移除被踢的用户，通过发送一个类型为 &amp;quot;unavailable&amp;quot; 的出席信息节给每个被踢的房客, 这个出席信息应在其扩展出席信息中包含状态码 307 , 或(可选地)包含 reason 子元素(如果提供了) 以及踢人的执行者的纯JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 79. 服务移除被踢的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='harfleur@henryv.shakespeare.lit/pistol'&lt;br /&gt;
    to='pistol@shakespeare.lit/harfleur'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='fluellen@shakespeare.lit'/&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Avaunt, you cullion!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='307'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
包含状态码可使客户端能够提交他们自己的通知消息 (例如, 适当的用户位置的信息). 可选的包含原因 reason 元素以及执行者 actor 使得被踢的用户能理解为什么他或她被踢了, 以及被踢的用户可以找谁去理论. [[XEP-0045#附录G:备注|18]]&lt;br /&gt;
&lt;br /&gt;
移除被踢的房客(们)之后, 服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 80. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='harfleur@henryv.shakespeare.lit'&lt;br /&gt;
    id='kick1'&lt;br /&gt;
    to='fluellen@shakespeare.lit/pda'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
通知主持人之后, 服务必须 MUST 接着通知剩余的房客那个被踢的房客已经不在房间里了,即从被踢者的房间昵称(&amp;lt;room@service/nick&amp;gt;)发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给所有剩余的房客 (就像房客自愿退出房间时所做的一样), 包含状态码 status 以及可选的原因 reason 和执行者 actor.&lt;br /&gt;
&lt;br /&gt;
'''例子 81. 服务通知剩余的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='harfleur@henryv.shakespeare.lit/pistol'&lt;br /&gt;
    to='gower@shakespeare.lit/cell'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='307'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个用户不能被比自己岗位低的主持人踢出. 所以, 如果一个身为与会者的主持人尝试踢出一个管理员，或一个身为与会者的主持人或管理员尝试踢出一个所有者, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 82. 服务对于尝试踢出更高岗位的用户返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='kicktest'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='firstwitch' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Be gone!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个主持人尝试踢出他自己, 服务可以 MAY 拒绝这个请求并返回一个 &amp;lt;conflict/&amp;gt; 错误给发送者. (尽管这个踢出自己的行为可能看起来怪异, 它在 IRC 里很常见，用于在房间里为某人的行为道歉.)&lt;br /&gt;
&lt;br /&gt;
===授予游客发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里, 主持人可能希望管理房间内谁有水没有发言权 &amp;quot;voice&amp;quot; (即, 发送消息给所有房客的能力). 发言权的授予是基于游客的房间昵称来的, 服务将从内部把这个房间昵称转成游客的全JID. 主持人通过把游客的角色变更为与会者 &amp;quot;participant&amp;quot;来给一个游客授予权限.&lt;br /&gt;
&lt;br /&gt;
'''例子 83. 主持人授予权限给一个游客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 84. 主持人授予权限给一个游客(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 85. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个人的&amp;lt;room@service/nick&amp;gt;发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'role'属性值为&amp;quot;participant&amp;quot;，指明添加了发言权.&lt;br /&gt;
&lt;br /&gt;
'''例子 86. 服务发送发言权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销与会者发言权===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里, 主持人可能希望撤销一个与会者发言的权力,主持人通过把与会者的角色变更为游客 &amp;quot;visitor&amp;quot;来撤销一个游客的发言权:&lt;br /&gt;
&lt;br /&gt;
'''例子 87. 主持人撤销一个与会者的发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 88. 主持人撤销一个与会者的发言权(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='visitor'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 89. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voice2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个人的&amp;lt;room@service/nick&amp;gt;发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'role'属性值为&amp;quot;visitor&amp;quot;，指明移除了发言权.&lt;br /&gt;
&lt;br /&gt;
'''例子 90. 服务通知失去发言权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个主持人不能 MUST NOT 从一个岗位等于或高于主持人岗位的用户撤销发言权. 另外, 服务不能 MUST NOT 允许一个管理员或所有者的发言权被任何人撤销. 如果一个主持人尝试撤销这些人的发言权, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 的错误给发送者(通过以下的违规条目):&lt;br /&gt;
&lt;br /&gt;
'''例子 91. 服务对于尝试从管理员，所有者或更高岗位的用户撤销权限返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='voicetest'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='secondwitch' role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改发言权列表===&lt;br /&gt;
&lt;br /&gt;
在一个被主持的房间里主持人可能希望管理发言权列表. 为了达到这个目的, 主持人首先查询房间所有角色为'participant'的房客列表来请求发言权列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 92. 主持人请求发言权列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='voice3'&lt;br /&gt;
    to='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回发言权列表给主持人; 每个条目必须 MUST 包含 'nick' 和 'role' 属性并且应该 SHOULD 包含 'affiliation' 和 'jid' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 93. 服务发送发言权列表给主持人'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voice3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='polonius@hamlet/castle'&lt;br /&gt;
          nick='Polo'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='horatio@hamlet/castle'&lt;br /&gt;
          nick='horotoro'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
主持人可以 MAY 接着修改发言权列表. 为了达到这个目的, 主持人必须 MUST 发送变更了的条目 (即, 只有 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'nick' 属性和 'role' 属性 (通常设置值为 &amp;quot;participant&amp;quot; 或 &amp;quot;visitor&amp;quot;) 但是不应该 SHOULD NOT 包含 'jid' 属性并且不能 MUST NOT 包含 'affiliation' 属性 (它用于管理如所有者那样的岗位而不是与会者那样的角色):&lt;br /&gt;
&lt;br /&gt;
'''例子 94. 主持人发送修改的发言权列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='voice4'&lt;br /&gt;
    to='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='Hecate'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='rosencrantz'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy fellow.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='guildenstern'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy fellow.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 95. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voice1'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着为任何受影响的人发送更新的出席信息给所有房客, 如前文的用例所述，发送适当的扩展出席信息来指明发言权的变更.&lt;br /&gt;
&lt;br /&gt;
大家知道, 不能撤销一个房间所有者或管理员的发言权, 也不能撤销比发出请求的主持人岗位高的用户的发言权. 如果一个房间管理员尝试通过修改发言权列表来撤销这类用户的发言权, 服务必须 MUST 拒绝请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 96. 服务返回错误给试图撤销管理员，所有者或比发送者岗位更高的用户的发言权的发送者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='goodfolk@chat.shakespeare.lit'&lt;br /&gt;
    id='voicetest'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='visitor'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===批准发言权申请===&lt;br /&gt;
&lt;br /&gt;
在本文的[[XEP-0045#申请发言权|申请发言权]]章节提到, 当服务接受到一个来自房客的请求，它应该 SHOULD 转发那个请求给房间的主持人(们). 为了达到这个目的, 服务应该 SHOULD 发送一个 &amp;lt;message/&amp;gt; 节给房间主持人(们), 这里 &amp;lt;message/&amp;gt; 节包含一个数据表格data form来批准或拒绝这个申请, 如下所示.&lt;br /&gt;
&lt;br /&gt;
'''例子 97. 申请批准发言权表格''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='crone1@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Voice request&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To approve this request for voice, select &lt;br /&gt;
      the &amp;amp;quot;Grant voice to this person?&amp;amp;quot;&lt;br /&gt;
      checkbox and click OK. To skip this request, &lt;br /&gt;
      click the cancel button.&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Requested role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#jid'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='User ID'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@shakespeare.lit/pda&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#roomnick'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Room Nickname'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#request_allow'&lt;br /&gt;
           type='boolean'&lt;br /&gt;
           label='Grant voice to this person?'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
为了批准这个申请, 主持人将提交此表格:&lt;br /&gt;
&lt;br /&gt;
'''例子 98. 批准发言权申请'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='crone1@shakespeare.lit/pda'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#role'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#jid'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@shakespeare.lit/pda&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#roomnick'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#request_allow'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果主持人批准了这个发言权申请, 服务将授予发言权给该房客并发送一个出席信息更新，如本文[[XEP-0045#授予游客发言权|授予游客发言权]]章节所述.&lt;br /&gt;
&lt;br /&gt;
==管理员用例==&lt;br /&gt;
&lt;br /&gt;
一个房间管理员有权修改用户岗位的持久信息 (例如, 通过禁止用户) 并授予和撤销主持人权限, 但是无权修改房间的定义, 那是唯一属于房间所有者(们)的权力. 具体哪些动作是管理员可以执行的则取决于配置. 无论如何, 在 MUC 框架中的用途, 规定房间管理员最少拥有执行以下操作的权限:&lt;br /&gt;
&lt;br /&gt;
# 在房间里禁止一个用户&lt;br /&gt;
# 在房间里修改黑名单&lt;br /&gt;
# 授予或撤销成员资格&lt;br /&gt;
# 修改成员列表&lt;br /&gt;
# 授予或撤销主持人权力&lt;br /&gt;
# 修改主持人列表&lt;br /&gt;
&lt;br /&gt;
这些特性将由一个 请求/应答 request/response 式的交换来实现，使用 &amp;lt;iq/&amp;gt; 元素，包含满足 'http://jabber.org/protocol/muc#admin' 名字空间的子元素. 以下例子展示协议如何与实现互动以得到期望的功能. (以下除非显示地声明, 如果发送方的'from'地址中的&amp;lt;user@host&amp;gt;和任何房间管理员的纯JID都不同，接下来的任何管理请求必须 MUST 被拒绝; 这种情况下, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误.)&lt;br /&gt;
&lt;br /&gt;
===禁止用户===&lt;br /&gt;
&lt;br /&gt;
在房间里一个管理员或所有者可以禁止一个或多个用户. 这动作必须 MUST 基于房客的纯JID来执行. 为了禁止一个用户, 管理员必须 MUST 把该用户的岗位改为&amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 99. 管理员禁止用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 100. 管理员禁止用户(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把那个纯JID添加到黑名单, 应该 SHOULD 把被排斥者的昵称从已注册的昵称列表中移除, 并且必须 MUST 通知管理员或所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 101. 服务通知管理员或所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也移除任何还在房间中的被禁止的用户，通过发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给每个被禁止的房客, 在扩展的出席信息中包含一个状态码 301 , 可选地带上 reason (如果服务提供的话) 以及执行这个禁止动作的用户的纯JID.&lt;br /&gt;
&lt;br /&gt;
'''例子 102. 服务移除被禁止的用户'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='southampton@henryv.shakespeare.lit/cambridge'&lt;br /&gt;
    to='earlofcambridge@shakespeare.lit/stabber'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='kinghenryv@shakespeare.lit'/&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='301'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
包含状态码可使客户端能够提交他们自己的通知消息 (例如, 适当的用户位置的信息). 可选的包含原因 reason 元素以及执行者 actor 使得被踢的用户能理解为什么他或她被踢了, 以及被踢的用户可以找谁去理论.&lt;br /&gt;
&lt;br /&gt;
通知主持人之后, 服务必须 MUST 接着通知剩余的房客那个被禁止的房客已经不在房间里了,即从被禁止用户发送 &amp;quot;unavailable&amp;quot; 类型的出席信息节给所有剩余的房客 (就像房客自愿退出房间时所做的一样), 包含状态码 status 以及可选的原因 reason 和执行者 actor. &lt;br /&gt;
&lt;br /&gt;
'''例子 103. 服务通知剩余的房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    type='unavailable'&lt;br /&gt;
    from='southampton@henryv.shakespeare.lit/cambridge'&lt;br /&gt;
    to='exeter@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit/stabber'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='301'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
就像[[XEP-0045#踢出房客|踢出房客]]一样, 一个用户不能被自己岗位低的管理员禁止. 所以, 如果一个管理员尝试禁止一个所有者， 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者: &lt;br /&gt;
&lt;br /&gt;
'''例子 104. 服务对尝试禁止更高岗位用户返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban1'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个管理员或所有者尝试禁止他自己, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;conflict/&amp;gt; 错误给发送者. (注意:这和踢出自己时推荐的服务行为不同, 踢自己的行为服务是允许的.)&lt;br /&gt;
&lt;br /&gt;
===修改黑名单===&lt;br /&gt;
&lt;br /&gt;
房间管理员可能希望修改黑名单. 注意: 黑名单总是基于用户的纯JID. 要修改黑名单, 管理员首先向房间查询所有岗位为'outcast'的用户以得到黑名单.&lt;br /&gt;
&lt;br /&gt;
'''例子 105. 管理员请求黑名单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban2'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回黑名单给管理员; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性但不应该 SHOULD NOT 包含 'nick' 和 'role' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 106. 服务发送黑名单给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban2'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改黑名单. 为此, 管理员必须 MUST 发送变更的条目 (即, 仅是 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'affiliation' 属性 (通常设为&amp;quot;outcast&amp;quot;来禁止或&amp;quot;none&amp;quot;来取消禁止) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用来管理角色，例如与会者，而不是被排斥者岗位); 另外, reason 和 actor 元素是可选的 OPTIONAL:&lt;br /&gt;
&lt;br /&gt;
'''例子 107. 管理员发送修改的黑名单给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    id='ban3'&lt;br /&gt;
    to='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='earlofcambridge@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&amp;gt;&lt;br /&gt;
          jid='lordscroop@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='sirthomasgrey@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Treason&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更新黑名单之后, 服务必须 MUST 通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 108. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='southampton@henryv.shakespeare.lit'&lt;br /&gt;
    id='ban3'&lt;br /&gt;
    to='kinghenryv@shakespeare.lit/throne'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着移除受影响的房客 (如果他们在房间里) 并从他们发送更新的出席信息 (包含适当的状态码) 给所有剩余的房客，如 &amp;quot;禁止用户&amp;quot; 用例所述. (服务应该 SHOULD 也移除从保留房间昵称列表中移除每个被禁止的用户的保留昵称, 如果必要.)&lt;br /&gt;
&lt;br /&gt;
当一个实体被一个房间禁止, 实现应该 SHOULD 按以下顺序匹配 JIDs (这些匹配规则和'''RFC 3921'''中定义的隐私列表的匹配规则是相同的):&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;user@domain/resource&amp;gt; (仅匹配特定的资源)&lt;br /&gt;
# &amp;lt;user@domain&amp;gt; (匹配任何资源)&lt;br /&gt;
# &amp;lt;domain/resource&amp;gt; (仅匹配特定资源)&lt;br /&gt;
# &amp;lt;domain&amp;gt; (匹配域名本身, 就像任何 user@domain 或 domain/resource 一样)&lt;br /&gt;
&lt;br /&gt;
一些管理员可能希望在一个 MUC 服务中的所有房间里禁止所有和特定域名相关的用户. 这个功能是一个服务级的特性，所以超过了本文的范围, 它定义在 '''XEP-0133'''里.&lt;br /&gt;
&lt;br /&gt;
===授予成员资格===&lt;br /&gt;
&lt;br /&gt;
管理员可以授予成员资格给一个用户; 方法是把用户的岗位改为 &amp;quot;member&amp;quot; (通常如果用户在房间里，基于昵称，如果用户不在房间里，则基于纯JID; 在这两种情况下如果提供了昵称, 那么这个昵称就是用户在这个房间的缺省昵称，如果实现支持那个功能的话):&lt;br /&gt;
&lt;br /&gt;
'''例子 109. 管理员授予成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 110. 管理员授予成员资格(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把这个用户添加到成员列表，然后通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 111. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;member&amp;quot;，指明授予了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 112. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间里, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 在这个消息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;member&amp;quot;，指明授予了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 113. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销成员资格===&lt;br /&gt;
&lt;br /&gt;
一个管理员可能想撤销一个用户的成员资格; 通过把该用户的岗位改为&amp;quot;none&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 114. 管理员撤销成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 115. 管理员撤销成员资格(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 从成员列表中移除该用户然后通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 116. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以这个用户的名义发送更新的出席信息节给所有房客, 在这个出席信息里包含了一个满足'http://jabber.org/protocol/muc#user'名字空间的&amp;lt;x/&amp;gt;元素，&amp;lt;x/&amp;gt;元素则包含一个&amp;lt;item/&amp;gt;子元素，其'affiliation'属性值为&amp;quot;none&amp;quot;，指明失去了成员资格.&lt;br /&gt;
&lt;br /&gt;
'''例子 117. 服务通知失去成员资格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间是仅限会员的, 服务必须 MUST 从房间移除这个用户, 包含一个状态码 321 来指明用户被移除是因为岗位变更, 并通知所有剩余的房客:&lt;br /&gt;
&lt;br /&gt;
'''例子 118. 服务移除非会员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;actor jid='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;status code='321'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='321'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改成员列表===&lt;br /&gt;
&lt;br /&gt;
在一个仅限会员的房间的上下文里, 成员列表本质上是一个允许人们加入房间的白名单 &amp;quot;whitelist&amp;quot;. 任何不是成员的人等于是被禁止加入该房间, 即使他们的岗位不是&amp;quot;outcast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
在一个开放房间的上下文里, 成员列表只是一个注册了这个房间的用户 (纯JID和保留的昵称) 的列表. 这些用户可以出现在一个房间名册里, 有他们自己的保留房间昵称, 在搜索结果或类似FAQ里被返回给(查询者).&lt;br /&gt;
&lt;br /&gt;
推荐 RECOMMENDED 在仅限会员的房间里只让房间管理员拥有修改成员列表的权力. 为此, 管理员首先请求成员列表，通过查询房间里所有岗位为&amp;quot;member&amp;quot;的用户来实现:&lt;br /&gt;
&lt;br /&gt;
'''例子 119. 管理员请求成员列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: 在一个仅限会员的房间里，服务也应该 SHOULD 返回成员列表给任何房客; 即, 当一个房间的成员请求房间列表时，它不应该 SHOULD NOT 生成一个 &amp;lt;forbidden/&amp;gt; 错误. 这个功能可帮助客户端展示所有现有的成员，即使他们中的一些人不在房间里, 例如. 帮助成员确定是否另一个用户应该被邀请. 服务也应该 SHOULD 允许任何成员接收成员列表，即使还不是一个房客（译注：即未进入房间）.&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回全部的成员列表给管理员，遵循 'http://jabber.org/protocol/muc#admin' 名字空间; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，每个正在房间里的成员可以 MAY 包含 'nick' 和 'role' 属性.&lt;br /&gt;
&lt;br /&gt;
'''例子 120. 服务发送成员列表给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member3'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改成员列表. 为此, 管理员必须 MUST 发送变更的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'affiliation' 属性(通常值设为 &amp;quot;member&amp;quot; 或 &amp;quot;none&amp;quot;) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，并且不能 MUST NOT 包含 'role' 属性(它是用来管理角色的，例如与会者，而不是成员的岗位):&lt;br /&gt;
&lt;br /&gt;
'''例子 121. 管理员发送修改的成员列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='member4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 修改成员列表然后通知主持人成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 122. 服务通知主持人成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='member4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 变更任何受影响的用户的岗位. 如果该用户已经从成员列表中移除了, 服务必须 MUST 把该用户的岗位从 &amp;quot;member&amp;quot; 变更为 &amp;quot;none&amp;quot;. 如果该用户已经被加入到成员列表, 服务必须 MUST 把该用户的岗位改成 &amp;quot;member&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
如果一个被移除的成员正在一个仅限会员的房间, 服务应该 SHOULD 踢出这个房客，如前文所述，通过把被移除的成员的角色改成 &amp;quot;none&amp;quot; 并发送适当的出席信息给这个被移除的成员来实现. 无论是否被移除的那个用户在或不在一个仅限会员的房间里, 服务必须 MUST 随后拒绝这个用户的进入.&lt;br /&gt;
&lt;br /&gt;
对所有的房间类型来说, 服务必须 MUST 以这个用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'affiliation'属性值设为&amp;quot;none&amp;quot;,以指明这个岗位的变更.&lt;br /&gt;
&lt;br /&gt;
'''例子 123. 服务发送失去成员资格的通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 服务必须 SHOULD 发送一个邀请给任何已加入到仅限会员的房间里的成员名单中的用户，如果该用户目前在该房间还没有岗位, 例如作为一个管理员或所有者(这类用户在定义时不在房间里; 同时要注意这个例子里使用了一个密码password而不是原因reason -- 这两个子元素都是可选的 OPTIONAL):&lt;br /&gt;
&lt;br /&gt;
'''例子 124. 房间发送邀请给新成员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite from='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
因为只有管理员们和所有者们应该 SHOULD 被允许修改成员列表, 一个实现可以 MAY 提供一个配置选项，在仅限会员的房间里开放邀请权限给任何成员. 这种情况下, 任何被发送的邀请都应该 SHOULD 自动触发被邀请者加入成员列表. 无论如何, 如果邀请权限被限于管理员们，而普通成员尝试发送邀请, 服务必须 MUST 拒绝这个邀请的的请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 125. 服务在普通成员尝试邀请其他人加入仅限会员的房间时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;&lt;br /&gt;
        Hey Hecate, this is the place for all good witches!&lt;br /&gt;
      &amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从开放房间发送的邀请不能 MUST NOT 触发被邀请者加入成员列表.&lt;br /&gt;
&lt;br /&gt;
如果一个用户被加入一个开放房间的成员列表并且该用户在该房间内, 服务必须 MUST 以该用户的名义发送更新的出席信息给所有房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'affiliation'属性值设为&amp;quot;member&amp;quot;,以指明这个岗位的变更.&lt;br /&gt;
&lt;br /&gt;
'''例子 126. 服务发送成员资格通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/hecate'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===授予主持人权限===&lt;br /&gt;
&lt;br /&gt;
管理员可能想授予主持人权限给一个与会者或游客; 通过把用户的角色改为 &amp;quot;moderator&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 127. 管理员授予主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 128. 管理员授予主持人权限(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='moderator'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 添加这个用户到主持人列表然后通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 129. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以该用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;moderator&amp;quot;,以指明添加了主持人权限.&lt;br /&gt;
&lt;br /&gt;
'''例子 130. 服务发送主持人权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销主持人权限===&lt;br /&gt;
&lt;br /&gt;
管理员可能想撤销用户的主持人权限. 一个管理员只可以 MAY 撤销岗位为&amp;quot;member&amp;quot; 或 &amp;quot;none&amp;quot; (也就是, 非管理员和所有者)的用户的主持人权限. 权限的撤销是通过把用户的角色改为 &amp;quot;participant&amp;quot;实现的:&lt;br /&gt;
&lt;br /&gt;
'''例子 131. 管理员撤销主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 132. 管理员撤销主持人权限(包含一个原因Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='thirdwitch'&lt;br /&gt;
          role='participant'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 从主持人列表移除这个用户然后通知管理员成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 133. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着以该用户的名义发送更新的出席信息给所有的房客, 这个出席信息拥有一个满足 'http://jabber.org/protocol/muc#user'  名字空间的&amp;lt;x/&amp;gt; 元素并包含一个&amp;lt;item/&amp;gt;子元素, 这个子元素的'role'属性值设为&amp;quot;participant&amp;quot;,以指明移除了主持人权限. &lt;br /&gt;
&lt;br /&gt;
'''例子 134. 服务通知失去了主持人权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
大家知道, 管理员不 MUST NOT 被允许从岗位为 &amp;quot;owner&amp;quot; 或 &amp;quot;admin&amp;quot;的用户撤销主持人权限. 如果一个管理员尝试撤销这类用户的权限, 服务必须MUST 拒绝这个请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 135. 服务在用户尝试撤销管理员或所有者的主持人权限时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='modtest'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='secondwitch' role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改主持人列表===&lt;br /&gt;
&lt;br /&gt;
管理员可能希望修改主持人列表. 为此, 管理员首先通过请求房间内所有角色为'moderator'的用户来请求主持人列表.&lt;br /&gt;
&lt;br /&gt;
'''例子 136. 管理员请求主持人列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着返回主持人列表给管理员; 每个条目必须 MUST 包含 'jid', 'nick', 'role' 属性并应该 SHOULD 包含 'affiliation' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 137. 服务发送主持人列表给管理员'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod3'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          nick='thirdwitch'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理员可以 MAY 接着修改主持人列表. 为此, 管理员必须 MUST发送修改的条目(即, 仅&amp;quot;delta&amp;quot;) 给服务; 每个条目必须 MUST 包含 'jid' 属性和'role' 属性(通常值设为 &amp;quot;member&amp;quot; 或 &amp;quot;participant&amp;quot;) 但不应该 SHOULD NOT 包含 'nick' 属性并且不能 MUST NOT 包含 'affiliation' 属性(它被用于管理类似管理员这样的岗位而不是主持人这样的角色):&lt;br /&gt;
&lt;br /&gt;
'''例子 138. 管理员发送修改了的主持人列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='mod4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hag66@shakespeare.lit/pda'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 修改主持人列表并通知管理员成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 139. 服务通知管理员成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='mod4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 随后以所有受影响的用户发送更新的出席信息给所有的房客, 支出主持人权限的变更，通过发送前面用例所述的适当的扩展出席信息.&lt;br /&gt;
&lt;br /&gt;
显然, 房间所有者或房间管理员的主持人权限不能被撤销. 如果一个房间管理员尝试通过修改主持人列表来撤销这类用户的主持人权限, 服务必须 MUST 拒绝请求并返回一个 &amp;lt;not-allowed/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 140. 服务在用户尝试撤销管理员或所有者的主持人权限时返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='modtest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item jid='hecate@shakespeare.lit/broom'&lt;br /&gt;
          nick='Hecate'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===批准注册申请===&lt;br /&gt;
&lt;br /&gt;
如果一个服务不自动接受注册到房间的请求, 它可以 MAY 为房间管理员提供一个方法来批准或拒绝来自 Jabber 的注册请求(替代方案是, 它可能提供一个 web 接口或一些其他管理工具). 对这个服务来说，最简单的办法就是，当接收到注册请求时发送一个 &amp;lt;message/&amp;gt; 节给房间管理员(们), 这里的&amp;lt;message/&amp;gt; 节包含一个数据表格 Data Form asking 用来询问管理员是否批准用户的注册申请. 推荐 RECOMMENDED 以下数据表格 Data Form，但是实现可以 MAY 使用完全不同的表格, 或or 在下面的表格基础上补充字段.&lt;br /&gt;
&lt;br /&gt;
'''例子 141. 注册申请批准表格'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         id='approve'&lt;br /&gt;
         to='crone1@shakespeare.lit/pda'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Registration request&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;instructions&amp;gt;&lt;br /&gt;
      To approve this registration request, select the&lt;br /&gt;
      &amp;amp;quot;Allow this person to register with the room?&amp;amp;quot;&lt;br /&gt;
      checkbox and click OK. To skip this request, click the &lt;br /&gt;
      cancel button.&lt;br /&gt;
    &amp;lt;/instructions&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_first'&lt;br /&gt;
           type='text-single'&lt;br /&gt;
           label='Given Name'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Brunhilde&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_last'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Family Name&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Entwhistle-Throckmorton&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_roomnick'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Desired Nickname&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;thirdwitch&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_url'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;User URL&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;http://witchesonline/~hag66/&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_email'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;Email Address&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;hag66@witchesonline&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_faqentry'&lt;br /&gt;
           type=&amp;quot;text-single&amp;quot;&lt;br /&gt;
           label=&amp;quot;FAQ Entry&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;Just another witch.&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='muc#register_allow'&lt;br /&gt;
           type='boolean'&lt;br /&gt;
           label='Allow this person to register with the room?'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果管理员批准了注册申请, 服务将把该用户注册到房间.&lt;br /&gt;
&lt;br /&gt;
更多高级的批准机制(例如, 使用特定命令[http://xmpp.org/extensions/xep-0050.html Ad-Hoc Commands] [[XEP-0045#附录G:备注|19]]来接收注册申请列表,就像 [http://xmpp.org/extensions/xep-0060.html Publish-Subscribe] [[XEP-0045#附录G:备注|20]]里所做的一样) 超出了本文的范围.&lt;br /&gt;
&lt;br /&gt;
==所有者用例==&lt;br /&gt;
&lt;br /&gt;
每个房间必须 MUST 至少有一个所有者, 而所有者(或一个成功者)在一个房间的生命周期里是这个房间长期存在的属性(例如, 所有者在退出一个持久性的房间时不会失去所有权). 本文假定(初始的) 房间所有者是那个新建了该房间的用户并且有一个房间所有者有权修改房间配置选项的定义，例如房间类型. 理想情况下, 房间所有者不仅能指定房间类型(密码保护的, 仅限会员的, 等等) 而且包括如本文的 [XEP-0045#需求|需求]章节所述的房间特定属性. 另外, 如果所有者能指定其他所有者们的JID也是不错的, 但那将取决于具体实现.&lt;br /&gt;
&lt;br /&gt;
为了让配置选项更加广泛提供必要的伸缩性, 房间配置将使用 Data Forms ('''XEP-0004'''), 通过使用由 'http://jabber.org/protocol/muc' 名字空间触发. 也就是, 如果一个实体在它请求加入房间的 join/request 里不包含 MUC 名字空间, 那么服务将立刻新建房间，在新建房间之前不等待通过数据表格进行配置(这保证了和旧的&amp;quot;groupchat 1.0&amp;quot;协议的向后兼容); 无论如何, 如果房间的 join/create 请求包含了 MUC 扩展, 那么服务在新建和解锁该房间之前将通过数据表格请求配置.&lt;br /&gt;
&lt;br /&gt;
注意: 以下展示的配置选项列出了本文的需求章节的所有特性和房间类型; 无论如何, 实际的配置选项和表格布局将取决于实现和具体的布署. 而且, 这些只是例子，不代表这些就是房间可以拥有的所有允许或需要的配置选项. 一个特定的实现或布署可以 MAY 选择提供额外的配置选项(敏感词过滤, 设置房间的缺省语言, 消息记录, 等等), 这就是为什么在这里使用 'jabber:x:data' 协议是很有价值的.&lt;br /&gt;
&lt;br /&gt;
===新建房间===&lt;br /&gt;
====一般注意事项====&lt;br /&gt;
&lt;br /&gt;
新建房间的权限可以 MAY 限制在特定的用户群或可以 MAY 保留给一个服务级别的管理员. 如果访问被拒绝而一个用户试图新建一个房间, 服务必须MUST 返回一个 &amp;lt;not-allowed/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 142. 服务通知用户不能新建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果访问不限制, 服务必须 MUST 允许用户按以下步骤新建房间.&lt;br /&gt;
&lt;br /&gt;
从房间创建的视角来看, 本质上有两种房间:&lt;br /&gt;
&lt;br /&gt;
* 即时房间&amp;quot;Instant rooms&amp;quot; -- 可以立刻访问并基于某些缺省配置自动创建.&lt;br /&gt;
* 保留房间&amp;quot;Reserved rooms&amp;quot; -- 在任何人访问之前由房间配置者手动创建.&lt;br /&gt;
&lt;br /&gt;
新建和配置这些房间的流程如下:&lt;br /&gt;
&lt;br /&gt;
# 用户必须 MUST 发送出席信息到 &amp;lt;room@service/nick&amp;gt; 并声明他或她对MUC协议的支持，通过包含一个扩展的出席信息,并包含在一个空的满足'http://jabber.org/protocol/muc'名字空间的 &amp;lt;x/&amp;gt; 子元素里(注意这里不包含 '#owner' 或 '#user' 后缀).&lt;br /&gt;
# 如果用户被允许新建房间并且房间还不存在, 服务必须 MUST 根据一些缺省配置新建此房间, 指定请求的用户成为初始的房间拥有者, 并增加这个拥有者到该房间但不允许任何别的用户进入该房间(有效地锁定 &amp;quot;locking&amp;quot;该房间). 从房间发送由所有者收到的初始的出席信息节必须 MUST 包含扩展的出席信息以指出该用户的状态为一个所有者并承认房间已经被创建了(通过状态码 201) 并等待配置.&lt;br /&gt;
# 如果初始的房间所有者想新建和配置一个保留房间, 房间所有者必须 MUST 接着请求一个配置，通过发送类型为&amp;quot;get&amp;quot;的IQ节并包含一个空的满足'http://jabber.org/protocol/muc#owner'名字空间的&amp;lt;query/&amp;gt;元素给该房间 ,然后完成第4和第5步. 如果房间所有者喜欢新建一个即时房间, 该房间所有者必须 MUST 发送一个遵循'http://jabber.org/protocol/muc#owner'名字空间的 query 元素并包含一个遵循 'jabber:x:data' 名字空间的空的类型为 &amp;quot;submit&amp;quot; 的 &amp;lt;x/&amp;gt; 元素, 然后跳到第6步.&lt;br /&gt;
# 如果房间所有者请求了一个配置表格, 服务必须 MUST 发送一个包含配置表格并遵循 'jabber:x:data'名字空间的 IQ 给房间拥有者. 如果没有配置选项可用, 房间必须 MUST 返回一个空的 query 元素给房间所有者.&lt;br /&gt;
# 初始的房间所有者应该 SHOULD 为该房间提供一个开始的配置(或接受缺省配置)，通过发送&amp;quot;set&amp;quot;类型并包含完整的配置表格的 IQ . 另外, 房间所有者可以 MAY 取消配置过程. (实现可以 MAY 设置一个初始化配置的超时, 这样如果房间所有者再给定的超时时间内不配置房间, 房间所有者就被假定已经接受了缺省得配置或取消了配置过程.)&lt;br /&gt;
# 一旦服务从初始房间所有者接收了完整的配置表格(或接收到了一个即时房间的请求), 服务必须 MUST 解锁 &amp;quot;unlock&amp;quot; 这个房间 (即, 允许其他用户进入此房间) 并发送&amp;quot;result&amp;quot;类型的 IQ  给房间所有者. 如果服务接收到了取消（指令）, 它必须 MUST 销毁这个房间.&lt;br /&gt;
&lt;br /&gt;
以下例子展示了这个协议流程.&lt;br /&gt;
&lt;br /&gt;
首先, Jabber用户必须 MUST 发送出席信息给房间, 包含空的 &amp;lt;x/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc' 名字空间(当他寻求进入一个房间时也发送和这同样的节).&lt;br /&gt;
&lt;br /&gt;
'''例子 143. Jabber用户新建一个房间并声明对多用户聊天的支持'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该房间不存在, 服务应该 SHOULD 新建这个房间(取决于关于新建房间的本地策略), 指定发出请求的用户的纯JID成为所有者, 添加这个所有者到房间, 并通过发送以下格式的出席信息节承认房间新建成功:&lt;br /&gt;
&lt;br /&gt;
'''例子 144. 服务承认房间新建成功'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='110'/&amp;gt;&lt;br /&gt;
    &amp;lt;status code='201'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接收到该房间已经创建的通知之后, 房间所有者需要决定是否接受缺省的房间配置(即, 新建一个即时房间 &amp;quot;instant room&amp;quot;) 还是做一些不同于缺省房间设置的配置 (即, 新建一个保留房间&amp;quot;reserved room&amp;quot;). 完成这两个用例的协议流程展示如下.&lt;br /&gt;
&lt;br /&gt;
注意: 如果如上的发送到一个不存在的房间里的出席信息节没有包含一个遵循 'http://jabber.org/protocol/muc'名字空间的 &amp;lt;x/&amp;gt; 元素, 服务应该SHOULD 立刻新建一个缺省的房间(即, 它必须 MUST 假定客户端支持 &amp;quot;groupchat 1.0&amp;quot; 而不是 Multi-User Chat, 所以在等待房间创建者决定是创建即时房间还是保留房间的时候,它不能 MUST NOT 锁定这个房间).&lt;br /&gt;
&lt;br /&gt;
====新建即时房间====&lt;br /&gt;
&lt;br /&gt;
如果初始的房间所有者想接受缺省的房间配置(即, 新建一个即时房间&amp;quot;instant room&amp;quot;), 房间所有者必须 MUST 拒绝初始配置表格,通过发送一个 IQ set 给 &amp;lt;room@service&amp;gt; 本身,包含一个遵循'http://jabber.org/protocol/muc#owner'名字空间的 &amp;lt;query/&amp;gt; 元素, 这里 &amp;lt;query/&amp;gt; 的唯一子元素是一个空的遵循'jabber:x:data'名字空间的 &amp;lt;x/&amp;gt; 元素并且拥有一个 'type'属性值为 &amp;quot;submit&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 145. 所有者请求即时房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 接着解锁该房间并允许其他实体加入它.&lt;br /&gt;
&lt;br /&gt;
====新建保留房间====&lt;br /&gt;
&lt;br /&gt;
如果初始的房间所有者想新建并配置一个保留房间, 这个房间所有者必须 MUST 请求初始配置表格,通过发送一个 IQ get 给 &amp;lt;room@service&amp;gt; 本身,包含一个空的遵循 'http://jabber.org/protocol/muc#owner' 名字空间的 &amp;lt;query/&amp;gt; 元素 :&lt;br /&gt;
&lt;br /&gt;
'''例子 146. 所有者请求配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间还不存在, 服务必须 MUST 返回一个初始的房间配置表单给该用户. (注意: 以下例子展示一个配置选项的典型例子. 已登记用于房间创建和配置的所有 x:data 字段列表由 XMPP Registrar 维护; 参见本文的 [[XEP-0045#XMPP注册项事项|XMPP注册项事项]] 章节.)&lt;br /&gt;
&lt;br /&gt;
'''例子 147. 服务发送配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Configuration for &amp;quot;darkcave&amp;quot; Room&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
          Your room darkcave@macbeth has been created!&lt;br /&gt;
          The default configuration is as follows:&lt;br /&gt;
            - No logging&lt;br /&gt;
            - No moderation&lt;br /&gt;
            - Up to 20 occupants&lt;br /&gt;
            - No password required&lt;br /&gt;
            - No invitation required&lt;br /&gt;
            - Room is not persistent&lt;br /&gt;
            - Only admins may change the subject&lt;br /&gt;
            - Presence broadcasted for all users&lt;br /&gt;
          To accept the default configuration, click OK. To&lt;br /&gt;
          select a different configuration, please complete&lt;br /&gt;
          this form.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural-Language Room Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomname'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Short Description of Room'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomdesc'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural Language for Room Discussions'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_lang'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Enable Public Logging?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Change Subject?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Invite Others?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Maximum Number of Occupants'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='10'&amp;gt;&amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='20'&amp;gt;&amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='30'&amp;gt;&amp;lt;value&amp;gt;30&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='50'&amp;gt;&amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='100'&amp;gt;&amp;lt;value&amp;gt;100&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='None'&amp;gt;&amp;lt;value&amp;gt;none&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles for which Presence is Broadcast'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_presencebroadcast'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles and Affiliations that May Retrieve Member List'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_getmemberlist'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Publicly Searchable?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Persistent?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Moderated?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Members-Only?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password Required to Enter?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          If a password is required to enter this room,&lt;br /&gt;
          you must specify the password below.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password'&lt;br /&gt;
          type='text-private'&lt;br /&gt;
          var='muc#roomconfig_roomsecret'/&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Who May Discover Real JIDs?'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderators Only'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Anyone'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;anyone&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional people who have&lt;br /&gt;
          administrative privileges in the room. Please&lt;br /&gt;
          provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Admins'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomadmins'/&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional owners for this&lt;br /&gt;
          room. Please provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Owners'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomowners'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意: _whois 配置选项指定该房间是非匿名的(值为 &amp;quot;anyone&amp;quot;), 半匿名的(值为&amp;quot;moderators&amp;quot;), 还是全匿名的(值为&amp;quot;none&amp;quot;, 不显示在这).&lt;br /&gt;
&lt;br /&gt;
如果没有配置选项可用, 服务必须 MUST 返回空的 query 元素给房间所有者:&lt;br /&gt;
&lt;br /&gt;
'''例子 148. 服务通知所有者没有配置可用'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间所有者应该 SHOULD 接着填好表单并提交给服务.&lt;br /&gt;
&lt;br /&gt;
'''例子 149. 所有者提交配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
      &amp;lt;field var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomname'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;A Dark Cave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomdesc'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomsecret'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;cauldronburn&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field var='muc#roomconfig_roomadmins'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;wiccarocks@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hecate@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间创建成功, 服务必须 MUST 通知新的房间所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 150. 服务通知新房间所有者成功'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果因为指定的房间配置违反了一个或多个服务策略而导致房间创建失败 (例如, 因为密码保护房间的密码为空), 服务必须 MUST 返回一个 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
'''例子 151. 服务通知所有者请求的配置选项不被接受'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一方面, 房间所有者可以 MAY 取消配置过程:&lt;br /&gt;
&lt;br /&gt;
'''例子 152. 所有者取消初始的配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='create2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='cancel'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间所有者取消了初始的房间配置, 服务应该 SHOULD 销毁房间, 确保发送不可用出席信息给房间所有者 (详见 &amp;quot;销毁房间&amp;quot; 用例).&lt;br /&gt;
&lt;br /&gt;
如果房间所有者在提交表单之前因为任何原因下线了(例如, 失去连接), 服务将接收到一个类型为 &amp;quot;unavailable&amp;quot; 的出席信息节，从所有者到所有者的 &amp;lt;room@service/nick&amp;gt; 或到 &amp;lt;room@service&amp;gt; (或两者). 服务必须 MUST 接着销毁这个房间, 发送一个 &amp;quot;unavailable&amp;quot; 类型的出席信息节，从房间到所有者，包含一个 &amp;lt;destroy/&amp;gt; 元素以及 reason (子元素)(如果提供了) ，参见本文的 [[XEP-0045#销毁房间|销毁房间]]章节.&lt;br /&gt;
&lt;br /&gt;
====申请唯一房间名====&lt;br /&gt;
&lt;br /&gt;
在一些场合 (例如, 当 [[XEP-0045#把一对一聊天转为多用户会议|把一对一聊天转为会议]]), 房间创建者可能想在尝试新建房间之前请求一个唯一的房间名 (例如, 避免可能的房间冲突). 为此, 服务可以 MAY 如本章所述支持这个特性. (如果服务支持这个特性, 它必须 MUST 在对服务发现信息请求应答时返回一个 &amp;quot;http://jabber.org/protocol/muc#unique&amp;quot; 特性.)&lt;br /&gt;
&lt;br /&gt;
房间创建者通过发送一个 IQ-get 给服务本身来请求唯一房间名, 这个IQ节中包含一个空的 &amp;lt;unique/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc#unique' 名字空间:&lt;br /&gt;
&lt;br /&gt;
'''例子 153. 实体请求唯一房间名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='unique1'&lt;br /&gt;
    to='chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;unique xmlns='http://jabber.org/protocol/muc#unique'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果服务支持这个特性, 它应该 SHOULD 以 XML 字符数据的方式返回一个唯一房间名，包含一个 &amp;lt;unique/&amp;gt; 元素 (但不创建该房间):&lt;br /&gt;
&lt;br /&gt;
'''例子 154. 服务返回唯一房间名'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='chat.shakespeare.lit'&lt;br /&gt;
    id='unique1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;unique xmlns='http://jabber.org/protocol/muc#unique'&amp;gt;&lt;br /&gt;
    6d9423a55f499b29ad20bf7b2bdea4f4b885ead1&lt;br /&gt;
  &amp;lt;/unique&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 拒绝返回一个唯一房间名给一个没有资格创建房间的实体, 或那些发送请求唯一房间名过多次数的实体, 等等.&lt;br /&gt;
&lt;br /&gt;
服务可以 MAY 使用算法保证房间名的创建在服务上下文中是唯一的 (例如, 对发出请求的JID,datetime,和random salt的SHA-1 哈希运算).&lt;br /&gt;
&lt;br /&gt;
房间创建者将接着使用 XML 字符数据 &amp;lt;unique/&amp;gt; 元素作为它请求的房间JID的节点标识符(ID):&lt;br /&gt;
&lt;br /&gt;
'''例子 155. 所有者以唯一名创建房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence &lt;br /&gt;
    from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    to='6d9423a55f499b29ad20bf7b2bdea4f4b885ead1@chat.shakespeare.lit/firstwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===随后的房间配置===&lt;br /&gt;
&lt;br /&gt;
在指定房间的初始配置之后的任何时间, 房间所有者可能想修改房间配置. 为此, 房间所有者必须 MUST 向房间发出一个新的配置表单请求,通过发送一个 IQ 到 &amp;lt;room@service&amp;gt; ，包含一个空的 &amp;lt;query/&amp;gt; 元素，遵循 'http://jabber.org/protocol/muc#owner' 名字空间.&lt;br /&gt;
&lt;br /&gt;
'''例子 156. 所有者请求配置表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='config1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 157. 服务禁止非所有者的访问配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='configures'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另外, 服务必须 MUST 以当前使用的选项组作为缺省值发送一个配置表单给房间所有者:&lt;br /&gt;
&lt;br /&gt;
'''例子 158. 服务发送配置表单给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='config1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;Configuration for &amp;quot;darkcave&amp;quot; Room&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;instructions&amp;gt;&lt;br /&gt;
        Complete this form to make changes to&lt;br /&gt;
        the configuration of your room.&lt;br /&gt;
      &amp;lt;/instructions&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          type='hidden'&lt;br /&gt;
          var='FORM_TYPE'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Natural-Language Room Name'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomname'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;A Dark Cave&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Short Description of Room'&lt;br /&gt;
          type='text-single'&lt;br /&gt;
          var='muc#roomconfig_roomdesc'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Enable Public Logging?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_enablelogging'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Change Subject?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_changesubject'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Allow Occupants to Invite Others?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_allowinvites'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Maximum Number of Occupants'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_maxusers'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='10'&amp;gt;&amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='20'&amp;gt;&amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='30'&amp;gt;&amp;lt;value&amp;gt;30&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='50'&amp;gt;&amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='100'&amp;gt;&amp;lt;value&amp;gt;100&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='None'&amp;gt;&amp;lt;value&amp;gt;none&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles for which Presence is Broadcast'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_presencebroadcast'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Roles and Affiliations that May Retrieve Member List'&lt;br /&gt;
          type='list-multi'&lt;br /&gt;
          var='muc#roomconfig_getmemberlist'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderator'&amp;gt;&amp;lt;value&amp;gt;moderator&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Participant'&amp;gt;&amp;lt;value&amp;gt;participant&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Visitor'&amp;gt;&amp;lt;value&amp;gt;visitor&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Publicly Searchable?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_publicroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Persistent?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_persistentroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Moderated?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_moderatedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Make Room Members Only?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_membersonly'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password Required for Entry?'&lt;br /&gt;
          type='boolean'&lt;br /&gt;
          var='muc#roomconfig_passwordprotectedroom'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          If a password is required to enter this room,&lt;br /&gt;
          you must specify the password below.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Password'&lt;br /&gt;
          type='text-private'&lt;br /&gt;
          var='muc#roomconfig_roomsecret'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;cauldronburn&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Who May Discover Real JIDs?'&lt;br /&gt;
          type='list-single'&lt;br /&gt;
          var='muc#roomconfig_whois'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Moderators Only'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;moderators&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option label='Anyone'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;anyone&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional people who have&lt;br /&gt;
          administrative privileges in the room. Please&lt;br /&gt;
          provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Admins'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomadmins'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;wiccarocks@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;hecate@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;&lt;br /&gt;
          You may specify additional owners for this&lt;br /&gt;
          room. Please provide one Jabber ID per line.&lt;br /&gt;
        &amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field&lt;br /&gt;
          label='Room Owners'&lt;br /&gt;
          type='jid-multi'&lt;br /&gt;
          var='muc#roomconfig_roomowners'/&amp;gt;&lt;br /&gt;
    &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有配置选项可用, 服务必须 MUST 返回一个空的 query 元素给房间所有者，如前面的用例所示.&lt;br /&gt;
&lt;br /&gt;
该房间所有者应该 SHOULD 接着以更新的配置信息提交表单.&lt;br /&gt;
&lt;br /&gt;
另外, 房间所有者可以 MAY 取消这次配置过程:&lt;br /&gt;
&lt;br /&gt;
'''例子 159. 所有者取消随后的配置'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='config2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='cancel'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果房间所有者取消随后的配置, 服务必须 MUST 让该房间的配置保持和房间所有者请求这次配置之前一样.&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个房间管理员失去管理权限，而这个管理员正在房间里, 该房间必须 MUST 为那个管理员发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;member&amp;quot; 或 'role' 属性值为 &amp;quot;participant&amp;quot; 或 &amp;quot;visitor&amp;quot; ，以适当地表达岗位级别和房间类型:&lt;br /&gt;
&lt;br /&gt;
'''例子 160. 服务通知失去管理员岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个用户获得管理员权限，而这个用户正在房间里, 房间必须 MUST 为那个用户发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 或 'role' 属性值为 &amp;quot;admin&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
'''例子 161. 服务通知所有用户有人获得管理员岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个房间所有者失去所有者权限，而这个所有者正在房间里, 该房间必须 MUST 为那个所有者发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 或 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 162. 服务通知失去所有者岗位'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有其他所有者，服务不能 MUST NOT 允许一个所有者撤销他或她自己的所有权; 如果一个所有者企图这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给这个所有者. 然而, 如果没有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有者权限.&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致一个用户获得所有者权限，而这个用户正在房间里, 房间必须 MUST 为那个用户发送更新的出席信息给所有房客, 表明状态的变更，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; 或 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''例子 163. 服务通知所有用户有人获得所有者权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一次房间配置变更导致房间类型变成仅限会员，但还有非成员在房间里, 服务必须 MUST 从房间移除任何非成员，并在发送给那些剩余的房客的 '不可用' 出席信息节里包含状态码 322.&lt;br /&gt;
&lt;br /&gt;
====配置变更通知====&lt;br /&gt;
&lt;br /&gt;
当一个房间的配置变更会对房间的隐私和安全策略产生影响时，该房间必须 MUST 发送通知给所有房客. 这个通知将包括一个 &amp;lt;message/&amp;gt; 节，包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 元素,  &amp;lt;x/&amp;gt; 元素则只有一个 &amp;lt;status/&amp;gt; 子元素，其 'code' 属性为一个适当的值. 这是例子:&lt;br /&gt;
&lt;br /&gt;
'''例子 164. 配置状态码'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
         to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
         type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;status code='170'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
房间配置中和隐私相关的策略变更导致生成这些状态码，如下:&lt;br /&gt;
&lt;br /&gt;
* 如果房间日志功能可用了, 状态码 170.&lt;br /&gt;
* 如果房间日志现在禁止了, 状态码 171.&lt;br /&gt;
* 如果房间现在是非匿名的了, 状态码 172.&lt;br /&gt;
* 如果房间现在是半匿名的了, 状态码 173.&lt;br /&gt;
* 如果房间现在是全匿名的了, 状态码 174.&lt;br /&gt;
&lt;br /&gt;
对更多其他配置变更, 房间应该 SHOULD 发送状态码 104 这样感兴趣的房客如果想要的话可以接受到更新的房间配置.&lt;br /&gt;
&lt;br /&gt;
===授予所有者权限===&lt;br /&gt;
&lt;br /&gt;
如果实现允许, 一个所有者可以 MAY 授予所有权给其他用户; 只要把用户的岗位改成&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 165. 所有者授予所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 166. 所有者授予所有权(饱含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把用户添加到所有者列表并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 167. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已授予所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值(推荐为&amp;quot;moderator&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
'''例子 168. 服务发送所有权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/hecate'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已授予所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;owner&amp;quot; . &lt;br /&gt;
&lt;br /&gt;
'''例子 169. 服务发送所有权通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销所有者权限===&lt;br /&gt;
&lt;br /&gt;
实现可以 MAY 允许一个所有者撤销其他用户的所有权; 只要把用户的岗位改成非&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 170. 所有者撤销所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt;元素是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
'''例子 171. 所有者撤销所有权(包含一个原因)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有其它所有者，服务不能 MUST NOT 允许一个所有者撤销他或她自己的所有权; 如果一个所有者尝试这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该所有者. 然而, 如果有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有权.&lt;br /&gt;
&lt;br /&gt;
如果一个实现不允许所有者撤销另一个用户的所有权, 实现必须 MUST 返回一个 &amp;lt;not-authorized/&amp;gt; 错误给做出这个请求的所有者.&lt;br /&gt;
&lt;br /&gt;
注意: 允许一个所有者移除其它用户的所有权能给房间管理一个折衷的控制模式; 所以这个特性是可选的 OPTIONAL, 并且鼓励实现支持通过一个只有拥有服务范围管理权限的用户使用的接口来移除所有者.&lt;br /&gt;
&lt;br /&gt;
其它情况下, 服务必须 MUST 把用户从所有者列表移除并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 172. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;owner&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值:&lt;br /&gt;
&lt;br /&gt;
'''例子 173. 服务通知失去所有权'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;owner&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
'''例子 174. 服务发送失去所有权通知给所有房客 '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改所有者列表===&lt;br /&gt;
&lt;br /&gt;
如果实现允许, 一个房间所有者可能想修改所有者列表. 为此, 所有者首先请求所有者列表，通过向房间请求所有岗位为 'owner'的用户.&lt;br /&gt;
&lt;br /&gt;
'''例子 175. 所有者请求所有者列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='owner3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 接着返回所有者列表给所有者; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，对任何正是一名房客（也就是正在房间里）的所有者可以 MAY 包含 'nick' 和 'role' 属性:&lt;br /&gt;
&lt;br /&gt;
'''例子 176. 服务发送所有者列表给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='crone1@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
所有者可以 MAY 接着修改所有者列表. 为此, 所有者必须 MUST 发送修改的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; [[XEP-0045#附录G:备注|21]]每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用于管理参与者之类的角色，而不是所有者之类的岗位):&lt;br /&gt;
&lt;br /&gt;
'''例子 177. 所有者发送修改过的所有者列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='owner4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner'&lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
只有所有者被允许修改所有者列表. 如果一个非所有者试图察看或修改所有者列表, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 178. 服务对于非所有者试图修改所有者列表返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='ownertest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='owner' &lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有别的所有者，服务不能 MUST NOT 允许一个所有者撤销自己的所有权; 如果一个所有者尝试这么干, 服务必须 MUST 返回一个 &amp;lt;conflict/&amp;gt; 错误给该所有者. 然而, 如果有其他所有者，服务应该 SHOULD 允许一个所有者撤销自己的所有权. &lt;br /&gt;
&lt;br /&gt;
其它情况下, 服务必须 MUST 修改所有者列表并通知所有者成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 179. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='owner4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也为任何因前述所有者列表修改而导致的岗位变化而发送出席信息通知.&lt;br /&gt;
&lt;br /&gt;
===授予管理员权限===&lt;br /&gt;
&lt;br /&gt;
一个所有者可以授予管理员权限给一个成员或无岗位的用户; 只要把用户的岗位改成&amp;quot;admin&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 180. 所有者授予管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt; 元素是可选的 OPTIONAL. &lt;br /&gt;
&lt;br /&gt;
'''例子 181. 所有者授予管理员权限(包含一个原因 Reason)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;A worthy witch indeed!&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把用户添加到管理员列表并通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 182. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin1'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已授予管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot; 并且 'role' 属性值为根据岗位和房间类型确定的适当的值. &lt;br /&gt;
&lt;br /&gt;
'''例子 183. 服务发送管理员权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='moderator'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已授予管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为 &amp;quot;admin&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 184. 服务发送管理员权限通知给所有房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===撤销管理员权限===&lt;br /&gt;
&lt;br /&gt;
一个所有者可能想撤销一个用户的管理员权限; 只要把用户的岗位改成非&amp;quot;admin&amp;quot;和非&amp;quot;owner&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''例子 185. 所有者撤销管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reason/&amp;gt;元素是可选的 OPTIONAL. &lt;br /&gt;
&lt;br /&gt;
'''例子 186. 所有者撤销管理员权限(包含一个原因)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Not so worthy after all!&amp;lt;/reason&amp;gt; &lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 把该用户从管理员列表移除并接着通知所有者成功了:&lt;br /&gt;
&lt;br /&gt;
'''例子 187. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin2'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户在房间里, 服务必须 MUST 接着以这个用户的名义发送更新的出席信息给所有房客, 表明已失去管理员权限，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非&amp;quot;admin&amp;quot;非&amp;quot;owner&amp;quot;, 并且 'role' 属性值为根据岗位和房间类型确定的适当的值: &lt;br /&gt;
&lt;br /&gt;
'''例子 188. 服务通知失去管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='darkcave@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='participant'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果该用户不在房间, 服务可以 MAY 从房间本身发送一个消息给房间的房客们, 表明已失去所有权，通过包含一个遵循 'http://jabber.org/protocol/muc#user'  名字空间的的 &amp;lt;x/&amp;gt; 元素以及一个 &amp;lt;item/&amp;gt; 子元素，该 &amp;lt;item/&amp;gt; 子元素的 'affiliation' 属性值为非 &amp;quot;admin&amp;quot; . &lt;br /&gt;
&lt;br /&gt;
'''例子 189. 服务通知失去管理员权限'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message&lt;br /&gt;
    from='chat.shakespeare.lit'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='member'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          role='none'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===修改管理员列表===&lt;br /&gt;
&lt;br /&gt;
一个房间所有者可能想修改管理员列表. 为此, 所有者首先请求管理员列表，通过向房间请求所有岗位为 'admin'的用户. &lt;br /&gt;
&lt;br /&gt;
'''例子 190. 所有者请求管理员列表'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/desktopaffiliation&lt;br /&gt;
    id='admin3'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果'from'地址的 &amp;lt;user@host&amp;gt; 部分和房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者.&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 接着返回管理员列表给所有者; 每个条目必须 MUST 包含 'affiliation' 和 'jid' 属性，对任何正是一名房客（也就是正在房间里）的管理员可以 MAY 包含 'nick' 和 'role' 属性: &lt;br /&gt;
&lt;br /&gt;
'''例子 191. 服务发送管理员列表给所有者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin3'&lt;br /&gt;
    to='bard@shakespeare.lit/globe'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='wiccarocks@shakespeare.lit'&lt;br /&gt;
          nick='secondwitch'/&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hag66@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
所有者可以 MAY 接着修改管理员列表. 为此, 所有者必须 MUST 发送修改的条目 (即, 仅 &amp;quot;delta&amp;quot;) 给服务; [[XEP-0045#附录G:备注|22]] 每个条目必须 MUST 包含 'affiliation'属性(通常值为 &amp;quot;admin&amp;quot; 或 &amp;quot;none&amp;quot;) 和 'jid' 属性，但不应该 SHOULD NOT 包含 'nick' 属性，不能 MUST NOT 包含 'role' 属性 (它用于管理参与者之类的角色，而不是管理员之类的岗位): &lt;br /&gt;
&lt;br /&gt;
'''例子 192. 所有者发送修改的管理员列表给服务'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='bard@shakespeare.lit/globe'&lt;br /&gt;
    id='admin4'&lt;br /&gt;
    to='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none'&lt;br /&gt;
          jid='hag66@shakespeare.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin'&lt;br /&gt;
          jid='hecate@shakespeare.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
只有所有者被允许修改管理员列表. 如果一个非所有者试图察看或修改所有者列表, 服务必须 MUST 拒绝这个请求并返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者: &lt;br /&gt;
&lt;br /&gt;
'''例子 193. 服务对于非所有者试图修改管理员列表返回错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admintest'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='admin' &lt;br /&gt;
          jid='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
否则, 服务必须 MUST 修改管理员列表并通知所有者成功了: &lt;br /&gt;
&lt;br /&gt;
'''例子 194. 服务通知所有者成功了'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='darkcave@chat.shakespeare.lit'&lt;br /&gt;
    id='admin4'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务必须 MUST 也为任何因前述管理员列表修改而导致的岗位变化而发送出席信息通知.&lt;br /&gt;
&lt;br /&gt;
===销毁房间===&lt;br /&gt;
&lt;br /&gt;
房间所有者必须 MUST 能够销毁一个房间, 特别是如果这个房间不是持久房间的时候. 流程如下:&lt;br /&gt;
&lt;br /&gt;
# 房间所有者请求销毁房间, 如果必要的话指出一个原因 reason 和一个备用场地.&lt;br /&gt;
# 该房间移除所有房客(包含适当的关于备用场地和被移除的原因的信息) 并销毁房间, 即使它被定义为持久房间.&lt;br /&gt;
&lt;br /&gt;
不像前述的, 本文不指定一个MUC服务实现收到一个销毁房间请求之后将会如何做. 例如, 如果房间定义为持久地, 一个实现可以 MAY 选择锁定房间I，这样它不能被重用, 把加入该房间的请求重定向到替代场地, 或邀请当前的参与者到新的房间; 无论如何, 这些行为是可选的 OPTIONAL.&lt;br /&gt;
&lt;br /&gt;
为了销毁一个房间, 房间所有者必须 MUST 发送一个 IQ set 指令到要销毁的房间的地址. 这个 &amp;lt;iq/&amp;gt; 节将包含一个遵循 'http://jabber.org/protocol/muc#owner' 名字空间的 &amp;lt;query/&amp;gt; 元素，它将包含一个 &amp;lt;destroy/&amp;gt; 元素. 替代场地的地址可以 MAY 用这个 &amp;lt;destroy/&amp;gt; 元素的 'jid' 属性来提供. 一个密码保护的替代场地可以 MAY 通过 &amp;lt;destroy/&amp;gt; 元素的 &amp;lt;password/&amp;gt; 子元素的 XML 字符数据来提供. 摧毁房间的原因可以 MAY 通过 &amp;lt;destroy/&amp;gt; 元素的 &amp;lt;reason/&amp;gt; 子元素的 XML 字符数据来提供.&lt;br /&gt;
&lt;br /&gt;
以下例子展示了协议发送和接收的元素:&lt;br /&gt;
&lt;br /&gt;
'''例子 195. 所有者提交房间摧毁请求'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    id='begone'&lt;br /&gt;
    to='heath@chat.shakespeare.lit'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务负责移除所有房客. 它不应该 SHOULD NOT 广播类型为&amp;quot;unavailable&amp;quot;的出席信息节给所有房客, 只需要发送一个&amp;quot;unavailable&amp;quot;类型的出席信息节给每个房客，这样该用户知道他或她已经从房间移除了. 如果所有者的扩展出席信息指定了一个替代场地的 JID 以及房间销毁的原因, 这个出席信息节必须 MUST 包含那些信息.&lt;br /&gt;
&lt;br /&gt;
'''例子 196. 服务移除每个房客'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/firstwitch'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/secondwitch'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence&lt;br /&gt;
    from='heath@chat.shakespeare.lit/thirdwitch'&lt;br /&gt;
    to='hag66@shakespeare.lit/pda'&lt;br /&gt;
    type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='none' role='none'/&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 197. 服务通知所有者成功销毁房间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='begone'&lt;br /&gt;
    to='crone1@shakespeare.lit/desktop'&lt;br /&gt;
    type='result'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果在一个销毁请求中接收到的'from'地址的 &amp;lt;user@host&amp;gt; 和一个房间所有者的纯JID不符, 服务必须 MUST 返回一个 &amp;lt;forbidden/&amp;gt; 错误给发送者:&lt;br /&gt;
&lt;br /&gt;
'''例子 198. 服务拒绝由非所有者提交的销毁请求'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='destroytest'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#owner'&amp;gt;&lt;br /&gt;
    &amp;lt;destroy jid='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;Macbeth doth come.&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/destroy&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==错误和状态码==&lt;br /&gt;
===错误码===&lt;br /&gt;
&lt;br /&gt;
和'http://jabber.org/protocol/muc#user' 名字空间相关的错误码相当简单, 总结于下表之中. 关于传统的错误码到XMPP格式的错误之间的映射的详细信息, 参见 [http://xmpp.org/extensions/xep-0086.html 错误条件映射] [[XEP-0045#附录G:备注|23]]; 实现应该 SHOULD 支持传统和XMPP错误处理两者.&lt;br /&gt;
&lt;br /&gt;
'''表9: http://jabber.org/protocol/muc#user 名字空间的错误码'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!码 !!类型 !!元素 !!上下文 !!目的&lt;br /&gt;
|-&lt;br /&gt;
|401 ||Error ||Presence  ||进入一个房间 ||通知用户需要密码&lt;br /&gt;
|-&lt;br /&gt;
|403 ||Error ||Presence  ||进入一个房间 ||通知用户他或她被房间禁止了&lt;br /&gt;
|-&lt;br /&gt;
|404 ||Error ||Presence  ||进入一个房间 ||通知用户房间不存在&lt;br /&gt;
|-&lt;br /&gt;
|405 ||Error ||Presence  ||进入一个房间 ||通知用户限制创建房间&lt;br /&gt;
|-&lt;br /&gt;
|406 ||Error ||Presence  ||进入一个房间 ||通知用户必须使用保留的房间昵称&lt;br /&gt;
|-&lt;br /&gt;
|407 ||Error ||Presence  ||进入一个房间 ||通知用户他或她不在成员列表中&lt;br /&gt;
|-&lt;br /&gt;
|409 ||Error ||Presence  ||进入一个房间 ||通知用户他或她的房间昵称正在使用或被别的用户注册了&lt;br /&gt;
|-&lt;br /&gt;
|503 ||Error ||Presence  ||进入一个房间 ||通知用户已经达到最大用户数&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
本文不规定和上述错误条件相关的文本字符串(即, XMPP &amp;lt;text/&amp;gt; 元素值).&lt;br /&gt;
&lt;br /&gt;
===状态码===&lt;br /&gt;
&lt;br /&gt;
多用户聊天的使用一个 &amp;lt;status/&amp;gt; 元素(特指, &amp;lt;status/&amp;gt; 元素的的 'code' 属性  ) 来传达关于用户在一个房间里的状态的信息. 随着时间的推移, 状态码的数量已经增加了很多, 而新的状态码继续被作者申请. 所以, 这些状态码现在记录在一个由XMPP登记处维护的注册表里. 细节可参考本文的 [[XEP-0045#状态码注册表|状态码注册表]].&lt;br /&gt;
&lt;br /&gt;
注意: 通常, MUC 状态码倾向于沿用[http://tools.ietf.org/html/rfc2616 RFC 2616] [[XEP-0045#附录G:备注|24]] 和 [http://tools.ietf.org/html/rfc1893 RFC 1893] [[XEP-0045#附录G:备注|25]] (1xx 码表示信息, 2xx 码说明情况良好可继续, 3xx 码指定重定向被踢或被禁止的用户, x3x 码指系统状态, x7x 码指安全或策略事务, 等等) 里面的状态码的 &amp;quot;抽象&amp;quot;含义.&lt;br /&gt;
&lt;br /&gt;
注意: 如果今天来定义 MUC 协议, 它将指定一个更有弹性的, XML-友好的 途径而不是硬编码的状态数字; 然而, 现在修改状态汇报系统带来的痛苦将远大于好处, 这是为什么状态码数字保持使用至今. 本文的未来版本可能定义一个更 类XMPP 的途径来表示状态条件, 保留状态码数字但是给它们补充更多的描述性的子元素,就像 '''RFC 3920 '''里那样.&lt;br /&gt;
&lt;br /&gt;
==国际化事项==&lt;br /&gt;
&lt;br /&gt;
如 '''RFC 3920''' 中所定义的, XMPP 实体 (包括 MUC 房间和 MUC 服务) 应该 SHOULD 遵守任何给定的节提供的 'xml:lang' 属性. 然而, 群聊消息的同声翻译超出了本文的范围.&lt;br /&gt;
&lt;br /&gt;
这里定义的状态和错误码允许一个客户端实现展示一个本地化的界面; 然而, 任何给定语言社区的本地化文本字符串的定义超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
尽管这里的很多数据表单字段的标签显示为英文, MUC 客户端应该 SHOULD 把这些字段展示为本地化的文本而不是英文文本.&lt;br /&gt;
&lt;br /&gt;
==安全事项==&lt;br /&gt;
===用户验证和授权===&lt;br /&gt;
&lt;br /&gt;
本文没有定义或要求比明文密码更安全的房间准入验证或授权方法. 然而, 这些潜在的风险可能使用 '''RFC 3920''' 描述的通过使用 TLS 和 SASL 加密通道来减轻.&lt;br /&gt;
&lt;br /&gt;
===端到端加密===&lt;br /&gt;
&lt;br /&gt;
这里没有定义没有端到端消息或会话加密方法. 用户不应该 SHOULD NOT 相信一个服务能保持通过房间发送的任何文本的安全.&lt;br /&gt;
&lt;br /&gt;
===隐私===&lt;br /&gt;
&lt;br /&gt;
取决于房间配置, 一个房间可以公开地记录房间里发生的所有讨论. 服务必须 MUST 警告用户该房间是公开记录的，通过在该用户的初始出席信息中返回一个状态码 &amp;quot;170&amp;quot; , 并且如果房间讨论被记录 (用户的客户端也应该 SHOULD 在允许用户进入之前查询房间的配置，以&amp;quot;预先发现&amp;quot;房间是否被记录)，该用户的客户端也必须 MUST 警告用户. 如果房间的配置随后修改成允许房间记录(当房间发送状态码 170 时客户端将发现)，客户端也必须 MUST 警告用户 . 注意: 房间内的历史和公开房间记录是不同的, 并且很自然的一个房间不能有效地阻止房客独立维护的自有的房间记录, 它可能被公开; 用户应该 SHOULD 谨慎操作并认识到任何房间讨论可能被有效地公开.&lt;br /&gt;
&lt;br /&gt;
===匿名===&lt;br /&gt;
&lt;br /&gt;
取决于房间配置, 一个房间可以 MAY 暴光每个房客的真实 JID 给其他房客 (如果该房间是非匿名的) 并且将几乎肯定地暴光每个房客的真实 JID 给该房间的所有者和管理员(如果该房间不是全匿名的).服务必须 MUST 警告用户真实 JIDs 在房间被暴光，通过在该用户的初始出席信息中包含状态码 &amp;quot;100&amp;quot; , 并且用户的客户端必须 MUST 警告该用户 (一个用户的客户端应该 SHOULD 也在允许用户进入房间之前查询房间配置以 &amp;quot;预先发现&amp;quot; 是否真实 JIDs 会在房间中暴光). 如果房间配置随后从半匿名或全匿名修改成非匿名(当房间发送状态码 172 时客户端将发现) ，客户端必须 MUST 也警告用户，如果房间的配置随后从全匿名改成半匿名时(当房间发送状态码 173 时客户端将发现)，客户端也应该 SHOULD 警告用户.&lt;br /&gt;
&lt;br /&gt;
===拒绝服务===&lt;br /&gt;
&lt;br /&gt;
公开的 MUC 房间能承受一定数量的攻击, 大部分能减少拒绝服务攻击. 这些攻击包括但不限于:&lt;br /&gt;
&lt;br /&gt;
# 向房间里塞进大量的非法房客从而阻止合法用户加入房间.&lt;br /&gt;
# 发送侮辱性的消息接着在被踢或被禁止之前离开房间; 这些侮辱性的消息包含但不限于，大量消息以阻止参与者正常跟踪会话线索或房间历史, 对参与者的人身攻击 (特别是房间管理员和主持人), 攻击性的文字, 以及垃圾网站链接.&lt;br /&gt;
# 高频率的制造出席信息变更.&lt;br /&gt;
# 使用过长的昵称导致无法看到完整的发言.&lt;br /&gt;
# 辱骂房间管理员或其他房间房客.&lt;br /&gt;
# 在一个服务里注册很多昵称然后禁止这些昵称的使用.&lt;br /&gt;
# 模仿别的房客的昵称(例如, 通过在尾部增加一个空格或看起来相似的字符串), 然后以那个房间昵称发送消息用于欺骗房客.&lt;br /&gt;
&lt;br /&gt;
这些攻击可能被减轻不能完全被阻止，通过灵活地使用管理员操作。例如禁止用户, 有管理员权限的自动的房间机器人出席信息, 智能内容过滤的实现, 检查连接的用户的 IP 地址(在分布式的系统里不一定能实现), 应用发言规则到出席信息以及消息, 使用比Resourceprep profile of stringprep更严格的规则匹配房间昵称, 等等. 然而, 经验表明无法完全阻止这类攻击.&lt;br /&gt;
&lt;br /&gt;
===其它事项===&lt;br /&gt;
&lt;br /&gt;
关于延迟递送符号的列入和流程的更多安全事项参见 '''XEP-0203'''.&lt;br /&gt;
&lt;br /&gt;
==IANA事项==&lt;br /&gt;
&lt;br /&gt;
本文档与[http://www.iana.org/ 互联网编号分配授权机构] [[XEP-0045#附录G:备注|26]]无关。&lt;br /&gt;
&lt;br /&gt;
==XMPP登记事项==&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/registrar/ XMPP登记处] [[XEP-0045#附录G:备注|27]]在它的登记处包含了以下信息.&lt;br /&gt;
&lt;br /&gt;
===协议名字空间===&lt;br /&gt;
&lt;br /&gt;
XMPP登记处在它的协议名字空间注册表里包含了以下 MUC相关的名字空间:&lt;br /&gt;
&lt;br /&gt;
* http://jabber.org/protocol/muc&lt;br /&gt;
* http://jabber.org/protocol/muc#admin&lt;br /&gt;
* http://jabber.org/protocol/muc#owner&lt;br /&gt;
* http://jabber.org/protocol/muc#user&lt;br /&gt;
&lt;br /&gt;
===服务发现种类/类型===&lt;br /&gt;
&lt;br /&gt;
一个多用户聊天服务或房间在服务发现里是用 &amp;quot;conference&amp;quot; 种类categary 和 &amp;quot;text&amp;quot; 类型type 来标识的.&lt;br /&gt;
&lt;br /&gt;
===服务发现特性===&lt;br /&gt;
&lt;br /&gt;
有很多和MUC相关的服务或房间相关的特性可以被&amp;quot;服务发现&amp;quot;来发现. 这里面最基本的是 'http://jabber.org/protocol/muc' 名字空间. 另外, 一个MUC房间应该 SHOULD 提供关于它实现的特定房间特性的信息, 例如密码保护和房间主持.&lt;br /&gt;
&lt;br /&gt;
'''注册提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#register FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#roomconfig FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Support for the muc#roominfo FORM_TYPE&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_hidden&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Hidden room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_membersonly&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Members-only room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_moderated&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Moderated room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_nonanonymous&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Non-anonymous room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_open&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Open room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_passwordprotected&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Password-protected room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_persistent&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Persistent room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_public&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Public room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_rooms&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;List of MUC rooms (each as a separate item)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_semianonymous&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Semi-anonymous room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_temporary&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Temporary room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_unmoderated&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Unmoderated room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;var&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;muc_unsecured&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;Unsecured room in Multi-User Chat (MUC)&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/var&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===知名服务发现节点===&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'http://jabber.org/protocol/muc#rooms' 允许发现一个用户是哪个房间的房客.&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'x-roomuser-item' 允许一个用户从房间外发现自己的已注册房间昵称.&lt;br /&gt;
&lt;br /&gt;
知名服务发现节点 'http://jabber.org/protocol/muc#traffic' 允许发现通过一个房间能发送哪些名字空间的通讯(参见本文允许的 [[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
&lt;br /&gt;
===字段标准化===&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/extensions/xep-0068.html 数据表单的字段标准化] [[XEP-0045#附录G:备注|28]] 定义了用于遵循特定名字空间的数据表单的字段标准化的过程. 在 MUC 里面, 使用了四种这类表单: 房间注册 ( &amp;quot;muc#register&amp;quot; FORM_TYPE), 请求发言权和批准请求 (&amp;quot;muc#request&amp;quot;), 房间配置 (&amp;quot;muc#roomconfig&amp;quot;), 以及用于房间信息的服务发现扩展 (&amp;quot;muc#roominfo&amp;quot;). 这些保留的字段定义如下.&lt;br /&gt;
&lt;br /&gt;
====muc#register FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#register&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling user registration with a&lt;br /&gt;
    Multi-User Chat (MUC) room or admin approval&lt;br /&gt;
    of user registration requests.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field &lt;br /&gt;
     var='muc#register_allow'&lt;br /&gt;
     type='boolean'&lt;br /&gt;
     label='Allow this person to register with the room?'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_email'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Email Address'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_faqentry'&lt;br /&gt;
      type='text-multi'&lt;br /&gt;
      label='FAQ Entry'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_first'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Given Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_last'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Family Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_roomnick'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Desired Nickname'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#register_url'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Your URL'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#request FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#request&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling voice requests in a &lt;br /&gt;
    Multi-User Chat (MUC) room or admin&lt;br /&gt;
    approval of such requests.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#role'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='Requested role'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#jid'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='User ID'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#roomnick'&lt;br /&gt;
         type='text-single'&lt;br /&gt;
         label='Room Nickname'/&amp;gt;&lt;br /&gt;
  &amp;lt;field var='muc#request_allow'&lt;br /&gt;
         type='boolean'&lt;br /&gt;
         label='Whether to grant voice'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#roomconfig FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roomconfig&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling creation and configuration of&lt;br /&gt;
    a Multi-User Chat (MUC) room.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_allowinvites'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Occupants to Invite Others'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_changesubject'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Occupants to Change Subject'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_enablelogging'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Enable Public Logging of Room Conversations'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_getmemberlist'&lt;br /&gt;
      type='list-multi'&lt;br /&gt;
      label='Roles and Affiliations that May Retrieve Member List'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_lang'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural Language for Room Discussions'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_pubsub'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='XMPP URI of Associated Publish-Subcribe Node'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_maxusers'&lt;br /&gt;
      type='list-single'&lt;br /&gt;
      label='Maximum Number of Room Occupants'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_membersonly'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether an Make Room Members-Only'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_moderatedroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Make Room Moderated'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_passwordprotectedroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether a Password is Required to Enter'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_persistentroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Make Room Persistent'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_presencebroadcast'&lt;br /&gt;
      type='list-multi'&lt;br /&gt;
      label='Roles for which Presence is Broadcast'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_publicroom'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='Whether to Allow Public Searching for Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomadmins'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Full List of Room Admins'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomdesc'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Short Description of Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomname'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural-Language Room Name'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomowners'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Full List of Room Owners'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_roomsecret'&lt;br /&gt;
      type='text-private'&lt;br /&gt;
      label='The Room Password'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roomconfig_whois'&lt;br /&gt;
      type='list-single'&lt;br /&gt;
      label='Affiliations that May Discover Real JIDs of Occupants'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====muc#roominfo FORM_TYPE====&lt;br /&gt;
&lt;br /&gt;
'''注册处提交'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form_type&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;&lt;br /&gt;
    Forms enabling the communication of extended service discovery&lt;br /&gt;
    information about a Multi-User Chat (MUC) room.&lt;br /&gt;
  &amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_contactjid'&lt;br /&gt;
      type='jid-multi'&lt;br /&gt;
      label='Contact Addresses (normally, room owner or owners)'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_description'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Short Description of Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_lang'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Natural Language for Room Discussions'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_ldapgroup'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='An associated LDAP group that defines room membership; &lt;br /&gt;
             this should be an LDAP Distinguished Name according to an&lt;br /&gt;
             implementation-specific or deployment-specific definition&lt;br /&gt;
             of a group.'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_logs'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='URL for Archived Discussion Logs'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_occupants'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Current Number of Occupants in Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_subject'&lt;br /&gt;
      type='text-single'&lt;br /&gt;
      label='Current Subject or Discussion Topic in Room'/&amp;gt;&lt;br /&gt;
  &amp;lt;field&lt;br /&gt;
      var='muc#roominfo_subjectmod'&lt;br /&gt;
      type='boolean'&lt;br /&gt;
      label='The room subject can be modified by participants'/&amp;gt;&lt;br /&gt;
&amp;lt;/form_type&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===状态码登记处===&lt;br /&gt;
====过程====&lt;br /&gt;
&lt;br /&gt;
XMPP注册员为遵循 'http://jabber.org/protocol/muc#user' 名字空间的&amp;lt;status/&amp;gt; 元素的 'code' 属性维护注册表中的值 .&lt;br /&gt;
&lt;br /&gt;
为了提交新值给这个注册表, 注册人将按以下格式定义一个XML段并把它包含在相关的XMPP扩展协议中，或者发到&amp;lt;registrar@xmpp.org&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;the three-digit code number&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;the stanza type of which it is a child (message or presence)&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;the use case or situation in which the status is used&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;a natural-language description of the meaning&amp;lt;/purpose&amp;gt;&lt;br /&gt;
  &amp;lt;child&amp;gt;the descriptive child element (reserved for future use)&amp;lt;/child&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注册人可一次注册多个状态码，每个状态码包含在独立的&amp;lt;statuscode/&amp;gt;元素中。&lt;br /&gt;
&lt;br /&gt;
====初始提交====&lt;br /&gt;
&lt;br /&gt;
作为本文的一部分, 以下状态码已被注册了:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;100&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message or presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that any occupant is allowed to see the user's full JID&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;101&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message (out of band)&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Affiliation change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that his or her affiliation changed while not in the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;102&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room now shows unavailable members&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;103&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room now does not show unavailable members&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;104&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;&lt;br /&gt;
    Inform occupants that a non-privacy-related room configuration change has occurred&lt;br /&gt;
  &amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;110&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Any room presence&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that presence refers to one of its own room occupants&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;170&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message or initial presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room logging is now enabled&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;171&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that room logging is now disabled&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;172&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now non-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;173&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now semi-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;174&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;message&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Configuration change&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform occupants that the room is now fully-anonymous&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;201&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that a new room has been created&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;210&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Entering a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that service has assigned or modified occupant's roomnick&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;301&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she has been banned from the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;303&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Exiting a room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform all occupants of new room nickname&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;307&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she has been kicked from the room&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;321&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because of an affiliation change&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;322&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because the room has been changed to members-only and the user &lt;br /&gt;
    is not a member&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;statuscode&amp;gt;&lt;br /&gt;
  &amp;lt;number&amp;gt;332&amp;lt;/number&amp;gt;&lt;br /&gt;
  &amp;lt;stanza&amp;gt;presence&amp;lt;/stanza&amp;gt;&lt;br /&gt;
  &amp;lt;context&amp;gt;Removal from room&amp;lt;/context&amp;gt;&lt;br /&gt;
  &amp;lt;purpose&amp;gt;Inform user that he or she is being removed from the room &lt;br /&gt;
    because of a system shutdown&amp;lt;/purpose&amp;gt;&lt;br /&gt;
&amp;lt;/statuscode&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===URI查询类型===&lt;br /&gt;
&lt;br /&gt;
作为由[http://www.xmpp.org/extensions/xep-0147.html XMPP URI Query Components] [[XEP-00450#附录G:备注|29]]授权的机构，XMPP注册员维护着一个用于 XMPP URIs 的查询和键-值对的注册表（见&amp;lt;[http://www.xmpp.org/registrar/querytypes.html http://www.xmpp.org/registrar/querytypes.html]&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
====join====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;join&amp;quot; 查询类型被注册为一个 MUC相关的动作, 伴随一个可选的键 &amp;quot;password&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 199. Join动作: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?join&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
应用必须 MUST 要么展示一个界面允许用户提供一个房间昵称，要么基于配置好的选项或昵称发现来获取这个房间昵称.&lt;br /&gt;
&lt;br /&gt;
'''例子 200. Join动作: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
join 动作可以 MAY 为这房间包含一个密码. 自然的, 对一个包含了房间密码的 URI 的访问必须 MUST 得到适当的控制.&lt;br /&gt;
&lt;br /&gt;
'''例子 201. Join动作包含密码: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?join;password=cauldronburn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 202. Join动作包含密码: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下提交注册 &amp;quot;join&amp;quot; 查询类型.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;querytype&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;join&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;proto&amp;gt;http://jabber.org/protocol/muc&amp;lt;/proto&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;enables joining a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;keys&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;password&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the password required to enter a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
  &amp;lt;/keys&amp;gt;&lt;br /&gt;
&amp;lt;/querytype&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====invite====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;invite&amp;quot; 查询类型被注册为一个 MUC相关的动作, 伴随一个可选的键 &amp;quot;jid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''例子 203. Invite动作: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果加入中的用户还未在房间里, 应用必须 MUST 发送两个节: 第一个加入房间，第二个邀请另一个人. 如果加入中的用户已经在房间里, 应用将只发送邀请节.&lt;br /&gt;
&lt;br /&gt;
'''例子 204. Invite动作: 结果节(s)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
URI 可以包含多个邀请:&lt;br /&gt;
&lt;br /&gt;
'''例子 205. Invite动作包含多个邀请: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit;jid=bard@shakespeare.lit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 206. Invite动作包含多个邀请: 结果节'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
URI 也可以包含一个密码:&lt;br /&gt;
&lt;br /&gt;
'''例子 207. Invite动作包含密码: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
xmpp:darkcave@chat.shakespeare.lit?invite;jid=hecate@shakespeare.lit;password=cauldronburn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果加入中的用户还未在房间里, 应用必须 MUST 发送两个节: 第一个加入房间，第二个邀请另一个人. 如果加入中的用户已经在房间里, 应用将只发送邀请节.&lt;br /&gt;
&lt;br /&gt;
'''例子 208. Invite动作包含密码: 结果节(s)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence to='darkcave@chat.shakespeare.lit/thirdwitch'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message to='darkcave@chat.shakespeare.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='hecate@shakespeare.lit'/&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;cauldronburn&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下提交注册 &amp;quot;invite&amp;quot; 查询类型.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;querytype&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;invite&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;proto&amp;gt;http://jabber.org/protocol/muc&amp;lt;/proto&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;enables simultaneously joining a groupchat room and inviting others&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0045&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;keys&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;jid&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the Jabber ID of the invitee&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;password&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the password required to enter a multi-user chat room&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
  &amp;lt;/keys&amp;gt;&lt;br /&gt;
&amp;lt;/querytype&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==商业规则==&lt;br /&gt;
===Addresses===&lt;br /&gt;
&lt;br /&gt;
为了提供关于从房间JIDs抓获的地址的一致性, Room IDs 必须 MUST 遵循 Stringprep 的 Nodeprep 规范并且 Room Nicknames 必须 MUST 符合 Stringprep (这些都定义在 '''RFC 3920''') 的 Resourceprep 规范. 尽管在 '''RFC 3920''' 中没有显式的说明 , 一个 Room JID 的 Room ID (node) 和 Room Nickname (resource) 部分都必须 MUST 长度不为零. 另外, 一个 MUC 服务不能 MUST NOT 允许空的或不可见的房间昵称 Room Nicknames (即, 房间昵称Room Nicknames 只包含一个或多个空格).&lt;br /&gt;
&lt;br /&gt;
取决于服务实现，是否更多地限制房间昵称 (例如, 通过应用情景例程, stringprep的Nodeprep规范, 或其他限制).&lt;br /&gt;
&lt;br /&gt;
===Message===&lt;br /&gt;
&lt;br /&gt;
# 如果一个房客想发送一个消息给所有其他房客, MUC 客户端必须 MUST 把 'type' 属性值设为 &amp;quot;groupchat&amp;quot;. 服务可以 MAY 忽略不正确的消息类型, 或用 &amp;lt;bad-request/&amp;gt; 错误弹回.&lt;br /&gt;
# 如果一个MUC服务从一个角色为&amp;quot;none&amp;quot;的Jabber用户收到一个发送给该房间的消息或给某个房客的消息, 服务不能 MUST NOT 递送这个消息并应该 SHOULD 返回给这个消息给发送者并伴随一个 &amp;lt;forbidden/&amp;gt; 错误.&lt;br /&gt;
# 如果一个MUC服务 接收到一个发送给不存在的或尚未解锁的房间的消息, 服务应该 SHOULD 返回这个消息给发送者并伴随一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
# 一个MUC服务应该 SHOULD 不做修改地传递扩展的消息 (例如, 一个消息主体的 XHTML 版本) 给房客; 然而, 一个 MUC 服务可以 MAY 不允许消息的特定扩展(参见本文的[[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
# 一个MUC客户端可以 MAY 生成扩展以满足 [http://xmpp.org/extensions/xep-0022.html 消息事件] [[XEP-0045#附录G:备注|30]] 或 [http://xmpp.org/extensions/xep-0085.html 聊天状态通知] [[XEP-0045#附录G:备注|31]] 规范; 然而, 一个 MUC 服务可以 MAY 不允许这些扩展 (参见本文的[[XEP-0045#允许的通讯|允许的通讯]]章节).&lt;br /&gt;
&lt;br /&gt;
===Presence===&lt;br /&gt;
&lt;br /&gt;
# 一个房间必须 MUST 安静地忽略从一个角色为&amp;quot;none&amp;quot;的用户发来的不可用出席信息信息.&lt;br /&gt;
# 只有MUC服务自身应该 SHOULD 生成关于角色，岗位，全JIDs或遵循 'http://jabber.org/protocol/muc#user' 名字空间的状态码的扩展的出席信息 (基于服务所知道的关于房客的信息, 例如, 角色, 或由一个主持人或房间管理员的动作所产生的结果). 一个客户端不应该 SHOULD NOT 推定生成这类信息. 如果一个 MUC 服务从一个房客接收到这类扩展的出席信息, 它不能 MUST NOT 反射它给其他房客们. (一个客户端可以 MAY 为了提供一个密码而生成遵循 'http://jabber.org/protocol/muc#user' 名字空间的扩展的出席信息, 但自然的这是不反射给其他房客的.)&lt;br /&gt;
# 一个MUC服务应该 SHOULD 允许所有其他出席信息通过, 尽管它可以 MAY 选择阻塞扩展的出席信息; 参见本文的 [[XEP-0045#允许的通讯|允许的通讯]]章节.&lt;br /&gt;
# 为了适当地通知房客角色和岗位, 并使之更易于Jabber客户端跟踪房间里所有用户的当前状态, MUC服务实现必须 MUST 在所有出席信息节里提供关于角色和岗位的扩展的出席信息, 包括一个用户因为任何原因退出该房间时被发送的类型为&amp;quot;unavailable&amp;quot;的出席信息节.&lt;br /&gt;
# 如果一个权限被撤销, 服务必须 MUST 通知这件事，通过发送一个遵循 'http://jabber.org/protocol/muc#user' 名字空间的 &amp;lt;x/&amp;gt; 元素并包含一个 &amp;lt;item/&amp;gt; 子元素，该&amp;lt;item/&amp;gt; 子元素的 'role' 和/或 'affiliation' 属性值的设定指明是去了有关的权限. 所有将来的为这个房客发出的出席信息节必须 MUST 包含这个更新的角色和岗位, 直到除非它们再次改变.&lt;br /&gt;
# 一个MUC服务必须 MUST 发送扩展的出席信息给一个客户端，即使客户端在进入该房间时没有发送一个空的遵循 'http://jabber.org/protocol/muc' 名字空间的 &amp;lt;x/&amp;gt; 元素 ; 自然的, 一个客户端必须 MUST 忽略这类信息，如果它不懂得它的话(根据 '''RFC 3920''').&lt;br /&gt;
# 在 muc#user 名字空间中被发送的关于角色和岗位的扩展的出席信息必须 MUST 包含全JID (不是纯JID) 作为 'jid' 属性的值.&lt;br /&gt;
# 如果想要，一个客户端可以 MAY 发送一个客户化的退出消息 (就像 IRC 频道里经常出现的那样) ，通过在退出时被发送的&amp;quot;unavailable&amp;quot;类型的出席信息节里包含一个 &amp;lt;status/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
===IQ===&lt;br /&gt;
&lt;br /&gt;
# MUC被设计用于分享消息和出席信息, 而不是 IQs. 一个被发送的到房间本身JID的 IQ 由房间本身来处理并且不反射给所有房客.&lt;br /&gt;
# 如果一个房客想在一个非匿名房间发送一个 IQ 节给其他用户, 发送者应该 SHOULD 直接发送请求给接收者的纯JID或全JID, 而不是试图通过房间发送请求(即, 通过接收者的房间JID).&lt;br /&gt;
# 如果一个房客想在一个半匿名房间发送一个 IQ 节给其他用户, 发送者能直接发送这个节给接受者的房间JID并且服务可以 MAY 转发这个节给接收者的真实JID. 然而, 任何时候一个MUC服务不能 MUST NOT 泄露这个发送者的真实JID给接收者, 也不能泄露接收者的真实JID给发送者.&lt;br /&gt;
# 一个MUC客户端必须 MUST 在IQ set 中的遵循 'http://jabber.org/protocol/muc#admin' &amp;lt;item/&amp;gt; 子元素中只发送 'affiliation' 属性或 'role' 属性; 如果一个主持人, 管理员, 或所有者试图在相同的IQ set中修改相同条目的岗位或角色, 服务必须 MUST 返回一个 &amp;lt;bad-request/&amp;gt; 错误给发送者. 无论如何, 一个MUC服务可以 MAY 基于一个岗位的变更来修改一个角色，从而可以 MAY 发送出席信息更新，同时包含一个修改的角色和一个修改的岗位.&lt;br /&gt;
# 在关于角色的 IQ sets中, 一个MUC客户端必须 MUST 只包含 'nick' 属性; 在关于角色的 IQ results中, 一个 MUC 服务必须 MUST 包含 'nick', 'role', 'affiliation', 和'jid' 属性 (值为后来设置的用户的全JID).&lt;br /&gt;
# 在关于岗位的 IQ sets中, 一个MUC客户端必须 MUST 只包含 'jid' 属性(值为纯JID); 在关于岗位的 IQ results中, 一个MUC服务不能 MUST NOT 包含 'role' 属性, 必须MUST 包含 'affiliation' 属性和 'jid' 属性 (值为纯JID), 并且应该 SHOULD 包含 'nick' 属性 (除非岗位为 &amp;quot;outcast&amp;quot;, 以为被排斥者不应该 SHOULD NOT 有保留的房间昵称).&lt;br /&gt;
&lt;br /&gt;
==实现注意事项==&lt;br /&gt;
&lt;br /&gt;
以下方针有助于客户端和组件开发者建立 MUC 实现.&lt;br /&gt;
&lt;br /&gt;
===服务端===&lt;br /&gt;
&lt;br /&gt;
# 在处理一个被主持的房间里游客发送的消息时, 一个MUC服务可以 MAY 通过一个主持人让每个消息排队等待批准并且可以 MAY 通知发送者消息正在等待批准; 然而, 这一行为是可选的 OPTIONAL, 并且一个消息批准协议的定义 (例如, 使用'''XEP-0004'''定义的数据表单) 超出了本文的范围.&lt;br /&gt;
# 对于一个 MUC 服务来说，在特定时间发生时提供房间内的消息是很常见的, 例如当标题变更时, 当一个房客加入或退出时, 或当一个房间被销毁时. 这类消息完全是可选的 OPTIONAL 并且留给实现或布署来决定, 但如果使用了，则必须 MUST 是从房间JID本身(&amp;lt;room@service&amp;gt;) 而不是从一个特定的&lt;br /&gt;
房客(&amp;lt;room@service/nick&amp;gt;)发送的类型为 &amp;quot;groupchat&amp;quot; 类型的消息. 无论如何, 通常接收的客户端倾向于基于房间的事件以及MUC提供的特定状态码来生成类似的消息(例如, 用户加入或退出) ; 这将帮助确保这类消息的正确的本地化.&lt;br /&gt;
# 出于礼貌, 一个MUC服务可以 MAY 发送一个房间外的 &amp;lt;message/&amp;gt; 给一个被踢的或被禁止的房客, 并且可以 MAY 广播一个房间内的 &amp;lt;message/&amp;gt; 给所有剩余的房客通知他们该房客已被该房间踢出或禁止. 无论如何, 这类消息是可选的 OPTIONAL, 并且事实上是多余的，因为接收的客户端生成这类消息所必需的信息已经通过MUC服务发送的出席信息节(特别是状态码)得到了.&lt;br /&gt;
# 出于礼貌, 如果一个用户的岗位变更了而该用户不在房间里，一个MUC服务可以MAY发送一个房间外的 &amp;lt;message/&amp;gt; ; 这消息应该 SHOULD 被从房间发送给该用户的纯JID, 可以 MAY 包含一个 &amp;lt;body/&amp;gt; 元素描述岗位变更, 并且必须 MUST 包含一个状态码 101.&lt;br /&gt;
# 没有需求要一个MUC服务将为旧的&amp;quot;groupchat 1.0&amp;quot;用户提供特别的治疗, 例如包含等价于扩展的遵循 'http://jabber.org/protocol/muc#user' 名字空间的出席信息的消息.&lt;br /&gt;
# 房间类型可以 MAY 被配置成任何组合. 一个MUC服务可以 MAY 支持或允许任何想要的房间类型或它们的组合.&lt;br /&gt;
# 一个MUC服务可以 MAY 限制在初始配置完成之后配置选项展示给一个所有者的次数, 例如因为特定的选项除非重启服务无法生效.&lt;br /&gt;
# 一个MUC服务可以 MAY 提供一个接口给房间创建和配置(例如, 以一个特定的Jabber表单或一个网页), 这样表面上房间所有者是一个应用而不是一个自然人用户.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择让一个特定的房间内资源提供接口给管理功能 (例如, 一个 &amp;quot;user&amp;quot; 名的机器人 &amp;quot;ChatBot&amp;quot;), 房客们可以和它直接互动, 从而允许管理员在一个私有消息里键入命令参数 '/command parameter' 给那个机器人 &amp;quot;user&amp;quot;. 显然这种服务要求服务在房间创建时添加一个 'ChatBot' 用户到房间, 并且阻止任何房客在该房间使用房间昵称 'ChatBot' . 这可能在一些实现或布署中比较难以保证. 任何情况下, 任何这类接口是可选的 OPTIONAL.&lt;br /&gt;
# 如果服务接收到它之前发送给该用户的节相关的递送类错误，一个MUC服务应该 SHOULD 移除一个用户; 递送相关的错误即 &amp;lt;gone/&amp;gt;, &amp;lt;item-not-found/&amp;gt;, &amp;lt;recipient-unavailable/&amp;gt;, &amp;lt;redirect/&amp;gt;, &amp;lt;remote-server-not-found/&amp;gt;, 和 &amp;lt;remote-server-timeout/&amp;gt;.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择在反射出席信息变更给一个房间的房客们之前，抛弃附加在&amp;lt;presence/&amp;gt; 节上的扩展的出席信息. 也就是, 一个实现可以 MAY 选择只反射该出席信息节的 &amp;lt;show/&amp;gt;, &amp;lt;status/&amp;gt;, 和 &amp;lt;priority/&amp;gt; 子元素，如 'jabber:client' 名字空间描述的 XML 架构之中, 结果导致那个在扩展的名字空间中的出席信息变更 &amp;quot;changes&amp;quot; (例如, gabber:x:music:info) 不被传递给房客. 如果一个服务禁止特定的扩展名字空间, 它应该 SHOULD 在本文 [[XEP-0045#允许的通讯|允许的通讯]]章节描述的知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 提供一个允许的通讯的描述.&lt;br /&gt;
# 一个MUC服务可以 MAY 在反射消息给一个房间的房客之前选择抛弃附加在 &amp;lt;message/&amp;gt; 节的扩展信息. 一个这类扩展信息的例子是轻量级文本标记，定义于 [http://xmpp.org/extensions/xep-0071.html XHTML-IM]  [XEP-0045#附录G:备注|32]]. 如果一个服务禁止特定的扩展名字空间, 它应该 SHOULD 在本文 [[XEP-0045#允许的通讯|允许的通讯]]章节描述的知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 提供一个允许的通讯的描述.&lt;br /&gt;
# 一个MUC服务可以 MAY 选择锁定 &amp;quot;lock down&amp;quot; 房间昵称 (例如, 硬编码房间昵称给该房客的纯JID). 如果这么干, 该服务必须 MUST 把被锁定的昵称看作一个保留的房间昵称并且必须 MUST 支持本文[[XEP-0045#发现保留的房间昵称|发现保留的房间昵称]]章节定义的协议.&lt;br /&gt;
&lt;br /&gt;
====允许的通讯====&lt;br /&gt;
&lt;br /&gt;
大家知道, 一个服务 (更准确地说, 一个正确配置的房间)可以 MAY 抛弃一些或所有的扩展的附加在从发送者通过房间反射给所有房客的 &amp;lt;message/&amp;gt; 和 &amp;lt;presence/&amp;gt; 节的名字空间. 如果房间这么干, 它应该 SHOULD 允许发送者通过发送 disco#info 查询知名的服务发现节点 'http://jabber.org/protocol/muc#traffic' 来发现允许的扩展的列表, 在结果中返回支持的名字空间每个用一个 &amp;lt;feature/&amp;gt; 元素表示. 如果该房间不允许任何扩展的名字空间, 它必须 MUST 如 '''XEP-0030''' 所述返回一个空的 query . 如果该房间不支持 &amp;quot;#traffic&amp;quot; 节点, 它必须 MUST 返回一个 &amp;lt;feature-not-implemented/&amp;gt; 错误应答给查询发送到 'http://jabber.org/protocol/muc#traffic' 节点的查询.&lt;br /&gt;
&lt;br /&gt;
以下例子展示一个只允许 'http://jabber.org/protocol/xhtml-im' 和 'http://jabber.org/protocol/rosterx' 名字空间的房间, 而不包括其他的名字空间.&lt;br /&gt;
&lt;br /&gt;
'''例子 209. 用户查询服务关于允许的名字空间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    to='heath@chat.shakespeare.lit'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子 210. 服务返回允许的名字空间'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='result'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/xhtml-im'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/rosterx'/&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个服务不抛弃任何名字空间或不实现这个特性, 它必须 MUST 返回一个 &amp;lt;service-unavailable/&amp;gt; 错误:&lt;br /&gt;
&lt;br /&gt;
'''例子 211. 服务返回服务不可用错误'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='heath@chat.shakespeare.lit'&lt;br /&gt;
    to='wiccarocks@shakespeare.lit/laptop'&lt;br /&gt;
    id='allow1'&lt;br /&gt;
    type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&lt;br /&gt;
         node='http://jabber.org/protocol/muc#traffic'/&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===客户端===&lt;br /&gt;
&lt;br /&gt;
# Jabber客户端可以 MAY 展示房间角色，通过在一个房间名册里为每个角色显示特定的群. 这将使房客清楚图形化的知道哪个房客是主持人, 参与者, 和游客. 无论如何, 这样一个展示是可选的 OPTIONAL.&lt;br /&gt;
# Jabber客户端可以 MAY 实现多样化的界面以提供快捷方式 &amp;quot;shortcuts&amp;quot; 给功能，例如修改某人昵称, 踢人或禁止用户, 发现一个房客的全JID, 或修改主题. 一个选项包含了类IRC 的命令例如 '/nick', '/kick', '/ban', 和 '/whois'; 另一个是使用户能用鼠标右击房间名册里的项目. 所有这些界面形式是可选的 OPTIONAL. 然而, 为方便起见, 下面提供了一个 IRC 命令到 MUC 协议的映射.&lt;br /&gt;
&lt;br /&gt;
====IRC命令映射====&lt;br /&gt;
&lt;br /&gt;
IRC 客户端使用大量常用的快捷方式 &amp;quot;shortcut&amp;quot; 命令，以一个斜杠开始, 例如 '/nick' and '/ban'. 下表提供一个 类IRC 命令到 MUC 协议的映射, 用于希望支持类似功能的 Jabber 客户端.&lt;br /&gt;
&lt;br /&gt;
'''表10: IRC命令映射'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!命令 !!功能 !!MUC协议&lt;br /&gt;
|-&lt;br /&gt;
|/ban &amp;lt;roomnick&amp;gt; [comment] ||在房间里以房间昵称禁止用户(客户端翻译房间昵称为纯JID) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;iq id='someid'&lt;br /&gt;
    to='room@service'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item affiliation='outcast'&lt;br /&gt;
          jid='bare-jid-of-user'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/invite &amp;lt;jid&amp;gt; [comment] ||以JID邀请用户到此房间 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;invite to='jid'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/invite&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
|/join &amp;lt;roomname&amp;gt; [pass] ||在服务里加入房间(房间昵称同本房间内的昵称) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/nick'&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='http://jabber.org/protocol/muc#user'&amp;gt;&lt;br /&gt;
    &amp;lt;password&amp;gt;pass&amp;lt;/password&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/kick &amp;lt;roomnick&amp;gt; [comment] ||以房间昵称从房间里踢人 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;iq id='someid'&lt;br /&gt;
    to='room@service'&lt;br /&gt;
    type='set'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/muc#admin'&amp;gt;&lt;br /&gt;
    &amp;lt;item nick='roomnick' role='none'&amp;gt;&lt;br /&gt;
      &amp;lt;reason&amp;gt;comment&amp;lt;/reason&amp;gt;&lt;br /&gt;
    &amp;lt;/item&amp;gt;&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|/msg &amp;lt;roomnick&amp;gt; &amp;lt;foo&amp;gt; ||发送私有消息&amp;quot;foo&amp;quot;给房间昵称 ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service/nick' type='chat'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;foo&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/nick &amp;lt;newnick&amp;gt; ||变更在此房间内的昵称为&amp;quot;newnick&amp;quot; ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/newnick'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/part [comment] ||退出本房间(一些 IRC 客户端也支持 /leave) ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;presence to='room@service/nick'&lt;br /&gt;
          type='unavailable'&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;comment&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|/topic &amp;lt;foo&amp;gt; ||变更此房间主题为&amp;quot;foo&amp;quot; ||&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;message to='room@service' type='groupchat'&amp;gt;&lt;br /&gt;
  &amp;lt;subject&amp;gt;foo&amp;lt;/subject&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 因为 MUC 房间昵称遵循stringprep的Resourceprep脚本, 它们被允许包含一个空格字符, 而 IRC 昵称不允许. 尽管一个给定的客户端可以 MAY 支持引用字符串用于这个目的 (导致命令类似 '/ban &amp;quot;king lear&amp;quot; insanity is no defense'), 最常见的引用字符(类似 &amp;quot; 和 ') 也是被Resourceprep允许的 , 从而导致增加了复杂性和包含空格和引号的房间昵称中引号的潜在问题. 所以不建议 NOT RECOMMENDED Jabber客户端支持包含了空格符的房间昵称的类IRC的快捷方式命令.&lt;br /&gt;
&lt;br /&gt;
注意: 很多Jabber客户端也实现了 '/me ' 命令，如 [http://xmpp.org/extensions/xep-0245.html The /me Command] [[XEP-0045#附录G:备注|33]] 所述. 这个命令不会导致任何 MUC 或 IRC 协议的动作所以不显式在上表中.&lt;br /&gt;
&lt;br /&gt;
==XML架构==&lt;br /&gt;
===http://jabber.org/protocol/muc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='x'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='history' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='history'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='maxchars' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='maxstanzas' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='seconds' type='xs:int' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='since' type='xs:dateTime' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#user===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#user'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#user'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='x'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:choice minOccurs='0' maxOccurs='unbounded'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='decline' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='destroy' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='invite' minOccurs='0' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='item' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='status' minOccurs='0' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='decline'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='destroy'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='invite'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='item'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='actor' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='continue' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='affiliation' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='admin'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='member'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='outcast'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='owner'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='nick' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='role' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='moderator'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='participant'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='visitor'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='actor'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='jid' type='xs:string' use='required'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='continue'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='thread' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='status'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='code' use='required'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:int'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:minInclusive value='100'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:maxInclusive value='999'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='reason' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#admin===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#admin'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#admin'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='query'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='item' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='item'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='actor' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='reason' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='affiliation' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='admin'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='member'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='outcast'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='owner'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='nick' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='role' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='moderator'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='none'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='participant'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='visitor'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='actor'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='jid' type='xs:string' use='required'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='reason' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#owner===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#owner'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#owner'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:import &lt;br /&gt;
      namespace='jabber:x:data'&lt;br /&gt;
      schemaLocation='http://www.xmpp.org/schemas/x-data.xsd'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='query'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:choice xmlns:xdata='jabber:x:data' minOccurs='0'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='xdata:x'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='destroy'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='destroy'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='password' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='reason' type='xs:string' minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='jid' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===http://jabber.org/protocol/muc#unique===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/muc#unique'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/muc#unique'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0045: http://www.xmpp.org/extensions/xep-0045.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='unique' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==鸣谢==&lt;br /&gt;
&lt;br /&gt;
作者感谢以下个人，为他们很多对于本协议草案的帮助性的评论: David Sutton, Peter Millard, Joe Hildebrand, Craig Kaes, Alexey Shchepin, David Waite, Jean-Louis Seguineau, Jacek Konieczny, Gaston Dombiak, 以及其他在 jdev@conference.jabber.org 会议室和在 Standards 邮件列表里的人.&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
&lt;br /&gt;
系列：[http://xmpp.org/extensions/ XEP]&lt;br /&gt;
&lt;br /&gt;
序号：0045&lt;br /&gt;
&lt;br /&gt;
发布者：[http://xmpp.org/xsf/ XMPP标准基金会]&lt;br /&gt;
&lt;br /&gt;
状态：[http://xmpp.org/extensions/xep-0001.html#states-Draft 草案 ]&lt;br /&gt;
&lt;br /&gt;
类型：[http://www.xmpp.org/extensions/xep-0001.html#types-Standards%20Track 标准跟踪]&lt;br /&gt;
&lt;br /&gt;
版本：1.24&lt;br /&gt;
&lt;br /&gt;
最后更新：2008-07-16&lt;br /&gt;
&lt;br /&gt;
批准机构：[http://xmpp.org/council/ XMPP理事会]&lt;br /&gt;
&lt;br /&gt;
依赖标准：XMPP Core, XMPP IM, XEP-0004, XEP-0030, XEP-0068, XEP-0082, XEP-0128&lt;br /&gt;
&lt;br /&gt;
替代标准：无&lt;br /&gt;
&lt;br /&gt;
被替代标准：无&lt;br /&gt;
&lt;br /&gt;
缩略名：muc&lt;br /&gt;
&lt;br /&gt;
muc名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#admin名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-admin.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#owner名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-owner.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#unique名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-unique.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muc#user名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/muc-user.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注册表: &amp;lt;http://www.xmpp.org/registrar/muc.html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原文控制： [http://svn.xmpp.org:18080/browse/XMPP/trunk/extensions/xep-0045.xml HTML] [http://svn.xmpp.org:18080//changelog/~rss/XMPP/trunk/extensions/xep-0045.xml/rss.xml RSS]&lt;br /&gt;
&lt;br /&gt;
本文的其它格式： [http://xmpp.org/extensions/xep-0045.xml XML] [http://xmpp.org/extensions/xep-0045.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
URI: https://stpeter.im/&lt;br /&gt;
&lt;br /&gt;
{{Template:XEP附录CDEF}}&lt;br /&gt;
&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
&lt;br /&gt;
# RFC 1459: Internet Relay Chat &amp;lt;http://tools.ietf.org/html/rfc1459&amp;gt;.&lt;br /&gt;
# RFC 2810: Internet Relay Chat: Architecture &amp;lt;http://tools.ietf.org/html/rfc2810&amp;gt;.&lt;br /&gt;
# RFC 2811: Internet Relay Chat: Channel Management &amp;lt;http://tools.ietf.org/html/rfc2811&amp;gt;.&lt;br /&gt;
# RFC 2812: Internet Relay Chat: Client Protocol &amp;lt;http://tools.ietf.org/html/rfc2812&amp;gt;.&lt;br /&gt;
# RFC 2813: Internet Relay Chat: Server Protocol &amp;lt;http://tools.ietf.org/html/rfc2813&amp;gt;.&lt;br /&gt;
# XEP-0133: Service Administration &amp;lt;http://xmpp.org/extensions/xep-0133.html&amp;gt;.&lt;br /&gt;
# XEP-0030: Service Discovery &amp;lt;http://xmpp.org/extensions/xep-0030.html&amp;gt;.&lt;br /&gt;
# XEP-0059: Result Set Management &amp;lt;http://xmpp.org/extensions/xep-0059.html&amp;gt;.&lt;br /&gt;
# XEP-0128: Service Discovery Extensions &amp;lt;http://xmpp.org/extensions/xep-0128.html&amp;gt;.&lt;br /&gt;
# RFC 3920: 可扩展的消息和出席信息协议 (XMPP): Core &amp;lt;http://tools.ietf.org/html/rfc3920&amp;gt;.&lt;br /&gt;
# XEP-0203: Delayed Delivery &amp;lt;http://xmpp.org/extensions/xep-0203.html&amp;gt;.&lt;br /&gt;
# XEP-0091: Legacy Delayed Delivery &amp;lt;http://xmpp.org/extensions/xep-0091.html&amp;gt;.&lt;br /&gt;
# XEP-0082: XMPP Date and Time Profiles &amp;lt;http://xmpp.org/extensions/xep-0082.html&amp;gt;.&lt;br /&gt;
# RFC 3921: 可扩展的消息和出席信息协议 (XMPP): Instant Messaging and Presence &amp;lt;http://tools.ietf.org/html/rfc3921&amp;gt;.&lt;br /&gt;
# XEP-0249: Direct MUC Invitations &amp;lt;http://xmpp.org/extensions/xep-0249.html&amp;gt;.&lt;br /&gt;
# XEP-0077: In-Band Registration &amp;lt;http://xmpp.org/extensions/xep-0077.html&amp;gt;.&lt;br /&gt;
# XEP-0004: Data Forms &amp;lt;http://xmpp.org/extensions/xep-0004.html&amp;gt;.&lt;br /&gt;
# 一些评论者抱怨公开房间的所有者和管理员存在潜在的滥用; 很不幸的, 能力越大责任越大.&lt;br /&gt;
# XEP-0050: Ad-Hoc Commands &amp;lt;http://xmpp.org/extensions/xep-0050.html&amp;gt;.&lt;br /&gt;
# XEP-0060: Publish-Subscribe &amp;lt;http://xmpp.org/extensions/xep-0060.html&amp;gt;.&lt;br /&gt;
# 这和房间配置的行为不同, 这里 'muc#roomconfig_roomowners' 字段指定房间所有者的完整列表, 不是delta.&lt;br /&gt;
# 这和房间配置的行为不同, 这里 'muc#roomconfig_roomadmins' 字段指定房间管理眼的完整列表, 不是delta.&lt;br /&gt;
# XEP-0086: Error Condition Mappings &amp;lt;http://xmpp.org/extensions/xep-0086.html&amp;gt;.&lt;br /&gt;
# RFC 2616: Hypertext Transport Protocol -- HTTP/1.1 &amp;lt;http://tools.ietf.org/html/rfc2616&amp;gt;.&lt;br /&gt;
# RFC 1893: Enhanced Mail System Status Codes &amp;lt;http://tools.ietf.org/html/rfc1893&amp;gt;.&lt;br /&gt;
# 互联网编号分配机构 (IANA) 是用于互联网协议的唯一性参数值分配的核心协调者, 例如号码和URI计划. 更多信息, 见 &amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
# XMPP登记员 XMPP Registrar 维护着一个保留的协议名字空间以及用于由XMPP标准基金会批准的XMPP扩展协议的上下文参数的注册项的列表. 更多信息, 见 &amp;lt;http://xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
# XEP-0068: Field Data Standardization for Data Forms &amp;lt;http://xmpp.org/extensions/xep-0068.html&amp;gt;.&lt;br /&gt;
# XEP-0147: XMPP URI Query Components &amp;lt;http://xmpp.org/extensions/xep-0147.html&amp;gt;.&lt;br /&gt;
# XEP-0022: Message Events &amp;lt;http://xmpp.org/extensions/xep-0022.html&amp;gt;.&lt;br /&gt;
# XEP-0085: Chat State Notifications &amp;lt;http://xmpp.org/extensions/xep-0085.html&amp;gt;.&lt;br /&gt;
# XEP-0071: XHTML-IM &amp;lt;http://xmpp.org/extensions/xep-0071.html&amp;gt;.&lt;br /&gt;
# XEP-0245: The /me Command &amp;lt;http://xmpp.org/extensions/xep-0245.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===附录H: 修订历史===&lt;br /&gt;
&lt;br /&gt;
注意: 本协议的旧版本可能在 http://xmpp.org/extensions/attic/ 还可用&lt;br /&gt;
&lt;br /&gt;
'''版本 1.24 (2008-07-16)'''&lt;br /&gt;
&lt;br /&gt;
增加了更多原因reason元素的例子; 移除了关于黑名单包含的昵称部分; 增加了拒绝服务注意事项.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.23 (2008-01-14)'''&lt;br /&gt;
&lt;br /&gt;
* 定义了 getmemberlist 房间配置选项&lt;br /&gt;
* 增加了直接邀请协议&lt;br /&gt;
* 修正了当房间满的时候房间承认所有者/管理员的逻辑&lt;br /&gt;
* 定义了和LDAP群关联的服务发现扩展字段&lt;br /&gt;
* 指定了房间配置字段能被列入扩展的房间信息之中&lt;br /&gt;
* 指定了消息格式用于用户不在房间时的岗位变更&lt;br /&gt;
* 增加了例子展示结果集管理&lt;br /&gt;
* 推荐出席信息错误中包含的MUC子元素&lt;br /&gt;
* 为一对一聊天和多用户聊天的连续性描述了ThreadID的使用, 包括在邀请中为 continue 元素定义 thread 属性.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.22 (2007-04-10)'''&lt;br /&gt;
&lt;br /&gt;
更新了延迟消息递送以反映 XEP-0203 演化到草案和 XEP-0091 的过时.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.21 (2006-09-13)'''&lt;br /&gt;
&lt;br /&gt;
* 澄清了MUC扩展的介入，在房间加入/创建请求触发数据表单流但没有MUC扩展可导致自动房间创建以向后兼容旧的 groupchat 1.0 协议.&lt;br /&gt;
* 指定昵称变更时如果昵称被锁定则返回 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
* 要求客户端在进入房间之前发现房间配置并指定相关的安全事项, 包括使用隐私相关的状态码 170, 171, 172, 173, 和 174.&lt;br /&gt;
* 指定在房间配置选项不能被执行或违反服务策略时使用 &amp;lt;not-acceptable/&amp;gt; 错误.&lt;br /&gt;
* 强制要求房间昵称不能只包含空格.&lt;br /&gt;
* 移除所有服务发现用例到专用章节.&lt;br /&gt;
* 修改 urn:xmpp:delay 支持从 SHOULD 改为 MUST.&lt;br /&gt;
* 澄清 _whois 房间配置选项定义房间类型.&lt;br /&gt;
* 定义 XEP-0128 房间信息字段用于讨论记录, 关联的 pubsub 节点, 以及联系人 JID.&lt;br /&gt;
* 指出修改角色到主持人导致岗位变更为管理员或所有者成为推荐的, 而不是必需的.&lt;br /&gt;
* 增加了国际化事项中关于数据表单的本地化的部分.&lt;br /&gt;
* 指出实现可以持久化角色括月整个访问并且应该在被主持的房间里这样做.&lt;br /&gt;
* 增加了协议和服务发现特性用于在新建房间之前请求唯一的房间名.&lt;br /&gt;
* 更多澄清保留的房间昵称和昵称锁定的性质.&lt;br /&gt;
* 定义数据表单用于请求发言权和批准发言申请.&lt;br /&gt;
* 增加了多个邀请的例子用于XMPP URI.&lt;br /&gt;
* 澄清了出席信息，讨论历史的顺序, 等等.&lt;br /&gt;
* 增加了状态码用于房客拥有的房间昵称, 服务修改的房间昵称, 并警告房间讨论被公开记录.&lt;br /&gt;
* 澄清关于房间记录和非匿名房间的隐私和匿名事项.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.20 (2005-09-08)'''&lt;br /&gt;
&lt;br /&gt;
同意了踢人和禁止用户的能力, 并定义了一个用户不能被一个比自己岗位低的主持人或管理员踢或禁止.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 1.19 (2005-04-21)'''&lt;br /&gt;
&lt;br /&gt;
定义了怎样发送并发多邀请; 纠正了一些和岗位变更状态一致性的错误; 修改了消息事件禁令表单从 MUST NOT 到 SHOULD NOT; 修正了和 #traffic disco 节点相关的错误处理; 允许了 &amp;lt;password/&amp;gt; 作为&amp;lt;destroy/&amp;gt;的一个子元素; 修改了最大用户数错误从 &amp;lt;not-allowed/&amp;gt; 到 &amp;lt;service-unavailable/&amp;gt;; 指定了 maxchars 属性的字符数是指完整的 XML 节; 为 FORM_TYPEs;增加了 disco 特性 为状态码定义了注册表; 为遵守协议分开了新建即时房间的用例; 调整了 XML 架构以反映之前的修改; 重写了绪论; 澄清了小的文本错误.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
Version 1.18 (2004-11-02)&lt;br /&gt;
&lt;br /&gt;
Corrected several errors in the affiliation state chart and in the examples (wrong FORM_TYPE values); mentioned /me command.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.17 (2004-10-04)&lt;br /&gt;
&lt;br /&gt;
Added text about allowable extension namespaces and related service discovery mechanisms; specified well-known service discovery nodes; added conformance terms to clarify some descriptions; modified affiliation state chart to allow more flexible state changes; per list dicussion, added ability to convert a one-to-one chat into a conference, including sending of history; specified error to use when max users limit is reached; specified form for admin approval of user registration requests and modified FORM_TYPE from http://jabber.org/protocol/muc#user to http://jabber.org/protocol/muc#register; modified FORM_TYPE for room configuration from http://jabber.org/protocol/muc#owner to http://jabber.org/protocol/muc#roomconfig.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.16 (2004-06-30)&lt;br /&gt;
&lt;br /&gt;
Added example and registry submission for service discovery extension.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.15 (2004-06-24)&lt;br /&gt;
&lt;br /&gt;
Removed jabber:iq:browse references; clarified order of presence stanzas sent to new occupant on entering room; specified format of in-room messages (type='groupchat', from='room@service'); clarified allowable attributes in various list-related operations; made admin/owner revocation text and examples consistent with state chart; clarified ownership revocation conflict scenarios; changed the 'muc#roomconfig_inviteonly' field to 'muc#roomconfig_membersonly'; changed attribute order in examples to match XML canonicalization rules; corrected several errors in the schemas.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.14 (2004-05-03)&lt;br /&gt;
&lt;br /&gt;
Corrected discovery of registered roomnicks; added note about error to return if nicks are locked down.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.13 (2004-03-31)&lt;br /&gt;
&lt;br /&gt;
Fixed an error in the muc#user schema.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.12 (2004-03-01)&lt;br /&gt;
&lt;br /&gt;
Corrected a few errors in the examples; added IQ results in order to clarify workflows.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.11 (2004-02-05)&lt;br /&gt;
&lt;br /&gt;
Clarified JID matching rules (same as for privacy lists in XMPP IM).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.10 (2004-01-07)&lt;br /&gt;
&lt;br /&gt;
Added XMPP error handling; fully specified all conformance terms.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.9 (2003-12-14)&lt;br /&gt;
&lt;br /&gt;
Removed protocol for requesting voice in a moderated room (should be performed using Ad-Hoc Commands).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.8 (2003-12-04)&lt;br /&gt;
&lt;br /&gt;
Added protocol for requesting voice in a moderated room; added (informational) mapping of IRC commands to MUC protocols.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.7 (2003-10-21)&lt;br /&gt;
&lt;br /&gt;
Added room configuration option for restricting presence broadcast to certain roles.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.6 (2003-10-03)&lt;br /&gt;
&lt;br /&gt;
Added history management protocol on entering a room.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.5 (2003-09-11)&lt;br /&gt;
&lt;br /&gt;
Specified that ban occurs by JID, not roomnick; allowed privileged users to send messages to the room even if not present in the room; added note that service should remove occupant if a delivery-related stanza error occurs; enabled user to disco the room in order to discover registered roomnick; specified that &amp;quot;banning&amp;quot; by domain or regex is a service-level configuration matter and therefore out of scope for MUC; specified that role should be decremented as appropriate if affiliation is lowered; added some clarifying text to room creation workflow; added implementation note about sending an out-of-band message if a user's affiliation changes while the user is not in the room; fixed stringprep references (room nicks use Resourceprep); clarified relationship between Room ID (i.e., node identifier of Room JID, which may be opaque) and natural-language Room Name; specified Field Standardization profile per XEP-0068; defined XMPP Registrar submissions; added schema locations.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.4 (2003-02-16)&lt;br /&gt;
&lt;br /&gt;
Added XML schemas.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.3 (2003-02-11)&lt;br /&gt;
&lt;br /&gt;
Added reference to nodeprep Internet-Draft.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.2 (2003-01-30)&lt;br /&gt;
&lt;br /&gt;
Commented out revision history prior to version 1.0 (too long); clarified business rules regarding when nicks, full JIDs, and bare JIDs are used in reference to roles and affiliations; consistently specified that extended presence information in the muc#user namespace must include the full JID as the value of the 'jid' attribute in all cases; cleaned up text and examples throughout; added open issue regarding syntax of room nicknames.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.1 (2002-12-16)&lt;br /&gt;
&lt;br /&gt;
Added protocol for declining an invitation; replaced &amp;lt;created/&amp;gt; element with status code 201; modified the destroy room protocol so that &amp;lt;destroy/&amp;gt; is a child of &amp;lt;query/&amp;gt;; clarified usage of 'nick' attribute when adding members; prohibited use of message events.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 1.0 (2002-11-21)&lt;br /&gt;
&lt;br /&gt;
Per a vote of the Jabber Council, revision 0.23 was advanced to Draft on 2002-11-21. (For earlier revision history, refer to XML source.)&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.23 (2002-11-06)&lt;br /&gt;
&lt;br /&gt;
Added examples for disco#items queries sent to a room; prohibited 'type' attribute on invite messages sent from client to room; added dependencies on browse and disco; changed 'room user' to 'occupant'; fixed many small errors throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.22 (2002-11-04)&lt;br /&gt;
&lt;br /&gt;
Added example for disco#items; added support for cancellation of room configuration using type='cancel' from XEP-0004; noted 403 error for invites sent by non-admins in members-only room.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.21 (2002-11-01)&lt;br /&gt;
&lt;br /&gt;
Clarified several small ambiguities; made &amp;lt;body/&amp;gt; optional on invites sent from the service to the invitee; added error scenarios for changing nickname and for destroying the room; specified that the service must return the full member list for a members-only room (not only the members in the room); updated the disco examples to track protocol changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.20 (2002-10-29)&lt;br /&gt;
&lt;br /&gt;
Specified that messages sent to change the room subject must be of type &amp;quot;groupchat&amp;quot;; updated the legal notice to conform to the XSF IPR policy.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.19 (2002-10-28)&lt;br /&gt;
&lt;br /&gt;
Added ability to create an instant room within MUC (not by using gc-1.0 protocol); cleaned up disco examples.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.18 (2002-10-27)&lt;br /&gt;
&lt;br /&gt;
Added experimental support for disco; added sections for security, IANA, and JANA considerations; corrected typographical errors; cleaned up some DocBook formatting.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.17 (2002-10-23)&lt;br /&gt;
&lt;br /&gt;
Added the optional &amp;lt;actor/&amp;gt; element (with 'jid' attribute) to &amp;lt;item/&amp;gt; elements inside presence stanzas of type &amp;quot;unavailable&amp;quot; that are sent to users who are kicked or banned, as well as within IQs for tracking purposes; reverted all list editing use cases (ban, voice, member, moderator, admin, owner) to use of MUC format rather than 'jabber:x:data' namespace; added several guidelines regarding generation and handling of XML stanzas; cleaned up the change room subject use case; changed several ambiguous uses of 'would', 'can', and 'will' to 'should', 'may', or 'must'; fixed several small errors in the text, examples, and DTDs.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.16 (2002-10-20)&lt;br /&gt;
&lt;br /&gt;
Added the &amp;lt;item/&amp;gt; element to presence stanzas of type &amp;quot;unavailable&amp;quot; in order to improve the tracking of user states in the room; consolidated &amp;lt;invitee/&amp;gt; and &amp;lt;invitor/&amp;gt; elements into an &amp;lt;invite/&amp;gt; element with 'from' and 'to' attributes; made &amp;lt;reason/&amp;gt; element always a child of &amp;lt;item/&amp;gt; or &amp;lt;invite/&amp;gt; in the muc#user namespace; moved the alternate room location in room destruction to a 'jid' attribute of the &amp;lt;alt/&amp;gt; element; further specified several error messages; disallowed simultaneous modifications of both affiliations and roles by a moderator or admin; added several more rules regarding handling of XML stanzas; added use cases for granting and revoking administrative privileges; adjusted DTD to track all changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.15 (2002-10-18)&lt;br /&gt;
&lt;br /&gt;
Fully incorporated the change to affiliations + roles; moved a number of admin use cases to a new section for moderator use cases; added participant use case for requesting membership; added admin use cases for adding members, removing members, granting and revoking moderator privileges, and modifying the moderator list; organized the sections in a more logical manner.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.14 (2002-10-17)&lt;br /&gt;
&lt;br /&gt;
Significantly modified the privileges model by distinguishing between in-room &amp;quot;roles&amp;quot; and long-lived &amp;quot;affiliations&amp;quot;; specified the privileges of the various roles and affiliations; included state transition charts for both roles and affiliations; removed use of MUC protocol for editing ban, voice, and admin lists (but not for the actions of banning users and granting/revoking voice); added delivery rule regarding IQ stanzas; changed kick so that the action is based on changing the role to &amp;quot;none&amp;quot;.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.13 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Corrected the change nickname examples (newnick sent on unavailable, no nick sent on available).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.12 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Removed SHA1 passwords; specified that room shall add passwords on invitations to password-protected rooms (not supplied by invitor).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.11 (2002-10-16)&lt;br /&gt;
&lt;br /&gt;
Changed 'participant' to 'room user' and 'discussant' to 'participant'; clarified presence rule about client generation of extended presence information; added role of 'none'.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.10 (2002-10-15)&lt;br /&gt;
&lt;br /&gt;
Fixed extended presence on entering or creating a room (plain '...muc' with no fragment); harmonized #user with #admin regarding the use of the &amp;lt;item/&amp;gt; element and associated attributes (jid, nick, etc.), and added 'role' attribute; modified management of voice, ban, admin, and member lists to use &amp;lt;query/&amp;gt; wrapper and new &amp;lt;item/&amp;gt; structure; changed the 'member' role to 'discussant', added 'outcast' role for banned users, and added new 'member' role to enable management of member lists; changed invitation-only rooms to members-only rooms and made appropriate adjustments to apply member lists to both members-only rooms and open rooms; modified nickname change protocol slightly to send the old nickname in the unavailable presence and the new nickname in the available presence; removed prohibition on members-only rooms that are password-protected; removed the &amp;lt;query/&amp;gt; wrapper for the &amp;lt;destroy/&amp;gt; element; updated the DTDs.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.9 (2002-10-13)&lt;br /&gt;
&lt;br /&gt;
Added extended presence ('...#user') on entering a room for MUC clients; changed namespace on room creation request to '...#owner'; added a service discovery example using jabber:iq:browse; added information about discussion history; made small fixes to several examples; further defined the presence rules; transferred all implementation notes to a dedicated section; added a Terminology section.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.8 (2002-10-10)&lt;br /&gt;
&lt;br /&gt;
Made further changes to the room creation workflow (finally correct); removed feature discovery use case (this needs to be addressed by a real service discovery protocol!); added ability for room owners to edit the admin list; removed &amp;lt;body/&amp;gt; from invitations generated by the service; removed messages sent to kicked and banned users (handled by unavailable presence with status code); added a number of implementation notes; converted all examples to Shakespeare style.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.6 (2002-10-09)&lt;br /&gt;
&lt;br /&gt;
Fixed the room creation workflow; changed some terminology (&amp;quot;join&amp;quot; to &amp;quot;enter&amp;quot; and &amp;quot;leave&amp;quot; to &amp;quot;exit&amp;quot;).&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.5 (2002-10-08)&lt;br /&gt;
&lt;br /&gt;
Specified and improved the handling of invitation-only rooms. In particular, added the ability for room admins to edit the invitation list and added a configuration option that limits the ability to send invitations to room admins only.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.4 (2002-10-07)&lt;br /&gt;
&lt;br /&gt;
Changed namespaces from http://jabber.org/protocol/muc/owner etc. to http://jabber.org/protocol/muc#owner etc. per Jabber Council discussion.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.3 (2002-10-07)&lt;br /&gt;
&lt;br /&gt;
Changed namespaces to HTTP URIs; left role handling up to the implementation; further clarified presence rules.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.2 (2002-10-06)&lt;br /&gt;
&lt;br /&gt;
Disallowed kicking, banning, and revoking voice with respect to room admins and room owners; replaced &amp;lt;x/&amp;gt; with &amp;lt;query/&amp;gt; in the Discovering Room Features and Destroying a Room use cases; corrected some small errors and made many clarifications throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7.1 (2002-10-04)&lt;br /&gt;
&lt;br /&gt;
Removed &amp;lt;whois/&amp;gt; command (unnecessary since participants with appropriate privileges receive the full JID of all participants in presence stanzas); completed many small fixes throughout.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.7 (2002-10-03)&lt;br /&gt;
&lt;br /&gt;
More clearly delineated participant roles and defined the hierarchy thereof (owner, admin, member, visitor); replaced &amp;lt;voice/&amp;gt; element in extended presence with &amp;lt;item role='member'/&amp;gt;; changed initial room configuration to use IQ rather than message; adjusted presence rules (especially regarding extended presence information); cleaned up examples throughout; updated DTD to track changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.6 (2002-09-21)&lt;br /&gt;
&lt;br /&gt;
More clearly defined the scope; removed fully anonymous rooms; changed meaning of semi-anonymous rooms and of non-anonymous rooms; added mechanism for notification of full JIDs in non-anonymous rooms; replaced the &amp;lt;admin/&amp;gt; element in extended presence with a &amp;lt;role/&amp;gt; element (more extensible); changed room passwords to cleartext; added status codes for various messages received from the service; added lists of valid error and status codes associated with the 'http://jabber.org/protocol/muc#user' namespace; added a &amp;lt;reason/&amp;gt; element for invitations; made kick and ban reasons child elements rather than attributes; replaced stopgap feature discovery mechanism with jabber:iq:negotiate; added extended presence element to room creation request and clarified the room creation process; specified presence reflection rules; added method for destroying a room; adjusted DTDs to track all changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.5.1 (2002-09-20)&lt;br /&gt;
&lt;br /&gt;
Added DTDs; changed feature discovery to use &amp;lt;x/&amp;gt; element rather than query and made service response come in IQ result; fixed reference to JID spec; changed 'grant' to 'add' and 'revoke' to 'remove' for consistency in the item attributes; made several other small changes.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.5 (2002-09-19)&lt;br /&gt;
&lt;br /&gt;
Changed the kick, ban, and voice protocols; added a few more configuration options; specified the restrictions for roomnicks; and added a stopgap service discovery protocol.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.4 (2002-09-18)&lt;br /&gt;
&lt;br /&gt;
Changed all non-GC-1.0 use cases to jabber:gc:* namespaces or jabber:x:data; added use cases for ban list management and room moderation; added protocol for sending notice of admin and voice privileges in presence; cleaned up text and many examples.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.3 (2002-09-17)&lt;br /&gt;
&lt;br /&gt;
Changed admin use cases; cleaned up participant and owner use cases.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.2 (2002-09-12)&lt;br /&gt;
&lt;br /&gt;
Broke content out into three actors (participant, owner, and admin) and added more detail to owner and admin use cases.&lt;br /&gt;
(psa)&lt;br /&gt;
Version 0.1 (2002-09-09)&lt;br /&gt;
&lt;br /&gt;
Initial version.&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
END&lt;/div&gt;</summary>
		<author><name>Zyhserry</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/RFC6120</id>
		<title>RFC6120</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/RFC6120"/>
				<updated>2013-12-13T08:24:43Z</updated>
		
		<summary type="html">&lt;p&gt;Zyhserry: /* 内容命名空间 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;quot;本文的英文原文来自[http://xmpp.org/rfcs/rfc6120.html RFC 6120]&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;65%&amp;quot;&lt;br /&gt;
|互联网工程任务组(IETF) || P. Saint-Andre&lt;br /&gt;
|-&lt;br /&gt;
|申请讨论: 6120 || Cisco&lt;br /&gt;
|-&lt;br /&gt;
|取代: 3920 || 2011年3月&lt;br /&gt;
|-&lt;br /&gt;
|类别: 标准跟踪 || &lt;br /&gt;
|-&lt;br /&gt;
|ISSN: 2070-1721 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::'''可扩展的消息和出席信息协议 (XMPP): 核心协议'''&lt;br /&gt;
&lt;br /&gt;
'''摘要'''&lt;br /&gt;
&lt;br /&gt;
:可扩展的消息和出席信息协议(XMPP)是一个XML应用，让任何两个或多个网络实体之间进行结构化和可扩展的准实时信息交流. 本文定义了XMPP的核心协议方法: XML流的配置和解除, 通道加密, 验证, 错误处理, 以及消息通讯基础, 网络可用性 (&amp;quot;presence&amp;quot;), 和 请求-应答 交互. 本文取代了 RFC 3920.&lt;br /&gt;
&lt;br /&gt;
'''本文的状态'''&lt;br /&gt;
&lt;br /&gt;
:这是一个互联网标准跟踪文档.&lt;br /&gt;
&lt;br /&gt;
:本文是互联网工程工作组(IETF)的一个成果. 它代表了IETF社区的一致意见. 它已经公开审核并由互联网工程控制组(IESG)批准发布了. 更多关于互联网标准的信息请参见RFC 5741第2章.&lt;br /&gt;
&lt;br /&gt;
:关于本文当前状态的信息, 任何错误, 以及如何对它提出反馈，请到 http://www.rfc-editor.org/info/rfc6120 .&lt;br /&gt;
&lt;br /&gt;
'''版权声明'''&lt;br /&gt;
&lt;br /&gt;
:Copyright (c) 2011 IETF Trust and the persons identified as the document authors. All rights reserved.&lt;br /&gt;
&lt;br /&gt;
:This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.&lt;br /&gt;
&lt;br /&gt;
==序论==&lt;br /&gt;
===概述===&lt;br /&gt;
&lt;br /&gt;
可扩展的消息和出席信息协议(XMPP)是一个可扩展标记语言[[RFC6120#XML|XML]]应用，让任何两个或多个网络实体之间进行结构化和可扩展的准实时信息交流. 本文定义了XMPP的核心协议方法: XML流的配置和解除, 通道加密, 验证, 错误处理, 以及消息通讯基础, 网络可用性 (&amp;quot;presence&amp;quot;), 和 请求-应答 交互.&lt;br /&gt;
&lt;br /&gt;
===历史===&lt;br /&gt;
&lt;br /&gt;
XMPP的基本语法和语义最开始是由Jabber开源社区开发的, 主要是在1999年. 2002年, 根据 [[RFC6120#IMP‑REQS|IMP‑REQS]] ，XMPP工作组被允许基于Jabber协议开发一个适合IETF的即时消息和出席信息技术. 到了2004年10月, 发布了 [[RFC3920]] 和 [[RFC3921]] , 意味着那时候XMPP的主要定义完成了.&lt;br /&gt;
&lt;br /&gt;
从2004年开始，互联网社区已经获得了广泛的XMPP实现和布署经验, 包括XMPP标准基金会(XSF)主持下开展的正式的互操作性测试. 本文全面整合了从软件开发者和XMPP服务提供者得到的反馈, 包含了一系列向后兼容的修改，见 [[RFC6120#附录D:和RFC3920的不同|附录D]] . 结果是, 本文反映了互联网社区对于XMPP1.0核心功能的初步共识, 因此废止了RFC 3920.&lt;br /&gt;
&lt;br /&gt;
===功能汇总===&lt;br /&gt;
&lt;br /&gt;
这个不规范的章节提供了一个方便开发者的XMPP功能汇总; 接下来的其他章节则是XMPP的规范定义.&lt;br /&gt;
&lt;br /&gt;
XMPP的目标是允许两个(或多个)实体通过网络来交换相关的小件结构化数据(所谓&amp;quot;XML节&amp;quot;). XMPP典型地使用分布式的 客户端-服务器 体系结构来实现, 这里客户端需要连接到一个服务器以获得对网络的访问，从而被允许和其他实体(可能在其他服务器上)交换XML节. 一个客户端连接到一个服务器，交换XML节，以及结束连接，这样的流程如下: &lt;br /&gt;
&lt;br /&gt;
# 确定要连接的IP地址和端口号, 典型的做法是对一个合格的域名做出解析( [[RFC6120#合格域名的解析|3.2]] )&lt;br /&gt;
# 打开一个传输控制协议 [[RFC6120#TCP|TCP]] 连接&lt;br /&gt;
# 通过TCP打开一个XML流 [[RFC6120#打开一个流|4.2]]&lt;br /&gt;
# 握手最好使用传输层安全性 [[RFC6120#TLS|TLS]] 来进行通道加密( [[RFC6120#STARTTLS握手|5]] )&lt;br /&gt;
# 使用简单验证和安全层 [[RFC6120#SASL|SASL]] 机制来验证 ( [[RFC6120#SASL握手|6]] )&lt;br /&gt;
# 绑定一个资源到这个流上 ( [[RFC6120#资源绑定|7]] )&lt;br /&gt;
# 和其他网络上的实体交换不限数量的XML节( [[RFC6120#XML节|8]] )&lt;br /&gt;
# 关闭XML流 ( [[RFC6120#关闭一个流|4.4]] )&lt;br /&gt;
# 关闭TCP连接&lt;br /&gt;
&lt;br /&gt;
在XMPP中, 一个服务器可以选择性地连接到另一个服务器以激活域间或服务器间的通讯. 这种情形下, 两个服务器需要在他们自身之间建立一个连接然后交换XML节; 这个过程所做的事情如下: &lt;br /&gt;
&lt;br /&gt;
# 确定要连接的IP地址和端口号, 典型的做法是对一个合格的域名做出解析( [[RFC6120#合格域名的解析|3.2]] )&lt;br /&gt;
# 打开一个TCP连接&lt;br /&gt;
# 打开一个XML流 [[RFC6120#打开一个流|4.2]]&lt;br /&gt;
# 握手最好使用TLS来进行通道加密( [[RFC6120#STARTTLS握手|5]] )&lt;br /&gt;
# 使用简单验证和安全层 [[RFC6120#SASL|SASL]] 机制来验证 ( [[RFC6120#SASL握手|6]] ) *&lt;br /&gt;
# 交换不限数量的XML节，可以服务器之间直接交换，也可以代表每台服务器上的相关实体来交换，例如那些连到服务器上的客户端 ( [[RFC6120#XML节|8]] )&lt;br /&gt;
# 关闭XML流 ( [[RFC6120#关闭一个流|4.4]] )&lt;br /&gt;
# 关闭TCP连接&lt;br /&gt;
&lt;br /&gt;
* 互操作性提示: 在本文写就的时候, 大多数已布署的服务器仍使用服务器回拨协议 [[RFC6120#XEP‑0220|XEP‑0220]] 来提供弱身份验证，而不是使用SASL的 PKIX证书来提供强验证, 特别在这些情况下，SASL握手无论如何将不会得到强验证 (例如, 因为TLS握手没有被对方服务器强制要求, 或因为当TLS握手时对方服务器提供的PKIX证书是自签名的并且之前没有被接受过); 细节请见 [[RFC6120#XEP‑0220|XEP‑0220]] . 本文的解决方案显然提供了一个更高级别的安全性 (参见  [[RFC6120#高安全性|13.6]] ).&lt;br /&gt;
&lt;br /&gt;
本文指定了客户端如何连接到服务器以及基本的XML节语义. 然而, 本文不定义一个连接成功建立之后可能用来交换的XML节的&amp;quot;载荷&amp;quot;; 反之, 那些载荷被定义在各种XMPP扩展之中. 例如, [[RFC6120#XMPP‑IM|XMPP‑IM]] 定义了基本的即时消息和出席信息功能的扩展. 另外, XSF创造了各种扩展协议，即XEP系列  [[RFC6120#XEP‑0001|XEP‑0001]] ,也为广泛的应用程序定义了扩展.&lt;br /&gt;
&lt;br /&gt;
===术语===&lt;br /&gt;
&lt;br /&gt;
本文中的关键字 &amp;quot;MUST&amp;quot;, &amp;quot;MUST NOT&amp;quot;, &amp;quot;REQUIRED&amp;quot;, &amp;quot;SHALL&amp;quot;, &amp;quot;SHALL NOT&amp;quot;, &amp;quot;SHOULD&amp;quot;, &amp;quot;SHOULD NOT&amp;quot;, &amp;quot;RECOMMENDED&amp;quot;, &amp;quot;NOT RECOMMENDED&amp;quot;, &amp;quot;MAY&amp;quot;, 和 &amp;quot;OPTIONAL&amp;quot; 的解释参见RFC 2119 [[RFC6120#规范引用|关键字]] .&lt;br /&gt;
&lt;br /&gt;
特定的安全相关的术语的含义参见 [[RFC6120#安全术语|安全术语]] ; 这些术语包括但不限于, &amp;quot;assurance&amp;quot;, &amp;quot;attack&amp;quot;, &amp;quot;authentication&amp;quot;, &amp;quot;authorization&amp;quot;, &amp;quot;certificate&amp;quot;, &amp;quot;certification authority&amp;quot;, &amp;quot;certification path&amp;quot;, &amp;quot;confidentiality&amp;quot;, &amp;quot;credential&amp;quot;, &amp;quot;downgrade&amp;quot;, &amp;quot;encryption&amp;quot;, &amp;quot;hash value&amp;quot;, &amp;quot;identity&amp;quot;, &amp;quot;integrity&amp;quot;, &amp;quot;signature&amp;quot;, &amp;quot;self-signed certificate&amp;quot;, &amp;quot;sign&amp;quot;, &amp;quot;spoof&amp;quot;, &amp;quot;tamper&amp;quot;, &amp;quot;trust&amp;quot;, &amp;quot;trust anchor&amp;quot;, &amp;quot;validate&amp;quot;, and &amp;quot;verify&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
特定的和证书，域名，应用服务身份相关的术语参见 [[RFC6120#TLS‑证书|TLS‑证书]] ; 这包括但不限于, &amp;quot;PKIX certificate&amp;quot;, &amp;quot;source domain&amp;quot;, &amp;quot;derived domain&amp;quot;, 以及身份类型 &amp;quot;CN-ID&amp;quot;, &amp;quot;DNS-ID&amp;quot;, 和 &amp;quot;SRV-ID&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
其他安全相关的术语定义于参考协议中 (例如, &amp;quot;denial of service&amp;quot; (拒绝服务)定义于 [[RFC6120#DOS|DOS]] 或 &amp;quot;end entity certificate&amp;quot; (终端实体证书)定义于 [[RFC6120#PKIX|PKIX]] ).&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;whitespace&amp;quot; (空格) 用于指代 [[RFC6120#XML|XML]] 中任何匹配&amp;quot;S&amp;quot;的字符或字符串, 也就是说, 一个或多个满足 [[RFC6120#ABNF|ABNF]] 定义的SP, HTAB, CR, 或 LF 规则的实例.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;localpart&amp;quot; (本地部分), &amp;quot;domainpart&amp;quot; (域部分), 以及 &amp;quot;resourcepart&amp;quot; (资源部分)定义于 [[RFC6120#XMPP地址|XMPP地址]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;bare JID&amp;quot; (纯JID) 指代一个格式为 &amp;lt;localpart@domainpart&amp;gt; (对于一个位于某个服务器上的帐户而言) 或 &amp;lt;domainpart&amp;gt; (对于一个服务器而言) 的XMPP地址.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;full JID&amp;quot; (全JID) 指代一个格式为 &amp;lt;localpart@domainpart/resourcepart&amp;gt; (对一个典型的已授权客户端或和某个帐号相关的设备而言) 或 &amp;lt;domainpart/resourcepart&amp;gt; (对于一个典型的资源或和某个服务器相关的文字)的XMPP地址.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;XML stream&amp;quot; (也称为 &amp;quot;stream&amp;quot; (流)) 定义于 [[RFC6120#流的基本原理|4.1]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;XML stanza&amp;quot; (也称为 &amp;quot;stanza&amp;quot; (节)) 定义于 [[RFC6120#流的基本原理|4.1]] . 有三种 stanzas（节）: message, presence, 和 IQ (&amp;quot;Info/Query&amp;quot;的简称). 这些通讯原语分别定义于 [[RFC6120#Message语义|8.2.1]] , [[RFC6120#Presence语义|8.2.2]] , 和 [[RFC6120#IQ语义|8.2.3]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;originating entity&amp;quot; (原实体)指的是第一次生成一个发送到XMPP网络的stanza(节)的实体(例如, 一个已连接的客户端, 一个附加的服务, 或一个服务器). 术语 &amp;quot;generated stanza&amp;quot; (生成的节)值的是生成的节那个节.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;input stream&amp;quot; (输入流)指定这样一个XML流，服务器通过这个流从一个已连接的客户端或远端服务器接收数据, 而术语 &amp;quot;output stream&amp;quot; (输出流)指定这样一个流，服务器通过这个流发送数据到一个已连接的客户端或远程服务器. 以下术语指定一些动作，处理从输入流收到的数据时服务器可以执行这些动作:&lt;br /&gt;
&lt;br /&gt;
        route(路由):&lt;br /&gt;
            传递数据到一个远端服务器让它自行处理或最终递送到一个和远端服务器关联的客户端&lt;br /&gt;
        deliver(递送):&lt;br /&gt;
            传递数据到一个已连接的客户端&lt;br /&gt;
        ignore(忽略):&lt;br /&gt;
            丢弃数据不做任何处理或返回一个错误给发送者sender &lt;br /&gt;
&lt;br /&gt;
当术语 &amp;quot;ignore&amp;quot; (忽略)用于客户端处理收到的数据时, 短语 &amp;quot;without acting upon it&amp;quot; (不做任何处理)明确的包括不展示任何数据给使用者(人).&lt;br /&gt;
&lt;br /&gt;
接下来的 &amp;quot;XML符号&amp;quot; 被 [[RFC6120#参考文献|IRI]] 用于展示无法用仅用ASCII码呈现的字符, 本文的一些例子使用了类似 &amp;quot;&amp;amp;#x....&amp;quot; 的格式来表现 [[RFC6120#参考文献|UNICODE]] 字符串 (例如, 字符串 &amp;quot;&amp;amp;#x0159;&amp;quot; 表示Unicode字符 LATIN SMALL LETTER R WITH CARON); 这个格式在XMPP系统中绝对不会在网络上被发送.&lt;br /&gt;
&lt;br /&gt;
和 [[RFC6120#URI|URI]] 展现统一资源定位符的规则一样, XMPP地址文本也是用 '&amp;lt;' 和 '&amp;gt;' 括起来的(尽管基本上它们不属于 URIs).&lt;br /&gt;
&lt;br /&gt;
例如, 被括起来的行是用来提高可读性的, &amp;quot;[...]&amp;quot; 表示省略, 并且还是用了以下预定义字符串 (这些预定义的字符串不会通过网络发送出去):&lt;br /&gt;
&lt;br /&gt;
* C: = 客户端&lt;br /&gt;
* E: = 任何XMPP实体&lt;br /&gt;
* I: = 发起实体&lt;br /&gt;
* P: = 对端服务器&lt;br /&gt;
* R: = 接收实体&lt;br /&gt;
* S: = 服务器&lt;br /&gt;
* S1: = 服务器1&lt;br /&gt;
* S2: = 服务器2&lt;br /&gt;
&lt;br /&gt;
读者需要注意这些例子不包括细节, 并且例子里的一些协议流程中, 展示的备用步骤不一定是由前一个步骤发送的确切的数据触发的; 本文或常用参考文档中的协议规范所用到的所有用例里面提供的例子都遵从上述规则. 所有例子都是虚构的并且交换的信息 (例如, 用户名和密码) 不代表任何现存的用户和服务器.&lt;br /&gt;
&lt;br /&gt;
==体系结构==&lt;br /&gt;
&lt;br /&gt;
XMPP提供一种异步的端到端的结构化数据交换技术，在一个分布式的可全球寻址和出席信息感知的客户端和服务器的网络中使用直接的持久XML流。这种体系结构形式包含了普遍的网络可用性的知识，以及在给定的客户端-服务器和服务器-服务器会话的时候，不限数量的并发信息交易的概念，所以我们把它称为 &amp;quot;并发交易可用性&amp;quot; (&amp;quot;Availability for Concurrent Transactions&amp;quot;) (简称ACT) 来把它和来自WWW的 &amp;quot;Representational State Transfer&amp;quot; [[RFC6120#REST|REST]] 体系结构形式区别开. 尽管XMPP的体系结构很大程度上类似于 email (参见 [[RFC6120#EMAIL‑ARCH|EMAIL‑ARCH]], 它引入了一些变化以便于准实时通讯.  ACT体系结构形式的独特特性如下. &lt;br /&gt;
&lt;br /&gt;
===全局地址===&lt;br /&gt;
&lt;br /&gt;
和email一样, 为了通过网络路由和递送消息,XMPP使用全球唯一地址(基于DNS). 所有XMPP实体可以在网络上被寻址, 大部分客户端和服务器以及很多外部服务可以被客户端和服务器访问. 通常, 服务器地址的格式为 &amp;lt;域部分&amp;gt; (例如, &amp;lt;im.example.com&amp;gt;), 属于某台服务器的帐号的格式为 &amp;lt;本地部分@域部分&amp;gt; (例如, &amp;lt;juliet@im.example.com&amp;gt;, 称为 &amp;quot;纯JID&amp;quot;), 而连接到一个特定的设备或资源并且已经被(服务器)授权可以和外部交互的客户端的格式为 &amp;lt;本地部分@域部分/资源部分&amp;gt; (例如, &amp;lt;juliet@im.example.com/balcony&amp;gt;, 称为 &amp;quot;全JID&amp;quot;). 因为历史原因, XMPP地址常被称为Jabber IDs 或 JIDs. 因为XMPP地址格式的正式规范依赖于国际化技术（本文撰写时正在制定中），这个格式定义于 [[RFC6120#XMPP‑ADDR|XMPP‑ADDR]] 而非本文之中. 术语 &amp;quot;localpart&amp;quot;(本地部分), &amp;quot;domainpart&amp;quot;（域部分）, 和 &amp;quot;resourcepart&amp;quot;（资源部分） 正式定义于  [[RFC6120#XMPP‑ADDR|XMPP‑ADDR]] .&lt;br /&gt;
&lt;br /&gt;
===出席信息===&lt;br /&gt;
&lt;br /&gt;
XMPP让一个实体能够向其他实体声明它的网络可用性或者 &amp;quot;presence&amp;quot;（出席信息） . 在XMPP中, 这种可通讯状态是用端到端的专用通讯元素来标识的: 即 &amp;lt;presence/&amp;gt; 节. 尽管网络可用性对于XMPP消息交换并不是必需的, 它还是可以促进实时交互，因为消息发起者可以在发消息之前知道接收者在线并处于可通讯状态. 端到端的出席信息定义于 [[RFC6120#XMPP‑IM|XMPP‑IM]] .&lt;br /&gt;
&lt;br /&gt;
===持久流===&lt;br /&gt;
&lt;br /&gt;
每个点对点的一&amp;quot;跳&amp;quot;都建立了基于TCP长连接的持久XML流来保持可通讯状态. 这些 &amp;quot;always-on&amp;quot; 客户端-服务器 和 服务器-服务器 流使得任何时间每方都能够推送数据到另一方并且立即路由和递送. XML流定义于 [[RFC6120#XML流|4]] .&lt;br /&gt;
&lt;br /&gt;
===结构化数据===&lt;br /&gt;
&lt;br /&gt;
XMPP中基本的协议数据单元不是一个XML流 (它只是为点对点通讯提供传输层) 而是一个 XML 节（&amp;quot;stanza&amp;quot;), 它是一个通过流发送的XML片段. 一个节的根元素包括路由属性 (类似 &amp;quot;from&amp;quot; 和 &amp;quot;to&amp;quot; 地址), 而节的子元素包含了递送给目标接收者的载荷. XML节定义于 [[RFC6120#XML节|8]] .&lt;br /&gt;
&lt;br /&gt;
===客户端和服务器的分布式网络===&lt;br /&gt;
&lt;br /&gt;
在实践之中, XMPP是一个包含了很多互相通讯的客户端和服务器的网络(当然, 任何两个给定的布署服务器之间的通讯都是严格谨慎的并且也和本地服务策略有关). 因此, 例如, 与服务器 &amp;lt;im.example.com&amp;gt; 关联的用户 &amp;lt;juliet@im.example.com&amp;gt; 能够和服务器 &amp;lt;example.net&amp;gt; 关联的用户 &amp;lt;romeo@example.net&amp;gt; 交换消息，出席信息和其他结构化数据. 这个模式对使用全局地址的消息协议是很常见的, 例如email网络 (见 [[RFC6120#SMTP|SMTP]] 和 [[RFC6120#EMAIL‑ARCH|EMAIL‑ARCH]] . 结果, 在XMPP中端到端的通讯是逻辑上的点对点，而物理结构则是 客户端-服务器-服务器-客户端, 如下图所示. &lt;br /&gt;
&lt;br /&gt;
'''图1: 分布式客户端-服务器 体系结构'''&lt;br /&gt;
&lt;br /&gt;
  example.net &amp;lt;--------------&amp;gt; im.example.com&lt;br /&gt;
      ^                                ^&lt;br /&gt;
      |                                |&lt;br /&gt;
      v                                v&lt;br /&gt;
 romeo@example.net           juliet@im.example.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:参考文献: 体系结构使用 [[RFC6120#XML流|XML流]] 和 [[RFC6120#XML节|XML节]] ，但是两个客户端之间直接建立端到端的连接则使用基于 [[RFC6120#LINKLOCAL|LINKLOCAL]] 的技术, 不过那个体系结构没有定义在本协议之中，它只能说是 &amp;quot;类XMPP&amp;quot;; 详见 [[RFC6120#XEP‑0174|XEP‑0174]] . 另外, XML流可以在任何可靠的传输层上建立端到端的连接, 包括XMPP本身的扩展; 无论如何, 这些方法没有包含在本文之中.&lt;br /&gt;
&lt;br /&gt;
以下段落描述客户端和服务器们各自在网络中负责什么.&lt;br /&gt;
&lt;br /&gt;
一个客户端就是一个实体，它先和它的注册帐号所在服务器建立XML流 (通过 [[RFC6120#SASL握手|SASL握手]] ) , 然后完成 [[RFC6120#资源绑定|资源绑定]] , 这样就能通过建好的流在客户端和服务器之间递送XML节. 客户端使用 XMPP 来和它的服务器, 其他客户端以及任何其他网络上的实体通讯, 这里服务器负责递送节到同一台服务器上其他已连接的客户端，或把它们路由到远程服务器上. 一个服务器上的注册帐号可以同时使用多个客户端连接到一台服务器上, 这里每个客户端的XMPP地址的 ''资源部分'' 是不同的 (例如, &amp;lt;juliet@im.example.com/balcony&amp;gt; 和 &amp;lt;juliet@im.example.com/chamber&amp;gt;), 定义于 [[RFC6120#常规引用|XMPP‑ADDR]] 和 [[RFC6120#资源绑定|7]]&lt;br /&gt;
&lt;br /&gt;
一个服务器是一个实体，主要负责以下事项: &lt;br /&gt;
&lt;br /&gt;
:* 管理已连接客户端的 [[RFC6120#XML流|XML流]] 并通过建好的流递送 [[RFC6120#XML节|XML节]] 到那些通过客户端; 这也包括负责确保客户端在被授权访问XMPP网络之前的客户端身份验证工作.&lt;br /&gt;
:* 遵循本地服务对服务器之间通讯的策略, 管理和远程服务器之间的 [[RFC6120#XML流|XML流]] 并通过建好的流路由 [[RFC6120#XML节|XML节]] 到那些服务器.&lt;br /&gt;
&lt;br /&gt;
取决于服务器的不同, 一个XMPP服务器的次要责任可能包括: &lt;br /&gt;
&lt;br /&gt;
:* 存储客户端使用的数据 (例如, 用户的基于 [[RFC6120#常规引用|XMPP-IM]] 的联系人; 在这种情况下, 相关的XML节直接由服务器本身代替客户端来处理而不用路由到远程服务器或递送到一个已连接的客户端.&lt;br /&gt;
:* 托管的额外服务也使用XMPP作为通讯的基础，但是提供超出本文范围的额外的或 [[RFC6120#常规引用|XMPP-IM]] 定义的功能; 例子包括多用户会议服务(定义于 [[RFC6120#常规引用|XEP‑0045]] ) 和 发布-订阅 服务 (定义于 [[RFC6120#常规引用|XEP‑0060]] ).&lt;br /&gt;
&lt;br /&gt;
==TCP绑定==&lt;br /&gt;
===范围===&lt;br /&gt;
&lt;br /&gt;
如本文定义的XMPP所述, 一个发起方实体在 (客户端或服务器) 和接收方实体协商XML流之前必须(MUST) 打开一个到接收方实体 (服务器) 的 [[RFC6120#常规引用|TCP]] 连接. 然后在使用XML流期间双方一直保持那个TCP连接. 这个规则在下面章节中的TCP绑定要用到.&lt;br /&gt;
&lt;br /&gt;
:参考文献: 不一定要把XML流建立在TCP上, 其他传输协议也是可以的. 例如, 两个实体可以通过 [[RFC6120#提示性引用|HTTP]] 互相连接（定义于 [[RFC6120#提示性引用|XEP‑0124]] 和 [[RFC6120#提示性引用|XEP‑0206]] . 无论如何, 本协议只定义把XMPP绑定到TCP.&lt;br /&gt;
&lt;br /&gt;
===合格的全域名解析===&lt;br /&gt;
&lt;br /&gt;
因为XML流是是通过TCP发送的, 发起方实体在尝试打开一个XML流之前需要确定接收方实体的IPv4或IPv6地址(以及端口). 一般来说这是通过解析接收方实体的合格的全域名(简称FQDN,参见 [[RFC6120#常规引用|DNS概念]] )来实现的. &lt;br /&gt;
&lt;br /&gt;
====首选流程:SRV查询====&lt;br /&gt;
&lt;br /&gt;
FQDN解析的首选流程是如下使用 [[RFC6120#常规引用|DNS‑SRV]] 记录: &lt;br /&gt;
&lt;br /&gt;
# 发起方实体构造一个 DNS SRV 查询，参数如下:&lt;br /&gt;
## 一个 &amp;quot;xmpp-client&amp;quot; (用于 客户端-服务器 连接) 或 &amp;quot;xmpp-server&amp;quot; (用于 服务器-服务器 连接)服务&lt;br /&gt;
## 一个 &amp;quot;tcp&amp;quot; 协议&lt;br /&gt;
## 一个对应发起方实体希望连接的XMPP服务的 &amp;quot;原有域&amp;quot;（ [[RFC6120#常规引用|TLS‑CERTS]] ）的名字 (例如, &amp;quot;example.net&amp;quot; 或 &amp;quot;im.example.com&amp;quot;)&lt;br /&gt;
# 得到一个类似 &amp;quot;_xmpp-client._tcp.example.net.&amp;quot; 或 &amp;quot;_xmpp-server._tcp.im.example.com.&amp;quot; 的查询.&lt;br /&gt;
# 如果收到应答, 它将包含一个或多个FDQN和端口的组合, 每个都拥有权重和优先级 (如 [[RFC6120#常规引用|DNS‑SRV]] 所述). (无论如何, 如果SRV查询的结果是一个单独的资源记录 &amp;quot;.&amp;quot;, 即根域名, 那么发起方实体必须(MUST)在这时终止SRV处理，因为根据 [[RFC6120#常规引用|DNS‑SRV]] ,这样一个结果意味着那个服务在本域中是不可用的)&lt;br /&gt;
# 发起方实体至少选择返回的FQDNs记录中的一个来解决 (根据 [[RFC6120#常规引用|DNS‑SRV]] 规则,对FDQN执行 DNS &amp;quot;A&amp;quot; 或 &amp;quot;AAAA&amp;quot; 查询; 这将返回一个 IPv4 或 IPv6 的地址.&lt;br /&gt;
# 成功解析FDQN(包括SRV查询返回的相应的端口号)之后,发起方实体就使用IP地址来连接接收方实体.&lt;br /&gt;
# 如果发起方实体使用那个IP地址连接失败，而的 &amp;quot;A&amp;quot; 或 &amp;quot;AAAA&amp;quot; 记录查询返回了不止一个IP地址, 那么发起方实体使用那个FDQN的下一个解析好的IP地址作为连接地址.&lt;br /&gt;
# 如果发起方实体用给定的FDQN的所有解析出来的IP地址都无法连接, 那么它重复解析过程并使用基于优先级和权重的SRV查询(定义于 [[RFC6120#常规引用|DNS SRV]] )返回的下一个FQDN来连接.&lt;br /&gt;
# 如果发起方实体接收到它的SRV应答但是无法使用接收到的应答数据来建立一个XMPP连接, 它不应该(SHOULD NOT)尝试下面描述的备用流程(这有助于防止入站和出站连接状态不匹配).&lt;br /&gt;
# 如果发起方实体不能从它的SRV查询接收到应答, 它应该(SHOULD)尝试下一节描述的备用流程.&lt;br /&gt;
&lt;br /&gt;
====后备流程====&lt;br /&gt;
&lt;br /&gt;
后备流程应该(SHOULD)是一个常规的 &amp;quot;A&amp;quot; 或 &amp;quot;AAAA&amp;quot; 地址记录解析以决定原始域的IPv4或IPv6地址, 而端口则为 &amp;quot;xmpp-client&amp;quot; 端口(5222)用于客户端-服务器连接或 &amp;quot;xmpp-server&amp;quot; 端口(5269)用于服务器-服务器连接 (这些是在IANA注册的缺省端口，[[RFC6120#端口号和服务名|14.7]] .&lt;br /&gt;
&lt;br /&gt;
如果通过TCP连接不成功, 发起方实体可能尝试找到并使用替代连接方法例如HTTP绑定 (见 [[RFC6120#提示性引用|XEP‑0124]] 和 [[RFC6120#提示性引用|XEP‑0206]] , 它可能使用 [[RFC6120#提示性引用|DNS‑TXT]] 记录(参见 [[RFC6120#提示性引用|XEP‑0156]]) 来搜索.&lt;br /&gt;
&lt;br /&gt;
====什么时候不用SRV====&lt;br /&gt;
&lt;br /&gt;
如果发起方实体已经被显式地配置为一个关联到接收实体的原始域的一个特定的FQDN (以及潜在的端口) (比如,一个特定的原始域 example.net  &amp;quot;写死&amp;quot; 到一个配置好的 apps.example.com 的 FQDN), 鼓励初始方实体使用配置好的名字而不是建议的对原始域的SRV解析流程.&lt;br /&gt;
&lt;br /&gt;
====附加服务使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
很多XMPP服务器以可托管附加服务 (超出本文和 [[RFC6120#常规引用|XMPP-IM]] 定义范围) 这种方式来实现，附加服务的DNS域名典型的形式是主XMPP服务的 &amp;quot;子域名&amp;quot; (例如, conference.example.net 用于 [[RFC6120#常规引用|XEP‑0045]] 服务,相关的XMPP主服务为 example.net ) 或 底层服务的一级域名的 &amp;quot;子域名&amp;quot; (例如, muc.example.com 用于 [[RFC6120#常规引用|XEP‑0045]] 服务，相关的XMPP主服务为 im.example.com ). 如果一个和远程XMPP服务关联的实体希望连接到这样一个附加服务上, 它将生成一个适当的XML节，而远程服务器将尝试通过一个SRV查询资源记录类似 &amp;quot;_xmpp-server._tcp.conference.example.net.&amp;quot; 或 &amp;quot;_xmpp-server._tcp.muc.example.com.&amp;quot; 来解析该附加服务的DNS域名. 所以, 如果一个XMPP服务的管理员希望让远程服务器相关的实体能访问这样的附加服务, 除了用于他们的主XMPP服务的 &amp;quot;_xmpp-server&amp;quot; 记录之外, 他们还需要声明适当的 &amp;quot;_xmpp-server&amp;quot; SRV 记录. 当 SRV 记录不可用的时候, 可使用后备方法 [[RFC6120#后备流程|3.2.2]] 来为附加服务解析域名.&lt;br /&gt;
&lt;br /&gt;
===重连===&lt;br /&gt;
&lt;br /&gt;
XMPP服务器可能在会向连接的客户端和远端服务器提供TCP连接服务的时候意外掉线. 因为这些连接的数量可能非常大, 实体的重连机制寻求解决重连可能导致的对软件性能的冲剂和网络堵塞. 如果实体选择重连, 它: &lt;br /&gt;
&lt;br /&gt;
:* 应该把重连之前等待的秒数设置为0到60之间 (这有助于确保不会所有实体在掉线的同一个时间间隔之后同时尝试重连).&lt;br /&gt;
:* 如果第一次尝试重连没有成功则随后的尝试重连的时间间隔应该越来越长 (例如, 按照 [[RFC6120#提示性引用|ETHERNET]] 描述的 &amp;quot;动态二进制指数后退算法&amp;quot; ).&lt;br /&gt;
&lt;br /&gt;
建议重连的时候使用TLS会话恢复 [[RFC6120#提示性引用|TLS‑RESUME]] . 本文未来的某个版本, 或某个独立的协议, 可能会提供更多详细的关于加速重连过程的方法的指南.&lt;br /&gt;
&lt;br /&gt;
===可靠性===&lt;br /&gt;
&lt;br /&gt;
在XMPP使用常连的TCP连接意味着通过XML流发送的XML节可能不可靠, 因为长连的TCP的各方可能无法及时地了解掉线情况. 在XMPP应用层, 长连接掉线可能导致无法发送节. 尽管本文定义的核心XMPP技术未包括克服这一可靠性缺陷的特性, 有一个XMPP扩展在做这件事 (例如, [[RFC6120#提示性引用|XEP‑0198]] ).&lt;br /&gt;
&lt;br /&gt;
==XML流==&lt;br /&gt;
===流基础===&lt;br /&gt;
&lt;br /&gt;
两个基本概念，使得XMPP实体之间的小的结构化信息有效载荷能快速地进行异步交换：XML流和XML节。这些术语的定义如下。&lt;br /&gt;
&lt;br /&gt;
:XML流的定义:&lt;br /&gt;
::XML流是一个容器，用于任何两个实体通过网络进行XML元素的交换. XML流的开始明确表达为一个打开的 &amp;quot;流头&amp;quot; (即, 一个包含了适当树形和命名空间声明的 XML &amp;lt;stream&amp;gt; 标签), 而这个XML流的结尾明确表达为一个关闭的XML &amp;lt;/stream&amp;gt; 标签. 在流的生存期间, 发起方实体可以通过这个流发送不限数量的XML元素, 这些元素或用来协商这个流 (例如, 完成 [[RFC6120#提示性引用|TLS协商]] 或 [[RFC6120#提示性引用|SASL协商]] ) 或用于 XML节. &amp;quot;发起流&amp;quot; 是从发起方实体 (通常是一个客户端或服务器) 到接收方实体 (通常是一个服务器), 也可视为对应发起方 &amp;quot;连接到&amp;quot; 或 &amp;quot;和......开启会话&amp;quot; 接收方实体. 发起流允许从发起方实体到接收方实体的单向通讯; 为了让接收方实体能够向发起方实体发送节, 接收方实体必须(MUST) 协商一个相反的流 (&amp;quot;应答流&amp;quot;).&lt;br /&gt;
:XML节的定义:&lt;br /&gt;
::XML节是一个XMPP中的基本语义单位. 一个节就是一个第一层元素 (在流的深度=1)，它的元素名是 &amp;quot;message&amp;quot;, &amp;quot;presence&amp;quot;, 或 &amp;quot;iq&amp;quot; ，而它的合格命名空间是 'jabber:client' 或 'jabber:server'. 相比之下, 任何其他命名空间限定的第一层元素都不是一个XML节 (stream errors, stream features, TLS相关的元素, SASL相关的元素, 等等.), 由'jabber:client' 或 'jabber:server' 命名空间限定的 &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 或 &amp;lt;iq/&amp;gt; 元素但不在第一层 (例如, 包含在一个扩展元素中的 &amp;lt;message/&amp;gt; 元素 ( 做报告用的 [[RFC6120#扩展内容|8.4]] )也不是一个XML节, 不是命名空间 'jabber:client' 或 'jabber:server'限定的 &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 或 &amp;lt;iq/&amp;gt; 元素也不是一个XML节. 一个XML节典型的包含一个或多个必要的子元素 (以及相关的属性, 元素, 和 XML 字符串数据) 来传达所需的信息, 子元素可以(MAY)使用任何XML命名空间 (见 [[RFC6120#常规引用|XML‑NAMES]] 和本协议的 [[RFC6120#扩展内容|8.4]]).&lt;br /&gt;
&lt;br /&gt;
有三种节: message, presence, 和 IQ (&amp;quot;Info/Query&amp;quot;的缩写). 这些节类型提供三种不同的通讯原语: 一个 &amp;quot;推送&amp;quot; 机制用于已生成的消息, 一个特定的 &amp;quot;发行-订阅&amp;quot; 机制用于广播网络可用性信息, 和一个 &amp;quot;请求-应答&amp;quot; 机制用于更结构化的数据交换 (类似 [[RFC6120#提示性引用|HTTP]] . 更多解释分别位于 [[RFC6120#Messsage语义|8.2.1]] , [[RFC6120#Presence语义|8.2.2]] , 和 [[RFC6120#IQ语义|8.2.3]] . &lt;br /&gt;
&lt;br /&gt;
考虑一个客户端连接到一个服务器的例子. 客户端通过发送一个流头来发起一个XML流到服务器, 最好在前面加上一个XML声明来指定XML版本和支持的字符串编码 (见 [[RFC6120#包含XML声明|11.5]] 和 [[RFC6120#字符串编码|11.6]] ). 遵循本地策略和服务设置, 该服务器接着以第二个XML流应答回客户端, 最好再次在前面加上一个XML声明. 一旦客户端完成 [[RFC6120#SASL协商|SASL协商]] 和 [[RFC6120#资源绑定|资源绑定]] , 该客户端就能通过这个流来发送不限数量的XML节. 当客户端想要关闭这个流的时候, 它只要简单的发送一个关闭 &amp;lt;/stream&amp;gt; 标签给服务器，如 [[RFC6120#关闭流|4.4]] . &lt;br /&gt;
&lt;br /&gt;
于是, 从本质上讲, 一个XML流作为会话期间发送的XML节的信封, 而另一个XML流作为会话期间接收的XML节的信封. 我们可以用如下的简化模型做一个展示.&amp;lt;br/&amp;gt; &lt;br /&gt;
&lt;br /&gt;
----&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
+--------------------+--------------------+&lt;br /&gt;
| INITIAL STREAM     |  RESPONSE STREAM   |&lt;br /&gt;
+--------------------+--------------------+&lt;br /&gt;
| &amp;lt;stream&amp;gt;           |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | &amp;lt;stream&amp;gt;           |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;presence&amp;gt;         |                    |&lt;br /&gt;
|   &amp;lt;show/&amp;gt;          |                    |&lt;br /&gt;
| &amp;lt;/presence&amp;gt;        |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;message to='foo'&amp;gt; |                    |&lt;br /&gt;
|   &amp;lt;body/&amp;gt;          |                    |&lt;br /&gt;
| &amp;lt;/message&amp;gt;         |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;iq to='bar'       |                    |&lt;br /&gt;
|     type='get'&amp;gt;    |                    |&lt;br /&gt;
|   &amp;lt;query/&amp;gt;         |                    |&lt;br /&gt;
| &amp;lt;/iq&amp;gt;              |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | &amp;lt;iq from='bar'     |&lt;br /&gt;
|                    |     type='result'&amp;gt; |&lt;br /&gt;
|                    |   &amp;lt;query/&amp;gt;         |&lt;br /&gt;
|                    | &amp;lt;/iq&amp;gt;              |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| [ ... ]            |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | [ ... ]            |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;/stream&amp;gt;          |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | &amp;lt;/stream&amp;gt;          |&lt;br /&gt;
+--------------------+--------------------+&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt; '''图2: 两路XML流的简化观点''' &amp;lt;/div&amp;gt;&lt;br /&gt;
----&amp;lt;br/&amp;gt;&lt;br /&gt;
那些习惯于以文档为中心的方式看待XML的人可能会发现下面的类比是有益的: &lt;br /&gt;
&lt;br /&gt;
:* 两个XML流像两个 &amp;quot;文档&amp;quot; (相当于 [[RFC6120#常规引用|XML]] 的&amp;quot;文档&amp;quot; 产生)，它们是通过积累XML节来建立的.&lt;br /&gt;
:* 根 &amp;lt;stream/&amp;gt; 元素像每个 &amp;quot;文档&amp;quot; 的 &amp;quot;文档实体&amp;quot; (详见 [[RFC6120#常规引用|XML]] 的4.8章).&lt;br /&gt;
:* 通过流发送的XML节像该 &amp;quot;文档&amp;quot;的 &amp;quot;片段&amp;quot; (详见 [[RFC6120#提示性引用|XML‑FRAG]] ).&lt;br /&gt;
&lt;br /&gt;
无论如何, 这些描述只是类比, 因为XMPP不处理文档和片段而是处理流和节. &lt;br /&gt;
&lt;br /&gt;
本节的其余部分定义XML流（连同相关主题）的以下几个方面：&lt;br /&gt;
&lt;br /&gt;
:* 如何打开流 ( [[RFC6120#打开流|4.2]] )&lt;br /&gt;
:* 流协商过程 ( [[RFC6120#流协商|4.3]] )&lt;br /&gt;
:* 如何关闭流 ( [[RFC6120#关闭流|4.4]] )&lt;br /&gt;
:* XML流的方向性 ( [[RFC6120#方向性|4.5]] )&lt;br /&gt;
:* 如何处理沉默的对端 ( [[RFC6120#处理沉默对端|4.6]] )&lt;br /&gt;
:* 流的XML属性 ( [[RFC6120#流属性|4.7]] )&lt;br /&gt;
:* 流的XML命名空间 ( [[RFC6120#流命名空间|4.8]] )&lt;br /&gt;
:* 和XML流相关的错误处理 ( [[RFC6120#流错误|4.9]] )&lt;br /&gt;
&lt;br /&gt;
===打开流===&lt;br /&gt;
&lt;br /&gt;
连接到接收方实体的适当的IP地址和端口之后, 发起方实体通过发送一个流头 (&amp;quot;发起流头&amp;quot;) 来打开到接收方实体的流. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后接收方实体通过发送一个它自己的流头 (&amp;quot;应答流头&amp;quot;) 来回复发起方实体. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接着实体们就可以再进行流协商过程的剩余步骤了.&lt;br /&gt;
&lt;br /&gt;
===流协商===&lt;br /&gt;
====基本概念====&lt;br /&gt;
&lt;br /&gt;
因为流的接收方实体可以说是它所服务的域的看门人, 它对客户端或对端服务器的发起的连接有一定的条件要求. 最低程度, 发起方实体在接收方实体被允许发送节之前需要验证接收方实体， (对客户-服务器流来说这意味着使用 [[RFC6120#SASL协商|6]] 中描述的SASL). 无论如何, 接收方实体可以考虑其他验证条件来强制协商, 例如使用 [[RFC6120#TLS协商|5]] 描述的TLS加密. 接收方实体通过交流&amp;quot;stream features&amp;quot;以通知发起方实体这些条件: 发起方需要在接收方接受它发送的XML节之前完成的一系列特别的协议交互, 以及任何自愿协商但是可以提高XML流处理的协议交互 (例如,  [[RFC6120#提示性引用|XEP‑0138]] 描述的建立应用层压缩). &lt;br /&gt;
&lt;br /&gt;
连接条件的存在意味着流需要协商. 层的顺序 (TCP, 然后是TLS, 然后是SASL, 然后是XMPP. 这些顺序如[[RFC6120#层的顺序|13.3]]描述) 意味着流协商是一个多阶段的过程. 进一步的结构由两个因素来施加: (1) 一个给定的流特性可以仅对特定的实体提供，或只在特定的其他特性已经被协商之后提供 (例如, 资源绑定仅在SASL验证之后提供), 和 (2) 流特性可能是强制协商也可能是自愿协商. 最后, 基于安全的原因一个流的参与者们在成功地完成用于特定特性的协议交互之后需要丢弃它们在协商过程中获得的知识 (例如, 在所有情况下的TLS和当可能建立一个安全层的情况下的SASL, 如有关SASL机制的规范所述). 通过刷新旧的流上下文和在现有的TCP连接上交换新的流头就可以做到这一点.&lt;br /&gt;
&lt;br /&gt;
====流特性格式====&lt;br /&gt;
&lt;br /&gt;
如果发起方实体包含在发起流头里的 'version' 属性值设为不低于 &amp;quot;1.0&amp;quot; (见 [[RFC6120#版本|4.7.5]] ), 接收方实体在发送应答流头之后必须发送一个&amp;lt;features/&amp;gt; 子元素 (通常使用 [[RFC6120#命名空间声明和前缀|4.8.5]] 描述的流命名空间前缀作为前缀) 给发起方实体以声明使流协商过程继续下去的任何条件. 每个条件用 &amp;lt;features/&amp;gt; 元素的子元素的格式, 由一个不同于流命名空间和内容命名空间的命名空间来限定. &amp;lt;features/&amp;gt; 元素可以包含一个子元素，多个子元素，或者为空.&lt;br /&gt;
&lt;br /&gt;
:实现备注: 包含在任何给定的&amp;lt;features/&amp;gt;元素内的子元素的顺序不重要.&lt;br /&gt;
&lt;br /&gt;
如果一个特殊的流特性是或者可以是强制协商的, 那个特性的定义需要做以下几件事之一: &lt;br /&gt;
&lt;br /&gt;
:# 声明这个特性总是强制协商的 (例如, XMPP客户端的资源绑定就是这样的); 或&lt;br /&gt;
:# 为接收方实体指定一个方法来标记这个特性在这次交互中为强制协商 (例如, 对于 STARTTLS, 这是通过包含一个空的 &amp;lt;required/&amp;gt; 元素到流特性广告中来实现的, 但这不是对所有流特性的通用格式); 建议用于新的强制协商特性的流特性定义如 STARTTLS 所做的那样通过包含一个空的 &amp;lt;required/&amp;gt; 元素来实现.&lt;br /&gt;
&lt;br /&gt;
:参考文献: 因为没有通用格式来说明一个特性是强制协商的, 有可能会出现一个发起方实体不能理解的特性而被接收方认为是强制协商的, 而导致流协商过程失败. 尽管这样一个结果是不可取的, 本工作组认为不需要通用格式的情况是很罕见的.&lt;br /&gt;
&lt;br /&gt;
基于安全性的原因, 在某些流特性协商成功之后，发起方有必要发送一个新的发起流头 (例如, 任何情况下的TLS和当建立了安全层的情况下的SASL). 如果一个给定的流特性出现在这种情况下, 那个特性的定义需要指定该特性协商之后的流重启. &lt;br /&gt;
&lt;br /&gt;
一个包含至少一个强制协商特性的&amp;lt;features/&amp;gt;元素表明了流协商没有完成, 发起方实体必须进行进一步的特性协商. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'&amp;gt;&lt;br /&gt;
       &amp;lt;required/&amp;gt;&lt;br /&gt;
     &amp;lt;/starttls&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个&amp;lt;features/&amp;gt;元素可以包含不止一个强制协商特性. 这意味着发起方实体能在流协商过程的这个阶段中对强制协商特性进行选择. 举例来说, 可能一个将来的技术将执行和TLS一样的功能, 所以接收方实体可能在这次流协商过程中的同一个阶段声明同时支持TLS和这个将来的技术. 无论如何, 这只适用于流协商过程中的给定阶段而不适用于不同阶段的强制协商特性 (例如, 接收方实体不会声明同时支持STARTTLS和SASL作为强制性协商, 或同时声明SASL和资源绑定为强制协商, 因为TLS需要在SASL之前协商并且SASL需要在资源绑定之前协商). &lt;br /&gt;
&lt;br /&gt;
一个同时包含强制协商和自愿协商特性的&amp;lt;features/&amp;gt;元素表明协商未完成, 发起方实体可以在它尝试协商强制协商特性之前完成自愿协商特性. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/&amp;gt;&lt;br /&gt;
     &amp;lt;compression xmlns='http://jabber.org/features/compress'&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;zlib&amp;lt;/method&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;lzw&amp;lt;/method&amp;gt;&lt;br /&gt;
     &amp;lt;/compression&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个只包含自愿协商特性的&amp;lt;features/&amp;gt;元素表明流协商已经完成, 发起方实体可以开始发送XML节了. 但是如果发起方实体愿意可以协商更多特性. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;compression xmlns='http://jabber.org/features/compress'&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;zlib&amp;lt;/method&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;lzw&amp;lt;/method&amp;gt;&lt;br /&gt;
     &amp;lt;/compression&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个空的&amp;lt;features/&amp;gt;元素表明流协商已经完成, 发起方实体可以开始发送XML节了. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====重启====&lt;br /&gt;
&lt;br /&gt;
在对一个需要流重启的特性成功协商之后, 双方都必须考虑前一个流将被取代, 但是必须不能发送一个关闭的&amp;lt;/stream&amp;gt;标签并且必须不能终止底层的TCP连接; 反之, 双方必须重用现有的连接, 它可以处于一个新的状态(例如, 作为一个TLS协商的结果被加密). 然后发起方实体必须发送一个新的发起流头, 它之前应该放一个如  [[RFC6120#包含XML声明|11.5]] 所述的XML声明. 当接收方实体接收到新的发起流头, 它必须在发送一个新的应答流头(它之前应该放一个如  [[RFC6120#包含XML声明|11.5]] 所述的XML声明）之前生成一个新的流ID(而不是重用旧的流ID).&lt;br /&gt;
&lt;br /&gt;
====重发特性====&lt;br /&gt;
&lt;br /&gt;
接收方实体必须在一个流重启之后发送一个流特性的更新列表给发起方实体. 如果没有更多的特性要被声明，这个更新的流特性列表可以是空的，也可以包含任何特性的组合.&lt;br /&gt;
&lt;br /&gt;
====完成流协商====&lt;br /&gt;
&lt;br /&gt;
接收方实体通过发送一个空的&amp;lt;features/&amp;gt;元素或只包含自愿协商特性的&amp;lt;features/&amp;gt;元素来表明流协商过程的完成. 这样做之后, 接收方实体可以发送一个空的&amp;lt;features/&amp;gt; 元素(例如, 在这些自愿协商特性协商完成之后) 但是必须不能发送额外的流特性给发起方实体(如果接收方实体有新的特性提供, 最好仅限于强制协商或安全关键的特性, 它可以简单地以一个&amp;lt;reset/&amp;gt;流错误( [[RFC6120#reset|4.9.3.16]] )来关闭流并且等发起方重新连接的时候声明新的特性, 最好以一个交错的方法来关闭现有的流，这样不会让所有的发起方同时进行重连). 一旦流协商完成, 发起方就可以一直通过这个流来发送XML节，只要双方都维持着这个流.&lt;br /&gt;
&lt;br /&gt;
:参考文献: 在下面 [[RFC6120#资源绑定|第7章]] 定义的资源绑定是一个前述规则的一个历史性的例外, 因为对于客户端来说它是强制协商的但使用XML节来达成协商.&lt;br /&gt;
&lt;br /&gt;
在流协商完成之前，发起方实体不能(MUST NOT)尝试发送 [[RFC6120#XML节|XML节]] 给非自身的实体(也就是说, 客户端的已连接资源或客户端帐号的任何其他已验证的资源) 或给它连接的服务器. 即使发起方尝试这么做, 接收方实体也不能(MUST NOT)接受这些节并且必须以一个&amp;lt;not-authorized/&amp;gt;流错误( [[RFC6120#未授权|4.9.3.12]] )来关闭流. 这个规则只适用于XML节(也就是说, 由内容命名空间限定的 &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 和 &amp;lt;iq/&amp;gt; 元素) 而不是用于流协商的XML元素(例如, 完成 [[RFC6120#STARTTLS协商|TLS协商]] 或 [[RFC6120#SASL协商|SASL协商]] 的元素).&lt;br /&gt;
&lt;br /&gt;
====确定地址====&lt;br /&gt;
&lt;br /&gt;
在一个XML流的双方已经完成了流协商的适当步骤之后, 流的接收方实体必须确定发起方实体的JID. &lt;br /&gt;
&lt;br /&gt;
对于客户端-服务器的通讯, 在服务器能确定客户端的地址之前，[[RFC6120#SASL协商|SASL协商]] 和 [[RFC6120#资源绑定|资源绑定]] 必须完成. 客户端的纯JID (&amp;lt;localpart@domainpart&amp;gt;) 必须是授权身份 (如 [[RFC6120#常规引用|SASL]] 所定义的, 要么 (1) 是 [[RFC6120#SASL协商|SASL协商]] 期间客户端直接与之通讯的身份,要么 (2) 如果SASL协商期间没有指定授权身份，则是从服务器的验证身份指定的. 全JID(&amp;lt;localpart@domainpart/resourcepart&amp;gt;)的资源部分(resourcepart)必须是客户端和服务器在 [[RFC6120#资源绑定|资源绑定]] 期间协商得来的那个资源. 客户端必须不去尝试猜测它的JID而是必须相信在资源绑定期间服务器返回给它的JID. 服务器必须确保返回的这个JID (包含 本地部分(localpart), 域部分(domainpart), 资源部分(resourcepart), 以及分隔符) 遵循定义于 [[RFC6120#常规引用|XMPP‑ADDR]] 的XMPP地址规范格式; 为了满足这个限定, 服务器可以把客户端的发来的JID替换成服务器确定的规范JID并在资源绑定期间使用那个JID来和客户端通讯.&lt;br /&gt;
&lt;br /&gt;
对于服务器-服务器通讯, 发起方服务器的纯JID (&amp;lt;domainpart&amp;gt;) 必须是授权的身份 (定义于 [[RFC6120#常规引用|SASL]] ), 要么 (1) 是[[RFC6120#SASL协商|SASL协商]] 期间发起方服务器直接与之通讯的身份,要么 (2) 如果SASL协商期间没有指定授权身份，则是从接收方服务器的验证身份指定的. 在缺少SASL协商的情况下, 接收方服务器可以认为授权身份是一个和相关确认协议协商的身份(例如, 在 服务器回拨[[RFC6120#常规引用|XEP‑0220]] 中 &amp;lt;result/&amp;gt; 元素的'from'属性.&lt;br /&gt;
&lt;br /&gt;
:安全警告: 因为可能会有第三方在一个安全层例如TLS成功协商之前篡改流上发送的数据, 建议接收服务器谨慎对待这些未得到保护的信息; 这特别适用于由发起方实体发送的第一个发起流头中的'from'和'to'地址.&lt;br /&gt;
&lt;br /&gt;
====流程图====&lt;br /&gt;
&lt;br /&gt;
我们在接下来的非规范性的流程图里为流协商过程总结前述的规则, 以发起方实体的视角来展示. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
                +---------------------+&lt;br /&gt;
                | 打开TCP连接         |&lt;br /&gt;
                +---------------------+&lt;br /&gt;
                           |&lt;br /&gt;
                           v&lt;br /&gt;
                    +---------------+&lt;br /&gt;
                    | 发送发起流头  |&amp;lt;-------------------------+&lt;br /&gt;
                    |               |                          ^&lt;br /&gt;
                    +---------------+                          |&lt;br /&gt;
                           |                                   |&lt;br /&gt;
                           v                                   |&lt;br /&gt;
                   +------------------+                        |&lt;br /&gt;
                   | 接收应答流头     |                        |&lt;br /&gt;
                   |                  |                        |&lt;br /&gt;
                   +------------------+                        |&lt;br /&gt;
                           |                                   |&lt;br /&gt;
                           v                                   |&lt;br /&gt;
                    +----------------+                         |&lt;br /&gt;
                    | 接收流特性     |                         |&lt;br /&gt;
+------------------&amp;gt;|                |                         |&lt;br /&gt;
^   {可选的}        +----------------+                         |&lt;br /&gt;
|                          |                                   |&lt;br /&gt;
|                          v                                   |&lt;br /&gt;
|       +&amp;lt;-----------------+                                   |&lt;br /&gt;
|       |                                                      |&lt;br /&gt;
|    {空?}    ----&amp;gt; {全部自愿?   } ----&amp;gt; {一些强制性?      }   |&lt;br /&gt;
|       |      否          |          否         |             |&lt;br /&gt;
|       | 是               | 是                  | 是          |&lt;br /&gt;
|       |                  v                     v             |&lt;br /&gt;
|       |     +--------------------+    +-----------------+    |&lt;br /&gt;
|       |     | 可以协商或不协商   |    |必须协商一个特性 |    |&lt;br /&gt;
|       |     |       任何一个     |    |                 |    |&lt;br /&gt;
|       |     +--------------------+    +-----------------+    |&lt;br /&gt;
|       v                  |                     |             |&lt;br /&gt;
|   +---------+            v                     |             |&lt;br /&gt;
|   |  完成   |&amp;lt;----- {协商?      }              |             |&lt;br /&gt;
|   +---------+   否       |                     |             |&lt;br /&gt;
|                     是   |                     |             |&lt;br /&gt;
|                          v                     v             |&lt;br /&gt;
|                          +---------&amp;gt;+&amp;lt;---------+             |&lt;br /&gt;
|                                     |                        |&lt;br /&gt;
|                                     v                        |&lt;br /&gt;
+&amp;lt;-------------------------- {强制性重新开始?   } ------------&amp;gt;+&lt;br /&gt;
               否                                        是&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::::::'''图表3: 流协商流程图'''&lt;br /&gt;
&lt;br /&gt;
===关闭流===&lt;br /&gt;
&lt;br /&gt;
从一个实体到另一个实体的XML流可以在任何时候关闭, 可以是因为发生了一个特定的流错误 ([[RFC6120#流错误|4.9章]])) 也可以没有任何错误(例如, 当客户端简单地结束它的会话). &lt;br /&gt;
&lt;br /&gt;
通过发送一个关闭的&amp;lt;/stream&amp;gt;标签来关闭流. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
E: &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果双方正在使用一个TCP连接上两个流, 或者两个TCP连接上两个流的通信方式, 发送关闭流标签的实体必须按以下步骤进行:&lt;br /&gt;
&lt;br /&gt;
# 在终止底层的TCP连接之前等待另一方也关闭它的出站流; 这让另一方有机会在终止TCP连接之前发完任何到正在关闭的实体的出站数据.&lt;br /&gt;
# 避免通过它的出站流发送任何更多的数据到另一方, 但是继续处理从另一方实体已经接收到的数据(并且, 如果必要, 处理这些数据).&lt;br /&gt;
# 如果另一方没有在一个合理的时间(这里 &amp;quot;合理&amp;quot; 的定义取决于实现或布署)内发送它的关闭流标签则认为两个流都失效了.&lt;br /&gt;
# 从另一方接收到一个反向的关闭流标签之后, 或在等待一段合理的时间之后未收到应答, 终止底层的TCP连接.&lt;br /&gt;
&lt;br /&gt;
:安全警告: 根据 [[RFC6120#常规引用|TLS]] 的7.2.1章节, 为了帮助防止截断攻击，正在关闭流的那一方在终止底层TCP连接之前必须发送一个 TLS close_notify警告, 并且必须从另一方接收到应答的 close_notify警告.&lt;br /&gt;
&lt;br /&gt;
如果双方通过多重TCP连接使用多重流, 那么没有已定义的配对流, 因此其行为取决于实现.&lt;br /&gt;
&lt;br /&gt;
===方向性===&lt;br /&gt;
&lt;br /&gt;
一个XML流总是单向的, 这意味着只能从一个方向通过流来发送XML节(要么从发起方实体到接收方实体，要么从接收方实体到发起方实体). &lt;br /&gt;
&lt;br /&gt;
取决于已协商的会话的类型以及涉及的实体的性质, 该实体可以使用: &lt;br /&gt;
&lt;br /&gt;
:* 在一个TCP连接上跑两个流, 这里第一个流协商的安全性上下文也适用于第二个流. 这对客户端-服务器是典型的情况, 并且服务器必须允许客户端为两个流使用同一个TCP连接.&lt;br /&gt;
:* 在两个TCP连接上跑两个流, 这里每个流是独立保障安全的. 在这种方法下, 一个TCP连接用于发起方实体发送节到接收方实体的那个流, 另一个TCP连接用于接收方实体发送节到发起方实体的那个流. 这对服务器-服务器会话是典型的情况.&lt;br /&gt;
:* 在两个或更多TCP连接上跑多个流, 这里每个流是独立保障安全的. 这个方法有时用于两个大的XMPP服务提供商之间的服务器-服务器通讯; 无论如何, 在 [[RFC6120#按顺序处理|10.1]] 描述的情况下这将导致难于维护从多个流接收到的数据的一致性, 这是为什么如果远程服务器尝试如[[RFC6120#冲突|4.9.3.3]] 所述来协商多个流，本服务器可能以一个&amp;lt;conflict/&amp;gt;流错误([[RFC6120#冲突|4.9.3.3]])来关闭流.&lt;br /&gt;
&lt;br /&gt;
这个方向性的概念只适用于节, 并且明确地不适用于根流(stream root)的第一级子元素, 那些根流是被用来启动或管理流的(例如, 用于TLS协商, SASL协商, 服务器回拨 [[RFC6120#参考文献|XEP-0220]] , 流管理 [[RFC6120#参考文献|XEP-0198]] 的第一级元素).&lt;br /&gt;
&lt;br /&gt;
上述的考虑暗示当完成 [[RFC6120#STARTTLS协商|STARTTLS协商]] 和 [RFC6120#SASL协商|SASL协商]] 的时候，两个服务器将使用同一个TCP连接, 但是在流协商过程完成之后，原始的那个TCP连接将仅用于发起方服务器发送XML节到接收方服务器. 为了让接收方服务器能发送XML节给发起方服务器, 接收方服务器将需要反转角色并通过一个单独的TCP连接从接收方服务器向发起方服务器协商一个XML流. 然后这个单独的TCP连接用新一轮的 TLS 和/或 SASL 协商来保证安全性.&lt;br /&gt;
&lt;br /&gt;
:实现备注: 基于历史原因, 一个服务器-服务器会话总是使用两个TCP连接. 这个方法仍然在本文描述的标准行为之内, 类似 [[RFC6120#参考文献|XEP‑0288]] 的扩展允许服务器们使用单一的TCP连接协商来进行双向的节交换.&lt;br /&gt;
&lt;br /&gt;
:参考文献: 尽管XMPP开发者们有时对底层TCP连接使用了&amp;quot;单向&amp;quot;和&amp;quot;双向&amp;quot;的概念 (例如, 把用于客户端-服务器会话的TCP连接称为&amp;quot;双向的&amp;quot; 而用于服务器-服务器会话的TCP连接称为&amp;quot;单向的&amp;quot;), 严格来讲一个流总是单向的 (因为发起方实体和接收方实体总是最少有两个流, 每个方向一个) 并且一个TCP连接总是双向的 (因为TCP通讯能从两个方向发送). 方向性应用于TCP连接的应用层通讯, 而不是在TCP连接的传输层通讯本身.&lt;br /&gt;
&lt;br /&gt;
===无响应对端的处理===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:当连接某个流的实体在一段时间内没有接收到同样连接到该流的另一对等端发来的任何XMPP信息，那么该对等端可能是无响应的。有几个原因很可能引起这种情况发生：&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:#底层的TCP连接死掉。&lt;br /&gt;
:#尽管当底层的TCP连接仍然是激活的时候，XML流被中断了。&lt;br /&gt;
:#对等端是空闲的，只是没有通过其连接的XML流发送XMPP信息到该实体。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:这三个条件最好被分别对待，像下面章节描述的一样。&lt;br /&gt;
&lt;br /&gt;
::实现注意:为了处理无响应的对等端，我们把两个单向的TCP连接当作一个在概念上相当的双向的TCP连接（见4.5节（[[RFC6120#方向性|方向性]]））;然而，实现者要知道在两个单向的TCP连接的情况下，在XMPP应用层对等端对通信的响应将从其第二个TCP连接返回。此外，在每个方向上的多个数据流的使用（大型的XMPP服务提供商间的服务器到服务器之间的连接经常这么部署）使得对XMPP流和底层TCP连接的应用级检查进一步复杂化了，因为任何给定的初始流和任何给定的响应流之间没有必然联系。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====死连接====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:如果底层的TCP连接是死的，流级别的检查（例如：[http://xmpp.org/rfcs/rfc6120.html#XEP-0199 [XEP-0199]]和[http://xmpp.org/rfcs/rfc6120.html#XEP-0198 [XEP-0198]]）是无效的。因此，不管有没有流错误都没必要关闭流，恰当的做法是直接终止TCP连接。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:检查TCP连接的一个通用方法是在XML节之间发送一个空格符（U+0020）,发送空格在XML流中是被允许的，下面[[RFC6120#Whitespace|第11.7节]]中将进行描述。发送这样的一个空格被称作“空格保持激活”（词语“whitespace ping”通常被使用，尽管事实上它不是一个ping,因为“pong”是不可能的）。然而，在TLS认证和SASL认证期间，发送空格符是不允许的，下面[[RFC6120#Data Formatting|第5.3.3节]]和[[RFC6120#Data Formatting|第6.3.5节]]将会描述。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====中断的流====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:即使底层的TCP连接仍然是激活的，对等端很可能从来不对实体发出的XMPP通信请求作出响应，不管是正常的节还是例如在[http://xmpp.org/rfcs/rfc6120.html#XEP-0199 [XEP-0199]]中所定义的应用程序级别ping那样的专门流通信检查，或者在[http://xmpp.org/rfcs/rfc6120.html#XEP-0198 [XEP-0198]]中定义的更全面的流管理协议。在这种情况下，对实体来说恰当的做法是发送&amp;lt;connection-timeout/&amp;gt;流错误（[[RFC6120#connection-timeout|第4.9.3.4节]]）来关闭中断的流。&lt;br /&gt;
&lt;br /&gt;
====空闲对端====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:即使底层的TCP连接仍然激活，并且流没有被中断，对等端很可能在一段时间内都没有发送XML节。在这种情况下，对等端可以（MAY）关闭流（像[[RFC6120#关闭流|第4.4节]]描述的一样），而不是让不再使用的流打开着。如果空闲对等端没有关闭流，那么与该流关联的另一端或者可以（MAY）通过使用第4.4节描述的握手方式来关闭该流，或者发送一个流错误（例如：&amp;lt;resource-constraint/&amp;gt;（[[RFC6120#resource-constraint|第4.9.3.17节]]），如果实体已经到了打开TCP连接数的限制，或者&amp;lt;policy-violation/&amp;gt;（[[RFC6120#policy-violation|第4.9.3.14节]]），如果连接已超出本地超时政策）来关闭该流。然而，层（下面[[RFC6120#Order of Layers|第13.3节]]指定）的顺序要符合，在得出对等端处于空闲状态的结论前，另一端需要去核实底层TCP连接仍然是激活的并且流没有被中断（前面已描述）。此外，在接受空闲对等端时最好宽容一点，因为经验表明，这样做可以提高在XMPP网络上通信的可靠性，并且保持两个服务器之间的流比积极地去超时一个流通常更有效。&lt;br /&gt;
&lt;br /&gt;
====检查方法的使用====&lt;br /&gt;
&lt;br /&gt;
建议实现人员支持任何他们认为合适的流检查和连接检查方法, 但是要小心衡量这些方法对网络的冲击和及时发现中断的流和死TCP连接得到的好处. 使用的任何特定检查方法的时间间隔对本地服务策略都是一个大事情，并且严重依赖于网络环境和给定布署和连接类型的使用场景. 在撰写本文的时候, 建议任何这类检查的执行不要超过每5分钟一次, 并且理想的情况是, 这类检查由客户端发起而不是服务器来发起. 鼓励那些实现XMPP软件和布署XMPP服务的人对适当的流检查和连接检查时间间隔寻求其他的意见, 特别是当使用了功率受限的设备的时候 (例如, 在移动环境).&lt;br /&gt;
&lt;br /&gt;
===流属性===&lt;br /&gt;
根&amp;lt;stream/&amp;gt;元素的属性定义在以下章节. &lt;br /&gt;
&lt;br /&gt;
:安全警告: 在流的保密性和安全性被 [[RFC6120#START协商|第5章]] 描述的TLS或一个相当的安全层(类似SASL GSSAPI机制)保护之前, 一个流头提供的属性们可能会被攻击者篡改.&lt;br /&gt;
&lt;br /&gt;
:实现备注: 根&amp;lt;stream/&amp;gt;元素的属性不是以一个命名空间前缀来前置是因为, 根据 [[RFC6120#常规引用|XML‑NAMES]] 的解释, &amp;quot;[d]缺省的命名空间声明不直接应用用于属性名称; 没有前缀的属性的解释由它们出现的那个节来决定.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====from====&lt;br /&gt;
:'from'属性指定发送流元素的实体的XMPP标识。&lt;br /&gt;
&lt;br /&gt;
对客户机-服务器通信的发起流头而言，'from'属性是控制客户端的主要XMPP标识，如格式为&amp;lt;localpart@domainpart&amp;gt;的JID。客户端可能不知道XMPP标识，因为XMPP标识不是在XMPP应用层的等级上被分配的（如通用安全服务应用程序接口[http://xmpp.org/rfcs/rfc6120.html#GSS-API [GSS-API]]中描述），或者从客户端提供的信息由服务器生成（像采用SASL EXTERNAL机制的终端用户证书部署）。此外，如果客户端认为XMPP标识是私人信息，那么在流的保密性和完整性被TLS或等效的安全层保护之前是不提倡包括一个'from'属性的。但是，如果客户端知道XMPP标识，它应该（SHOULD）在流的保密性和完整性被TLS或等效的安全层保护之后包括'from'属性。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:对于服务器-服务器通信的发起流头而言，'from'属性是服务器配置的FQDN之一，如，格式如&amp;lt;domainpart&amp;gt;的JID。初始服务器可能有一个以上的XMPP标识，如，在服务器提供虚拟主机的情况下，所以它需要选择一个与此输出流关联的标识（如：基于触发流协商尝试的节的'to'属性）。因为服务器是XMPP网络上的“公共实体”，它必须（MUST）在流的保密性和完整性被TLS或等效的安全层保护之后包含'from'属性。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='example.net'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:server'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:对于客户端-服务器和服务器-服务器通信的响应流头，接收实体必须（MUST）包括'from'属性并且必须（MUST）把该属性值设置为接收实体的FQDN之一（可以（MAY）是一个正式域名（FQDN），而不是发起流头中'to'属性指定的值，下面[[RFC6120#当主机未定义或未知时会发生流错误|第4.9.1.3节]]和[[RFC6120#host-unknown|第4.9.3.6节]]将描述）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论'from'属性是否被包括，在和其它实体交换XML节之前，每个实体必须（MUST）核实其它实体的身份，下面[[RFC6120#Peer Entity Authentication|第13.5节]]将描述。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:互操作性备注：基于[http://xmpp.org/rfcs/rfc6120.html#RFC3920 [RFC3920]]的实现在任何流头（即使其保密性和完整性受到保护）中不包括'from'地址是可以的，一个实体在接收这样的流头时应该（SHOULD）宽容些。&lt;br /&gt;
&lt;br /&gt;
====to====&lt;br /&gt;
:对于客户端-服务器和服务器-服务器通信中的发起流头，发起实体必须（MUST）包含'to'属性，并且必须（MUST）使用发起实体知道或者期望接收实体提供服务的域名来设置'to'属性的值。（在其他方面，如[http://xmpp.org/rfcs/rfc6120.html#TLS-EXT [TLS-EXT]]中所描述，在TLS协商期间的服务器名称显示，也可以提供类似的信息。）&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:对于客户端-服务器通信的响应流头，如果客户端在其发起流头中包含'from'属性，那么服务器在应答流头中必须（MUST）包含'to'属性，并且必须（MUST）使用初始化流头中'from'属性指定的裸JID来设置'to'属性的值。如果客户端在其初始化流头中不包含'from'属性，那么服务器在应答流中不必（MUST NOT）包含'to'属性。&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:对于服务器-服务器通信的响应流头，接收实体在应答流头中必须（MUST）包含'to'属性，并且必须（MUST）使用发起流头中'from'属性指定的域名部分来设置'to'属性的值。&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='g4qSvGvBxJ+xeAd7QKezOQJFFlw='&lt;br /&gt;
       to='example.net'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:server'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:无论是否包含'to'属性，每个实体在与其它实体交换XML节之前必须（MUST）先核实其它实体的身份，如下面[[RFC#Peer Entity Authentication|第13.5节]]所描述。&lt;br /&gt;
&lt;br /&gt;
::互操作性备注：基于[http://xmpp.org/rfcs/rfc6120.html#RFC3920 [RFC3920]]的实现在任何流头中不包括'to'地址是可以的，一个实体在接收这样的流头时应该（SHOULD）宽容些。&lt;br /&gt;
&lt;br /&gt;
====id====&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:'id'属性是流的唯一标识符，称为“流ID”。流ID必须（MUST）由接收实体在发送应答流头时生成，并且在接收的应用（一般是一个服务器）内部，所生成的流ID必须（MUST）是唯一的。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
::'''安全警告：'''流ID都必须（MUST）是不可预测的和非重复的，因为身份验证机制重用它时可能引起安全隐患，如服务器回拨[http://xmpp.org/rfcs/rfc6120.html#XEP-0220 [XEP-0220]]和“XMPP 0.9”身份验证机制，“XMPP 0.9”机制是RFC 3920在XMPP使用SASL机制之前所使用的身份认证机制;出于安全目的 的随机性建议,见[http://xmpp.org/rfcs/rfc6120.html#RANDOM [RANDOM]]。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:对于初始流头，初始实体不必（MUST NOT）包含'id'属性;但是，如果包含'id'属性，接收实体必须（MUST）忽略它。&lt;br /&gt;
&lt;br /&gt;
:对于响应流头，接收实体必须（MUST）包括'id'属性。&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::'''互用性备注：'''在RFC 3920中，列入'id'属性的文字含糊不清的，导致一些实现的id属性脱离了响应流头。&lt;br /&gt;
&lt;br /&gt;
====xml:lang====&lt;br /&gt;
&lt;br /&gt;
'xml:lang'属性指定一个实体在该流上发送的任何可读XML字符串数据的首选或缺省语言(XML节也可以拥有'xml:lang'属性, 定义在 [[RFC6120#xml:lang|8.1.5]] ). 这个属性的语法定义于 [[RFC6120#常规引用|XML]] 的2.12节; 特别是, 'xml:lang'属性必须符合 NMTOKEN 数据类型 (定义于 [[RFC6120#常规引用|XML]] 的2.3节) 同时必须符合定义于 [[RFC6120#常规引用|LANGTAGS]] 的语言标识符.&lt;br /&gt;
&lt;br /&gt;
对于发起流头, 发起方实体应该包含 'xml:lang' 属性. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
I: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
对于应答流头, 接收方实体必须包含 'xml:lang' 属性. 应用以下规则:&lt;br /&gt;
&lt;br /&gt;
:* 如果发起方实体在它的发起流头包含了'xml:lang'属性，而接收方实体在它生成和发送给发起方实体的可读XML字符串数据(例如, 流和节错误中的&amp;lt;text/&amp;gt;元素)中支持那个语言, 'xml:lang'属性值必须是发起方实体首选语言的标识符(例如, &amp;quot;de-CH&amp;quot;).&lt;br /&gt;
:* 如果接收方实体根据定义于[[RFC6120#常规引用|LANGMATCH]] 3.4节的 &amp;quot;lookup scheme&amp;quot;(例如, &amp;quot;de&amp;quot; 而不是 &amp;quot;de-CH&amp;quot;)支持一种和发起方实体首选语言匹配的语言, 那么'xml:lang'属性值应该是匹配语言的标识符.&lt;br /&gt;
:* 如果接收方实体不支持发起方实体的首选语言或根据查找方案匹配的语言(或者如果发起方实体未在其发起流头中包含'xml:lang'属性), 那么'xml:lang'属性值必须是接收方实体的缺省语言的标识符(例如, &amp;quot;en&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
R: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果发起方实体在它的发起流头包含了'xml:lang'属性, 接收方实体应该记住那个值并以此作为发起方实体通过当前流发送的所有节的缺省 xml:lang . 如下面的 [[RFC6120#xml:lang|8.1.5]] 所述, 发起方实体可以在它通过这个流发送的任何XML节中包含'xml:lang'属性. 如果发起方实体在任何这类节中未包含'xml:lang'属性, 接收方实体在路由它到远程服务器或递送它到一个已连接的客户端时应该加上'xml:lang'属性, 而这个属性的值必须是发起方实体的首选语言的标识符(即使接收方实体生成和发送给发起方实体的可读XML字符串数据不支持该语言, 类似流或节错误等). 如果发起方实体在任何这类节中包含了'xml:lang'属性, 接收方实体在路由它到远程服务器或递送到已连接的客户端时必须不能修改和删除它.&lt;br /&gt;
&lt;br /&gt;
====version====&lt;br /&gt;
:包含值至少为“1.0”的版本属性传达了对本文所定义的流相关的协议支持的信号，这些流相关的协议包括[[RFC6120#STARTTLS Negotiation|TLS协商]]，[[RFC6120#SASL Negotiation|SASL协商]]，[[RFC6120#流特性格式|流特征]]，[[RFC6120#流错误|流错误]]。&lt;br /&gt;
&lt;br /&gt;
:本文规定的XMPP版本是“1.0”；尤其，XMPP 1.0 封装了流相关协议以及三个定义的XML节类型的基本语义（&amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;,和 &amp;lt;iq/&amp;gt;，下面[[RFC6120#Message Semantics|8.2.1节]]，[[RFC6120#Message Semantics|8.2.2节]]，[[RFC6120#Message Semantics|8.2.3节]]分别描述）。&lt;br /&gt;
&lt;br /&gt;
:XMPP版本编号方案是“&amp;lt;主版本&amp;gt;.&amp;lt;次版本&amp;gt;（‘&amp;lt;major&amp;gt;.&amp;lt;minor&amp;gt;’）”。主版本和次版本号必须（MUST）视为独立的整数，并且每个数可能（MAY）会以高于一个单一的数字的方式递增。因此，“XMPP 2.4”版本将低于“XMPP 2.13”，同理，“XMPP 2.13”版本将低于“XMPP 12.3”。接受方必须（MUST）忽略前导零（例如，“XMPP 6.01”），并且不能（MUST NOT）发送。&lt;br /&gt;
&lt;br /&gt;
:只有重大的新功能已被添加到核心协议（如：对message, presence, 或者IQ节新定义一个‘TYPE’属性值），次要版本号才递增。具有较小次版本号的实体必须（MUST）忽略版本比它大的次版本号，但是具有较大次版本号的实体为了一些信息目的可以使用版本比它小的次版本号（如：具有较大次版本号的实体将仅仅关注其通信器将不能理解‘TYPE’属性的值，因此不发送它）。&lt;br /&gt;
&lt;br /&gt;
:下述规则适用于流头内“version”属性的生成和处理：&lt;br /&gt;
:#初始化实体必须（MUST）在初始化流头中设置‘version’属性的值为它所支持的最高版本号（如：如果它支持的最高版本号是本文中定义的，它必须（MUST）设置该值为“1.0”）。&lt;br /&gt;
:#接收实体必须（MUST）在应答流头中设置‘version’属性的值或者为初始化实体提供的值，或者为接收实体所支持的最高版本号，以较低者为准。接收实体必须（MUST）执行主要和次要版本号的数值比较，而不是关于“&amp;lt;主版本&amp;gt;.&amp;lt;次版本&amp;gt;（‘&amp;lt;major&amp;gt;.&amp;lt;minor&amp;gt;’）”的字符串匹配。&lt;br /&gt;
:#如果在应答流头中包含的版本号至少在主版本号上比在初始化流头中包含的版本号低，那么较新版本的实体不能与旧版本的实体互操作，初始化实体应该（SHOULD）通过发送一个包含&amp;lt;unsupported-version/&amp;gt;元素的流错误（[[RFC6120#unsupported-version|第4.9.3.25节]]）来关闭流。&lt;br /&gt;
:#如果任何一个实体接收到一个没有‘version’属性的流头，该实体必须（MUST）认为其他实体支持的版本是“0.9”，并且不应该在响应流头中包含‘version’属性。&lt;br /&gt;
&lt;br /&gt;
====流属性总结====&lt;br /&gt;
:下表总结了根元素&amp;lt;stream/&amp;gt;的属性。&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
+----------+--------------------------+-------------------------+&lt;br /&gt;
|          |    初始实体 到 接收实体     |    接收实体 到 初始实体    |&lt;br /&gt;
+----------+--------------------------+-------------------------+&lt;br /&gt;
| to       | 接收实体JID               | 初始实体JID              |&lt;br /&gt;
| from     | 初始实体JID               | 接收实体JID              |&lt;br /&gt;
| id       | 忽  略                       | 流标识                     |&lt;br /&gt;
| xml:lang | 默认语言                     | 默认语言                   |&lt;br /&gt;
| version  | XMPP 1.0+ supported      | XMPP 1.0+ supported     |&lt;br /&gt;
+----------+--------------------------+-------------------------+&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''图4：流属性'''&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===XML命名空间===&lt;br /&gt;
读者可以参考 [[RFC6120#常规引用|XML‑NAMES]] 来完整地理解本章的概念, 特别是本协议的第三章和第6.2节的 &amp;quot;缺省命名空间&amp;quot; 的概念. &lt;br /&gt;
&lt;br /&gt;
====流命名空间====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;stream/&amp;gt; 根元素 (&amp;quot;流头&amp;quot;) 必须由 'http://etherx.jabber.org/streams' (即 &amp;quot;流命名空间&amp;quot;) 命名空间来限定. 如果违反了这个规则, 接受到该流头的实体必须以一个流错误来关闭流, 这个流错误应该是 &amp;lt;invalid-namespace/&amp;gt; ([[RFC6120#invalid-namespace|4.9.3.10]]), 尽管一些现存的实现发送的是 &amp;lt;bad-format/&amp;gt; ([[RFC6120#bad-forma|4.9.3.1]]) .&lt;br /&gt;
&lt;br /&gt;
====内容命名空间====&lt;br /&gt;
&lt;br /&gt;
实体可以声明一个&amp;quot;内容命名空间&amp;quot; 作为缺省的命名空间用于在流上发送的数据 (也就是那些不属于由流命名空间限定的元素的数据). 如果这样做, (1) 内容命名空间必须不同于流命名空间, 并且 (2) 内容命名空间对于发起流和应答流必须是相同的，使得两个流的限定是一致的. 内容命名空间应用所有从流上发送的一级子元素,除非被显式地由另一个命名空间来限定 (即, 内容命名空间是缺省命名空间).&lt;br /&gt;
&lt;br /&gt;
另外 (也就是说, 不定义内容命名空间作为缺省命名空间), 实体可以显式地为流的每个一级子元素限定命名空间, 使用所谓 &amp;quot;自由前缀规范&amp;quot;. 这两种方式在下面的例子中展示.&lt;br /&gt;
&lt;br /&gt;
当声明了一个内容命名空间作为缺省命名空间时, 大致来说一个流看起来类似下面的例子. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;stream:stream&lt;br /&gt;
    from='juliet@im.example.com'&lt;br /&gt;
    to='im.example.com'&lt;br /&gt;
    version='1.0'&lt;br /&gt;
    xml:lang='en'&lt;br /&gt;
    xmlns='jabber:client'&lt;br /&gt;
    xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
  &amp;lt;message&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;foo&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当没有定义内容命名空间作为缺省命名空间而使用所谓&amp;quot;自由前缀规范&amp;quot;时, 大致一个流看起来像以下例子. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;stream&lt;br /&gt;
    from='juliet@im.example.com'&lt;br /&gt;
    to='im.example.com'&lt;br /&gt;
    version='1.0'&lt;br /&gt;
    xml:lang='en'&lt;br /&gt;
    xmlns='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
  &amp;lt;message xmlns='jabber:client'&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;foo&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
传统上, 大多数XMPP实现在流头使用了 把内容命名空间作为缺省命名空间 的方式，而不是 自由前缀规范 的方式; 无论如何, 两种方式都是可以接受的，因为它们在语义上是等价的.&lt;br /&gt;
&lt;br /&gt;
====XMPP内容命名空间====&lt;br /&gt;
&lt;br /&gt;
本协议定义的XMPP使用两种内容命名空间: 'jabber:client' 和 'jabber:server'. 这些命名空间差不多相同但是用于不同的上下文 ('jabber:client'用于 客户端-服务器 通讯而'jabber:server' 用于 服务器-服务器 通讯). 两者之间唯一的不同是在通过'jabber:client'命名空间限定的XML流发送的节中 'to' 和 'from' 属性是可选的, 而在'jabber:server'限定的XML流发送的节中它们是必需的. 支持这些内容命名空间意味着支持常规属性和所有三个核心节类型 (message, presence, 和IQ)的基本语义. &lt;br /&gt;
&lt;br /&gt;
一个实现可以支持不同于 'jabber:client' 或 'jabber:server' 的内容命名空间. 然而, 因为这些命名空间将定义不同于XMPP的应用, 它们将在单独的协议中定义. &lt;br /&gt;
&lt;br /&gt;
一个实现可以拒绝支持任何与缺省命名空间不同的其他内容命名空间. 如果一个实体不支持它接收到的一个一级子元素的内容命名空间, 它必须以 &amp;lt;invalid-namespace/&amp;gt; 流错误([[RFC6120#invalid-namespace|4.9.3.10]])关闭这个流 .&lt;br /&gt;
&lt;br /&gt;
客户端实现必须支持'jabber:client'内容命名空间作为缺省命名空间. 'jabber:server'内容命名空间超出了XMPP客户端的范畴, 并且客户端不能(MUST NOT)发送'jabber:server'命名空间限定的节. &lt;br /&gt;
&lt;br /&gt;
服务器实现必须同时支持'jabber:client'命名空间(当这个流用于客户端和服务器之间通讯的时候)和'jabber:server'命名空间(当这个流用于两个服务器之间的通讯的时候)作为缺省命名空间. 和一个已连接的客户端通讯时,该服务器不能(MUST NOT)发送由'jabber:server'命名空间限定的节; 和一个对端服务器通讯时, 该服务器不能(MUST NOT)发送由'jabber:client'命名空间限定的节. &lt;br /&gt;
&lt;br /&gt;
:实现备注: 因为一个客户端通过一个内容命名空间为'jabber:client'的流发送节, 如果一个服务器路由一个它从一个已连接的客户端收到的节到另一个对端服务器,那么它需要为这个节 &amp;quot;重新界定范围(re-scope)&amp;quot; ，所以它的命名空间是'jabber:server'. 类似的, 如果一个服务器递送一个它从别的对端服务器收到的节到一个已连接的客户端，那么它需要给这个节 &amp;quot;重新界定范围&amp;quot; ，所以它的内容命名空间是'jabber:client'. 这个规则适用于[[RFC6120#流基础|4.1]]定义的XML节(即, 一个由'jabber:client'或'jabber:server'命名空间限定的顶级的 &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 或 &amp;lt;iq/&amp;gt; 元素 ), 并且命名空间继承到一个节的所有子元素. 然而, 这个规则不适用于非'jabber:client'和'jabber:server'限定的元素以及它们的任何子元素(例如, 一个包含了用于报告的扩展元素([[RFC6120#扩展内容|8.1]])的 &amp;lt;message/&amp;gt;元素). 尽管不可能禁止一个实体在一个扩展元素中生成的节的子元素由'jabber:client'或'jabber:server'命名空间来限定, 现有的实现处理这类节的方法是不一致的; 因此, 建议实现者自己权衡选择降低互操作性还是损失这些节的功能. 最后, 建议服务器对于使用其他流连接方法和替代的XMPP连接方法而来的节重新界定范围, 例如那些定义在 [[XEP-0124]] , [[RFC6120#参考文献|XEP-0206]] , [[XEP-0114]] , 和 [[RFC6120#参考文献|XEP-0225]] 中的节.&lt;br /&gt;
&lt;br /&gt;
====其他命名空间====&lt;br /&gt;
&lt;br /&gt;
参与一个流的双方都可以发送非内容命名空间和流命名空间限定的数据. 例如, 和TLS协商以及SASL协商相关的数据如何交换, 以及类似 流管理[[RFC6120#参考文献|XEP‑0198]]和服务器回拨[[RFC6120#参考文献|XEP‑0220]]的XMPP扩展.&lt;br /&gt;
&lt;br /&gt;
:互操作性备注: 由于历史的原因, 一些服务器实现预期有一个'jabber:server:dialback'命名空间的声明用于 服务器-服务器 流, 详见[[RFC6120#参考文献|XEP‑0220]].&lt;br /&gt;
&lt;br /&gt;
无论如何, 一个XMPP服务器不能(MUST NOT)路由或递送这样一个从入站流中接收到的数据，如果那个数据 (a) 是由其他命名空间限定 并且 (b) 地址指向的实体不是一个服务器, 除非从出站流发送数据出来的另一方服务器显式地协商或声明支持从该服务器接收任意数据. 制定这个规则是因为XMPP是设计用来做XML节交换的(而不是任意XML数据), 也因为允许实体发送任意数据到其他实体可能会导致恶意数据交换显著增加. 作为本规则的例子, example.net 域主机将不会从 &amp;lt;romeo@example.net&amp;gt; 到 &amp;lt;juliet@example.com&amp;gt; 的路由一级XML元素: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ns1:foo xmlns:ns1='http://example.org/ns1'&lt;br /&gt;
           from='romeo@example.net/resource1'&lt;br /&gt;
           to='juliet@example.com'&amp;gt;&lt;br /&gt;
    &amp;lt;ns1:bar/&amp;gt;&lt;br /&gt;
  &amp;lt;/ns1:foo&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个规则也适用于看起来像节但是命名空间不正确所以并不是真的节的一级元素(参见 [[RFC6120#命名空间声明和前缀|4.8.5]]), 例如: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;ns2:message xmlns:ns2='http://example.org/ns2'&lt;br /&gt;
               from='romeo@example.net/resource1'&lt;br /&gt;
               to='juliet@example.com'&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;hi&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/ns2:message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在从一个入站流中接收到任意一级XML元素之后, 服务器必须要么忽略该数据要么以一个流错误关闭这个流, 这个流错误应该是 &amp;lt;unsupported-stanza-type/&amp;gt; ([[RFC6120#不支持的流类型|4.9.3.24]]).&lt;br /&gt;
&lt;br /&gt;
====命名空间声明和前缀====&lt;br /&gt;
&lt;br /&gt;
因为内容命名空间不同于流命名空间, 如果把一个内容命名空间声明为缺省命名空间，那么以下论断为真: &lt;br /&gt;
&lt;br /&gt;
:#流头需要包含一个同时用于内容命名空间和流命名空间的命名空间声明.&lt;br /&gt;
:#流命名空间的声明需要包含用于流命名空间的前缀.&lt;br /&gt;
&lt;br /&gt;
:互操作性备注: 由于历史原因, 一个实现可能只包含前缀'stream'用于流命名空间(包含了前缀的结果就像&amp;lt;stream:stream&amp;gt;和&amp;lt;stream:features&amp;gt;); 这个来自[[RFC3920]]的规范保留下来用于向后兼容. 实现如果使用不同于'stream'的前缀用于流命名空间将导致互操作性问题. 如果实体接收到一个流头而该流头的流命名空间前缀是不可接受的, 它必须以一个流错误来关闭这个流, 这个流错误应该是 &amp;lt;bad-namespace-prefix/&amp;gt; ([[RFC6120#bad-namespace-prefix|4.9.3.2]]), 虽然一些现有的实现发送的是 &amp;lt;bad-format/&amp;gt; ([[RFC6120#bad-format|4.9.3.1]]) .&lt;br /&gt;
&lt;br /&gt;
一个实现不能(MUST NOT)为由内容命名空间限定的元素生成命名空间前缀(即, 在流上发送的数据的缺省命名空间)，如果内容命名空间是'jabber:client'或'jabber:server'. 例如, 以下是非法的: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;stream:stream&lt;br /&gt;
    from='juliet@im.example.com'&lt;br /&gt;
    to='im.example.com'&lt;br /&gt;
    version='1.0'&lt;br /&gt;
    xml:lang='en'&lt;br /&gt;
    xmlns='jabber:client'&lt;br /&gt;
    xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;foo:message xmlns:foo='jabber:client'&amp;gt;&lt;br /&gt;
    &amp;lt;foo:body&amp;gt;foo&amp;lt;/foo:body&amp;gt;&lt;br /&gt;
  &amp;lt;/foo:message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
XMPP实体不应该接受违反这一规则的数据(特别是, XMPP服务器如果不首先纠正这个错误，就不能(MUST NOT）路由这类数据到另一个实体); 替代方案是，它应该要么忽略这个数据要么以流错误来关闭这个流, 这个流错误应该是 &amp;lt;bad-namespace-prefix/&amp;gt; ([[RFC6120#bad-namespace-prefix|4.9.3.2]]). &lt;br /&gt;
&lt;br /&gt;
在一个流头中对命名空间的声明必须只应用于那个流(例如, 'jabber:server:dialback' 命名空间用于服务器回拨 [[XEP‑0220]] ). 特别是, 因为用于通过流路由或递送到其他实体的XML节将丢失在那些生成节的原始流头中的命名空间的上下文, 这些节中的扩展内容的命名空间不能(MUST NOT)在那个流头中声明(参见 [[RFC6120#扩展内容|8.4]]). 如果流的参与双方声明了这样的命名空间, 这个流的其他参与方应该以&amp;lt;invalid-namespace/&amp;gt;流错误关闭该流([[RFC6120#invalid-namespace|4.9.3.10]]). 在任何情况下, 实体必须确保当从入站流路由或递送节到出战流的时候，这些命名空间(根据本章)被正确地声明 .&lt;br /&gt;
&lt;br /&gt;
===流错误===&lt;br /&gt;
&lt;br /&gt;
流的根元素可以包含一个由流命名空间限定的&amp;lt;error/&amp;gt;子元素. 这个错误子元素将由兼容的实体来发送，如果它发现发生了一个流错误. &lt;br /&gt;
&lt;br /&gt;
====规则====&lt;br /&gt;
&lt;br /&gt;
以下规则适用于流这一级的错误. &lt;br /&gt;
&lt;br /&gt;
=====流错误是不可恢复的=====&lt;br /&gt;
&lt;br /&gt;
流级别的错误是不可恢复的. 所以, 如果一个错误发生在流这个级别, 检测到这个错误的实体必须发送一个&amp;lt;error/&amp;gt;元素，其中包含适当的子元素以指明错误情况，并如[[RFC6120#关闭流|4.4]]所述立刻关闭这个流.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;message&amp;gt;&amp;lt;body&amp;gt;No closing tag!&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;not-well-formed&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接着收到这个流错误的实体将如[[RFC6120#关闭流|4.4]]所述关闭这个流. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====流错误可能发生在安装过程中=====&lt;br /&gt;
&lt;br /&gt;
如果该错误是被初始化流头触发的, 那么接收方实体必须仍然发送打开的&amp;lt;stream&amp;gt;标签, 把这个&amp;lt;error/&amp;gt;元素作为该流元素的子元素, 并且发送关闭流的&amp;lt;/stream&amp;gt;标签(最好在同一个TCP包里). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://wrong.namespace.example.org/'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
   &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;invalid-namespace&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====当主机未定义或未知时会发生流错误=====&lt;br /&gt;
&lt;br /&gt;
如果初始化实体未提供'to'属性或在'to'属性里提供了一个未知的主机并且这个错误发生在流安装的时候, 在接收方实体关闭这个流之前，由接收方实体返回给初始方实体的流头的'from'属性必须要么是接收方实体的可靠的完整域名要么是空字符串. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='unknown.host.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
   &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;host-unknown&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====流错误发到哪=====&lt;br /&gt;
&lt;br /&gt;
当在初始方实体和接收方实体之间使用了两个TCP连接(每个方向使用一个连接)而不是使用单独的双向连接时, 适用以下规则: &lt;br /&gt;
&lt;br /&gt;
:* 和初始方流相关的流级别错误由接收方实体在应答流中通过同一个TCP连接返回.&lt;br /&gt;
:* 从初始方实体用同一个TCP连接通过初始流发送的出站节所触发的节错误(区别于流级别的错误)，接收方实体应通过另一个(&amp;quot;返回&amp;quot;)TCP连接的应答流中返回，因为从初始方实体的角度来看这个(返回错误的)节是入站节.&lt;br /&gt;
&lt;br /&gt;
====语法====&lt;br /&gt;
&lt;br /&gt;
流错误的语法如下所示, 显示在中括号 '[' 和 ']' 的XML数据是可选的. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;stream:error&amp;gt;&lt;br /&gt;
  &amp;lt;defined-condition xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
  [&amp;lt;text xmlns='urn:ietf:params:xml:ns:xmpp-streams'&lt;br /&gt;
         xml:lang='langcode'&amp;gt;&lt;br /&gt;
     OPTIONAL descriptive text&lt;br /&gt;
  &amp;lt;/text&amp;gt;]&lt;br /&gt;
  [OPTIONAL application-specific condition element]&lt;br /&gt;
&amp;lt;/stream:error&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;defined-condition&amp;quot; 必须对应 [[RFC6120#已定义的错误条件|4.9.3]] 中定义的流错误条件之一. 然而, 因为将来可能定义额外的错误条件, 如果实体接收到一个它不理解的流错误条件，那么它必须把未知的条件当作 &amp;lt;undefined-condition/&amp;gt; ([[RFC6120#undefined-condition|4.9.3.21]]). 如果一个XMPP扩展的设计者或XMPP实现的开发者需要使用未在本协议中定义的流错误条件来通讯, 他们可以定义一个由应用层命名空间限定的应用特有的错误条件元素来达到这个目的. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;error/&amp;gt;元素:&lt;br /&gt;
&lt;br /&gt;
:* 必须包含一个对应已定义错误条件之一的子元素; 这个元素必须由 'urn:ietf:params:xml:ns:xmpp-streams' 命名空间限定.&lt;br /&gt;
:* 可以包含一个内有XML字符串数据的 &amp;lt;text/&amp;gt; 子元素用来描述错误细节; 这个元素必须由 'urn:ietf:params:xml:ns:xmpp-streams' 命名空间限定并且应该拥有一个 'xml:lang' 属性来指定XML字符串数据的自然语言.&lt;br /&gt;
:* 可以包含一个子元素用于应用特有的错误条件; 这个元素必须由一个应用定义的命名空间来限定，并且它的结构也由该命名空间来定义 (见 [[RFC6120#应用特有的条件|4.9.4]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;text/&amp;gt; 元素是可选的. 如果有它, 它必须只用于提供描述性或诊断性的信息，用来补充一个已定义的条件或应用特有的条件的含义. 它不能(MUST NOT)被应用程序解释执行. 它不能(MUST NOT)被用作向自然人用户展示的错误消息, 但是可以被用作和已定义条件元素(以及, 可选地, 应用特有的条件元素)相关的错误消息的额外信息.&lt;br /&gt;
&lt;br /&gt;
====已定义的流错误条件====&lt;br /&gt;
&lt;br /&gt;
以下是已定义的流级别的错误条件. &lt;br /&gt;
&lt;br /&gt;
=====bad-format=====&lt;br /&gt;
&lt;br /&gt;
实体发送了无法处理的XML.&lt;br /&gt;
&lt;br /&gt;
(在以下例子中, 客户端发送了一个非XML的XMPP消息, 它也可能会触发一个 &amp;lt;not-well-formed/&amp;gt; 流错误( [[RFC6120#not-well-formed|4.9.3.13]]).) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;message&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;No closing tag!&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;bad-format&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:这个错误可以用更多特定的XML相关的错误来替代, 例如 &amp;lt;bad-namespace-prefix/&amp;gt;, &amp;lt;invalid-xml/&amp;gt;, &amp;lt;not-well-formed/&amp;gt;, &amp;lt;restricted-xml/&amp;gt;, 和 &amp;lt;unsupported-encoding/&amp;gt;. 无论如何, 建议使用更多特定的错误.&lt;br /&gt;
&lt;br /&gt;
=====bad-namespace-prefix=====&lt;br /&gt;
&lt;br /&gt;
实体发送了不被支持的命名空间前缀, 或在一个需要这样的前缀的元素中没有发送命名空间前缀 (见 [[RFC6120#XML命名空间名字和前缀|11.2]]).&lt;br /&gt;
&lt;br /&gt;
(在以下例子中, 客户端指定了一个命名空间前缀 &amp;quot;foobar&amp;quot; 用于XML流命名空间.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;foobar:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:foobar='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
   &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;bad-namespace-prefix&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====conflict=====&lt;br /&gt;
&lt;br /&gt;
服务器要么 (1) 关闭这个实体现存的流(如果和现有流冲突的新流已经被初始化了), 要么 (2) 拒绝这个实体的新流(如果允许这个新的流将导致和现有的流冲突(例如, 服务器限制来自同一IP地址的连接数量或对于给定的域对只允许一个 服务器-服务器 流，以确保[[RFC6120#顺序处理|10.1]]所述的顺序处理)).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
   &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;conflict&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果客户端收到一个&amp;lt;conflict/&amp;gt;流错误( [[RFC6120#conflict|4.9.3.3]]), 它尝试重新连接的时候绑定的资源不能(MUST NOT)和前一个会话的资源相同，而是必须选择一个不同的资源; 详见 [[RFC6120#资源绑定|第7章]].&lt;br /&gt;
&lt;br /&gt;
=====connection-timeout=====&lt;br /&gt;
&lt;br /&gt;
如果一方有理由相信另一方永久地失去了通过某个流进行通讯的能力，它可以关闭这个流. 有很多办法可以查觉到对方丧失通讯能力, 类似 [[RFC6120#关闭流|4.4]] 所述的空格符保持连接, 定义于 [[RFC6120#参考文献|XEP‑0199]] 的XMPP级的ping, 以及定义于[[RFC6120#参考文献|XEP‑0198]] 的XMPP流管理.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
P: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;connection-timeout&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:互操作性备注: RFC 3920指出，如果在一段时间内对端在某个流上没有产生任何流量，则使用&amp;lt;connection-timeout/&amp;gt;流错误([[RFC6120#connection-timeout|4.9.3.4]]). 那种行为已经不推荐了; 替代办法是, 只在已连接客户端或对端服务器不响应该流发送的数据时才使用该错误.&lt;br /&gt;
&lt;br /&gt;
=====host-gone=====&lt;br /&gt;
&lt;br /&gt;
在初始化流头中提供的'to'属性的值对应的完整合法域名(FQDN)不再由接收方实体提供服务.&lt;br /&gt;
&lt;br /&gt;
(以下例子中, 当连接到&amp;quot;im.example.com&amp;quot;服务器时,对端指定了一个'to'地址&amp;quot;foo.im.example.com&amp;quot;， 但是这个服务器不再为那个地址提供服务了.) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
P: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='example.net'&lt;br /&gt;
       to='foo.im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xmlns='jabber:server'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='g4qSvGvBxJ+xeAd7QKezOQJFFlw='&lt;br /&gt;
       to='example.net'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:server'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
   &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;host-gone&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====host-unknown=====&lt;br /&gt;
&lt;br /&gt;
初始流头中提供的'to'属性的值不对应接收方实体所服务的合法域名(FQDN).&lt;br /&gt;
&lt;br /&gt;
(在下例中, 对端连接到&amp;quot;im.example.com&amp;quot;服务器的时候指定了一个'to'地址&amp;quot;example.org&amp;quot;, 但是该服务器不知道这个地址.) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
P: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='example.net'&lt;br /&gt;
       to='example.org'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xmlns='jabber:server'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='g4qSvGvBxJ+xeAd7QKezOQJFFlw='&lt;br /&gt;
       to='example.net'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:server'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
   &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;host-unknown&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====improper-addressing=====&lt;br /&gt;
&lt;br /&gt;
在两服务器之间发送的节缺少'to'或'from'属性, 这个'from'或'to'属性没有值, 或它的值违反了XMPP地址[[RFC6120#规范引用|XMPP‑ADDR]]的规则 .&lt;br /&gt;
&lt;br /&gt;
(在下例中, 对端在服务器-服务器流中发送了一个不包含'to'地址的节.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
P: &amp;lt;message from='juliet@im.example.com'&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;Wherefore art thou?&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;improper-addressing&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====internal-server-error=====&lt;br /&gt;
&lt;br /&gt;
服务器配置错误或其他内部错误导致它无法服务于该流. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;internal-server-error&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====invalid-from=====&lt;br /&gt;
&lt;br /&gt;
当 (1) 在两个服务器使用SASL或服务器回拨, 或 (2) 在客户端和服务器通过SASL验证和资源绑定的时候,协商时的'from'属性提供的数据不匹配已授权的JID或合法的域名.&lt;br /&gt;
&lt;br /&gt;
(在下例中, 一个仅被授权为&amp;quot;example.net&amp;quot;的对端尝试以地址&amp;quot;example.org&amp;quot;发送节.) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
P: &amp;lt;message from='romeo@example.org' to='juliet@im.example.com'&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;Neither, fair saint, if either thee dislike.&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;invalid-from&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====invalid-namespace=====&lt;br /&gt;
&lt;br /&gt;
流命名空间的名字不是&amp;quot;http://etherx.jabber.org/streams&amp;quot; (见 [[RFC6120#XML命名空间和前缀|11.2]]) 或不支持把内容命名空间声明为缺省命名空间 (例如, 不同于&amp;quot;jabber:client&amp;quot;或&amp;quot;jabber:server&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
(下例中, 客户端为流指定了一个命名空间'http://wrong.namespace.example.org/'.) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://wrong.namespace.example.org/'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
   &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;invalid-namespace&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====invalid-xml=====&lt;br /&gt;
&lt;br /&gt;
实体通过该流发送了非法的XML到一个执行验证的服务器上(见 [[RFC6120#验证|11.4]]).&lt;br /&gt;
&lt;br /&gt;
(下例中, 对端尝试发送一个类型为&amp;quot;subscribe&amp;quot;的IQ节, 但是XML schema没有这个'类型'的属性.) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
P: &amp;lt;iq from='example.net'&lt;br /&gt;
       id='l3b1vs75'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       type='subscribe'&amp;gt;&lt;br /&gt;
     &amp;lt;ping xmlns='urn:xmpp:ping'/&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;invalid-xml&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====not-authorized=====&lt;br /&gt;
&lt;br /&gt;
实体尝试在流被验证之前发送XML节或其他出站数据, 或没有被授权执行一个和流协商有关的动作; 接收方实体在发送流错误之前不能(MUST NOT)处理这些数据.&lt;br /&gt;
&lt;br /&gt;
(下例中, 客户端尝试在被服务器验证前发送XML节.) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C: &amp;lt;message to='romeo@example.net'&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;Wherefore art thou?&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;not-authorized&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====not-well-formed=====&lt;br /&gt;
&lt;br /&gt;
初始化实体发送了违反[[RFC6120#规范引用|XML]]或[[RFC6120#规范引用|XML‑NAMES]]的&amp;quot;良好格式&amp;quot;规则的XML.&lt;br /&gt;
&lt;br /&gt;
(下例中, 客户端发送一个命名空间格式错误的XMPP消息.) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;message&amp;gt;&lt;br /&gt;
     &amp;lt;foo:body&amp;gt;What is this foo?&amp;lt;/foo:body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;not-well-formed&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:互操作性备注: 在RFC 3920中, 这个错误条件的名字是 &amp;quot;xml-not-well-formed&amp;quot; 而不是 &amp;quot;not-well-formed&amp;quot;. 改名是因为元素名 &amp;lt;xml-not-well-formed/&amp;gt; 违反了[[RFC6120#规范引用|XML]]第三章的约束 &amp;quot;以 (('X'|'x')('M'|'m')('L'|'l')) 打头的名字是保留给本协议的这个或下个版本的标准化用的&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=====policy-violation=====&lt;br /&gt;
&lt;br /&gt;
实体违反一些本地服务策略 (例如, 一个节超出了配置的大小限制); 服务器可以选择在 &amp;lt;text/&amp;gt; 元素里或在一个应用特有的条件元素中指定这个策略.&lt;br /&gt;
&lt;br /&gt;
(下例中, 客户端发送了一个据服务器的本地服务策略看来过大的XMPP消息.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;message to='juliet@im.example.com' id='foo'&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;[ ... the-emacs-manual ... ]&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;policy-violation&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
     &amp;lt;stanza-too-big xmlns='urn:xmpp:errors'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====remote-connection-failed=====&lt;br /&gt;
&lt;br /&gt;
服务器不能正确地连接到一个需要验证或授权的远程实体 (例如, 在和服务器回拨[[RFC6120#参考文献|XEP-0220]]相关的特定场景); 当发生这个错误的是XMPP服务提供商有管理员权限的域时候，这个条件不被使用, 那种情况下更适合使用 &amp;lt;internal-server-error/&amp;gt; 条件.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
   &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;remote-connection-failed&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====reset=====&lt;br /&gt;
&lt;br /&gt;
服务器在下列情况下关闭流，如提供了新的流特性(特别是关系安全的), 如为流建立安全上下文的密钥或者证书过期或在流的声明周期中被收回([[RFC6120#检查长连接流的证书|13.7.2.3), 如TLS序列号已经封装了([[RFC6120#TLS重新协商|5.3.5]]), 等等. reset适用于流以及该流(例如, 通过TLS和 SASL)建立的的任何安全上下文, 这意味着新的流的加密和验证需要再次协商(例如, 不能使用TLS会话恢复了).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;reset&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====resource-constraint=====&lt;br /&gt;
&lt;br /&gt;
服务器缺乏必要系统资源来服务于这个流.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
   &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;resource-constraint&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====restricted-xml=====&lt;br /&gt;
&lt;br /&gt;
实体尝试发送受限的XML特性，例如 注释, 处理指令, DTD子集, 或XML实体参考(见 [[RFC6120#XML限制|11.1]]).&lt;br /&gt;
&lt;br /&gt;
(下例中, 客户端发送一个包含XML注释的XMPP消息.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;message to='juliet@im.example.com'&amp;gt;&lt;br /&gt;
     &amp;lt;!--&amp;lt;subject/&amp;gt;--&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;This message has no subject.&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;restricted-xml&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====see-other-host=====&lt;br /&gt;
&lt;br /&gt;
服务器将不提供服务给初始化实体，但是重定向到同一个服务提供商管理控制下的另一台主机. 服务器返回的 &amp;lt;see-other-host/&amp;gt; 元素的XML字符串数据必须指定用来连接的替代的合法域名(FQDN)或IP地址, 它必须是一个合法的域部分或一个域部分加上一个端口号(通过&amp;quot;域名:端口号&amp;quot;中的':'字符来区分). 如果域部分和源域相同,或和派生域相同, 或解析出来的IPv4或IPv6地址和初始化实体原先连接的地址相同(只是端口号不同), 那么初始化实体应该简单地重新连接那个地址. (IPv6地址的格式必须遵循[[RFC6120#规范引用|IPv6‑ADDR]], 它包括如 [[RFC6120#规范引用|URI]] 所定义的，把IPv6地址封闭在方括号'[' 和 ']'里.) 否则, 初始化实体必须解析&amp;lt;see-other-host/&amp;gt;元素中指定的合格域名(FQDN),如 [[RFC6120#|解析合格域名3.2]]所述.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
   &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;see-other-host&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'&amp;gt;&lt;br /&gt;
       [2001:41D0:1:A49b::1]:9222&lt;br /&gt;
     &amp;lt;/see-other-host&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当协商一个已经被重定向的流时, 初始化实体必须应用和它应用于初次连接时相同的策略 (例如, 一个必须使用TLS的策略), 必须在初始化流头中指定相同的'to'地址, 而且必须使用和初次尝试连接时相同的参考标识符来检查新地址的标识符 (符合 [[RFC6120#规范引用|TLS‑CERTS]]). 即使接收方在流的保密和信任关系建立之前返回一个&amp;lt;see-other-host/&amp;gt;错误(从而产生 拒绝服务 攻击的可能性), 事实上初始化实体需要基于相同的参考标识符来检查XMPP服务的标识符，这意味着初始化实体将不会连接到一个恶意的实体. 为了避免 拒绝服务 攻击, (a) 在流的保密和信任关系由TLS或相当的安全层(例如 SASL GSSAPI 机制)保护起来立之前, 接收方实体不应该以&amp;lt;see-other-host/&amp;gt;流错误关闭流, 并且 (b) 只有当它已经被接收方实体验证了, 接收方才可以有一个下述的重定向策略. 另外, 初始化实体在特定数量的成功重定向之后应该放弃尝试连接(例如, 最少2次但不超过5次).&lt;br /&gt;
&lt;br /&gt;
=====system-shutdown=====&lt;br /&gt;
&lt;br /&gt;
服务器正在关闭且所有活跃的流正在被关闭.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;system-shutdown&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====undefined-condition=====&lt;br /&gt;
&lt;br /&gt;
这个错误条件不是预定义的条件列表中的一个; 这个错误应该不被使用，除非结合一个应用特有的条件.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;undefined-condition&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
     &amp;lt;app-error xmlns='http://example.org/ns'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====unsupported-encoding=====&lt;br /&gt;
&lt;br /&gt;
初始化实体给流使用的编码不被服务器支持(见 [[RFC6120#字符编码|11.6]]) 或没有正确地对流进行编码 (例如, 违反了 [[RFC6120#规范引用|UTF‑8]] 编码规则).&lt;br /&gt;
&lt;br /&gt;
(下例中, 客户端试图使用UTF-16编码而不是UTF-8.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;?xml version='1.0' encoding='UTF-16'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
   &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;unsupported-encoding&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====unsupported-feature=====&lt;br /&gt;
&lt;br /&gt;
接收方实体声明了一个 强制协商 的流特性，但是初始化实体不支持它, 并且提不出其他等价于不支持特性的 强制协商 特性.&lt;br /&gt;
&lt;br /&gt;
(下例中, 接收方实体要求一个example特性, 但是初始化实体不支持这个特性.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Rs: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;example xmlns='urn:xmpp:example'&amp;gt;&lt;br /&gt;
       &amp;lt;required/&amp;gt;&lt;br /&gt;
     &amp;lt;/example&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;unsupported-feature&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====unsupported-stanza-type=====&lt;br /&gt;
&lt;br /&gt;
初始化实体发送的流的顶级子元素不被服务器支持, 要么是因为接收方实体不理解命名空间要么因为接收方实体不理解适用的命名空间的元素名(可能是声明为缺省命名空间的内容命名空间).&lt;br /&gt;
&lt;br /&gt;
(下例中, 客户端尝试发送一个由'jabber:client'命名空间限定的顶级子元素 &amp;lt;pubsub/&amp;gt; , 但是那个命名空间的schema没有定义这个元素.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;pubsub xmlns='jabber:client'&amp;gt;&lt;br /&gt;
     &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
       &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
         &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
           &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
           &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
           &amp;lt;/summary&amp;gt;&lt;br /&gt;
           &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                 href='http://denmark.example/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
           &amp;lt;id&amp;gt;tag:denmark.example,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
           &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
           &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
         &amp;lt;/entry&amp;gt;&lt;br /&gt;
       &amp;lt;/item&amp;gt;&lt;br /&gt;
     &amp;lt;/publish&amp;gt;&lt;br /&gt;
   &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;unsupported-stanza-type&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====unsupported-version=====&lt;br /&gt;
&lt;br /&gt;
由初始化实体在流头中提供的'version'属性指定的XMPP版本不被服务器支持.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='11.0'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
   &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;unsupported-version&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====应用特有的条件====&lt;br /&gt;
&lt;br /&gt;
大家知道, 应用可以在错误元素中包含一个适当的命名空间子元素来提供应用特有的错误信息. 应用特有的元素应该补充或进一步限定一个已定义的元素. 因此, &amp;lt;error/&amp;gt; 元素将包含两个或三个子元素.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;message&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;&lt;br /&gt;
       My keyboard layout is:&lt;br /&gt;
&lt;br /&gt;
       QWERTYUIOP{}|&lt;br /&gt;
       ASDFGHJKL:&amp;quot;&lt;br /&gt;
       ZXCVBNM&amp;lt;&amp;gt;?&lt;br /&gt;
     &amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
     &amp;lt;not-well-formed&lt;br /&gt;
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
     &amp;lt;text xml:lang='en' xmlns='urn:ietf:params:xml:ns:xmpp-streams'&amp;gt;&lt;br /&gt;
       Some special application diagnostic information!&lt;br /&gt;
     &amp;lt;/text&amp;gt;&lt;br /&gt;
     &amp;lt;escape-your-data xmlns='http://example.org/ns'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===简化的流示例===&lt;br /&gt;
&lt;br /&gt;
这一仗包含两个客户端和服务器之间基于流的连接的高度简化的例子; 这些例子的目的是说明迄今为止介绍的那些概念, 但是读者需要注意这些例子省略了一些细节 (更完整的例子见 [[RFC6120#详细的例子|第9章]]).&lt;br /&gt;
&lt;br /&gt;
一个基本的连接:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... stream negotiation ... ]&lt;br /&gt;
&lt;br /&gt;
C:   &amp;lt;message from='juliet@im.example.com/balcony'&lt;br /&gt;
              to='romeo@example.net'&lt;br /&gt;
              xml:lang='en'&amp;gt;&lt;br /&gt;
       &amp;lt;body&amp;gt;Art thou not Romeo, and a Montague?&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S:   &amp;lt;message from='romeo@example.net/orchard'&lt;br /&gt;
              to='juliet@im.example.com/balcony'&lt;br /&gt;
              xml:lang='en'&amp;gt;&lt;br /&gt;
       &amp;lt;body&amp;gt;Neither, fair saint, if either thee dislike.&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C: &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
连接坏了:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ ... stream negotiation ... ]&lt;br /&gt;
&lt;br /&gt;
C:   &amp;lt;message from='juliet@im.example.com/balcony'&lt;br /&gt;
              to='romeo@example.net'&lt;br /&gt;
              xml:lang='en'&amp;gt;&lt;br /&gt;
       &amp;lt;body&amp;gt;No closing tag!&lt;br /&gt;
     &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;stream:error&amp;gt;&lt;br /&gt;
    &amp;lt;not-well-formed&lt;br /&gt;
        xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:error&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多详细的例子请到[[RFC6120#详细的例子|第9章]] .&lt;br /&gt;
&lt;br /&gt;
==STARTTLS协商==&lt;br /&gt;
===STARTTLS基础===&lt;br /&gt;
&lt;br /&gt;
XMPP包含了一个方法来保护流的安全使其免于被篡改和窃听. 这个通道加密的方法使用传输层安全 [[RFC6120#规范引用|TLS]] 协议, 特别是&amp;quot;STARTTLS&amp;quot;扩展，这个扩展是以 [[RFC6120#参考文献|USINGTLS]]中描述的 [[RFC6120#参考文献|IMAP]], [[RFC6120#参考文献|POP3]], 和 [[RFC6120#参考文献|ACAP]] 协议中的类似扩展为蓝本的. STARTTLS扩展的XML命名空间是 'urn:ietf:params:xml:ns:xmpp-tls'.&lt;br /&gt;
&lt;br /&gt;
===支持===&lt;br /&gt;
&lt;br /&gt;
在XMPP客户端和服务器的实现中必须支持STARTTLS. 一个给定布署的管理员可以指定 客户端-服务器通讯 和/或 服务器-服务器通讯 中TLS是强制协商的. 一个初始化实体应该在开始SASL验证之前使用TLS保护和接收方之间的流的安全.&lt;br /&gt;
&lt;br /&gt;
===流协商规则===&lt;br /&gt;
====强制协商====&lt;br /&gt;
&lt;br /&gt;
如果接收方实体只声明了STARTTLS特性或接收方实体包含了[[RRC6120#流头和流特性交换|5.4.1]]所述的&amp;lt;required/&amp;gt;子元素, 双方必须确保TLS是强制协商的. 如果TLS是强制协商的, 在流协商过程的初始化阶段接收方实体应该不(SHOULD NOT)声明支持任何STARTTLS以外的流特性, 因为在XMPP的层顺序中更多流特性可能依赖TLS的预先协商 (例如, 由接收方实体提供的特定的SASL机制将依赖于TLS是否完成协商).&lt;br /&gt;
&lt;br /&gt;
====重启====&lt;br /&gt;
&lt;br /&gt;
在TLS协商之后, 双方必须重启这个流.&lt;br /&gt;
&lt;br /&gt;
====数据格式====&lt;br /&gt;
&lt;br /&gt;
当STARTTLS协商时, 实体们不能(MUST NOT)在XML元素之间发送任何空格符号 (即, 由初始化实体发送的从'urn:ietf:params:xml:ns:xmpp-tls'命名空间限定的顶级&amp;lt;starttls/&amp;gt;元素的最后的字符, 到由接收方实体发送的'urn:ietf:params:xml:ns:xmpp-tls'命名空间限定的顶级&amp;lt;proceed/&amp;gt;元素的最后的字符). 这个禁令帮助确保适当的安全字节精度. 任何出现在本文提供的STARTTLS例子中的空格只是为了提高可读性.&lt;br /&gt;
&lt;br /&gt;
====TLS和SASL协商的顺序====&lt;br /&gt;
&lt;br /&gt;
如果初始化实体选择使用TLS, STARTTLS协商必须在[[RFC6120#SASL协商|SASL协商]]之前完成; 这个协商顺序对于帮助保护SASL协商期间发送的验证信息是必要的, 同时尽可能使用基于预先的TLS协商中提供的证书(或其他证件)的SASL EXTERNAL机制.&lt;br /&gt;
&lt;br /&gt;
====TLS重协商====&lt;br /&gt;
&lt;br /&gt;
TLS协议允许双方在一个 受TLS保护 的通道里初始化一个新的握手来建立新的加密参数(见 [[RFC6120#规范引用|TLS‑NEG]]). 最常提及的案例如下:&lt;br /&gt;
&lt;br /&gt;
# 刷新密钥&lt;br /&gt;
# 如[[RFC6120#规范引用|TLS]]的6.1节所述封装TLS序列号.&lt;br /&gt;
# 在受保护的通道上先完成服务器验证再完成客户端验证以保护客户端证书.&lt;br /&gt;
&lt;br /&gt;
因为在XMPP中建立一个流的代价相对低廉, 对于前面两个案例推荐使用XMPP流重置(如 [[RFC6120#reset|4.9.3.16]]) 而不是执行TLS重协商.&lt;br /&gt;
&lt;br /&gt;
第三个案例在TLS客户端(也可能是一个XMPP服务器)递交TLS证书给服务器时提高了安全特性. 如果和一个未验证的TLS服务器交换这类证书可能泄露隐私信息, 先完成让TLS客户端验证TLS服务器的TLS协商，再完成让TLS服务器验证TLS客户端的TLS协商，是适当的. 然而, 这个案例极为罕见，因为由一个扮演TLS客户端角色的XMPP服务器或XMPP客户端对外展现的证书几乎总是公开的(即, PKIX 证书), 所以在验证作为TLS服务器的XMPP服务器之前提供那些证书通常将不会泄露隐私信息.&lt;br /&gt;
&lt;br /&gt;
作为结果, 鼓励实现者在他们的软件中支持TLS重协商之前小心地权衡它的开销和好处, 不鼓励扮演TLS客户端的XMPP实体尝试TLS重协商，除非已知要在TLS协商中发送的证书(或其他证件信息)是私有的.&lt;br /&gt;
&lt;br /&gt;
对TLS重协商的支持是严格可选的. 然而, 支持TLS重协商的实现们必须实现和使用 TLS重协商扩展 [[RFC6120#规范引用|TLS‑NEG]].&lt;br /&gt;
&lt;br /&gt;
如果一个不支持TLS重协商的实体察觉到一个重协商尝试, 那么它必须立刻关闭相关的TCP连接而不要返回任何流错误(因为这个违规可能发生在TLS层, 而不是XMPP层, 详见 [[RFC6120#层的顺序|13.3]]).&lt;br /&gt;
&lt;br /&gt;
如果一个支持TLS重协商的实体察觉到一个未使用 TLS重协商扩展 [[RFC6120#规范引用|TLS‑NEG]] 的TLS重协商尝试 , 那么它必须立刻关闭相关的TCP连接而不要返回任何流错误(因为这个违规可能发生在TLS层, 而不是XMPP层, 详见 [[RFC6120#层的顺序|13.3]]).&lt;br /&gt;
&lt;br /&gt;
====TLS扩展====&lt;br /&gt;
&lt;br /&gt;
一个流的双方可以在它自己的TLS协商时包含任何TLS扩展. 这是TLS层的事情, 不是XMPP层.&lt;br /&gt;
&lt;br /&gt;
===过程===&lt;br /&gt;
====流头和流特性交换====&lt;br /&gt;
&lt;br /&gt;
初始化实体如[[RFC6120#TCP绑定|第三章]]所述解析接收实体的合格域名(FQDN), 打开一个到解析的IP地址和声明的端口的TCP连接, 并发送一个初始化流头给接收方流头.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;stream:stream&lt;br /&gt;
     from='juliet@im.example.com'&lt;br /&gt;
     to='im.example.com'&lt;br /&gt;
     version='1.0'&lt;br /&gt;
     xml:lang='en'&lt;br /&gt;
     xmlns='jabber:client'&lt;br /&gt;
     xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接收方实体必须通过初始化实体打开的那个TCP连接发送一个应答流头给初始化实体.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:stream&lt;br /&gt;
     from='im.example.com'&lt;br /&gt;
     id='t7AMCin9zjMNwQKDnplntZPIDEI='&lt;br /&gt;
     to='juliet@im.example.com'&lt;br /&gt;
     version='1.0'&lt;br /&gt;
     xml:lang='en'&lt;br /&gt;
     xmlns='jabber:client'&lt;br /&gt;
     xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接着接收方实体必须发送流特性给初始化实体. 如果接收方实体支持TLS, 流特性必须包含一个支持STARTTLS协商的声明, 即, 一个由'urn:ietf:params:xml:ns:xmpp-tls'命名空间限定的&amp;lt;starttls/&amp;gt;元素.&lt;br /&gt;
&lt;br /&gt;
如果接收方实体认为STARTTLS协商是强制协商的, &amp;lt;starttls/&amp;gt;元素必须包含一个空的&amp;lt;required/&amp;gt;子元素.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'&amp;gt;&lt;br /&gt;
       &amp;lt;required/&amp;gt;&lt;br /&gt;
     &amp;lt;/starttls&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====STARTTLS协商的初始化====&lt;br /&gt;
=====STARTTLS命令=====&lt;br /&gt;
&lt;br /&gt;
为了开始STARTTLS协商, 初始化实体发出STARTTLS指令(即, 一个由'urn:ietf:params:xml:ns:xmpp-tls'命名空间限定的&amp;lt;starttls/&amp;gt;元素)来指示接收方实体它希望开始一次STARTTLS协商以保护流.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接收方实体必须以由'urn:ietf:params:xml:ns:xmpp-tls'命名空间限定的&amp;lt;proceed/&amp;gt;元素(继续进行的情况下)或&amp;lt;failure/&amp;gt;元素(失败的情况下)回复. &lt;br /&gt;
&lt;br /&gt;
=====失败的情况=====&lt;br /&gt;
&lt;br /&gt;
如果发生失败的情况, 接收方实体必须返回一个由'urn:ietf:params:xml:ns:xmpp-tls'命名空间限定的&amp;lt;failure/&amp;gt;元素, 关闭这个XML流, 并且终止当前的TCP连接.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-tls'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R: &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
导致失败的情况包含但不限于以下几种:&lt;br /&gt;
&lt;br /&gt;
:# 初始化实体发送了一个异常的STARTTLS命令.&lt;br /&gt;
:# 接收方实体在它的流特性中不提供STARTTLS特性 .&lt;br /&gt;
:# 接收方实体因为内部错误而无法完成STARTTLS协商.&lt;br /&gt;
&lt;br /&gt;
:参考文献: STARTTLS失败不会由TLS错误触发，例如 坏证书(bad_certificate)或 握手失败(handshake_failure), 它是由TLS协商本身生成和处理的，参见[[RFC6120#规范引用|TLS]].&lt;br /&gt;
&lt;br /&gt;
如果发生了失败的情况, 初始化实体可以尝试重连，参见 [[RFC6120#重连|3.3]].&lt;br /&gt;
&lt;br /&gt;
=====继续进行的情况=====&lt;br /&gt;
&lt;br /&gt;
如果发生继续进行的情况, 接收方实体必须返回一个由'urn:ietf:params:xml:ns:xmpp-tls'命名空间限定的&amp;lt;proceed/&amp;gt;元素.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接收方实体在发送了&amp;lt;proceed/&amp;gt;元素的关闭字符'&amp;gt;'之后必须认为TLS协商已经立刻开始了. 初始化实体在从接收方实体接收到&amp;lt;proceed/&amp;gt;元素的关闭字符'&amp;gt;'之后必须认为TLS协商已经立刻开始了.&lt;br /&gt;
&lt;br /&gt;
实体现在继续进行TLS协商，如下一节所述.&lt;br /&gt;
&lt;br /&gt;
====TLS协商====&lt;br /&gt;
=====规则=====&lt;br /&gt;
&lt;br /&gt;
为了在TCP连接上完成TLS协商, 实体们必须跟随以下定义于[[RFC6120#规范引用|TLS]]的过程 .&lt;br /&gt;
&lt;br /&gt;
以下规则适用于:&lt;br /&gt;
&lt;br /&gt;
:# 实体们在TLS协商完成之前不能(MUST NOT)发送任何其他XML数据.&lt;br /&gt;
:# 当使用定义于[[RFC6120#强制实现的TLS和SASL技术|13.8]]的任何强制实现(MTI)的密码组时, 接收方实体必须出示一个证书.&lt;br /&gt;
:# 所以证书相互验证是有可能的, 接收方实体应该发送一个证书请求给初始化实体, 而初始化实体应该发送一个证书给接收方实体(但是由于隐私的原因可能选择在接收方实体已经被初始化实体验证之后才发送自己的证书).&lt;br /&gt;
:# 接收方实体应该基于包含在初始化流头中的'to'属性中的域部分选择哪个证书来展示(本质上, 这个域部分功能上等同于服务器名称指示 定义于[[RFC6120#参考文献|TLS‑EXT]]).&lt;br /&gt;
:# 为了确定TLS协商是否成功, 初始化实体必须尝试根据[[RFC6120#证书验证|13.7.2]]定义的证书验证程序来验证接收方实体的证书.&lt;br /&gt;
:# 如果初始化实体出示了一个证书, 接收方实体也必须尝试根据[[RFC6120#证书验证|13.7.2]]定义的证书验证程序来验证初始化实体的证书.&lt;br /&gt;
:# 随着TLS协商成功, 所有双方传送的更多的数据必须被协商的算法，密钥和秘密来保护(即, 加密, 完整性保护, 或都依赖于使用的密码组).&lt;br /&gt;
&lt;br /&gt;
:安全警告: 关于[[RFC6120#强制实现的TLS和SASL技术|13.8]]提到的密码组必须被TLS所支持; 自然的, 其他密码组也可以被支持.&lt;br /&gt;
&lt;br /&gt;
=====TLS失败=====&lt;br /&gt;
&lt;br /&gt;
如果TLS协商结果是失败, 接收方实体必须终止该TCP连接.&lt;br /&gt;
&lt;br /&gt;
在终止该TCP连接之前,接收方实体不能(MUST NOT)发送关闭标签&amp;lt;/stream&amp;gt;(因为失败可能发生在TLS层, 而不是XMPP层，参见[[RFC6120#层的顺序|13.3]]所述).&lt;br /&gt;
&lt;br /&gt;
初始化实体可以如[[RFC6120#重连|3.3]]所述尝试重连, 尝试使用或不使用TLS协商(依照本地服务策略, 用户配置的偏好, 等等).&lt;br /&gt;
&lt;br /&gt;
=====TLS成功=====&lt;br /&gt;
&lt;br /&gt;
如果TLS协商是成功的, 那么实体们必须继续如下步骤.&lt;br /&gt;
&lt;br /&gt;
:1. 初始化实体必须忽略TLS生效之前在TCP上的不安全情况下从接收方实体收到的任何信息(例如, 接收方实体的'from'地址或从接收方实体收到的流ID以及流特性).&lt;br /&gt;
:2. 接收方实体必须忽略TLS生效之前在TCP上的不安全情况下从初始化实体收到的任何信息(例如, 初始化实体的'from'地址).&lt;br /&gt;
:3. 初始化实体必须通过加密的连接发送一个新的初始化流头给接收方实体(如[[RFC6120#重启|4.3.3]]定义的, 在发送新的初始化流头之前初始化实体必须发送一个关闭标签&amp;lt;/stream&amp;gt;, 因为接收方实体和初始化实体必须确定旧的流在TLS协商成功之后被替代了).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    I: &amp;lt;stream:stream&lt;br /&gt;
         from='juliet@im.example.com'&lt;br /&gt;
         to='im.example.com'&lt;br /&gt;
         version='1.0'&lt;br /&gt;
         xml:lang='en'&lt;br /&gt;
         xmlns='jabber:client'&lt;br /&gt;
         xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:4. 接收方实体必须通过加密连接以一个新的应答流头来应答(为此它必须生成一个新的流ID而不是重用旧的流ID).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    R: &amp;lt;stream:stream&lt;br /&gt;
         from='im.example.com'&lt;br /&gt;
         id='vgKi/bkYME8OAj4rlXMkpucAqe4='&lt;br /&gt;
         to='juliet@im.example.com'&lt;br /&gt;
         version='1.0'&lt;br /&gt;
         xml:lang='en'&lt;br /&gt;
         xmlns='jabber:client'&lt;br /&gt;
         xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. 接收方实体也必须发送流特性给初始化实体, 不能(MUST NOT)包含STARTTLS特性但是应该包含SASL流特性，如[[RFC6120#SASL协商|第六章]](特别是[[RFC6120#流头和流特性交换|6.4.1]]中关于为什么不在这里提供SASL流特性的新的原因).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
         &amp;lt;mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
           &amp;lt;mechanism&amp;gt;EXTERNAL&amp;lt;/mechanism&amp;gt;&lt;br /&gt;
           &amp;lt;mechanism&amp;gt;SCRAM-SHA-1-PLUS&amp;lt;/mechanism&amp;gt;&lt;br /&gt;
           &amp;lt;mechanism&amp;gt;SCRAM-SHA-1&amp;lt;/mechanism&amp;gt;&lt;br /&gt;
           &amp;lt;mechanism&amp;gt;PLAIN&amp;lt;/mechanism&amp;gt;&lt;br /&gt;
         &amp;lt;/mechanisms&amp;gt;&lt;br /&gt;
       &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SASL协商==&lt;br /&gt;
===SASL基础===&lt;br /&gt;
&lt;br /&gt;
XMPP包含了一个某种意义上XMPP特有的简单验证和安全层协议(见[[RFC6120#规范引用|SASL]])用于验证一个流. SASL提供一个一般化的方法来给基于连接的协议添加验证支持, 而XMPP遵照[[RFC6120#规范引用|SASL]]的解析要求来使用SASL的XML命名空间解析. SASL扩展的XML命名空间名称是'urn:ietf:params:xml:ns:xmpp-sasl'.&lt;br /&gt;
&lt;br /&gt;
===支持===&lt;br /&gt;
&lt;br /&gt;
XMPP客户端和服务器必须支持SASL协商.&lt;br /&gt;
&lt;br /&gt;
===流协商规则===&lt;br /&gt;
====强制协商====&lt;br /&gt;
&lt;br /&gt;
一个流双方bxu确认SASL是强制协商的.&lt;br /&gt;
&lt;br /&gt;
====重启====&lt;br /&gt;
&lt;br /&gt;
在SASL协商之后, 双方必须重启该流.&lt;br /&gt;
&lt;br /&gt;
====机制推荐====&lt;br /&gt;
&lt;br /&gt;
任何将要扮演SASL客户端或SASL服务器的实体必须对于该客户端或该服务器维护一个它推荐的SASL机制的有序列表, 这个列表的顺序是根据本地策略或用户配置来的(它的顺序应该是根据验证能力越强排在越靠前). 初始化实体必须独立于接收方实体的推荐顺序来维护它自己的推荐顺序. 客户端必须以它自己的推荐顺序来尝试SASL机制. 例如, 如果服务器提供的顺序列表是&amp;quot;PLAIN SCRAM-SHA-1 GSSAPI&amp;quot; 或 &amp;quot;SCRAM-SHA-1 GSSAPI PLAIN&amp;quot; 而客户端的顺序列表是 &amp;quot;GSSAPI SCRAM-SHA-1&amp;quot;, 客户端必须首先尝试 GSSAPI 然后尝试 SCRAM-SHA-1 而不能(MUST NOT)尝试 PLAIN (因为 PLAIN 不在它的列表中).&lt;br /&gt;
&lt;br /&gt;
====机制提供====&lt;br /&gt;
&lt;br /&gt;
如果接收方实体在它接受特定的SASL机制之前确定[[RFC6120#STARTTLS|TLS协商]]是强制协商, 它不能(MUST NOT)在完成TLS协商之前在它的可用SASL机制列表中声明那个机制.&lt;br /&gt;
&lt;br /&gt;
如果发生以下两种情况，接收方实体应该提供 SASL EXTERNAL 机制，:&lt;br /&gt;
&lt;br /&gt;
:# 当初始化实体在TLS协商中出示了一个证书，这个证书被接收方实体接受了，接收方根据本地服务策略把它用于强身份验证(例如, 因为证书没有过期，没有撤销，并且被锚定到一个接收方实体信任的root账户).&lt;br /&gt;
:# 接收方实体期望初始化实体能够验证和授权这个证书所提供的身份; 在服务器-服务器流的情形下, 接收方实体可能有这样一个预期，因为初始化实体的证书所展示的DNS域名和初始化流头中相应的'from'属性是匹配的, 这里使用[[RFC6120#规范引用|TLS‑CERTS]]的匹配规则; 在客户端-服务器流的情形下, 接收方实体可能有这样一个预期，是因为在初始化实体的证书中展示的纯JID和在这个服务器上注册的一个用户帐号匹配，或者因为其他包含在初始化实体证书中的信息和被允许使用该服务器访问XMPP网络的某个实体相匹配.&lt;br /&gt;
&lt;br /&gt;
无论如何, 接收方实体在其他情况下也一样可以提供 SASL EXTERNAL 机制.&lt;br /&gt;
&lt;br /&gt;
当接收方实体提供 SASL EXTERNAL 机制, 接收方实体应该首先列出它提供的SASL机制的 EXTERNAL 机制列表，而初始化实体应该尝试首先使用EXTERNAL机制来进行SASL协商(这个选择往往会增加双方相互进行证书验证的可能性).&lt;br /&gt;
&lt;br /&gt;
[[RFC6120#强制协商的TLS和SASL技术|13.8]]定义了必须支持的SASL机制; 自然的, 也一样可以支持其他的SASL机制.&lt;br /&gt;
&lt;br /&gt;
:参考文献: 在XMPP的上下文中使用SASL的最佳实践，使用ANONYMOUS机制请参考[[RFC6120#参考文献|XEP‑0175]]，使用EXTERNAL机制请参考[[RFC6120#参考文献|XEP‑0178]].&lt;br /&gt;
&lt;br /&gt;
====数据格式====&lt;br /&gt;
&lt;br /&gt;
以下数据格式规则适用于SASL协商:&lt;br /&gt;
&lt;br /&gt;
:# 当SASL协商时, 实体不能(MUST NOT)在XML元素之间发送任何空格符号(即, 从初始化实体发送的'urn:ietf:params:xml:ns:xmpp-sasl'命名空间限定的&amp;lt;auth/&amp;gt;顶级元素的最后一个字符, 到接收方实体发送的'urn:ietf:params:xml:ns:xmpp-sasl'命名空间限定的&amp;lt;success/&amp;gt;顶级元素的最后一个字符). 这个禁令帮助确保正确的安全层字节精确度. 本文中任何在SASL例子中出现的这类空格只是为了增加可读性.&lt;br /&gt;
:# 任何包含在XML元素中的XML字符串数据必须使用base 64编码, 这里的编码要坚持[[RFC6120#规范引用|BASE64]]第四章的定义,并且填充位设为零.&lt;br /&gt;
:# 作为[[RFC6120#附录A.4|附录A.4]]下的XML schema中正式指定的 'urn:ietf:params:xml:ns:xmpp-sasl' 命名空间, 接收方实体可以在&amp;lt;mechanisms/&amp;gt;元素中包含一个或多个应用特有的子元素来提供初始化实体使用提供的一个或多个机制进行成功的SASL协商而可能需要的信息; 无论如何, 所有这类元素的语法和语义超出了本协议的范围(见[[RFC6120#参考文献|XEP‑0233]]的例子).&lt;br /&gt;
&lt;br /&gt;
====安全层====&lt;br /&gt;
&lt;br /&gt;
涉及安全层协商的SASL协商成功后, 初始化实体和接收方实体都必须丢弃任何应用层状态(即, 来自XMPP层的状态, 不包括来自TLS协商或SASL协商的状态).&lt;br /&gt;
&lt;br /&gt;
====简单用户名====&lt;br /&gt;
&lt;br /&gt;
一些SASL机制(例如, CRAM-MD5, DIGEST-MD5, 和 SCRAM) 指定了在这些机制的上下文中使用的验证身份是一个&amp;quot;简单用户名&amp;quot; (见 [[RFC6120#规范引用|SASL]] 的第二章以及 [[RFC6120#参考文献|SASLPREP]]). 在任何特定的机制或部署中简单用户名的准确格式都是一个本地事务, 并且简单用户名不需要映射到一个应用身份例如JID或JID部件(例如, 本地部分). 无论如何, 在缺乏由服务器提供的本地信息的情况下, 一个XMPP客户端应该假定一个SASL机制的验证身份是等于该用户的JID的本地部分的简单用户名.&lt;br /&gt;
&lt;br /&gt;
====授权身份====&lt;br /&gt;
&lt;br /&gt;
授权身份是一个由初始化实体提供的可选的身份，用来定义它扮演的身份(见[[RFC6120#规范引用|SASL]]第二章). 在客户端-服务器流中, 它大部分被管理员用于代表另一个用户来执行一些管理任务, 而在服务器-服务器流它大部分被用于在XMPP服务上指定一个特定的附加服务(例如, 一个多用户聊天服务器conference.example.com寄宿在example.com的XMPP服务上). 如果初始化实体希望代表另一个实体并且所选择的SASL机制支持授权身份的传输, 该初始化实体必须在SASL协商时提供一个授权身份. 如果初始化实体不希望代表另一个实体的身份, 它不能(MUST NOT)提供授权身份.&lt;br /&gt;
&lt;br /&gt;
在客户端-服务器通讯的情况下, 授权身份的值必须是一个纯JID(&amp;lt;本地部分@域部分&amp;gt;) 而不是一个全JID(&amp;lt;本地部分@域部分/资源部分&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
在服务器-服务器通讯的情况下, 授权身份的值必须且只能是一个域部分(&amp;lt;域部分&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
如果初始化实体在SASL协商时提供一个授权身份, 接收方实体负责验证初始化实体是否事实上被允许承担指定的授权身份; 如果不是, 接收方实体必须返回一个&amp;lt;invalid-authzid/&amp;gt; SASL错误，如 [[RFC6120#invalid-authzid|6.5.6]] 所述.&lt;br /&gt;
&lt;br /&gt;
====领域====&lt;br /&gt;
&lt;br /&gt;
在以特定SASL机制协商的时候接受方实体可以包含一个领域(例如, GSSAPI 和 DIGEST-MD5 机制都允许验证交换的信息中包含领域, 不过其他方式, 如 EXTERNAL, SCRAM, 和 PLAIN 机制不支持这个特性). 如果接受方实体不以一个领域来通讯, 则初始化实体不能(MUST NOT)假定任何领域的存在. 领域必须只被用于验证的目的; 特别是, 初始化实体不能(MUST NOT)尝试从接受方实体提供的领域信息来派生出一个XMPP域部分.&lt;br /&gt;
&lt;br /&gt;
====回合====&lt;br /&gt;
&lt;br /&gt;
[[RFC6120＃规范引用|SASL]] 规定，一个使用中的协议(例如XMPP)可以定义两个方法，这样协议可以节省批准SASL机制的回合:&lt;br /&gt;
&lt;br /&gt;
:# 当SASL客户端(XMPP &amp;quot;初始化实体&amp;quot;) 请求一个验证交换时, 如果使用了适当的SASL机制，它可以在它的请求中包含 &amp;quot;初始化应答&amp;quot; 数据. 在XMPP中, 要实现这一点，就把初始化应答作为XML字符串数据包含在&amp;lt;auth/&amp;gt;元素中.&lt;br /&gt;
:# 在验证交换的结尾, 如果使用了适当的SASL机制，SASL服务器(XMPP &amp;quot;接受方实体&amp;quot;) 可以包含 &amp;quot;成功附带的额外数据&amp;quot;. 在XMPP中, 要实现这一点，就把额外数据作为XML字符串数据包含在&amp;lt;success/&amp;gt;元素中.&lt;br /&gt;
&lt;br /&gt;
为了协议的效率, 要求客户端和服务器必须支持这些方法并且建议使用它们; 无论如何, 客户端和服务器也必须支持低效的模式.&lt;br /&gt;
&lt;br /&gt;
===过程===&lt;br /&gt;
&lt;br /&gt;
SASL协商过程如下. &lt;br /&gt;
&lt;br /&gt;
====流头和流特性交换====&lt;br /&gt;
&lt;br /&gt;
如果SASL协商紧跟在成功的[[RFC6120#STARTTLS协商|STARTTLS协商]]之后, 那么SASL协商发生在已经协商过的受保护的流上. 否则, 初始化实体如[[RFC6120#TCP绑定|第三章]]所述解析接受方实体的完整域名(FQDN), 打开一个到已解析的IP地址的已声明的端口的TCP连接, 并发送一个初始化流头给接受方实体. 在两种情况下, 接受方实体都将从初始化实体接收到一个初始化流.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;stream:stream&lt;br /&gt;
     from='juliet@im.example.com'&lt;br /&gt;
     to='im.example.com'&lt;br /&gt;
     version='1.0'&lt;br /&gt;
     xml:lang='en'&lt;br /&gt;
     xmlns='jabber:client'&lt;br /&gt;
     xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当接受方实体处理来自初始化实体的初始化流的时候, 它必须发送一个应答流头给初始化实体(为此它必须生成一个唯一的流ID. 如果TLS协商已经成功, 那么这个流ID必须不同于TLS协商成功之前发送的那个流ID).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:stream&lt;br /&gt;
     from='im.example.com'&lt;br /&gt;
     id='vgKi/bkYME8OAj4rlXMkpucAqe4='&lt;br /&gt;
     to='juliet@im.example.com'&lt;br /&gt;
     version='1.0'&lt;br /&gt;
     xml:lang='en'&lt;br /&gt;
     xmlns='jabber:client'&lt;br /&gt;
     xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接受方实体也必须发送流特性给初始化实体. 流特性应该包含一个声明用来支持SASL协商, 即, 一个由'urn:ietf:params:xml:ns:xmpp-sasl'命名空间限定的&amp;lt;mechanisms/&amp;gt;元素. 典型的，只有三种情况下对SASL协商的支持不需要在这里声明:&lt;br /&gt;
&lt;br /&gt;
:* TLS协商需要在提供SASL之前发生(即, TLS是必需的并且接受方实体已经在接收到的这次连接尝试的初次的初始化流头中应答过了).&lt;br /&gt;
:* SASL协商不可能发生在一个 服务器-服务器 连接中(即, 初始化服务器未提供一个证书以进行验证并且因而接受方实体回滚到使用服务器回拨协议[[RFC6120#参考文献|XEP‑0220]]进行弱身份验证).&lt;br /&gt;
:* SASL已经协商过了(即, 接受方实体在成功进行SASL协商之后应答一个以流重启的方式发送的初始化流头).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;mechanisms/&amp;gt;元素必须为接受方实体提供给初始化实体的每个验证机制包含一个&amp;lt;mechanism/&amp;gt;子元素. 大家知道, 在XML中的&amp;lt;mechanism/&amp;gt;元素的顺序表示来自接受方实体的SASL机制的优先顺序(它不一定是来自初始化实体的优先顺序).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
       &amp;lt;mechanism&amp;gt;EXTERNAL&amp;lt;/mechanism&amp;gt;&lt;br /&gt;
       &amp;lt;mechanism&amp;gt;SCRAM-SHA-1-PLUS&amp;lt;/mechanism&amp;gt;&lt;br /&gt;
       &amp;lt;mechanism&amp;gt;SCRAM-SHA-1&amp;lt;/mechanism&amp;gt;&lt;br /&gt;
       &amp;lt;mechanism&amp;gt;PLAIN&amp;lt;/mechanism&amp;gt;&lt;br /&gt;
     &amp;lt;/mechanisms&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====初始化====&lt;br /&gt;
&lt;br /&gt;
为了开始SASL协商, 初始化实体发送一个由'urn:ietf:params:xml:ns:xmpp-sasl'命名空间限定的&amp;lt;auth/&amp;gt;元素并在'mechanism'属性包含一个适当的值, 从而开始使用特定的验证机制进行握手. 这个元素可以包含XML字符串数据(用SASL术语来说, 就是&amp;quot;初始化应答&amp;quot;)，如果这个机制支持或必须要它的话. 如果初始化实体需要发送一个长度为零的初始化应答, 它必须以单个等号字符(&amp;quot;=&amp;quot;)来传输这个应答, 这表示那个应答是当前的但是不包含数据.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&lt;br /&gt;
         mechanism='PLAIN'&amp;gt;AGp1bGlldAByMG0zMG15cjBtMzA=&amp;lt;/auth&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果初始化实体后来发送另一个&amp;lt;auth/&amp;gt;元素而正在进行的验证握手还没完成, 接收方实体必须丢弃正在进行的握手而必须为后来请求的SASL机制处理新的握手.&lt;br /&gt;
&lt;br /&gt;
====挑战-应答序列====&lt;br /&gt;
&lt;br /&gt;
如果必要, 接收方实体通过发送一个由'urn:ietf:params:xml:ns:xmpp-sasl'命名空间限定的&amp;lt;challenge/&amp;gt;元素来挑战初始化实体; 这个元素可以包含XML字符串数据(它必须根据被初始化实体选择的SASL机制的定义来生成).&lt;br /&gt;
&lt;br /&gt;
初始化实体通过发送一个由'urn:ietf:params:xml:ns:xmpp-sasl'命名空间限定的&amp;lt;response/&amp;gt;元素来应答这个挑战; 这个元素可以包含XML字符串数据(它必须根据被初始化实体选择的SASL机制的定义来生成).&lt;br /&gt;
&lt;br /&gt;
如果必要y, 接收方实体发送更多挑战而初始化实体发送更多应答.&lt;br /&gt;
&lt;br /&gt;
这一系列的 挑战/应答 对 一直持续直到发生以下三件事情之一:&lt;br /&gt;
&lt;br /&gt;
:* 初始化实体退出这个验证机制的握手.&lt;br /&gt;
:* 接收方实体报告握手失败.&lt;br /&gt;
:* 接收方实体报告握手成功.&lt;br /&gt;
&lt;br /&gt;
这些场景具体描述在接下来的章节.&lt;br /&gt;
&lt;br /&gt;
====放弃====&lt;br /&gt;
&lt;br /&gt;
初始化实体通过发送一个由'urn:ietf:params:xml:ns:xmpp-sasl'命名空间限定的&amp;lt;abort/&amp;gt;元素放弃为这个验证机制所做的握手.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;abort xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在接收到一个&amp;lt;abort/&amp;gt;元素之后, 接收方实体必须返回一个由'urn:ietf:params:xml:ns:xmpp-sasl'命名空间限定的&amp;lt;failure/&amp;gt;元素并在其中包含一个&amp;lt;aborted/&amp;gt;子元素.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     &amp;lt;aborted/&amp;gt;&lt;br /&gt;
   &amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====SASL失败====&lt;br /&gt;
&lt;br /&gt;
接收方实体通过发送一个由'urn:ietf:params:xml:ns:xmpp-sasl'命名空间限定的&amp;lt;failure/&amp;gt;元素来汇报这个验证机制握手失败(特定的失败原因必须放进&amp;lt;failure/&amp;gt;元素的适当子元素，如 [[RFC6120#SASL定义|6.5]]定义的).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     &amp;lt;not-authorized/&amp;gt;&lt;br /&gt;
   &amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
为了选择适当的SASL机制, 接收方实体应该允许一个可配置的但是合理的重试次数(至少2次但不超过5次); 这让初始化实体能(例如, 一个终端用户客户端)容忍不正确的凭证(例如, 一个输错的密码)而不要强制重新连接(如果接收方实体立刻返回SASL失败并关闭流).&lt;br /&gt;
&lt;br /&gt;
如果初始化实体对同一个SASL机制尝试了合理的重试次数并且都失败了, 它可以回滚到顺序列表中的下一个机制，只要发送一个新的&amp;lt;auth/&amp;gt;请求给接收方实体, 从而开始那个机制的新的握手. 如果所有握手都失败了并且在初始化实体支持和可接受的机制列表里没有剩余的机制了, 初始化实体应该简单地关闭这个流，如[[RFC6120#关闭流|4.4]]所述(而不是等待这个流超时).&lt;br /&gt;
&lt;br /&gt;
如果初始化实体超出了重试次数, 接收方实体必须以一个流错误关闭流, 它应该是&amp;lt;policy-violation/&amp;gt;([[RFC6120#policy-violation|4.9.3.14]]), 不过一些现有的实现发送的是&amp;lt;not-authorized/&amp;gt;([[RFC6120#not-authorized|4.9.3.12]]).&lt;br /&gt;
&lt;br /&gt;
:实现备注: 对于 服务器-服务器 流, 如果接收方实体不能提供SASL EXTERNAL机制或其他基于TLS协商期间简历的安全上下文的SASL机制, 接收方实体可以尝试使用服务器回拨协议[[RFC6120#参考文献|XEP‑0220]]来完成弱身份验证; 无论如何, 如果根据本地策略弱身份验证不足够的话，那么接收方实体应该以&amp;lt;policy-violation/&amp;gt;流错误([[RFC6120#policy-violation|4.9.3.14]])关闭这个流而不是等待这个流超时.&lt;br /&gt;
&lt;br /&gt;
====SASL成功====&lt;br /&gt;
&lt;br /&gt;
在确定SASL握手成功之前, 如果初始化实体在一个其保密和诚信得到TLS或同等的安全层(例如SASL GSSAPI机制)保护的初始化流头提供了一个'from'属性，那么接收方实体应该把这个验证身份结果关联到来自SASL协商的'from'地址; 如果这两个身份不匹配，那么接收方实体应该终止连接尝试(然而, 接收方实体可以有合法的理由不终止这个连接尝试, 例如, 因为它覆盖了一个连接的客户端的地址来纠正JID格式或根据终端用户的证书授予一个JID).&lt;br /&gt;
&lt;br /&gt;
接收方实体通过发送一个由'urn:ietf:params:xml:ns:xmpp-sasl'命名空间限定的&amp;lt;success/&amp;gt;元素来汇报握手成功; 这个元素可以包含XML字符串数据(在SASL 属于中, 是&amp;quot;成功的附加数据&amp;quot;), 如果选择的SASL机制支持或者要求它. 如果接收方实体需要发送零长度的附加数据, 它必须传送一个单独的等号字符(&amp;quot;=&amp;quot;)数据.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:参考文献: 对于 客户端-服务器 流, 在SASL协商时通讯的授权身份是用来根据接收方服务器为初始化客户端确定的权威地址, 如[[RFC6120#确定地址|4.3.6]]所述.&lt;br /&gt;
&lt;br /&gt;
一旦接收到&amp;lt;success/&amp;gt;元素, 初始化实体必须在现有的TCP连接上发送一个新的初始化流头到接收方实体来初始化一个新的流(如[[RFC6120#重启|4.3.3]]所述, 在发送新的初始化流头之前,初始化实体不能(MUST NOT)发送一个关闭&amp;lt;/stream&amp;gt;标签, 因为接收方实体和初始化实体必须确定原始的流被替换成SASL协商成功之后的流).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;stream:stream&lt;br /&gt;
     from='juliet@im.example.com'&lt;br /&gt;
     to='im.example.com'&lt;br /&gt;
     version='1.0'&lt;br /&gt;
     xml:lang='en'&lt;br /&gt;
     xmlns='jabber:client'&lt;br /&gt;
     xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一旦从初始化实体接收到新的初始化流头, 接收方实体必须发送一个新的流头给初始化实体来应答(为此它必须生成一个新的流ID而不是重用旧的流ID).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:stream&lt;br /&gt;
     from='im.example.com'&lt;br /&gt;
     id='gPybzaOzBmaADgxKXu9UClbprp0='&lt;br /&gt;
     to='juliet@im.example.com'&lt;br /&gt;
     version='1.0'&lt;br /&gt;
     xml:lang='en'&lt;br /&gt;
     xmlns='jabber:client'&lt;br /&gt;
     xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接收方实体也必须发送流特性, 包含任何更多的可用特性或不包含特性(通过一个空的&amp;lt;features/&amp;gt;元素).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SASL错误===&lt;br /&gt;
&lt;br /&gt;
SASL错误的语法如下, 那些用方括号 '[' 和 ']' 括起来的XML数据是可选的.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
  &amp;lt;defined-condition/&amp;gt;&lt;br /&gt;
  [&amp;lt;text xml:lang='langcode'&amp;gt;&lt;br /&gt;
      OPTIONAL descriptive text&lt;br /&gt;
  &amp;lt;/text&amp;gt;]&lt;br /&gt;
&amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;defined-condition&amp;quot; 必须是在接下来的章节里的定义的SASL相关的错误条件之一. 然而, 因为将来可能定义额外的错误条件, 如果一个实体收到一个它不理解的SASL错误条件，那么它必须把这个未知的条件视为一个通用的验证错误, 即, 等同于 &amp;lt;not-authorized/&amp;gt; ([[RFC6120#not-authorized|6.5.10]]).&lt;br /&gt;
&lt;br /&gt;
内含的&amp;lt;text/&amp;gt;元素是可选的, 并且可被用于提供关于这个错误条件的应用特有的信息, 这个信息可以显示给人看但只是作为已定义的条件的补充.&lt;br /&gt;
&lt;br /&gt;
因为XMPP本身定义了一个SASL应用范本并且不期望有更多专门的XMPP应用建立在SASL之上, 所以SASL错误格式不会像在XML流([[RFC6120#应用特有的条件|4.9.4]])和XML节([[RFC6120#应用特有条件|8.3.4]])的做法一样，为应用特有的错误提供扩展性.&lt;br /&gt;
&lt;br /&gt;
====aborted====&lt;br /&gt;
&lt;br /&gt;
接收方实体确认验证握手已经被初始化实体放弃; 对&amp;lt;abort/&amp;gt;元素发送应答.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;abort xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     &amp;lt;aborted/&amp;gt;&lt;br /&gt;
   &amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====account-disabled====&lt;br /&gt;
&lt;br /&gt;
初始化实体的帐号已经被暂时禁用; 对&amp;lt;auth/&amp;gt;元素或&amp;lt;response/&amp;gt;元素发送应答(可以包含或不包含初始化应答数据).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&lt;br /&gt;
         mechanism='PLAIN'&amp;gt;AGp1bGlldAByMG0zMG15cjBtMzA=&amp;lt;/auth&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     &amp;lt;account-disabled/&amp;gt;&lt;br /&gt;
     &amp;lt;text xml:lang='en'&amp;gt;Call 212-555-1212 for assistance.&amp;lt;/text&amp;gt;&lt;br /&gt;
   &amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====credentials-expired====&lt;br /&gt;
&lt;br /&gt;
因为初始化实体提供的证书过期而验证失败; 对&amp;lt;response/&amp;gt;元素或&amp;lt;auth/&amp;gt;元素发送包含初始化应答数据的应答.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     [ ... ]&lt;br /&gt;
   &amp;lt;/response&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     &amp;lt;credentials-expired/&amp;gt;&lt;br /&gt;
   &amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====encryption-required====&lt;br /&gt;
&lt;br /&gt;
初始化实体请求的机制不能使用，出非当前的流的保密性和完整性收到保护(典型的是通过TLS); 对&amp;lt;auth/&amp;gt;元素发送应答(包含或不包含初始化应答数据).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&lt;br /&gt;
         mechanism='PLAIN'&amp;gt;AGp1bGlldAByMG0zMG15cjBtMzA=&amp;lt;/auth&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     &amp;lt;encryption-required/&amp;gt;&lt;br /&gt;
   &amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====incorrect-encoding====&lt;br /&gt;
&lt;br /&gt;
初始化实体提供的数据无法被处理，因为 base 64 编码不正确(例如, 因为编码没有遵循[[RFC6120#规范引用|BASE64]]的第四章的定义); 对&amp;lt;response/&amp;gt;元素或&amp;lt;auth/&amp;gt;元素发送包含初始化应答数据的应答.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&lt;br /&gt;
         mechanism='DIGEST-MD5'&amp;gt;[ ... ]&amp;lt;/auth&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     &amp;lt;incorrect-encoding/&amp;gt;&lt;br /&gt;
   &amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====invalid-authzid====&lt;br /&gt;
&lt;br /&gt;
初始化实体提供的authzid是非法的, 要么因为它格式不正确要么因为初始化实体没有权限授权那个ID; 对&amp;lt;response/&amp;gt;元素或&amp;lt;auth/&amp;gt;元素发送包含初始化应答数据的应答.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     [ ... ]&lt;br /&gt;
   &amp;lt;/response&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     &amp;lt;invalid-authzid/&amp;gt;&lt;br /&gt;
   &amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====invalid-mechanism====&lt;br /&gt;
&lt;br /&gt;
初始化实体没有指定一个机制, 或请求的机制不被接收方实体支持; 对&amp;lt;auth/&amp;gt;元素发送应答.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&lt;br /&gt;
         mechanism='CRAM-MD5'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     &amp;lt;invalid-mechanism/&amp;gt;&lt;br /&gt;
   &amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====malformed-request====&lt;br /&gt;
&lt;br /&gt;
请求是不良的(例如, &amp;lt;auth/&amp;gt;元素包含了初始化应答数据但是机制不允许这个, 或被发送的数据违反了指定的SASL机制的语法); 对&amp;lt;abort/&amp;gt;, &amp;lt;auth/&amp;gt;, &amp;lt;challenge/&amp;gt;, 或 &amp;lt;response/&amp;gt; 元素发送应答.&lt;br /&gt;
&lt;br /&gt;
(下例中, &amp;lt;auth/&amp;gt;元素的XML字符串数据包含了多于255个UTF-8编码的Unicode字符，所以违反了定义于[[RFC6120#参考文献|ANONYMOUS]]的SASL ANONYMOUS的&amp;quot;token&amp;quot;生产.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&lt;br /&gt;
         mechanism='ANONYMOUS'&amp;gt;[ ... some-long-token ... ]&amp;lt;/auth&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     &amp;lt;malformed-request/&amp;gt;&lt;br /&gt;
   &amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mechanism-too-weak====&lt;br /&gt;
&lt;br /&gt;
初始化实体请求的机制弱于服务器策略允许初始化实体使用的机制; 对&amp;lt;auth/&amp;gt;元素发送应答(包含或不包含初始化应答数据).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&lt;br /&gt;
         mechanism='PLAIN'&amp;gt;AGp1bGlldAByMG0zMG15cjBtMzA=&amp;lt;/auth&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     &amp;lt;mechanism-too-weak/&amp;gt;&lt;br /&gt;
   &amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====not-authorized====&lt;br /&gt;
&lt;br /&gt;
验证失败，因为初始化实体没有提供正确的证书, 或因为发生了一些普通的验证失败而接收方实体不希望泄露失败原因的特定信息; 对&amp;lt;response/&amp;gt;元素或&amp;lt;auth/&amp;gt;元素发送包含初始化应答数据的应答.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     [ ... ]&lt;br /&gt;
   &amp;lt;/response&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     &amp;lt;not-authorized/&amp;gt;&lt;br /&gt;
   &amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:安全警告: 这个错误条件包含但不限于不正确的证书或不存在的用户名的情形. 为了组织目录获取攻击, 不正确的证书和不存在的用户名两者没有区别.&lt;br /&gt;
&lt;br /&gt;
====temporary-auth-failure====&lt;br /&gt;
&lt;br /&gt;
验证失败，因为接收方实体的临时性错误, 可以建议初始化实体晚点再试; 对&amp;lt;auth/&amp;gt;元素或&amp;lt;response/&amp;gt;元素发送应答.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     [ ... ]&lt;br /&gt;
   &amp;lt;/response&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     &amp;lt;temporary-auth-failure/&amp;gt;&lt;br /&gt;
   &amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SASL定义===&lt;br /&gt;
&lt;br /&gt;
[[RFC6120#规范引用|SASL]]的范本需求里面要求使用中的协议定义必须提供以下信息.&lt;br /&gt;
&lt;br /&gt;
:服务名:&lt;br /&gt;
::&amp;quot;xmpp&amp;quot; &lt;br /&gt;
:初始化序列:&lt;br /&gt;
::在初始化实体提供一个打开的XML流头之后，接收方实体以同样的方式应答, 接收方实体提供一个可接受的验证方法的列表. 初始化实体从列表里选择一个方法并在放在&amp;lt;auth/&amp;gt;元素的'mechanism'属性的值里发送给接收方实体, 可选择包含一个初始化应答以避免多一个来回. &lt;br /&gt;
:交换序列:&lt;br /&gt;
::挑战和应答是通过从接收方实体发给初始化实体的&amp;lt;challenge/&amp;gt;元素和从初始化实体发送给接收方实体的&amp;lt;response/&amp;gt;元素. 接收方实体通过发送&amp;lt;failure/&amp;gt;元素来报告失败，通过发送&amp;lt;success/&amp;gt;元素来报告成功; 初始化实体通过发送&amp;lt;abort/&amp;gt;元素来放弃交换. 在成功协商之后, 双方确认原始的XML流被关闭而双方发送新的流头. &lt;br /&gt;
:安全层协商:&lt;br /&gt;
::安全层，对于接收方实体来说，发送完&amp;lt;success/&amp;gt;元素的'&amp;gt;'字符之后立刻生效, 对于初始化实体来说，在接收到&amp;lt;success/&amp;gt;元素的'&amp;gt;'字符之后立刻生效. 层的顺序是先 [[RFC6120#规范引用|TCP]], then [[RFC6120#规范引用|TLS]], then [[RFC6120#规范引用|SASL]], 然后 XMPP. &lt;br /&gt;
:授权身份的使用:&lt;br /&gt;
::授权身份在XMPP中可被用于指示客户端的非缺省的&amp;lt;localpart@domainpart&amp;gt;; 空字符串等于缺少授权身份.&lt;br /&gt;
&lt;br /&gt;
==资源绑定==&lt;br /&gt;
===原理===&lt;br /&gt;
&lt;br /&gt;
在客户端从一个服务器验证之后, 它必须绑定一个特定的资源到这个流，这样服务器才能正确地对客户端寻址. 就是说, 必须有一个XMPP资源关联到客户端的纯JID (&amp;lt;localpart@domainpart&amp;gt;), 所以在那个流上使用的地址是一个全JID，格式为&amp;lt;localpart@domainpart/resource&amp;gt; (包含资源部分). 这确保服务器可以向客户端相关的实体而不是服务器本身或客户端的帐号递送XML节和从客户端相关的实体而不是服务器本身或客户端的帐号接收XML节, 详见 [[RFC6120#服务器处理XML节的规则|第十章]].&lt;br /&gt;
&lt;br /&gt;
:参考文献: 在绑定资源之前，客户端可以和服务器本身或客户端帐号交换数据，因为全JID只在被这个客户端和服务器之间已协商好的流的上下文的外部寻址时需要用到, 但这不是常规做法.&lt;br /&gt;
&lt;br /&gt;
在客户端已经绑定了一个资源到该流之后, 它被视为一个 &amp;quot;已连接的资源&amp;quot;. 服务器应该允许一个实体同时维持多个已连接资源, 每个已连接的资源关联到一个唯一的XML流并且和其他已连接的资源的资源部分是不同的.&lt;br /&gt;
&lt;br /&gt;
:安全警告: 服务器应该允许一个XMPP服务的管理员限制已连接资源的数量，为了防止特定的拒绝服务攻击，详见[[RFC6120#拒绝服务|13.12]].&lt;br /&gt;
&lt;br /&gt;
如果, 在完成资源绑定步骤之前, 客户端尝试发送一个XML节给另一个不是服务器本身或客户端的帐号的实体, 服务器不能(MUST NOT)处理这个节而必须以&amp;lt;not-authorized/&amp;gt;流错误([[RFC6120#not-authorized|4.9.3.12]])关闭这个流.&lt;br /&gt;
&lt;br /&gt;
资源绑定扩展的XML命名空间是 'urn:ietf:params:xml:ns:xmpp-bind'.&lt;br /&gt;
&lt;br /&gt;
===支持===&lt;br /&gt;
&lt;br /&gt;
在XMPP客户端和服务器实现中，对于资源绑定的支持是必需的.&lt;br /&gt;
&lt;br /&gt;
===流协商规则===&lt;br /&gt;
====强制协商====&lt;br /&gt;
&lt;br /&gt;
流的双方必须确保资源绑定是强制协商的.&lt;br /&gt;
&lt;br /&gt;
====重启====&lt;br /&gt;
&lt;br /&gt;
在资源绑定之后, 双方不能(MUST NOT)重启该流.&lt;br /&gt;
&lt;br /&gt;
===声明支持===&lt;br /&gt;
&lt;br /&gt;
在SASL协商成功之后，服务器发送一个新的应答流头给客户端, 这时服务器必须在它展示给客户端的流特性中包含一个由'urn:ietf:params:xml:ns:xmpp-bind'命名空间限定的&amp;lt;bind/&amp;gt;元素.&lt;br /&gt;
&lt;br /&gt;
服务器不能(MUST NOT)包含资源绑定流特性，直到客户端验证之后, 通常就是SASL协商成功之后.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='gPybzaOzBmaADgxKXu9UClbprp0='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在得到资源绑定是强制协商的通知之后, 客户端必须绑定一个资源到流上，如下面章节所述.&lt;br /&gt;
&lt;br /&gt;
===资源标识符的生成===&lt;br /&gt;
&lt;br /&gt;
最低限度，资源部分在&amp;lt;localpart@domainpart&amp;gt;已连接的资源中必须是唯一的. 这个强制性策略是由服务器来负责的.&lt;br /&gt;
&lt;br /&gt;
:安全警告: 资源部分可能是关乎安全的. 例如, 如果一个恶意的实体猜测一个客户端的资源部分然后它能确定该客户端(也就是控制的主体)是在线还是离线, 所以导致如[[RFC6120#连击状态信息|13.10.2]]所述的联机状态泄漏. 为了防止那种可能性, 客户端可以要么 (1) 它自己生成一个随机的资源部分，要么(2) 请求服务器帮它生成一个资源部分. 一个确保资源部分随机性的方法是生成一个通用唯一标识符(UUID)，如 [[RFC6120#参考文献|UUID]] 所述.&lt;br /&gt;
&lt;br /&gt;
===服务器生成的资源标识符===&lt;br /&gt;
&lt;br /&gt;
一个服务器必须能代替客户端生成XMPP资源部分. 由服务器生成的资源部分必须是随机的(参见 [[RFC6120#规范引用|RANDOM]]). &lt;br /&gt;
&lt;br /&gt;
====成功情形====&lt;br /&gt;
&lt;br /&gt;
客户端，通过发送一个类型为&amp;quot;set&amp;quot;并包含了一个由'urn:ietf:params:xml:ns:xmpp-bind'命名空间限定的空的&amp;lt;bind/&amp;gt;元素的IQ节(见[[RFC6120#IQ语义|8.2.3]])来请求一个服务器生成的资源部分.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;iq id='tn281v37' type='set'&amp;gt;&lt;br /&gt;
    &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一旦服务器为该客户端生成了一个XMPP部分, 它必须返回一个类型为&amp;quot;result&amp;quot;的IQ节给该客户端, 这个节里面必须包含一个&amp;lt;jid/&amp;gt;元素来指定服务器决定的已连接资源的全JID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;iq id='tn281v37' type='result'&amp;gt;&lt;br /&gt;
    &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'&amp;gt;&lt;br /&gt;
      &amp;lt;jid&amp;gt;&lt;br /&gt;
        juliet@im.example.com/4db06f06-1ea4-11dc-aca3-000bcd821bfb&lt;br /&gt;
      &amp;lt;/jid&amp;gt;&lt;br /&gt;
    &amp;lt;/bind&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====错误情形====&lt;br /&gt;
&lt;br /&gt;
当一个客户端在资源绑定时请求服务器生成一个资源部分, 定义了以下节错误条件:&lt;br /&gt;
&lt;br /&gt;
:* 该帐号已经达到了被允许的并发资源连接数量限制.&lt;br /&gt;
:* 该客户端不被允许绑定一个资源到该流.&lt;br /&gt;
&lt;br /&gt;
自然的, 可能有这里没定义的错误条件发生, 如[[RFC6120#节错误|8.3]]所述. &lt;br /&gt;
&lt;br /&gt;
=====资源约束=====&lt;br /&gt;
&lt;br /&gt;
如果帐号已经达到被允许的并发连接资源数限制, 服务器必须返回一个&amp;lt;resource-constraint/&amp;gt;节错误([[RFC6120#resource-constraint|8.3.3.18]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;iq id='tn281v37' type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='wait'&amp;gt;&lt;br /&gt;
       &amp;lt;resource-constraint&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====不允许=====&lt;br /&gt;
&lt;br /&gt;
如果客户端不被允许绑定一个资源到该流, 服务器必须返回一个&amp;lt;not-allowed/&amp;gt;节错误([[RFC6120#not-allowed|8.3.3.10]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;iq id='tn281v37' type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;not-allowed&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===客户端提交的资源标识符===&lt;br /&gt;
&lt;br /&gt;
不同于请求服务器代替自己生成一个资源部分, 一个客户端可以尝试提交一个它自己生成的或受控制的用户已经提供的资源部分. &lt;br /&gt;
&lt;br /&gt;
====成功情形====&lt;br /&gt;
&lt;br /&gt;
客户端发送类型为&amp;quot;set&amp;quot;包含&amp;lt;bind/&amp;gt;元素以及拥有非空XML字符串数据的&amp;lt;resource/&amp;gt;子元素的IQ节，以请求它的服务器接受一个客户端提交的资源部分.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;iq id='wy2xa82b4' type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'&amp;gt;&lt;br /&gt;
       &amp;lt;resource&amp;gt;balcony&amp;lt;/resource&amp;gt;&lt;br /&gt;
     &amp;lt;/bind&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
该服务器应该接受这个客户端提交的资源部分. 它返回一个类型为&amp;quot;result&amp;quot;的IQ节给该客户端, 其中包含一个&amp;lt;jid/&amp;gt;子元素来为已连接的资源指定全JID并包含未修改的客户端提交的文本.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;iq id='wy2xa82b4' type='result'&amp;gt;&lt;br /&gt;
    &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'&amp;gt;&lt;br /&gt;
      &amp;lt;jid&amp;gt;juliet@im.example.com/balcony&amp;lt;/jid&amp;gt;&lt;br /&gt;
    &amp;lt;/bind&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
或者, 基于本地服务策略，该服务器可以拒绝客户端提交的资源部分并以服务器生成的资源部分覆盖它.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;iq id='wy2xa82b4' type='result'&amp;gt;&lt;br /&gt;
    &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'&amp;gt;&lt;br /&gt;
      &amp;lt;jid&amp;gt;&lt;br /&gt;
   juliet@im.example.com/balcony 4db06f06-1ea4-11dc-aca3-000bcd821bfb&lt;br /&gt;
      &amp;lt;/jid&amp;gt;&lt;br /&gt;
    &amp;lt;/bind&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====错误情形====&lt;br /&gt;
&lt;br /&gt;
当一个客户端在资源绑定期间尝试提交它自己的XMPP资源部分, 除了[[RFC6120#错误条件|7.6.2]]还定义了以下节错误条件:&lt;br /&gt;
&lt;br /&gt;
:* 所提供的资源部分无法被服务器处理.&lt;br /&gt;
:* 所提供的资源部分已经被使用.&lt;br /&gt;
&lt;br /&gt;
自然的, 有一些未在这里定义的错误条件可能发生, 如[[RFC6120#节错误|8.3]]所述. &lt;br /&gt;
&lt;br /&gt;
=====坏请求=====&lt;br /&gt;
&lt;br /&gt;
如果提供的资源部分无法被服务器处理(例如, 因为它长度为零或因为它违反了定义于[[RFC6120#规范引用|XMPP‑ADDR]]的资源部分的其他规则 ), 该服务器可能返回一个&amp;lt;bad-request/&amp;gt;节错误([[RFC6120#bad-request|8.3.3.1]])而不应该处理这个资源部分，这样就保持了一致性.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;iq id='wy2xa82b4' type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
       &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====冲突=====&lt;br /&gt;
&lt;br /&gt;
如果当前有一个已连接的客户端的会话被新连接的客户端请求了, 服务器必须做以下事情之一(该服务器做的这些事情之一对于实现或者本地服务策略是一个麻烦, 尽管下面提供了一些建议).&lt;br /&gt;
&lt;br /&gt;
:# 以一个服务器生成的资源部分覆盖新连接的客户端提供的资源部分. 这一行为是被提倡的, 因为对于客户端实现来说它简化了资源绑定过程.&lt;br /&gt;
:# 不允许新连接的客户端的资源绑定并保持当前已连接客户端的会话. 这一行为既不提倡也不反对, 尽管实际上它在RFC 3920中被隐性地提倡; 然而, 请注意对&amp;lt;conflict/&amp;gt;错误的处理并不总是被现有的客户端实现支持的, 它经常被当成一个验证错误并且当收到这个错误的时候丢弃缓存的凭证.&lt;br /&gt;
:# 中止当前已连接的客户端的会话并允许新连接的客户端的资源绑定尝试. 尽管这是早期XMPP服务器实现的传统行为, 现在不提倡这么做了，因为它可能导致两个客户端互相挂掉多方的无线循环; 无论如何, 注意这个行为在某些布署场景中可能是适当的，要么如果服务器知道当前已连接的客户端有一个死连接，要么有一个[[RFC6120#静默对端的处理|4.6]]所述的断裂的流.&lt;br /&gt;
&lt;br /&gt;
如果服务器遵循1号行为, 它返回一个类型为&amp;quot;result&amp;quot;的&amp;lt;iq/&amp;gt;节给新连接的客户端, 这里的&amp;lt;bind/&amp;gt;元素的&amp;lt;jid/&amp;gt;子元素包含XML字符串数据指定该客户端的全JID, 包含服务器生成的资源部分.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;iq id='wy2xa82b4' type='result'&amp;gt;&lt;br /&gt;
    &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'&amp;gt;&lt;br /&gt;
      &amp;lt;jid&amp;gt;&lt;br /&gt;
   juliet@im.example.com/balcony 4db06f06-1ea4-11dc-aca3-000bcd821bfb&lt;br /&gt;
      &amp;lt;/jid&amp;gt;&lt;br /&gt;
    &amp;lt;/bind&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果服务器遵循2号行为, 它发送一个&amp;lt;conflict/&amp;gt;节错误([[RFC6120#conflict|8.3.3.2]])应答新连接的客户端的资源绑定尝试但是保持这个XML流，这样新连接的客户端有机会去协商一个不冲突的资源部分(即, 新连接的客户端在做下一次绑定资源的尝试之前需要选择一个不同的资源部分).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;iq id='wy2xa82b4' type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
       &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果服务器遵循3号行为, 它返回一个&amp;lt;conflict/&amp;gt;流错误([[RFC6120#conflict|4.9.3.3]])给当前的已连接客户端(如[[RFC6120#conflict|4.9.3.3]]所述)并返回一个类型为&amp;quot;result&amp;quot;的IQ节(表示成功)新连接的应答资源绑定尝试.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;iq id='wy2xa82b4' type='result'&amp;gt;&lt;br /&gt;
     &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'&amp;gt;&lt;br /&gt;
       &amp;lt;jid&amp;gt;&lt;br /&gt;
         juliet@im.example.com/balcony&lt;br /&gt;
       &amp;lt;/jid&amp;gt;&lt;br /&gt;
     &amp;lt;/bind&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====重试====&lt;br /&gt;
&lt;br /&gt;
如果客户端提交资源部分的时候发生了一个错误, 服务器应该允许可配置的但是合理的重试次数(至少5次且不高于10次); 这让客户端能够不需要被迫重新连接就可以纠正不正确提通的资源部分(例如, 坏的数据格式或重复的文本字符串).&lt;br /&gt;
&lt;br /&gt;
在客户端达到重试次数限制之后, 服务器必须以&amp;lt;policy-violation/&amp;gt;流错误([[RFC6120#policy-violation|4.9.3.14]])关闭这个流.&lt;br /&gt;
&lt;br /&gt;
==XML节==&lt;br /&gt;
&lt;br /&gt;
在一个客户端和一个服务器(或两个服务器)完成了流协商之后, 双方就可以发送XML节了. 对于'jabber:client'和'jabber:server'命名空间定义了三种XML节: &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 和 &amp;lt;iq/&amp;gt;. 另外, 这些节类型有五种常见属性. 这些常见属性, 以及这三种节类型的基本语义, 定义于本协议; 更多即时消息和联机状态应用相关以及有关XMPP扩展协议的应用的XML节语法的详细信息在[[RFC6120#常规应用|XMPP‑IM]]里提供.&lt;br /&gt;
&lt;br /&gt;
XMPP客户端和服务器实现必须支持本协议所定义的XML节语法和语义.&lt;br /&gt;
&lt;br /&gt;
:安全警告: 服务器不能(MUST NOT)处理部分的节，也不能(MUST NOT)针对一个节的任何部分仍在传输时(在承认收到关闭标签之前)猜测其含义.&lt;br /&gt;
&lt;br /&gt;
===常见属性===&lt;br /&gt;
&lt;br /&gt;
以下五种属性常见于 message, presence, 和 IQ 节. &lt;br /&gt;
&lt;br /&gt;
====to====&lt;br /&gt;
&lt;br /&gt;
'to'属性指定该节期望的接收者的JID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message to='romeo@example.net'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Art thou not Romeo, and a Montague?&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
关于基于'to'地址的入站和出站XML节的服务器处理的信息, 参考[[RFC6120#处理XML节的服务器规则|第十章]]. &lt;br /&gt;
&lt;br /&gt;
=====客户端-服务器流=====&lt;br /&gt;
&lt;br /&gt;
以下规则适用于已连接客户端通过一个'jabber:client'命名空间限定的XML流发送给它的服务器的节中包含的'to'属性.&lt;br /&gt;
&lt;br /&gt;
:# 一个拥有特定接收者(例如, 一个会话伙伴, 一个远程服务, 该服务器本身, 甚至该用户的纯JID的另一个资源)的节必须拥有一个'to'属性，它的值是一个XMPP地址.&lt;br /&gt;
:# 一个从客户端发送到服务器的由该服务器直接处理的节(例如, [[RFC6120#规范引用|XMPP‑IM]]所述的好友列表处理或发送给服务器用来广播给其他实体的的联机状态信息)不能(MUST NOT)拥有'to'属性.&lt;br /&gt;
&lt;br /&gt;
以下规则适用于服务器通过一个'jabber:client'命名空间限定的XML流发送到已连接客户端的节中包含的'to'属性..&lt;br /&gt;
&lt;br /&gt;
:# 如果该服务器从另一个已连接客户端或从一个对端服务器接收到该节, 在递送该节给该客户端之前该服务器不能(MUST NOT)修改'to'地址.&lt;br /&gt;
:# 如果该服务器本身生成了这个节(例如, 对类型为&amp;quot;get&amp;quot;或&amp;quot;set&amp;quot;的IQ节的应答, 即使该节不包含一个'to'地址), 这个节可以包含一个'to'地址, 这个地址必须是该客户端的全JID, 如果这个节不包含'to'地址，那么该客户端必须把'to'地址视为等同于该客户端的全JID.&lt;br /&gt;
&lt;br /&gt;
:实现备注: 只递送节到客户端的全JID还是用户的纯JID,是服务器的责任; 就是说, 客户端不需要检查收到的节的'to'地址. 然而, 如果客户端不检查'to'地址，那么建议最好检查纯JID部分(不是全JID), 因为'to'地址可能是该用户的纯JID, 该客户端的当前全JID, 或甚至是一个不同资源的全JID(例如, 在[[RFC6120#参考文献|XEP‑0160]]所述的的所谓&amp;quot;离线消息&amp;quot;的情况下).&lt;br /&gt;
&lt;br /&gt;
=====服务器-服务器流=====&lt;br /&gt;
&lt;br /&gt;
以下规则适用于一个'jabber:server'命名空间限定的XML流(即,服务器-服务器 流)的上下文中包含的'to'属性.&lt;br /&gt;
&lt;br /&gt;
:# 一个节必须拥有'to'属性，它的值是一个XMPP地址; 如果服务器接收到一个不满足这一限定的节, 它必须以一个&amp;lt;improper-addressing/&amp;gt;流错误([[RFC6120#improper-addressing|4.9.3.7]])来关闭这个流.&lt;br /&gt;
:# 包含在这个节的'to'属性中的JID的域部分必须和通过SASL协商(见[[RFC6120#SASL协商|第六章]])与之通讯的, 或服务器回拨(见[[RFC6120#参考文献|XEP‑0220]]),或类似的接收方服务器(或其中任何有效的域名)的完全合法域名FQDN匹配; 如果服务器接收到的节不满足这个限定, 它必须以&amp;lt;host-unknown/&amp;gt;流错误([[RFC6120#host-unknown|4.9.3.6]])或&amp;lt;host-gone/&amp;gt;流错误([[RFC6120#host-gone|4.9.3.5]])来关闭该流.&lt;br /&gt;
&lt;br /&gt;
====from====&lt;br /&gt;
&lt;br /&gt;
'from'属性指定发送者的JID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='juliet@im.example.com/balcony'&lt;br /&gt;
         to='romeo@example.net'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Art thou not Romeo, and a Montague?&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====客户端-服务器流=====&lt;br /&gt;
&lt;br /&gt;
以下规则适用于被'jabber:client'命名空间限定的XML流(即, 客户端-服务器 流)上下文中的'from'属性.&lt;br /&gt;
&lt;br /&gt;
:# 当服务器从一个已连接客户端接收到一个XML节, 该服务器必须给这个节添加一个'from'属性或覆盖这个由客户端指定的'from'属性, 这里'from'属性的值必须是服务器针对生成这个节的已连接资源确定的全JID (&amp;lt;localpart@domainpart/resource&amp;gt;) (见[[RFC6120#确定地址|4.3.6]]), 或在和订阅相关的联机状态信息节(见[[RFC6120#参考文献|XMPP‑IM]])的情况下则是纯JID (&amp;lt;localpart@domainpart&amp;gt;).&lt;br /&gt;
:# 当服务器为它自己生成一个从服务器本身发送给客户端的节的时候, 这个节必须包含一个'from'属性，它的值是服务器在流协商中同意的纯JID (即, &amp;lt;domainpart&amp;gt;)(例如, 基于初始化流头中的'to'属性).&lt;br /&gt;
:# 当服务器生成一个从该服务器递送到已连接客户端的帐号本身的节的时候(例如, 在服务器代表客户端提供的数据存储服务的上下文中), 该节要么 (a) 不包含'from'属性，要么 (b) 包含一个值为该帐号纯JID(&amp;lt;localpart@domainpart&amp;gt;)的'from'属性.&lt;br /&gt;
:# 服务器不能(MUST NOT)给客户端发送不包含'from'属性的节，如果该节不是由服务器代表它本身生成的(例如, 如果它是由另一个客户端或对端服务器生成的，而该服务器仅仅递送它到客户端或一些其他的实体); 所以, 当一个客户端接收到一个不包含'from'属性的节的时候, 它必须假定这个节是从该用户帐号所在服务器发出的.&lt;br /&gt;
&lt;br /&gt;
=====服务器-服务器流=====&lt;br /&gt;
&lt;br /&gt;
以下规则适用于一个'jabber:server'命名空间限定的XML流(即,服务器-服务器 流)的上下文中包含的'from'属性.&lt;br /&gt;
&lt;br /&gt;
:# 一个节必须拥有'from'属性，它的值是一个XMPP地址; 如果服务器接收到一个不满足这一限定的节, 它必须以一个&amp;lt;improper-addressing/&amp;gt;流错误([[RFC6120#improper-addressing|4.9.3.7]])来关闭这个流.&lt;br /&gt;
:# 包含在这个节的'from'属性中的JID的域部分必须和通过SASL协商(见[[RFC6120#SASL协商|第六章]])与之通讯的, 或服务器回拨(见[[RFC6120#参考文献|XEP‑0220]]),或类似的发送方服务器(或其中任何有效的域名)的完全合法域名FQDN匹配; 如果服务器接收到的节不满足这个限定, 它必须以&amp;lt;invalid-from/&amp;gt;流错误([[RFC6120#invalid-from|4.9.3.9]])来关闭该流.&lt;br /&gt;
&lt;br /&gt;
强制执行这些规则有助于组织特定的如[[RFC6120#拒绝服务|13.12]]所述的拒绝服务攻击.&lt;br /&gt;
&lt;br /&gt;
====id====&lt;br /&gt;
&lt;br /&gt;
'id'属性是由发起方实体用来跟踪可能从其他实体(类似中间服务器或预期的接收者)收到的和它生成的节有关的任何应答或错误节.&lt;br /&gt;
&lt;br /&gt;
这个'id'属性仅在当前流保持唯一性还是全局保持唯一性，取决于发起方实体本身.&lt;br /&gt;
&lt;br /&gt;
对于&amp;lt;message/&amp;gt;和&amp;lt;presence/&amp;gt;节来说, 建议发起方实体包含一个'id'属性; 对于&amp;lt;iq/&amp;gt;节来说, 它是必需的.&lt;br /&gt;
&lt;br /&gt;
如果生成的节包含一个'id'属性，那么对于其相应的应答或错误节来说，也必须包含一个'id'属性, 这个'id'属性的值必须和生成的节的那个'id'属性值匹配.&lt;br /&gt;
&lt;br /&gt;
IQ节语义强加了额外的约束，参见[[RFC6120#IQ语义|8.2.3]].&lt;br /&gt;
&lt;br /&gt;
====type====&lt;br /&gt;
&lt;br /&gt;
'type'属性指定该消息,联机状态或IQ节的用途或上下文. 'type'属性的特定的允许值依赖于这个节是一个消息, 联机状态, 还是IQ节. 为消息和联机状态节定义的值用于即时消息和联机状态应用，所以定义于[[RFC6120#规范引用|XMPP‑IM]]中, 而为IQ节定义的值指定所有结构化请求-应答交换中的语义部分(无论载荷是什么), 所以它定义于[[RFC6120#IQ语义|8.2.3]]. 唯一通用于所有三种节的'type'值是&amp;quot;error&amp;quot;，定义于[[RFC6120#节错误|8.3]].&lt;br /&gt;
&lt;br /&gt;
====xml:lang====&lt;br /&gt;
&lt;br /&gt;
一个节应该拥有'xml:lang'属性(定义于的2.12节[[RFC6120#规范引用|XML]])，如果这个节包含了XML字符串数据打算展示给用户(如[[RFC6120#规范引用|CHARSETS]]所解释的, &amp;quot;可读国际化&amp;quot;). 'xml:lang'属性的值指定任何这类可读XML字符串数据的缺省语言.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence from='romeo@example.net/orchard' xml:lang='en'&amp;gt;&lt;br /&gt;
  &amp;lt;show&amp;gt;dnd&amp;lt;/show&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;Wooing Juliet&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'xml:lang'属性的指可以被特定子元素的'xml:lang'属性覆写.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence from='romeo@example.net/orchard' xml:lang='en'&amp;gt;&lt;br /&gt;
  &amp;lt;show&amp;gt;dnd&amp;lt;/show&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;Wooing Juliet&amp;lt;/status&amp;gt;&lt;br /&gt;
  &amp;lt;status xml:lang='cs'&amp;gt;Dvo&amp;amp;#x0159;&amp;amp;#x00ED;m se Julii&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个由客户端生成的出站节不拥有'xml:lang'属性, 该客户端的服务器应该添加一个'xml:lang'属性，其值为客户端的出站流所指定的值，如[[RFC6120#xml:lang|4.7.4]]所述.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;presence from='romeo@example.net/orchard'&amp;gt;&lt;br /&gt;
     &amp;lt;show&amp;gt;dnd&amp;lt;/show&amp;gt;&lt;br /&gt;
     &amp;lt;status&amp;gt;Wooing Juliet&amp;lt;/status&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;presence from='romeo@example.net/orchard'&lt;br /&gt;
             to='juliet@im.example.com'&lt;br /&gt;
             xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;show&amp;gt;dnd&amp;lt;/show&amp;gt;&lt;br /&gt;
     &amp;lt;status&amp;gt;Wooing Juliet&amp;lt;/status&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个被客户端或服务器接收到的入站节不拥有'xml:lang'属性, 一个实现必须假定缺省语言是该实体的输入流所指定的值，如[[RFC6120#xml:lang|4.7.4]]所述.&lt;br /&gt;
&lt;br /&gt;
'xml:lang'属性的值必须遵循 NMTOKEN 数据类型(定义于[[RFC6120#规范引用|XML]]的2.3节) 并且必须遵循定义于[[RFC6120#规范引用|LANGTAGS]]的格式.&lt;br /&gt;
&lt;br /&gt;
服务器不能(MUST NOT)修改或删除它从其他实体收到的节的'xml:lang'属性.&lt;br /&gt;
&lt;br /&gt;
===基本语义===&lt;br /&gt;
====消息语义====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message/&amp;gt;节是一个&amp;quot;推送&amp;quot;机制，这里一个实体推送信息到另一个实体, 类似发生在email系统里的通讯一样. 所有消息节将拥有'to'属性用来指定该消息期望的接收者 (见[[RFC6120#to|8.1.1]]和[[RFC6120#没有'to'地址|10.3]]), 除非消息是被一个已连接的客户端帐号的纯JID发送的. 接收到一个带有'to'地址的消息节之后, 服务器应该尝试路由或递送它到期望的接收者那里(见[[RFC6120#处理XML节的服务器规则|第十章]]里和XML节相关的通用路由和递送规则). &lt;br /&gt;
&lt;br /&gt;
====联机状态语义====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence/&amp;gt;节是一个特定的&amp;quot;广播&amp;quot;或&amp;quot;发布-订阅&amp;quot;机制, 这里多个实体接收关于他们订阅的一个实体的信息(在这个案例中, 是网络可用性信息). 通常, 发布客户端应该发送一个不带有'to'属性的联机状态节, 这种情况下该客户端连接的那个服务器将广播那个节给所有已订阅的实体. 然而, 发布客户端也可以发送一个带有'to'属性的联机状态节, 这种情况下该服务器将路由或递送那个节到期望的接收者. 尽管&amp;lt;presence/&amp;gt;节大部分情况下是由XMPP客户端使用, 它也可能被服务器, 附加服务, 以及任何其他类型呃XMPP实体使用. 参见[[RFC6120#处理XML节的服务器规则|第十章]]中和XML节相关的通用路由和递送规则, 以及[[RFC6120#规范引用|XMPP‑IM]]中联机状态应用的特定规则.&lt;br /&gt;
&lt;br /&gt;
====IQ语义====&lt;br /&gt;
&lt;br /&gt;
信息查询(Info/Query),或IQ, 是一个&amp;quot;请求-应答&amp;quot;机制, 类似某些情况下的超文本传输协议[[RFC6120#参考文献|HTTP]]. IQ的语义允许一个实体对另一个实体做出一个请求, 并接收一个应答. 这个请求和应答的数据内容由schema或其他限定IQ元素的直接子元素的XML命名空间相关的结构化定义(见[[RFC6120#扩展内容|8.4]])来限定, 发出请求的实体使用'id'属性来跟踪交互过程. 所以, IQ交互沿用了结构化数据交换的常见模式，类似 get/result 或 set/result (尽管适当的时候对于某个请求会返回一个error):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
  请求实体                     应答实体&lt;br /&gt;
----------                  ----------&lt;br /&gt;
    |                            |&lt;br /&gt;
    | &amp;lt;iq id='1' type='get'&amp;gt;     |&lt;br /&gt;
    |   [ ... payload ... ]      |&lt;br /&gt;
    | &amp;lt;/iq&amp;gt;                      |&lt;br /&gt;
    | -------------------------&amp;gt; |&lt;br /&gt;
    |                            |&lt;br /&gt;
    | &amp;lt;iq id='1' type='result'&amp;gt;  |&lt;br /&gt;
    |   [ ... payload ... ]      |&lt;br /&gt;
    | &amp;lt;/iq&amp;gt;                      |&lt;br /&gt;
    | &amp;lt;------------------------- |&lt;br /&gt;
    |                            |&lt;br /&gt;
    | &amp;lt;iq id='2' type='set'&amp;gt;     |&lt;br /&gt;
    |   [ ... payload ... ]      |&lt;br /&gt;
    | &amp;lt;/iq&amp;gt;                      |&lt;br /&gt;
    | -------------------------&amp;gt; |&lt;br /&gt;
    |                            |&lt;br /&gt;
    | &amp;lt;iq id='2' type='error'&amp;gt;   |&lt;br /&gt;
    |   [ ... condition ... ]    |&lt;br /&gt;
    | &amp;lt;/iq&amp;gt;                      |&lt;br /&gt;
    | &amp;lt;------------------------- |&lt;br /&gt;
    |                            |&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt; '''图5: IQ节的语义''' &amp;lt;/div&amp;gt;&lt;br /&gt;
----&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
为强制这些语义, 以下规则适用:&lt;br /&gt;
&lt;br /&gt;
:1. 'id'属性对于IQ节是必需的.&lt;br /&gt;
:2. 'type'属性对于IQ节是必需的. 这个值必须是以下之一; 如果不是, 接收者或中间路由器必须返回一个&amp;lt;bad-request/&amp;gt;节错误([[RFC6120#bad-request|8.3.3.1]]).&lt;br /&gt;
::* get -- 该节请求信息, 查询需要什么数据以完成更多操作, 等等.&lt;br /&gt;
::* set -- 该节为完成某个操作提供需要的数据, 设置新值, 取代旧值, 等等.&lt;br /&gt;
::* result -- 该节是对成功的get或set请求的应答.&lt;br /&gt;
::* error -- 该节报告关于处理或递送一个get或set请求时发生的错误(见[[RFC6120#节错误|8.3]]).&lt;br /&gt;
:3. 接收到类型为&amp;quot;get&amp;quot;或&amp;quot;set&amp;quot;的IQ请求的实体必须返回一个类型为&amp;quot;result&amp;quot;或&amp;quot;error&amp;quot;的IQ应答. 该应答必须保留请求中的'id'属性(或为空，如果生成的节没有包含'id'属性).&lt;br /&gt;
:4. 接收到类型为&amp;quot;result&amp;quot;或&amp;quot;error&amp;quot;节的实体不能(MUST NOT)发送更多的类型为&amp;quot;result&amp;quot;或&amp;quot;error&amp;quot;的IQ应答来应答; 然而, 请求实体可以发送另一个请求(例如, 一个类型为&amp;quot;set&amp;quot;的IQ对之前在get/result对中查询到的信息提供特定的信息).&lt;br /&gt;
:5. 类型为&amp;quot;get&amp;quot;或&amp;quot;set&amp;quot;的IQ节必须严格地包含一个子元素, 它定义特定请求的语义.&lt;br /&gt;
:6. 类型为&amp;quot;result&amp;quot;的IQ节必须包含零或一个子元素.&lt;br /&gt;
:7. 类型为&amp;quot;error&amp;quot;的IQ节可以包含相关的&amp;quot;get&amp;quot;或&amp;quot;set&amp;quot;子元素并且必须包含一个&amp;lt;error/&amp;gt;子元素; 详见[[RFC6120#节错误|8.3]].&lt;br /&gt;
&lt;br /&gt;
===节错误===&lt;br /&gt;
&lt;br /&gt;
节相关的错误处理的方式类似流错误[[RFC6120#流错误|流错误]], 但是不像流错误那样，节错误是可恢复的; 所以, 他们不会导致XML和当前TCP连接的中止. 反之, 发现错误条件的实体返回一个错误节, 它是一个这样的节:&lt;br /&gt;
&lt;br /&gt;
:* 是和触发这个错误的已生成的节同种类型(message, presence, 或 IQ)&lt;br /&gt;
:* 'type'属性值设为&amp;quot;error&amp;quot;&lt;br /&gt;
:* 通常是把已生成的节的'from'和'to'互换&lt;br /&gt;
:* 镜像触发这个错误的已生成的节的'id'属性(如果有的话)&lt;br /&gt;
:* 包含一个&amp;lt;error/&amp;gt;子元素以指明错误条件并且对发送者可以采取的补救措施提供一个暗示(然而, 不可能总是能够不补救这个错误)&lt;br /&gt;
&lt;br /&gt;
====规则====&lt;br /&gt;
&lt;br /&gt;
以下规则适用于节错误:&lt;br /&gt;
&lt;br /&gt;
:# 检测到和节相关的错误条件的接收或处理实体应该返回一个错误节(对于IQ节必须这么做).&lt;br /&gt;
:# 该错误节应该简单地把生成的节中的'from'和'to'地址互换, 除非这么做将会 (1) 导致信息泄漏(参见[RFC6120#信息泄露|13.10]])或其他违反安全, 或 (2) 强迫错误节的发送者在该错误节的'from'或'to'地址中包含一个异常的JID.&lt;br /&gt;
:# 如果生成的节是&amp;lt;message/&amp;gt;或&amp;lt;presence/&amp;gt;并且包含了'id'属性，那么该错误节必须也包含'id'属性. 如果生成的节是&amp;lt;iq/&amp;gt;，那么该错误节必须包含一个'id'属性. 在所有情况下, 'id'属性的值必须和生成节的相同(或者是空，如果生成的节没有包含'id'属性).&lt;br /&gt;
:# 错误节必须包含一个&amp;lt;error/&amp;gt;子元素.&lt;br /&gt;
:# 返回错误节的实体可以传递它的JID给生成节的发送者(例如, 为了诊断或跟踪的目的)，通过附加一个'by'属性到&amp;lt;error/&amp;gt;子元素.&lt;br /&gt;
:# 返回错误节的实体可以包含被发送的原始XML，这样发送者能够检查, 如果必要的话, 并在尝试重发之前纠正该XML(然而, 这只是出于礼貌，并且原实体不能(MUST NOT)依赖接收到的原始载荷). 自然地, 该实体不能(MUST NOT)包含原始数据，如果它不是格式良好的XML, 违反XMPP的XML限制(见[[RFC6120#XML限制|11.1]]), 或反而是有害的(例如, 超出大小限制).&lt;br /&gt;
:# 如果'type'属性值不是&amp;quot;error&amp;quot;(或如果没有'type'属性), 不能(MUST NOT)包含一个&amp;lt;error/&amp;gt;子元素.&lt;br /&gt;
:# 接收到错误节的实体不能(MUST NOT)以更多的错误节来应答这个节; 这有助于防止死循环.&lt;br /&gt;
&lt;br /&gt;
====语法====&lt;br /&gt;
&lt;br /&gt;
节相关的错误的语法如下, 这里展示的用方括号'['和']'括起来的XML数据是可选的, 'intended-recipient' 是原始节指定的地址的那个实体的JID, 'sender' 是原始实体的JID, 而 'error-generator' 是检测到错误的并方会错误节的那个实体.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;stanza-kind from='intended-recipient' to='sender' type='error'&amp;gt;&lt;br /&gt;
  [OPTIONAL to include sender XML here]&lt;br /&gt;
  &amp;lt;error [by='error-generator']&lt;br /&gt;
         type='error-type'&amp;gt;&lt;br /&gt;
    &amp;lt;defined-condition xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    [&amp;lt;text xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'&lt;br /&gt;
           xml:lang='langcode'&amp;gt;&lt;br /&gt;
      OPTIONAL descriptive text&lt;br /&gt;
    &amp;lt;/text&amp;gt;]&lt;br /&gt;
    [OPTIONAL application-specific condition element]&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/stanza-kind&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;stanza-kind&amp;quot;必须是 message, presence, 或 iq 之一.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;error-type&amp;quot; 必须是以下之一:&lt;br /&gt;
&lt;br /&gt;
:* auth -- 在提供身份之后重试&lt;br /&gt;
:* cancel -- 不要重试 (该错误不能加以弥补)&lt;br /&gt;
:* continue -- 继续 (这个条件只是个警告)&lt;br /&gt;
:* modify -- 在修改发送的数据之后重试&lt;br /&gt;
:* wait -- 等待之后重试 (该错误是暂时的)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;defined-condition&amp;quot;必须符合[[RFC6120#已定义条件|8.3.3]]定义的节错误条件之一. 然而, 因为将来可能会发生额外的错误条件, 如果实体接受到一个它不理解的节错误条件，那么它必须把这个未知的条件当成&amp;lt;undefined-condition/&amp;gt; ([[RFC6120#undefined-condition|8.3.3.21]]). 如果一个XMPP协议扩展的设计者或一个XMPP实现的开发者需要未在本协议中定义的节错误条件的通讯, 他们可以定义应用特有的命名空间所限定的应用特有的错误条件元素来实现这个目标.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error/&amp;gt;元素:&lt;br /&gt;
&lt;br /&gt;
:* 必须包含一个已定义的条件元素.&lt;br /&gt;
:* 可以包含一个包含XML字符串数据的&amp;lt;text/&amp;gt;子元素，用来描述错误的详细信息; 这个元素必须由'urn:ietf:params:xml:ns:xmpp-stanzas'命名空间来限定并且应该拥有'xml:lang'属性来指定该XML字符串数据的自然语言.&lt;br /&gt;
:* 可以包含一个用于应用特有的错误条件的子元素; 这个元素必须由一个应用特有的命名空间来限定，以定义该元素的语法和语义.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;text/&amp;gt;元素是可选的. 如果包含了它, 它仅被用于提供描述和诊断信息以补充说明已定义条件或应用特有的条件的含义. 它不能(MUST NOT)被应用程序当成编程信息来解释. 它不应该被用于向自然人用户展示错误消息, 但是可以被附加在该已定义条件元素(以及, 可选的, 应用特有的条件元素)的错误消息上展示.&lt;br /&gt;
&lt;br /&gt;
:互操作性备注: 定义于[[RFC3920]]的语法包含了一个遗留的'code'属性, 它的语义已经被已定义的条件元素取代; 关于已定义的条件元素和遗留的'code'属性值之间的对应关系，可以在[[RFC6120#参考文献|XEP‑0086]]]找到.&lt;br /&gt;
&lt;br /&gt;
====已定义的条件====&lt;br /&gt;
&lt;br /&gt;
以下条件是已定义好用于节错误的.&lt;br /&gt;
&lt;br /&gt;
error-type 的值是被推荐用于每个已定义的条件通常预期的类型; 无论如何, 在某些情况下不同的类型可能更合适. &lt;br /&gt;
&lt;br /&gt;
=====bad-request=====&lt;br /&gt;
&lt;br /&gt;
发送者发送的节里包含的XML不符合适当的schema或不能被拥有(例如, IQ节的'type'属性包含一个不能识别的值, 或一个被已知的命名空间限定的元素但是违反了该元素的已定义的语法); 相关的错误类型应该是&amp;quot;modify&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;iq from='juliet@im.example.com/balcony'&lt;br /&gt;
       id='zj3v142b'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       type='subscribe'&amp;gt;&lt;br /&gt;
     &amp;lt;ping xmlns='urn:xmpp:ping'/&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;iq from='im.example.com'&lt;br /&gt;
       id='zj3v142b'&lt;br /&gt;
       to='juliet@im.example.com/balcony'&lt;br /&gt;
       type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
       &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====conflict=====&lt;br /&gt;
&lt;br /&gt;
访问未被授权，因为一个现存的资源使用了相同的名字或地址; 相关的错误类型应该是&amp;quot;cancel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;iq id='wy2xa82b4' type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'&amp;gt;&lt;br /&gt;
       &amp;lt;resource&amp;gt;balcony&amp;lt;/resource&amp;gt;&lt;br /&gt;
     &amp;lt;/bind&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;iq id='wy2xa82b4' type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====feature-not-implemented=====&lt;br /&gt;
&lt;br /&gt;
出现在XML节里的特性没有被预定的接收方或中间服务器实现，所以该节无法被处理(例如, 该实体知道该命名空间但是不认识元素名); 相关的错误类型应该是&amp;quot;cancel&amp;quot; 或 &amp;quot;modify&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;iq from='juliet@im.example.com/balcony'&lt;br /&gt;
       id='9u2bax16'&lt;br /&gt;
       to='pubsub.example.com'&lt;br /&gt;
       type='get'&amp;gt;&lt;br /&gt;
     &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
       &amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
     &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E: &amp;lt;iq from='pubsub.example.com'&lt;br /&gt;
       id='9u2bax16'&lt;br /&gt;
       to='juliet@im.example.com/balcony'&lt;br /&gt;
       type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;feature-not-implemented&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
       &amp;lt;unsupported&lt;br /&gt;
           xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
           feature='retrieve-subscriptions'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====forbidden=====&lt;br /&gt;
&lt;br /&gt;
请求的实体没有必要的许可来执行一个只允许特定授权角色或个体来完成的动作(即, 它通常和授权而不是验证有关); 相关的错误类型应该是&amp;quot;auth&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;presence&lt;br /&gt;
       from='juliet@im.example.com/balcony'&lt;br /&gt;
       id='y2bs71v4'&lt;br /&gt;
       to='characters@muc.example.com/JulieC'&amp;gt;&lt;br /&gt;
     &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E: &amp;lt;presence&lt;br /&gt;
       from='characters@muc.example.com/JulieC'&lt;br /&gt;
       id='y2bs71v4'&lt;br /&gt;
       to='juliet@im.example.com/balcony'&lt;br /&gt;
       type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
       &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====gone=====&lt;br /&gt;
&lt;br /&gt;
接收者或服务器无法再用这个地址联系到, 通常是永久意义上的(和&amp;lt;redirect/&amp;gt;错误条件相反, 它被用于临时的地址失败); 相关的错误类型应该是&amp;quot;cancel&amp;quot;并且该错误节应该包含一个新的地址(如果可用的话)作为&amp;lt;gone/&amp;gt;元素的XML字符串数据(它必须是一个实体可以联系的唯一资源标识符[[RFC6120#规范引用|URI]]或国际化资源标识符[[RFC6120#参考文献|IRI]], 典型的是一个[[RFC6120#参考文献|XMPP‑URI]]定义的XMPP IRI.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;message&lt;br /&gt;
       from='juliet@im.example.com/churchyard'&lt;br /&gt;
       id='sj2b371v'&lt;br /&gt;
       to='romeo@example.net'&lt;br /&gt;
       type='chat'&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;Thy lips are warm.&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;message&lt;br /&gt;
       from='romeo@example.net'&lt;br /&gt;
       id='sj2b371v'&lt;br /&gt;
       to='juliet@im.example.com/churchyard'&lt;br /&gt;
       type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error by='example.net'&lt;br /&gt;
            type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;gone xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'&amp;gt;&lt;br /&gt;
         xmpp:romeo@afterlife.example.net&lt;br /&gt;
       &amp;lt;/gone&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====internal-server-error=====&lt;br /&gt;
&lt;br /&gt;
服务器发生了错误的配置或其他阻止它处理改节的内部错误; 相关的错误类型应该是&amp;quot;cancel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;presence&lt;br /&gt;
       from='juliet@im.example.com/balcony'&lt;br /&gt;
       id='y2bs71v4'&lt;br /&gt;
       to='characters@muc.example.com/JulieC'&amp;gt;&lt;br /&gt;
     &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E: &amp;lt;presence&lt;br /&gt;
       from='characters@muc.example.com/JulieC'&lt;br /&gt;
       id='y2bs71v4'&lt;br /&gt;
       to='juliet@im.example.com/balcony'&lt;br /&gt;
       type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;internal-server-error&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====item-not-found=====&lt;br /&gt;
&lt;br /&gt;
找不到请求的JID地址或条目; 相关的错误类型应该是&amp;quot;cancel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;presence from='userfoo@example.com/bar'&lt;br /&gt;
             id='pwb2n78i'&lt;br /&gt;
             to='nosuchroom@conference.example.org/foo'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;presence from='nosuchroom@conference.example.org/foo'&lt;br /&gt;
             id='pwb2n78i'&lt;br /&gt;
             to='userfoo@example.com/bar'&lt;br /&gt;
             type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:安全警告: 如果这样做将会提供预定的接收者的网络可用性信息给一个未被授权知道这些信息的实体(关于联机状态信息授权的更多细节讨论，参考[[RFC6120#规范引用|XMPP-IM]]联机状态订阅的讨论)，那么应用不能(MUST NOT)返回这个错误; 相反它应该返回一个&amp;lt;service-unavailable/&amp;gt;错误([[RFC6120#service-unavailable|8.3.3.19]]).&lt;br /&gt;
&lt;br /&gt;
=====jid-malformed=====&lt;br /&gt;
&lt;br /&gt;
发送的实体所提供(例如, 在资源绑定的时候)或与之通讯(例如, 一个节的'to'地址)的XMPP地址或其中一部分违反了[[RFC6120#规范引用|XMPP‑ADDR]]定义的规则; 相关的错误类型应该是&amp;quot;modify&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;presence&lt;br /&gt;
       from='juliet@im.example.com/balcony'&lt;br /&gt;
       id='y2bs71v4'&lt;br /&gt;
       to='ch@r@cters@muc.example.com/JulieC'&amp;gt;&lt;br /&gt;
     &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E: &amp;lt;presence&lt;br /&gt;
       from='ch@r@cters@muc.example.com/JulieC'&lt;br /&gt;
       id='y2bs71v4'&lt;br /&gt;
       to='juliet@im.example.com/balcony'&lt;br /&gt;
       type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error by='muc.example.com'&lt;br /&gt;
            type='modify'&amp;gt;&lt;br /&gt;
       &amp;lt;jid-malformed&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:实现备注: 强制XMPP本地部分的格式主要是相关帐号或实体所在的服务的责任(例如, example.com 服务负责返回所有和格式 &amp;lt;localpart@example.com&amp;gt; 相关的 &amp;lt;jid-malformed/&amp;gt; 错误), 而强制XMPP域部分的格式主要是由路由一个节到域部分所指定的服务的那个服务的责任 (例如, example.org 服务负责返回该服务尝试发送的目标JID &amp;lt;localpart@example.com&amp;gt;的格式的 &amp;lt;jid-malformed/&amp;gt; 错误 ). 无论如何, 任何检测到格式错误的JID的实体可以返回该错误.&lt;br /&gt;
&lt;br /&gt;
=====not-acceptable=====&lt;br /&gt;
&lt;br /&gt;
接收者或服务器理解该请求但是不能处理它，因为该请求不符合该接收者或服务器的标准(例如, 请求订阅信息但是未同时包含接收者需要的配置参数); 相关的错误类型应该是&amp;quot;modify&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;message to='juliet@im.example.com' id='yt2vs71m'&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;[ ... the-emacs-manual ... ]&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;message from='juliet@im.example.com' id='yt2vs71m'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
       &amp;lt;not-acceptable&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====not-allowed=====&lt;br /&gt;
&lt;br /&gt;
接收者或服务器不允许任何实体执行该动作(例如, 向列入黑名单的域发送消息); 相关的错误类型应该是&amp;quot;cancel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;presence&lt;br /&gt;
       from='juliet@im.example.com/balcony'&lt;br /&gt;
       id='y2bs71v4'&lt;br /&gt;
       to='characters@muc.example.com/JulieC'&amp;gt;&lt;br /&gt;
     &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E: &amp;lt;presence&lt;br /&gt;
       from='characters@muc.example.com/JulieC'&lt;br /&gt;
       id='y2bs71v4'&lt;br /&gt;
       to='juliet@im.example.com/balcony'&lt;br /&gt;
       type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====not-authorized=====&lt;br /&gt;
&lt;br /&gt;
发送者在被允许执行某动作之前需要提供凭证, 或已经提供了错误的凭证(&amp;quot;not-authorized&amp;quot;的提法, 来源于[[RFC6120#参考文献|HTTP]]的&amp;quot;401 Unauthorized&amp;quot;错误, 可能导致读者认为这个条件是和授权相关的, 但其实它通常用于验证相关的领域); 相关的错误类型应该是&amp;quot;auth&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;presence&lt;br /&gt;
       from='juliet@im.example.com/balcony'&lt;br /&gt;
       id='y2bs71v4'&lt;br /&gt;
       to='characters@muc.example.com/JulieC'&amp;gt;&lt;br /&gt;
     &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E: &amp;lt;presence&lt;br /&gt;
       from='characters@muc.example.com/JulieC'&lt;br /&gt;
       id='y2bs71v4'&lt;br /&gt;
       to='juliet@im.example.com/balcony'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
       &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====policy-violation=====&lt;br /&gt;
&lt;br /&gt;
实体违反了一些本地服务策略(例如, 一个消息包含了服务禁止的单词)而服务器可以选择在&amp;lt;text/&amp;gt;元素里或在应用特有的条件元素里指定策略; 相关的错误类型应该是&amp;quot;modify&amp;quot;或&amp;quot;wait&amp;quot;，取决于被违反的策略.&lt;br /&gt;
&lt;br /&gt;
(在下例中, 客户端发送一个包含了根据服务器的本地服务策略被禁止的单词的XMPP消息.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;message from='romeo@example.net/foo'&lt;br /&gt;
            to='bill@im.example.com'&lt;br /&gt;
            id='vq71f4nb'&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;%#&amp;amp;@^!!!&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;message from='bill@im.example.com'&lt;br /&gt;
            id='vq71f4nb'&lt;br /&gt;
            to='romeo@example.net/foo'&amp;gt;&lt;br /&gt;
     &amp;lt;error by='example.net' type='modify'&amp;gt;&lt;br /&gt;
       &amp;lt;policy-violation&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====recipient-unavailable=====&lt;br /&gt;
&lt;br /&gt;
预期的接收者暂时不可用, 正在维护, 等等; 相关的错误类型应该是&amp;quot;wait&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;presence&lt;br /&gt;
       from='juliet@im.example.com/balcony'&lt;br /&gt;
       id='y2bs71v4'&lt;br /&gt;
       to='characters@muc.example.com/JulieC'&amp;gt;&lt;br /&gt;
     &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E: &amp;lt;presence&lt;br /&gt;
       from='characters@muc.example.com/JulieC'&lt;br /&gt;
       id='y2bs71v4'&lt;br /&gt;
       to='juliet@im.example.com/balcony'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='wait'&amp;gt;&lt;br /&gt;
       &amp;lt;recipient-unavailable&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:安全警告: 如果这么做将提供关于预期接收者的网络可用性的信息给一个没有被授权可以知道这类信息的实体(对于联机状态授权方面的讨论的更多细节, 参考联机状态信息订阅的讨论[[RFC6120#规范引用|XMPP‑IM]]中),应用不能(MUST NOT)返回这个错误; 反之，它必须返回一个&amp;lt;service-unavailable/&amp;gt; 节错误([[RFC6120#service-unavailable|8.3.3.19]]).&lt;br /&gt;
&lt;br /&gt;
=====redirect=====&lt;br /&gt;
&lt;br /&gt;
接收者或服务器重定向该信息的请求到另一个实体, 典型的临时发生的情形(和&amp;lt;gone/&amp;gt;错误条件相反, 它用于永久性的地址错误); 相关的错误类型应该是&amp;quot;modify&amp;quot;，并且该错误节应该在&amp;lt;redirect/&amp;gt;元素的XML字符串数据中包含替代的地址(它必须是一个发送者可以与之通讯的URI或IRI, 通常是一个[[RFC6120#参考文献|XMPP‑URI]]定义的XMPP IRI).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;presence&lt;br /&gt;
       from='juliet@im.example.com/balcony'&lt;br /&gt;
       id='y2bs71v4'&lt;br /&gt;
       to='characters@muc.example.com/JulieC'&amp;gt;&lt;br /&gt;
     &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E: &amp;lt;presence&lt;br /&gt;
       from='characters@muc.example.com/JulieC'&lt;br /&gt;
       id='y2bs71v4'&lt;br /&gt;
       to='juliet@im.example.com/balcony'&lt;br /&gt;
       type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
       &amp;lt;redirect xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'&amp;gt;&lt;br /&gt;
         xmpp:characters@conference.example.org&lt;br /&gt;
       &amp;lt;/redirect&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:安全警告: 接收到一个节级别的重定向的应用应该向自然人用户警告这个重定向尝试并且在和包含在该&amp;lt;redirect/&amp;gt;元素的XML字符串数据中的地址代表的实体通讯之前请求批准, 因为那个实体可能有不同的身份或可能强制执行不同的安全策略. XMPP节的点对点验证或签名有助于减轻这个风险, 因为它将允许发送者来决定是否被重定向到的实体和开始尝试联系的实体是同一个身份. 应用可以有一个策略规定只有已经验证过接收实体才能重定向. 另外, 在成功地重定向了一定次数之后应用应该中止通讯尝试(例如, 至少2次但不超过5次).&lt;br /&gt;
&lt;br /&gt;
=====registration-required=====&lt;br /&gt;
&lt;br /&gt;
请求的实体没有被授权访问请求的服务，因为需要事先注册(提前注册的例子包括XMPP多用户聊天 [[XEP-0045]] 中仅限会员的房间和到非XMPP即时消息服务的网关, 传统上使用网关[[RFC6120#参考文献|XEP‑0100]]是需要注册的); 相关的错误类型应该是&amp;quot;auth&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;presence&lt;br /&gt;
       from='juliet@im.example.com/balcony'&lt;br /&gt;
       id='y2bs71v4'&lt;br /&gt;
       to='characters@muc.example.com/JulieC'&amp;gt;&lt;br /&gt;
     &amp;lt;x xmlns='http://jabber.org/protocol/muc'/&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E: &amp;lt;presence&lt;br /&gt;
       from='characters@muc.example.com/JulieC'&lt;br /&gt;
       id='y2bs71v4'&lt;br /&gt;
       to='juliet@im.example.com/balcony'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
       &amp;lt;registration-required&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====remote-server-not-found=====&lt;br /&gt;
&lt;br /&gt;
一个远程服务器或预期的接收者的JID的一部分所代表的服务不存在或不能解析(例如, 没有 _xmpp-server._tcp DNS SRV记录, A记录或AAAA记录解析也失败了, 或A/AAAA查询成功了但是在IANA注册了的端口5269上没有应答); 相关错误类型应该是&amp;quot;cancel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;message&lt;br /&gt;
       from='romeo@example.net/home'&lt;br /&gt;
       id='ud7n1f4h'&lt;br /&gt;
       to='bar@example.org'&lt;br /&gt;
       type='chat'&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;yt?&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E: &amp;lt;message&lt;br /&gt;
       from='bar@example.org'&lt;br /&gt;
       id='ud7n1f4h'&lt;br /&gt;
       to='romeo@example.net/home'&lt;br /&gt;
       type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;remote-server-not-found&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====remote-server-timeout=====&lt;br /&gt;
&lt;br /&gt;
远程服务器或作为预定的接收者的全JID的一部分(或履行请求所需要的)的服务能被解析但是无法在合理的时间内与之建立通讯(例如, 无法在解析到的IP地址和端口上建立一个XML流, 或可以建立一个XML流但是因为TLS, SASL, Server Dialback的问题导致流协商失败, 等等); 相关的错误类型应该是&amp;quot;wait&amp;quot; (除非该错误是更永久性的, 例如, 远程服务器能被找到但是无法被认证或它违反了安全策略).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;message&lt;br /&gt;
       from='romeo@example.net/home'&lt;br /&gt;
       id='ud7n1f4h'&lt;br /&gt;
       to='bar@example.org'&lt;br /&gt;
       type='chat'&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;yt?&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E: &amp;lt;message&lt;br /&gt;
       from='bar@example.org'&lt;br /&gt;
       id='ud7n1f4h'&lt;br /&gt;
       to='romeo@example.net/home'&lt;br /&gt;
       type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='wait'&amp;gt;&lt;br /&gt;
       &amp;lt;remote-server-timeout&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====resource-constraint=====&lt;br /&gt;
&lt;br /&gt;
服务器或接收者忙或缺乏必要的系统资源来服务该请求; 相关的错误类型应该是&amp;quot;wait&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;iq from='romeo@example.net/foo'&lt;br /&gt;
       id='kj4vz31m'&lt;br /&gt;
       to='pubsub.example.com'&lt;br /&gt;
       type='get'&amp;gt;&lt;br /&gt;
     &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
       &amp;lt;items node='my_musings'/&amp;gt;&lt;br /&gt;
     &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E: &amp;lt;iq from='pubsub.example.com'&lt;br /&gt;
       id='kj4vz31m'&lt;br /&gt;
       to='romeo@example.net/foo'&lt;br /&gt;
       type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='wait'&amp;gt;&lt;br /&gt;
       &amp;lt;resource-constraint&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====service-unavailable=====&lt;br /&gt;
&lt;br /&gt;
服务器或接收者当前未提供被请求的服务; 相关的错误类型应该是&amp;quot;cancel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;message from='romeo@example.net/foo'&lt;br /&gt;
            to='juliet@im.example.com'&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;Hello?&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;message from='juliet@im.example.com/foo'&lt;br /&gt;
            to='romeo@example.net'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;service-unavailable&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:安全警告: 应用程序必须返回一个&amp;lt;service-unavailable/&amp;gt;节错误([[RFC6120#service-unavailable|8.3.3.19]])而不是&amp;lt;item-not-found/&amp;gt;([[RFC6120#item-not-found|8.3.3.7]])或&amp;lt;recipient-unavailable/&amp;gt;([[RFC6120#recipient-unavailable|8.3.3.13]]), 如果发送后面两个错误将提供关于预期的接收者的网络可用性信息给一个未被授权知道这写信息的实体(详见联机状态信息授权的讨论, 参考[[RFC6120#规范引用|XMPP‑IM]]).&lt;br /&gt;
&lt;br /&gt;
=====subscription-required=====&lt;br /&gt;
&lt;br /&gt;
提出请求的实体没有被授权访问所请求的服务，因为需要事先订阅(事先订阅的例子包括授权接收[[RFC6120#规范引用|XMPP‑IM]]定义的联机状态信息和用于[[RFC6120#参考文献|XEP‑0060]]定义的XMPP发布-订阅的 opt-in 数据种子); 相关的错误类型应该是&amp;quot;auth&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;message&lt;br /&gt;
       from='romeo@example.net/orchard'&lt;br /&gt;
       id='pa73b4n7'&lt;br /&gt;
       to='playwright@shakespeare.example.com'&lt;br /&gt;
       type='chat'&amp;gt;&lt;br /&gt;
     &amp;lt;subject&amp;gt;ACT II, SCENE II&amp;lt;/subject&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;help, I forgot my lines!&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E: &amp;lt;message&lt;br /&gt;
       from='playwright@shakespeare.example.com'&lt;br /&gt;
       id='pa73b4n7'&lt;br /&gt;
       to='romeo@example.net/orchard'&lt;br /&gt;
       type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
       &amp;lt;subscription-required&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====undefined-condition=====&lt;br /&gt;
&lt;br /&gt;
该错误条件不在本列表中的其他错误条件之中; 任何错误类型都可能和本条件有关, 并且除非和应用特有的条件联合在一起，它应该不被使用.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;message&lt;br /&gt;
       from='northumberland@shakespeare.example'&lt;br /&gt;
       id='richard2-4.1.247'&lt;br /&gt;
       to='kingrichard@royalty.england.example'&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;My lord, dispatch; read o'er these articles.&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;amp xmlns='http://jabber.org/protocol/amp'&amp;gt;&lt;br /&gt;
       &amp;lt;rule action='notify'&lt;br /&gt;
             condition='deliver'&lt;br /&gt;
             value='stored'/&amp;gt;&lt;br /&gt;
     &amp;lt;/amp&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;message from='example.org'&lt;br /&gt;
            id='amp1'&lt;br /&gt;
            to='northumberland@example.net/field'&lt;br /&gt;
            type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;amp xmlns='http://jabber.org/protocol/amp'&lt;br /&gt;
          from='kingrichard@example.org'&lt;br /&gt;
          status='error'&lt;br /&gt;
          to='northumberland@example.net/field'&amp;gt;&lt;br /&gt;
       &amp;lt;rule action='error'&lt;br /&gt;
             condition='deliver'&lt;br /&gt;
             value='stored'/&amp;gt;&lt;br /&gt;
     &amp;lt;/amp&amp;gt;&lt;br /&gt;
     &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
       &amp;lt;undefined-condition&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
       &amp;lt;failed-rules xmlns='http://jabber.org/protocol/amp#errors'&amp;gt;&lt;br /&gt;
         &amp;lt;rule action='error'&lt;br /&gt;
               condition='deliver'&lt;br /&gt;
               value='stored'/&amp;gt;&lt;br /&gt;
       &amp;lt;/failed-rules&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====unexpected-request=====&lt;br /&gt;
&lt;br /&gt;
接收者或服务器理解这个请求但是不希望它在这个时候出现(即, 该请求顺序错了); 相关的错误类型应该是&amp;quot;wait&amp;quot;或&amp;quot;modify&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;iq from='romeo@example.net/foo'&lt;br /&gt;
       id='o6hsv25z'&lt;br /&gt;
       to='pubsub.example.com'&lt;br /&gt;
       type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
        &amp;lt;unsubscribe&lt;br /&gt;
            node='my_musings'&lt;br /&gt;
            jid='romeo@example.net'/&amp;gt;&lt;br /&gt;
     &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E: &amp;lt;iq from='pubsub.example.com'&lt;br /&gt;
       id='o6hsv25z'&lt;br /&gt;
       to='romeo@example.net/foo'&lt;br /&gt;
       type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
       &amp;lt;unexpected-request&lt;br /&gt;
           xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
       &amp;lt;not-subscribed&lt;br /&gt;
           xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====应用特有的条件====&lt;br /&gt;
&lt;br /&gt;
大家知道, 一个应用可以提供应用特有的节错误信息，通过在错误元素中包含一个正确的命名空间的子元素. 典型的, 该应用特有的元素补充或进一步限定一个已定义的元素. 从而, 该&amp;lt;error/&amp;gt;元素将包含两个或三个子元素.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq id='ixc3v1b9' type='error'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;too-many-parameters xmlns='http://example.org/ns'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message type='error' id='7h3baci9'&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;undefined-condition&lt;br /&gt;
          xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;text xml:lang='en'&lt;br /&gt;
          xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'&amp;gt;&lt;br /&gt;
      [ ... application-specific information ... ]&lt;br /&gt;
    &amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;too-many-parameters xmlns='http://example.org/ns'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个接收到它不理解的应用特有的错误条件的实体必须忽略那个条件但适当处理该错误节的其他部分.&lt;br /&gt;
&lt;br /&gt;
===扩展内容===&lt;br /&gt;
&lt;br /&gt;
尽管 message, presence, 和 IQ 节为消息,可用性,和 请求-应答 交互 提供了基本的语义, XMPP还使用XML命名空间 (见 [[RFC6120#规范引用|XML‑NAMES]]) 扩展基本的节语法来提供附加的功能.&lt;br /&gt;
&lt;br /&gt;
一个 message 或 presence 节可以包含一个或多个可选的子元素来指定扩展消息含义的内容(例如, [[RFC6120#参考文献|XEP‑0071]]所述的的消息主体的XHTML格式版本), 并且一个类型为&amp;quot;get&amp;quot;或&amp;quot;set&amp;quot;的IQ节必须包含一个这样的子元素. 这样一个子元素可以使用任何名称并且必须拥有一个命名空间声明(不同于 &amp;quot;jabber:client&amp;quot;, &amp;quot;jabber:server&amp;quot;, 或 &amp;quot;http://etherx.jabber.org/streams&amp;quot;) 来定义子元素中的数据. 这样一个子元素被成为一个 &amp;quot;扩展元素&amp;quot;. 扩展元素可能被包含在节的直属子元素中，也可能包含在任何混合的层级里面. &lt;br /&gt;
&lt;br /&gt;
类似的, &amp;quot;扩展属性&amp;quot; 也是允许的. 表示说: 一个节本身 (即, 一个 &amp;lt;iq/&amp;gt;, &amp;lt;message/&amp;gt;, 或 &amp;lt;presence/&amp;gt; 元素，并由 &amp;quot;jabber:client&amp;quot; 或 &amp;quot;jabber:server&amp;quot; 内容命名空间限定) 或这样一个节的任何子元素 (一个由内容命名空间限定的扩展元素或子元素) 也可以包含一个或多个由不同于内容命名空间或保留的 &amp;quot;http://www.w3.org/XML/1998/namespace&amp;quot;  命名空间的其他命名空间(包括所谓 &amp;quot;空命名空间&amp;quot;，如果属性没有如[[RFC6120#规范引用|XML‑NAMES]]所说的那样做前缀的话)限定的属性. &lt;br /&gt;
&lt;br /&gt;
:互操作性备注: 为了向后兼容和最大化互操作性, 生成节的实体应该不在节本身或被内容命名空间&amp;quot;jabber:client&amp;quot; 或 &amp;quot;jabber:server&amp;quot; 限定的节的子元素(例如, &amp;lt;message/&amp;gt; 节的&amp;lt;body/&amp;gt; 子元素 )中包含这类属性. &lt;br /&gt;
&lt;br /&gt;
一个扩展元素或扩展属性被称为 &amp;quot;扩展内容&amp;quot; 并且限定这样一个元素或属性的命名空间被称为&amp;quot;扩展命名空间&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:参考文献: 尽管用于XMPP的扩展命名空间通常由XMPP标准化基金会(XSF)和IETF定义, 对于定义扩展命名空间来说，没有协议或IETF标准行为是必需的, 任何个体或组织都可以自由地定义XMPP扩展.&lt;br /&gt;
&lt;br /&gt;
为了说明这些概念, 下面有些例子.&lt;br /&gt;
&lt;br /&gt;
以下的节包含一个直接子元素，它的扩展命名空间是 'jabber:iq:roster': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='juliet@capulet.com/balcony'&lt;br /&gt;
    id='h83vxa4c'&lt;br /&gt;
    type='get'&amp;gt;&lt;br /&gt;
 &amp;lt;query xmlns='jabber:iq:roster'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下节包含两个不同扩展命名空间的子元素.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;presence from='juliet@capulet.com/balcony'&amp;gt;&lt;br /&gt;
  &amp;lt;c xmlns='http://jabber.org/protocol/caps'&lt;br /&gt;
     hash='sha-1'&lt;br /&gt;
     node='http://code.google.com/p/exodus'&lt;br /&gt;
     ver='QgayPKawpkPSDYmwT/WM94uAlu0='/&amp;gt;&lt;br /&gt;
  &amp;lt;x xmlns='vcard-temp:x:update'&amp;gt;&lt;br /&gt;
    &amp;lt;photo&amp;gt;sha1-hash-of-image&amp;lt;/photo&amp;gt;&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/presence&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下节包含两个子元素, 其中一个被 &amp;quot;jabber:client&amp;quot; 或 &amp;quot;jabber:server&amp;quot; 内容命名空间限定，另一个被一个扩展命名空间限定; 而该扩展元素包含了一个由另一个扩展命名空间限定的子元素.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message to='juliet@capulet.com'&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;Hello?&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;html xmlns='http://jabber.org/protocol/xhtml-im'&amp;gt;&lt;br /&gt;
    &amp;lt;body xmlns='http://www.w3.org/1999/xhtml'&amp;gt;&lt;br /&gt;
      &amp;lt;p style='font-weight:bold'&amp;gt;Hello?&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
实现不为扩展命名空间限定的元素生成命名空间前缀在XMPP社区是常见的(在XML社区, 这个惯例有时被称为&amp;quot;免前缀标准化&amp;quot;). 无论如何, 如果一个实现生成了这类命名空间前缀那么它必须在该节本身或该节的一个子元素中包含该命名空间的声明, 而不是在流头声明(见 [[RFC6120#其它命名空间|4.8.4]]). &lt;br /&gt;
&lt;br /&gt;
路由实体(典型的是服务器)处理序列化XML节的时候应该尝试保持前缀, 但是接收实体不能(MUST NOT)依赖该前缀字符串来获取任何特定的值(对于'stream'前缀的许可, 如[[RFC6120#命名空间声明和前缀|4.8.5]]所述, 是这个规则的一个例外, 尽管它是用于流而不是节的).&lt;br /&gt;
&lt;br /&gt;
在任何实现的特定部分对任何给定的扩展命名空间的支持都是可选的. 如果一个实体不理解这样一个命名空间, 该实体的的预期行为依赖于该实体是 (1) 接收者 还是 (2) 一个路由或递送该节给接收者的服务器.&lt;br /&gt;
&lt;br /&gt;
如果一个接收者收到一个包含了不理解的元素或属性的节, 它不能(MUST NOT)尝试处理那个XML数据，而必须按以下方式处理. &lt;br /&gt;
&lt;br /&gt;
:*如果一个预定的接收者受到一个message节，它的唯一子元素由不理解的命名空间限定, 那么根据XMPP应用它必须要么忽略整个节要么返回一个节错误, 节错误应该是 &amp;lt;service-unavailable/&amp;gt; ([[RFC6120#service-unavailable|8.3.3.19]]).&lt;br /&gt;
&lt;br /&gt;
:*如果预定的接收者接收到一个presence节，它的唯一子元素由它不理解的命名空间限定, 那么它必须忽略该子元素，把它当成没有子元素的联机状态信息节.&lt;br /&gt;
&lt;br /&gt;
:*如果预定的接收者收到一个message或presence节，它包含的XML数据由它不理解的命名空间来限定, 那么它必须忽略节的由未知的命名空间限定的那部分.&lt;br /&gt;
&lt;br /&gt;
:*如果预定的接收者接收到一个类型为&amp;quot;get&amp;quot;或&amp;quot;set&amp;quot;的IQ节，它包含的一个子元素由它不理解的命名空间限定, 那么实体必须返回一个类型为&amp;quot;error&amp;quot;且错误条件为&amp;lt;service-unavailable/&amp;gt;的IQ节.&lt;br /&gt;
&lt;br /&gt;
如果一个服务器持有一个节，是用来递送到另一个实体的，并且这个节包含了一个该服务器不理解的子元素, 它必须不加修改地路由或递送该节到一个和本地账户关联的已连接客户端.&lt;br /&gt;
&lt;br /&gt;
==详细示例==&lt;br /&gt;
&lt;br /&gt;
本章的详细示例用来进一步说明本标准所定义的协议. &lt;br /&gt;
&lt;br /&gt;
===客户端-服务器示例===&lt;br /&gt;
&lt;br /&gt;
以下例子展示客户端和服务器协商XML流, 交换XML节, 和关闭已协商的流的XMPP数据流. 服务器是&amp;quot;im.example.com&amp;quot;, 该服务器要求使用TLS, 客户端验证使用SASL SCRAM-SHA-1机制，客户端帐号是&amp;lt;juliet@im.example.com&amp;gt;而密码是&amp;quot;r0m30myr0m30&amp;quot;, 并且客户端在这个流上提交了一个资源绑定请求. 我们假设在发送初始化流头之前, 客户端已经解析了_xmpp‑client._tcp.im.example.com的SRV记录并已经打开一个TCP连接到已解析的IP地址和声明的端口上. &lt;br /&gt;
&lt;br /&gt;
====TLS====&lt;br /&gt;
&lt;br /&gt;
第一步: 客户端初始化流到服务器:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;stream:stream&lt;br /&gt;
     from='juliet@im.example.com'&lt;br /&gt;
     to='im.example.com'&lt;br /&gt;
     version='1.0'&lt;br /&gt;
     xml:lang='en'&lt;br /&gt;
     xmlns='jabber:client'&lt;br /&gt;
     xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二步: 服务器发送一个应答流头给客户端来应答:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;stream:stream&lt;br /&gt;
     from='im.example.com'&lt;br /&gt;
     id='t7AMCin9zjMNwQKDnplntZPIDEI='&lt;br /&gt;
     to='juliet@im.example.com'&lt;br /&gt;
     version='1.0'&lt;br /&gt;
     xml:lang='en'&lt;br /&gt;
     xmlns='jabber:client'&lt;br /&gt;
     xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第三步: 服务器发送流特性给客户端(在这个点上只有STARTTLS扩展, 它是强制协商的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'&amp;gt;&lt;br /&gt;
       &amp;lt;required/&amp;gt;&lt;br /&gt;
     &amp;lt;/starttls&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第四步: 客户端发送STARTTLS命令给服务器:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第五步: 服务器通知客户端允许继续:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第五步(替代): 服务器通知客户端STARTTLS协商失败, 关闭XML流, 并中止TCP连接(所以, 流协商处理以不成功而结束并且双方不再进入下一步):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-tls'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第六步: 客户端和服务器尝试通过现有的TCP连接完成TLS协商(详见[[RFC6120#规范引用|TLS]]).&lt;br /&gt;
&lt;br /&gt;
第七步: 如果TLS协商成功, 客户端通过TLS保护的TCP连接初始化一个新的流到服务器:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;stream:stream&lt;br /&gt;
     from='juliet@im.example.com'&lt;br /&gt;
     to='im.example.com'&lt;br /&gt;
     version='1.0'&lt;br /&gt;
     xml:lang='en'&lt;br /&gt;
     xmlns='jabber:client'&lt;br /&gt;
     xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第七步(替代): 如果TLS协商不成功, 服务器关闭TCP连接(所以, 流协商处理以不成功而结束并且双方不再进入下一步): &lt;br /&gt;
&lt;br /&gt;
====SASL====&lt;br /&gt;
&lt;br /&gt;
第八步: 服务器发送流头给客户端并带上任何可用的流特性来应答:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;stream:stream&lt;br /&gt;
     from='im.example.com'&lt;br /&gt;
     id='vgKi/bkYME8OAj4rlXMkpucAqe4='&lt;br /&gt;
     to='juliet@im.example.com'&lt;br /&gt;
     version='1.0'&lt;br /&gt;
     xml:lang='en'&lt;br /&gt;
     xmlns='jabber:client'&lt;br /&gt;
     xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
       &amp;lt;mechanism&amp;gt;SCRAM-SHA-1-PLUS&amp;lt;/mechanism&amp;gt;&lt;br /&gt;
       &amp;lt;mechanism&amp;gt;SCRAM-SHA-1&amp;lt;/mechanism&amp;gt;&lt;br /&gt;
       &amp;lt;mechanism&amp;gt;PLAIN&amp;lt;/mechanism&amp;gt;&lt;br /&gt;
     &amp;lt;/mechanisms&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第九步: 客户端选择一个验证机制(在这个场景中, 是 SCRAM-SHA-1), 包含初始化应答数据:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;auth xmlns=&amp;quot;urn:ietf:params:xml:ns:xmpp-sasl&amp;quot;&lt;br /&gt;
         mechanism=&amp;quot;SCRAM-SHA-1&amp;quot;&amp;gt;&lt;br /&gt;
     biwsbj1qdWxpZXQscj1vTXNUQUF3QUFBQU1BQUFBTlAwVEFBQUFBQUJQVTBBQQ==&lt;br /&gt;
   &amp;lt;/auth&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解码之后的 base 64 数据是 &amp;quot;n,,n=juliet,r=oMsTAAwAAAAMAAAANP0TAAAAAABPU0AA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
第十步: 服务器发送挑战:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;challenge xmlns=&amp;quot;urn:ietf:params:xml:ns:xmpp-sasl&amp;quot;&amp;gt;&lt;br /&gt;
     cj1vTXNUQUF3QUFBQU1BQUFBTlAwVEFBQUFBQUJQVTBBQWUxMjQ2OTViLTY5Y&lt;br /&gt;
     TktNGRlNi05YzMwLWI1MWIzODA4YzU5ZSxzPU5qaGtZVE0wTURndE5HWTBaaT&lt;br /&gt;
     AwTmpkbUxUa3hNbVV0TkRsbU5UTm1ORE5rTURNeixpPTQwOTY=&lt;br /&gt;
   &amp;lt;/challenge&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解码后的 base 64 数据是 &amp;quot;r=oMsTAAwAAAAMAAAANP0TAAAAAABPU0AAe124695b-69a9-4de6-9c30-b51b3808c59e,s=NjhkYTM0MDgtNGY0Zi00NjdmLTkxMmUtNDlmNTNmNDNkMDMz,i=4096&amp;quot; (实际数据中是没有换行的).&lt;br /&gt;
&lt;br /&gt;
第十一步: 客户端发送一个应答:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;response xmlns=&amp;quot;urn:ietf:params:xml:ns:xmpp-sasl&amp;quot;&amp;gt;&lt;br /&gt;
     Yz1iaXdzLHI9b01zVEFBd0FBQUFNQUFBQU5QMFRBQUFBQUFCUFUwQUFlMTI0N&lt;br /&gt;
     jk1Yi02OWE5LTRkZTYtOWMzMC1iNTFiMzgwOGM1OWUscD1VQTU3dE0vU3ZwQV&lt;br /&gt;
     RCa0gyRlhzMFdEWHZKWXc9&lt;br /&gt;
   &amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解码后的 base 64 数据是 &amp;quot;c=biws,r=oMsTAAwAAAAMAAAANP0TAAAAAABPU0 AAe124695b-69a9-4de6-9c30-b51b3808c59e,p=UA57tM/ SvpATBkH2FXs0WDXvJYw=&amp;quot; (实际数据中是没有换行的).&lt;br /&gt;
&lt;br /&gt;
第十二步: 服务器通知客户端成功了, 并且包含了额外的数据:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     dj1wTk5ERlZFUXh1WHhDb1NFaVc4R0VaKzFSU289&lt;br /&gt;
   &amp;lt;/success&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解码后的 base 64 数据是 &amp;quot;v=pNNDFVEQxuXxCoSEiW8GEZ+1RSo=&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
第十二步(替代): 服务器返回一个SASL错误给客户端(所以, 流协商处理以不成功结束并且双方不再进行下一步):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
     &amp;lt;not-authorized/&amp;gt;&lt;br /&gt;
   &amp;lt;/failure&amp;gt;&lt;br /&gt;
   &amp;lt;/stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第十三步: 客户端初始化一个新的流到服务器:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;stream:stream&lt;br /&gt;
     from='juliet@im.example.com'&lt;br /&gt;
     to='im.example.com'&lt;br /&gt;
     version='1.0'&lt;br /&gt;
     xml:lang='en'&lt;br /&gt;
     xmlns='jabber:client'&lt;br /&gt;
     xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====资源绑定====&lt;br /&gt;
&lt;br /&gt;
第十四步: 服务器发送一个流头到客户端并带上支持的特性(在这个场景中, 是资源绑定)来应答:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;stream:stream&lt;br /&gt;
     from='im.example.com'&lt;br /&gt;
     id='gPybzaOzBmaADgxKXu9UClbprp0='&lt;br /&gt;
     to='juliet@im.example.com'&lt;br /&gt;
     version='1.0'&lt;br /&gt;
     xml:lang='en'&lt;br /&gt;
     xmlns='jabber:client'&lt;br /&gt;
     xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在被通知资源绑定是强制协商之后, 客户端需要绑定一个资源到流; 这里我们假定客户端提交了一个自然人可读的文本字符串.&lt;br /&gt;
&lt;br /&gt;
第十五步: 客户端绑定一个资源:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;iq id='yhc13a95' type='set'&amp;gt;&lt;br /&gt;
     &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'&amp;gt;&lt;br /&gt;
       &amp;lt;resource&amp;gt;balcony&amp;lt;/resource&amp;gt;&lt;br /&gt;
     &amp;lt;/bind&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第十六步: 服务器接受提交的资源部分并通知客户端资源绑定成功:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;iq id='yhc13a95' type='result'&amp;gt;&lt;br /&gt;
     &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'&amp;gt;&lt;br /&gt;
       &amp;lt;jid&amp;gt;&lt;br /&gt;
         juliet@im.example.com/balcony&lt;br /&gt;
       &amp;lt;/jid&amp;gt;&lt;br /&gt;
     &amp;lt;/bind&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第十六步(替代): 服务器返回错误给客户端(所以, 流协商处理以不成功结束并且双方不再进入下一步):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;iq id='yhc13a95' type='error'&amp;gt;&lt;br /&gt;
     &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
       &amp;lt;conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
     &amp;lt;/error&amp;gt;&lt;br /&gt;
   &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====节交换====&lt;br /&gt;
&lt;br /&gt;
现在客户端被允许通过协商好的流发送XML节了.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;message from='juliet@im.example.com/balcony'&lt;br /&gt;
            id='ju2ba41c'&lt;br /&gt;
            to='romeo@example.net'&lt;br /&gt;
            type='chat'&lt;br /&gt;
            xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;Art thou not Romeo, and a Montague?&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果必要, 发送者的服务器和预定的接收者的服务器协商XML流(见[[RFC6120#服务器-服务器示例|9.2]]).&lt;br /&gt;
&lt;br /&gt;
预定的接收者应答, 并且消息被递送到客户端.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
E: &amp;lt;message from='romeo@example.net/orchard'&lt;br /&gt;
            id='ju2ba41c'&lt;br /&gt;
            to='juliet@im.example.com/balcony'&lt;br /&gt;
            type='chat'&lt;br /&gt;
            xml:lang='en'&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;Neither, fair saint, if either thee dislike.&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
客户端随后可以通过这个流继续发送和接收不限数量的XML节.&lt;br /&gt;
&lt;br /&gt;
====关闭====&lt;br /&gt;
&lt;br /&gt;
不想发送更多的消息, 客户端关闭它到服务器的流,不在等待来自服务器的入站数据了.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
C: &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
和[[RFC6120#关闭流|4.4]]一致, 服务器可能发送额外的数据给客户端然后才关闭到该客户端的流.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S: &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
客户端现在发送一个 TLS close_notify 警告, 从服务器接收到一个 close_notify 警告应答, 然后中止当前的TCP连接.&lt;br /&gt;
&lt;br /&gt;
===服务器-服务器示例===&lt;br /&gt;
&lt;br /&gt;
以下示例展示一个服务器和对端服务器协商XML流，交换XML节, 和关闭已协商的流的数据流. 初始化服务器(&amp;quot;Server1&amp;quot;)是im.example.com; 接收服务器(&amp;quot;Server2&amp;quot;)是example.net 并且要求使用TLS; im.example.com递交一个证书并通过SASL EXTERNAL机制验证. 假定在发送初始化流头之前, Server1已经解析了一个SRV记录_xmpp-server._tcp.example.net并且已经打开了一个TCP连接到已解析的IP地址的声明的端口上. 注意Server1怎样声明内容命名空间&amp;quot;jabber:server&amp;quot;作为缺省的命名空间并为流相关的元素使用前缀, 反之Server2使用免前缀标准. &lt;br /&gt;
&lt;br /&gt;
====TLS====&lt;br /&gt;
&lt;br /&gt;
第一步: Server1初始化流到Server2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S1: &amp;lt;stream:stream&lt;br /&gt;
      from='im.example.com'&lt;br /&gt;
      to='example.net'&lt;br /&gt;
      version='1.0'&lt;br /&gt;
      xmlns='jabber:server'&lt;br /&gt;
      xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二步: Server2发送一个应答流头到Server1来应答:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S2: &amp;lt;stream&lt;br /&gt;
      from='example.net'&lt;br /&gt;
      id='hTiXkW+ih9k2SqdGkk/AZi0OJ/Q='&lt;br /&gt;
      to='im.example.com'&lt;br /&gt;
      version='1.0'&lt;br /&gt;
      xmlns='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第三步: Server2发送流特性给Server1(在这个点上只有STARTTLS扩展, 它是强制协商的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S2: &amp;lt;features xmlns='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
      &amp;lt;starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'&amp;gt;&lt;br /&gt;
        &amp;lt;required/&amp;gt;&lt;br /&gt;
      &amp;lt;/starttls&amp;gt;&lt;br /&gt;
    &amp;lt;/features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第四步: Server1发送STARTTLS指令给Server2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S1: &amp;lt;starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第五步: Server2通知Server1它被允许继续:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S2: &amp;lt;proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第五步(替代): Server2通知Server1 STARTTLS协商失败了, 关闭流, 并中止TCP连接(于是, 流协商过程以不成功结束并且双方不再进行下一步):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S2: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-tls'/&amp;gt;&lt;br /&gt;
    &amp;lt;/stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第六步: Server1和Server2尝试通过TCP完成TLS协商(详见[[RFC6120#规范引用|TLS]]).&lt;br /&gt;
&lt;br /&gt;
第七步: 如果TLS协商成功了, Server1在受TLS保护的TCP连接上初始化一个新流到Server2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S1: &amp;lt;stream:stream&lt;br /&gt;
      from='im.example.com'&lt;br /&gt;
      to='example.net'&lt;br /&gt;
      version='1.0'&lt;br /&gt;
      xmlns='jabber:server'&lt;br /&gt;
      xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第七步(替代): 如果TLS协商不成功, Server2关闭TCP连接(所以, 流协商过程以不成功结束并且双方不再进行下一步).&lt;br /&gt;
&lt;br /&gt;
====SASL====&lt;br /&gt;
&lt;br /&gt;
第八步: Server2发送一个应答流头给Server1并带上可用的流特性(包括优先的SASL EXTERNAL机制):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S2: &amp;lt;stream&lt;br /&gt;
      from='example.net'&lt;br /&gt;
      id='RChdjlgj/TIBcbT9Keu31zDihH4='&lt;br /&gt;
      to='im.example.com'&lt;br /&gt;
      version='1.0'&lt;br /&gt;
      xmlns='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S2: &amp;lt;features xmlns='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
      &amp;lt;mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
        &amp;lt;mechanism&amp;gt;EXTERNAL&amp;lt;/mechanism&amp;gt;&lt;br /&gt;
      &amp;lt;/mechanisms&amp;gt;&lt;br /&gt;
    &amp;lt;/features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第九步: Server1选择EXTERNAL机制(包含一个&amp;quot;=&amp;quot;的空应答):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S1: &amp;lt;auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&lt;br /&gt;
          mechanism='EXTERNAL'&amp;gt;=&amp;lt;/auth&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第十步: Server2返回成功:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S2: &amp;lt;success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第十步(替代): Server2通知Server1验证失败了(所以, 流协商过程以不成功结束并且双方不再进行下一步):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S2: &amp;lt;failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&amp;gt;&lt;br /&gt;
      &amp;lt;not-authorized/&amp;gt;&lt;br /&gt;
    &amp;lt;/failure&amp;gt;&lt;br /&gt;
    &amp;lt;/stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第十一步: Server1初始化一个新流到Server2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S1: &amp;lt;stream:stream&lt;br /&gt;
      from='im.example.com'&lt;br /&gt;
      to='example.net'&lt;br /&gt;
      version='1.0'&lt;br /&gt;
      xmlns='jabber:server'&lt;br /&gt;
      xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第十二步: Server2发送一个流头给并带上任何附加的特性(或, 在这个例子中, 一个空的特性元素)来应答:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S2: &amp;lt;stream&lt;br /&gt;
      from='example.net'&lt;br /&gt;
      id='MbbV2FeojySpUIP6J91qaa+TWHM='&lt;br /&gt;
      to='im.example.com'&lt;br /&gt;
      version='1.0'&lt;br /&gt;
      xmlns='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
S2: &amp;lt;features xmlns='http://etherx.jabber.org/streams'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====节交换====&lt;br /&gt;
&lt;br /&gt;
现在Server1被允许通过已协商的从im.example.com到example.net的流发送XML节给Server2; 这里我们假定被传输的节就是前面演示的那些客户端-服务器通讯的节, 尽管是在一个服务器-服务器由'jabber:server'命名空间限定的流上.&lt;br /&gt;
&lt;br /&gt;
Server1发送XML节给Server2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S1: &amp;lt;message from='juliet@im.example.com/balcony'&lt;br /&gt;
             id='ju2ba41c'&lt;br /&gt;
             to='romeo@example.net'&lt;br /&gt;
             type='chat'&lt;br /&gt;
             xml:lang='en'&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;Art thou not Romeo, and a Montague?&amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====关闭====&lt;br /&gt;
&lt;br /&gt;
想不再发送更多消息, Server1关闭它到Server2的流但是等待从Server2的入站数据. (实践中, 流大部分时候保持打开一段时间, 因为Server1和Server2不是立刻知道流是否需要更多通讯.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S1: &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
和建议的流关闭握手一致, Server2同样关闭流:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
S2: &amp;lt;/stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Server1现在发送一个TLS close_notify警告, 从Server2接收一个close_notify警告应答, 然后中止当前的TCP连接.&lt;br /&gt;
&lt;br /&gt;
==处理XML节的服务器规则==&lt;br /&gt;
&lt;br /&gt;
每个服务器实现将包含它自己的处理接受的节的逻辑. 这写逻辑决定服务器是需要路由一个给定的节到其他域, 还是把它递送到一个本地实体(典型的是一个和本地帐号相关联的已连接客户端), 或者直接由服务器本身处理它. 本章提供处理XML节的通用规则. 然而, 特殊的XMPP应用可以定义递送规则来修改或补充以下规则(例如, 定义于[[RFC6121|XMPP‑IM]]的用于即时消息和联机状态信息应用的一系列递送规则). &lt;br /&gt;
&lt;br /&gt;
===顺序处理===&lt;br /&gt;
&lt;br /&gt;
一个XMPP服务器必须确保它从一个已连接的客户端或远端服务器的给定的入站流上收到的节和其他XML元素的顺序处理.&lt;br /&gt;
&lt;br /&gt;
顺序处理适用于 (a) 任何用来协商和管理XML流的XML元素, 和 (b) 所有XML节, 包括但不限于以下情况:&lt;br /&gt;
&lt;br /&gt;
:#由一个客户端发送到它的服务器或它自己的纯JID的由服务器直接处理的节(例如, [[RFC6121|XMPP‑IM]]所述的获取好友名册和初始化出席信息的顺序处理).&lt;br /&gt;
:#由一个已连接的客户端发送的节并且是用来递送到另一个和该服务器相关的实体(例如, 从地址 &amp;lt;juliet@im.example.com&amp;gt; 发到 &amp;lt;nurse@im.example.com&amp;gt; 的节). 服务器必须确保按照从发送的客户端的入站流上接收到节的顺序来递送那些到预期接收者的节, 对递送目的接收者地址为纯JID和全JID的节等同对待.&lt;br /&gt;
:#由一个已连接的客户端发送的节并且是用来递送到一个位于远端服务器上的实体(例如, 从地址 &amp;lt;juliet@im.example.com&amp;gt; 发到 &amp;lt;romeo@example.net&amp;gt;). 路由的服务器必须确保按照从发送的客户端的入站流上接收到节的顺序来路由那些到预期接收者的节, 对路由目的接收者地址为纯JID和全JID的节等同对待. 为了帮助确保顺序处理, 路由服务器必须通过单一的到远端域的出站流来路由这些节, 而不是在一个服务器－服务器流上发送一些节而在另一个服务器－服务器流上发送另一些节.&lt;br /&gt;
:#从一个服务器路由到另一个服务器的递送到远端服务器的一个相关实体的节(例如, 从地址 &amp;lt;juliet@im.example.com&amp;gt; 发到 &amp;lt;romeo@example.net&amp;gt; 并且由 &amp;lt;im.example.com&amp;gt; 在一个服务器－服务器流上路由到 &amp;lt;example.net&amp;gt;). 递送服务器必须确保按照它从路由服务器的入站流上接收到的顺序来递送节, 对递送目的接收者地址为纯JID和全JID的节同等对待.&lt;br /&gt;
:#由一个服务器发送到另一个服务器用于远端域直接处理的节(例如, 从 &amp;lt;im.example.com&amp;gt; 发到 &amp;lt;example.net&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
如果服务器对于特定请求的处理对它接下来可能从入站流收到的数据的处理有影响(例如, 强制性的通讯策略), 它必须挂起接下来的数据的处理，直到它已经处理完该请求.&lt;br /&gt;
&lt;br /&gt;
顺序处理只适用于单一入站流. 所以, 服务器不负责保证它从相同本地帐号(例如, 通过两个不同入站流从&amp;lt;juliet@im.example.com/balcony&amp;gt; 和 &amp;lt;juliet@im.example.com/chamber&amp;gt;接收到的节) 或相同的远端域(例如, 由一个远端域通过两个不同的入站流进行的流协商; 然而, 服务器可以以&amp;lt;conflict/&amp;gt;流错误来关闭该流([[RFC6120#conflict|4.9.3.3]]),如果远端服务器尝试协商多个流, 详见[[RFC6120#conflict|4.9.3.3]])通过多个入站流接收到的数据的相干性.&lt;br /&gt;
&lt;br /&gt;
===一般注意事项===&lt;br /&gt;
&lt;br /&gt;
在顶层, 服务器处理XML节有三个主要的注意事项, 它们有时候相左但需要一个一致的办法来管理:&lt;br /&gt;
&lt;br /&gt;
:#如果可能最好把一个节递送到预定的接收者.&lt;br /&gt;
:#如果一个节不能被递送, 通知发送者是有帮助的.&lt;br /&gt;
:#促成目录获取攻击([[RFC6120#目录获取|13.11]])和联机状态泄露([[RFC6120#联机状态信息|13.10.2]])是不好的.&lt;br /&gt;
&lt;br /&gt;
对于可能的和递送相关的攻击, 以下几点需要牢记:&lt;br /&gt;
&lt;br /&gt;
:#从攻击者的视角来看, 在服务器 (i) 递送节或存储成离线消息稍后递送(见[{RFC6121|XMPP‑IM]]) 和 (ii) 安静地忽略它(因为在任何那种用例之下都不会立刻返回一个错误)之间是否有任何一点有效的不同; 因此, 在服务器递送一个节或吧这个节离线存储稍后递送的场景中, 如果那个帐号不存在，它需要安静地忽略这个节.&lt;br /&gt;
:#服务器如何处理发送到一个受到目录获取影响的纯JID&amp;lt;localpart@domainpart&amp;gt;的节, 因为如果服务器根据一个给定的纯JID是否有帐号来做出不同应答，那么攻击者可以确定一个帐号是否存在.&lt;br /&gt;
:#服务器如何处理发送到一个受到出席信息泄露影响的全JID的节, 因为可以发送请求到多个全JID上并且根据该用户是否有一个全JID的设备在线来收到不同的应答. 使用随机的资源部分(是由客户端还是服务器生成参见[[RFC6120#资源绑定|第七章]])明显减轻了这个攻击, 所以在某种程度上它被关心的程度地狱目录获取攻击.&lt;br /&gt;
&lt;br /&gt;
很自然, 如果收到从一个用户的服务器返回的错误的实体已经知道用户的出席信息或被授权知道它，那么出席信息就没有被泄露(例如, 所谓出席信息订阅或直接的出席信息), 如果服务器返回一个错误给一个已经知道某用户存在的实体，那么该服务器没有受到目录获取攻击(例如, 因为实体在用户的联系人列表里); 这些事情的更完整的讨论见[[RFC6121|XMPP‑IM]].&lt;br /&gt;
&lt;br /&gt;
===没有'to'地址===&lt;br /&gt;
&lt;br /&gt;
如果节没有'to'属性, 服务器必须代表发送它的实体来直接处理它, 这里&amp;quot;直接处理它&amp;quot;的含义依赖于这个节是 message, presence, 还是 IQ. 因为从其它服务器收到的所有节必须拥有'to'属性, 这个规则只适用于从连接到该服务器的本地实体(通常是一个客户端)收到的节. &lt;br /&gt;
&lt;br /&gt;
====Message====&lt;br /&gt;
&lt;br /&gt;
如果该服务器接收到一个没有'to'属性的message节, 它必须把这个消息当作'to'地址是发送实体的纯JID &amp;lt;localpart@domainpart&amp;gt; 那样来处理.&lt;br /&gt;
&lt;br /&gt;
====Presence====&lt;br /&gt;
&lt;br /&gt;
如果该服务器接收到一个没有'to'属性的presence节, 它必须广播这个节到订阅了发送者实体的出席信息的实体, 如果适用的话([[RFC6121|XMPP‑IM]]定义了出席信息应用的这类广播的语义).&lt;br /&gt;
&lt;br /&gt;
====IQ====&lt;br /&gt;
&lt;br /&gt;
如果服务器接收到一个没有'to'属性的IQ节, 它必须代表发送这个节的帐户处理这个节, 如下:&lt;br /&gt;
&lt;br /&gt;
:#如果IQ节的类型为&amp;quot;get&amp;quot;或&amp;quot;set&amp;quot;并且服务器理解限定载荷的命名空间, 该服务器必须代表发送实体处理该节或返回一个适当的错误给发送实体. 尽管&amp;quot;处理&amp;quot;的含义是由限定的命名空间的语义来决定的, 通常服务器将返回一个适当的类型为&amp;quot;result&amp;quot;或&amp;quot;error&amp;quot;的IQ节来应答类型为&amp;quot;get&amp;quot;或&amp;quot;set&amp;quot;的节, 应答就好像服务器就是发送实体的纯JID那样. 作为一个例子, 如果发送实体发送一个类型为&amp;quot;get&amp;quot;而载荷由'jabber:iq:roster'命名空间限定(参见[[RFC6121|XMPP‑IM]])的IQ节, 那么服务器将返回和该发送实体的纯JID相关的roster给请求roster的发送实体的特定资源.&lt;br /&gt;
:#如果IQ节的类型为&amp;quot;get&amp;quot;或&amp;quot;set&amp;quot;并且服务器不理解限定该载荷的命名空间, 服务器必须返回一个错误给发送实体, 这个错误必须是&amp;lt;service-unavailable/&amp;gt;.&lt;br /&gt;
:#如果IQ节的类型是&amp;quot;error&amp;quot;或&amp;quot;result&amp;quot;, 该服务器必须根据该IQ相关的载荷或类型是&amp;quot;get&amp;quot;或类型是&amp;quot;set&amp;quot;处理这个error或result(如果没有相关的节, 服务器必须忽略该error或result节).&lt;br /&gt;
&lt;br /&gt;
===远程域===&lt;br /&gt;
&lt;br /&gt;
如果JID的域部分包含一个'to'属性但是和该服务器配置的任何一个完整合格域名(FQDNs)都不匹配, 该服务器应该尝试路由该节到远端域(服从本地服务器关于域间通讯的规定和安全策略, 因为对于任何给定的部署来说这类通讯是可选的). 如下章所述, 有两个可能的用例.&lt;br /&gt;
&lt;br /&gt;
:安全警告: 这些规则仅适用于客户端-服务器流. 如[[RFC6120#服务器-服务器流|8.1.1.2]]所述, 如果'to'属性里的JID的域部分和接收服务器的完全合格域名(FQDN)不匹配，那么服务器不能(MUST NOT)在一个服务器-服务器流上接收节.&lt;br /&gt;
&lt;br /&gt;
====现有流====&lt;br /&gt;
&lt;br /&gt;
如果一个服务器-服务器流已经存在于两个域之间, 发送者的服务器应该尝试在现有的流上为远端服务器路由这个节到授权服务器.&lt;br /&gt;
&lt;br /&gt;
====无现有流====&lt;br /&gt;
&lt;br /&gt;
如果在两个域之间无现有的服务器-服务器流, 发送者的服务器将如下处理:&lt;br /&gt;
&lt;br /&gt;
:#解析远端域的完整合格域名(FQDN)(如[[RFC6120#DNS的使用|13.9.2]]所述).&lt;br /&gt;
:#在两个域之间协商服务器-服务器流(如[[RFC6120#STARTTLS协商|第五章]]和[[RFC6120#SASL协商|第六章]]所述).&lt;br /&gt;
:#在新建的流上为远端域路由该节到授权服务器.&lt;br /&gt;
&lt;br /&gt;
====错误处理====&lt;br /&gt;
&lt;br /&gt;
如果一个到预期接收者服务器的节的路由不成功, 发送者的服务器必须返回一个错误给发送者. 如果远端域的解析不成功, 节错误必须是 &amp;lt;remote-server-not-found/&amp;gt; ([[RFC6120#remote-server-not-found|8.3.3.16]]). 如果成功解析但是流无法协商, 节错误必须是&amp;lt;remote-server-timeout/&amp;gt; ([[RFC6120#remote-server-timeout|8.3.3.17]]).&lt;br /&gt;
&lt;br /&gt;
如果和期望的接收者的服务器的流协商成功了但是远端服务器不能递送该节到接收者, 远端服务器必须通过发送者的服务器返回一个适当的错误给发送者.&lt;br /&gt;
&lt;br /&gt;
===本地域===&lt;br /&gt;
&lt;br /&gt;
如果包含在'to'属性中的JID的域部分和该服务器的完整合格域名(FQDN)匹配, 该服务器必须首先确定该FQDN是由服务器本身还是由特定的本地服务来提供服务. 如果是后者, 该服务器必须路由该节到那个服务. 如果是前者, 该服务器必须执行接下来的动作. 无论如何, 该服务器不能(MUST NOT)路由或&amp;quot;转发&amp;quot;该节到另一个域, 因为处理所有'to'地址的域部分和该服务器的已配置FQDN匹配的节是服务器的责任(除此之外, 这还可以防止循环处理).&lt;br /&gt;
&lt;br /&gt;
====域部分====&lt;br /&gt;
&lt;br /&gt;
如果包含在'to'属性里的JID的格式为&amp;lt;domainpart&amp;gt;, 那个么该服务器必须要么 (a) 根据节类型做适当的处理，要么 (b) 返回一个错误节给发送者.&lt;br /&gt;
&lt;br /&gt;
====域部分/资源部分====&lt;br /&gt;
&lt;br /&gt;
如果包含在'to'属性中的JID的格式为&amp;lt;domainpart/resourcepart&amp;gt;, 那么该服务器必须要么 (a) 根据节类型做适当处理，要么 (b) 返回一个节错误给发送者.&lt;br /&gt;
&lt;br /&gt;
====本地部分@域部分====&lt;br /&gt;
&lt;br /&gt;
这种类型的地址通常和该服务器上的一个帐号相关. 以下规则提供一些通用方针; 更多即时消息和出席信息场景中的详细规则参见[[RFC6121|XMPP‑IM]].&lt;br /&gt;
&lt;br /&gt;
=====没有此用户=====&lt;br /&gt;
&lt;br /&gt;
如果没有本地帐号和&amp;lt;localpart@domainpart&amp;gt;相关, 节被如何处理取决于节的类型.&lt;br /&gt;
&lt;br /&gt;
:#对于message节 该服务器必须要么 (a) 安静地忽略该节，要么 (b) 返回一个&amp;lt;service-unavailable/&amp;gt;节错误([[RFC6120#service-unavailable|8.3.3.19]])给发送者.&lt;br /&gt;
:#对于presence节, 该服务器应该忽略该节(或如[[RFC6121|XMPP‑IM]]所述那样表现).&lt;br /&gt;
:#对于IQ节, 该服务器必须返回一个&amp;lt;service-unavailable/&amp;gt;节错误([[RFC6120#service-unavailable|8.3.3.19]])给发送者.&lt;br /&gt;
&lt;br /&gt;
=====用户存在=====&lt;br /&gt;
&lt;br /&gt;
如果包含在'to'属性中的JID的格式为&amp;lt;localpart@domainpart&amp;gt;, 节如何被处理取决于节类型.&lt;br /&gt;
&lt;br /&gt;
:#对于message节, 如果该帐号存在至少一个已连接的资源那么该服务器应该递送这个节到至少一个已连接的资源. 如果不存在已连接的资源，那么该服务器必须要么 (a) 离线存储该message等该帐号下次有已连接资源时递送，要么 (b) 返回一个&amp;lt;service-unavailable/&amp;gt;节错误([[RFC6120#service-unavailable|8.3.3.19]]).&lt;br /&gt;
:#对于presence节, 如果存在一个已连接的资源曾经发送过初始presence (即, 有一个如[[RFC6121|XMPP‑IM]]所述的&amp;quot;presence会话&amp;quot;)，那么该服务器应该递送该节到那个资源. 如果不存在已连接的资源，那么服务器应该忽略该节(或如[[RFC6121|XMPP‑IM]]那样表现).&lt;br /&gt;
:#对于IQ节, 服务器必须直接代表预期的接收者来处理它.&lt;br /&gt;
&lt;br /&gt;
====本地部分@域部分/资源部分====&lt;br /&gt;
&lt;br /&gt;
如果包含在'to'属性中的JID的格式为&amp;lt;localpart@domainpart/resourcepart&amp;gt;而且该用户存在但是没有已连接的资源能和该全JID精确匹配, 该节应该如[[RFC6120#用户存在|10.5.3.2]]所述的JID格式为&amp;lt;localpart@domainpart&amp;gt;时那样地被处理.&lt;br /&gt;
&lt;br /&gt;
如果包含在'to'属性中的JID的格式为&amp;lt;localpart@domainpart/resourcepart&amp;gt;, 该用户存在, 并且有一个已连接的资源和该全JID精确地匹配, 该服务器必须递送该节到那个已连接的资源.&lt;br /&gt;
&lt;br /&gt;
==XML用法==&lt;br /&gt;
===XML限制===&lt;br /&gt;
&lt;br /&gt;
XMPP定义了一类名为XML流的数据对象以及处理XML流的计算机程序的行为. XMPP是一个应用配置或[[RFC6120#规范引用|XML]]的受限格式, 并且一个完整的XML流(包括开始和结束的流标签)就是一个合格的XML文档.&lt;br /&gt;
&lt;br /&gt;
然而, XMPP不处理XML文档而是处理XML流. 因为XMPP不需要随意解析以及完成XML文档, XMPP不需要支持[[RFC6120#规范引用|XML]]的完整功能集. 此外, XMPP使用XML来定义协议数据结构和扩展，用于网络实体之间的结构化交互，所以坚持那些[[RFC6120#规范引用|XML‑GUIDE]]中关于在IETF协议中对XML使用的限制中提供的建议. 结果是, XML的以下特性在XMPP中被禁止:&lt;br /&gt;
&lt;br /&gt;
:*注释(定义于[[RFC6120#规范引用|XML]]的2.5节)&lt;br /&gt;
:*处理指令(其中的2.6节)&lt;br /&gt;
:*内部或外部的DTD子集(其中的2.8节)&lt;br /&gt;
:*预定义实体的例外(其中的4.6节)的内部或外部的实体参考(其中的4.2节)&lt;br /&gt;
&lt;br /&gt;
一个XMPP实现对这些特性必须做出如下的表现:&lt;br /&gt;
&lt;br /&gt;
:#XMPP实现不能(MUST NOT)插入匹配这类特性的字符串到一个XML流中.&lt;br /&gt;
:#如果一个XMPP实现从XML流收到匹配此类特性的字符串, 它必须以一个流错误来关闭流, 这个错误应该是&amp;lt;restricted-xml/&amp;gt;([[RFC6120#restricted-xml|4.9.3.18]]), 不过某些现有的实现发送的是&amp;lt;bad-format/&amp;gt;([[RFC6120#bad-format|4.9.3.1]]).&lt;br /&gt;
&lt;br /&gt;
===XML命名空间名字和前缀===&lt;br /&gt;
&lt;br /&gt;
XML命名空间(见[[RFC6120#规范引用|XML‑NAMES]])被XMPP流用来创建数据所有权的严格界限. 命名空间的基本功能是把结构化地混合在一起的XML元素的不同词汇区分开来. 确保XMPP流感知命名空间使得任何允许的XML在XMPP中都能以任何数据元素被结构化地混合在一起. XMPP对于XML命名空间名字和前缀的特有规则定义于[[RFC6120#XML命名空间|4.8]](对于XML流)和[[RFC6120#扩展内容|8.4]](对于XML节).&lt;br /&gt;
&lt;br /&gt;
===良好格式===&lt;br /&gt;
&lt;br /&gt;
在XML中, 有两种良好格式:&lt;br /&gt;
&lt;br /&gt;
:* 符合[[RFC6120#规范引用|XML]]的2.1节中&amp;quot;良好格式&amp;quot;定义的&amp;quot;XML良好格式&amp;quot;.&lt;br /&gt;
:* 符合[[RFC6120#规范引用|XML‑NAMES]]的第七章中&amp;quot;命名空间的良好格式&amp;quot;的&amp;quot;命名空间良好格式&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
以下规则适用:&lt;br /&gt;
&lt;br /&gt;
:# XMPP实体不能(MUST NOT)生成不符合XML良好格式的数据.&lt;br /&gt;
:# XMPP实体不能(MUST NOT)接受不符合XML良好格式的数据; 反之它必须以&amp;lt;not-well-formed/&amp;gt;流错误([[RFC6120#not-well-formed|4.9.3.13]])来关闭接收到那个数据的流.&lt;br /&gt;
:# XMPP实体不能(MUST NOT)生成不符合命名空间良好格式的数据.&lt;br /&gt;
:# XMPP实体不能(MUST NOT)接受不符合命名空间良好格式的数据(特别是, XMPP服务器不能(MUST NOT)路由或递送不符合命名空间良好格式的数据); 反之它必须要么返回一个&amp;lt;not-acceptable/&amp;gt;节错误([[RFC6120#not-acceptable|8.3.3.9]])要么以一个&amp;lt;not-well-formed/&amp;gt;流错误([[RFC6120#not-well-formed|4.9.3.13]])来关闭该流, 这里最好是以一个流错误关闭该流，因为i接受这类数据可能会把一个实体暴露给特定的拒绝服务攻击.&lt;br /&gt;
&lt;br /&gt;
:互操作性备注: 因为这些约束是在[[RFC3920]]下就已经确认的, 有可能基于那个协议的实现会发送一些不遵守这些约束的数据.&lt;br /&gt;
&lt;br /&gt;
===验证===&lt;br /&gt;
&lt;br /&gt;
服务器不负责确保递送到一个已连接的客户端或路由到一个对端服务器的XML数据是有效的, 符合[[RFC6120#规范引用|XML]]的2.8节中提供的&amp;quot;有效&amp;quot;的定义. 一个实现可以选择只接受或发送已经通过本文提供的schema被显式地验证过的数据, 但是这一行为是可选的. 建议客户端不要依靠这个能力来发送不符合schema的数据, 并且应该忽略入站XML流中任何不符的元素或属性.&lt;br /&gt;
&lt;br /&gt;
:参考文献: 术语&amp;quot;有效&amp;quot;(&amp;quot;valid&amp;quot;)和&amp;quot;良好格式&amp;quot;(&amp;quot;well-formed&amp;quot;)在XML中是不同的.&lt;br /&gt;
&lt;br /&gt;
===包含XML声明===&lt;br /&gt;
&lt;br /&gt;
在发送一个流头之前, 实现应该发送一个XML声明(和从[[RFC6120#规范引用|XML]]产生的&amp;quot;XMLDecl&amp;quot;匹配). 应用必须遵从[[RFC6120#规范引用|XML]]提供的关于XML声明的格式和哪些场景需要包含XML声明的规则.&lt;br /&gt;
&lt;br /&gt;
因为外部标记声明在XMPP中是被禁止的(如[[RFC6120#XML约束|11.1]]所述), 独立的文档声明(和来自[[RFC6120#规范引用|XML]]产生的&amp;quot;SDDecl&amp;quot;)将是无意义的并且因此不能(MUST NOT)被包含在一个在XML流上发送的XML声明中. 如果XMPP实体接收到一个包含了独立的文档声明的XML声明并且值为&amp;quot;no&amp;quot;, 该实体必须要么忽略这个独立的文档声明，要么以一个流错误来关闭这个流, 这个流错误应该是&amp;lt;restricted-xml/&amp;gt;([[RFC6120#restricted-xml|4.9.3.18]]).&lt;br /&gt;
&lt;br /&gt;
===字符编码===&lt;br /&gt;
&lt;br /&gt;
实现必须支持通用字符集[[RFC6120#规范引用|UCS2]]字符串的UTF-8改造, 定义于[[RFC6120#规范引用|CHARSETS]]和定义于[[RFC6120#规范引用|UTF‑8]]中的要保持一致性. 实现不能(MUST NOT)试图使用其他编码. 如果一方在一个XML流中探测到另一方试图发送编码不是UTF-8的XML数据, 它必须以一个流错误关闭这个流, 这个流错误应该是&amp;lt;unsupported-encoding/&amp;gt;([[RFC6120#unsupported-encoding|4.9.3.22]]), 虽然某些现有的实现发送的是&amp;lt;bad-format/&amp;gt;([[RFC6120#bad-format|4.9.3.1]]).&lt;br /&gt;
&lt;br /&gt;
因为对于XMPP实现来说支持所有并且仅有UTF-8编码是强制性的并且因为UTF-8总是有相同的字节顺序, 实现不能(MUST NOT)在数据流的起始部分发送字节顺序标记(&amp;quot;BOM&amp;quot;). 如果实体在一个XML流的任何位置(包括该流的第一个字符)接收到[[RFC6120#规范引用|UNICODE]]字符 U+FEFF , 它必须把该字符当成一个零宽度的不中断的空白, 而不是任何字节顺序标记.&lt;br /&gt;
&lt;br /&gt;
===空格===&lt;br /&gt;
&lt;br /&gt;
除了明确不允许(例如, 在[[RFC6120#STARTTLS Negotiation|TLS协商]]和[[RFC6120#SASL协商|SASL协商]]的时候)的情况, 实体可以在XML节之间或在任何其他在流上发送的顶层元素之间发送空格作为分隔符. 发送这类空格的一个常见用法参见[[RFC6120#关闭流|4.4]].&lt;br /&gt;
&lt;br /&gt;
===XML版本===&lt;br /&gt;
&lt;br /&gt;
XMPP是一个XML 1.0的应用范本. XMPP的更多版本可以被定义于更高版本的XML, 但是本协议定义的XMPP只限于XML 1.0.&lt;br /&gt;
&lt;br /&gt;
==国际化事项==&lt;br /&gt;
&lt;br /&gt;
如[[RFC6120#字符编码|11.6]]所定义的, XML流必须以UTF-8编码.&lt;br /&gt;
&lt;br /&gt;
如[[RFC6120#流属性|4.7]]所定义的, XML流应该包含一个'xml:lang'属性来为期望展现给自然人用户的任何XML字符数据指定缺省语言. 如[[RFC6120# xml:lang|8.1.5]]所定义的, XML节应该包含一个'xml:lang'属性，如果该节包含期望展现给自然人用户的XML字符数据的话. 服务器应该代表连接的实体应用缺省的'xml:lang'属性于到路由或递送的节, 并且不能(MUST NOT)修改或删除从其他实体收到的节的'xml:lang'属性.&lt;br /&gt;
&lt;br /&gt;
XMPP地址的国际化事项定义于[[RFC6120#规范引用|XMPP‑ADDR]].&lt;br /&gt;
&lt;br /&gt;
==安全事项==&lt;br /&gt;
===基本情况===&lt;br /&gt;
&lt;br /&gt;
XMPP技术典型的被部署在非中心化的客户端-服务器体系架构中. 结果是, 当两个XMPP实体需要通讯时有很多可能的途径:&lt;br /&gt;
&lt;br /&gt;
:# 双方实体都是服务器. 这种情况下, 实体可以在它们之间直接建立 服务器-服务器 流.&lt;br /&gt;
:# 一个实体是服务器而另一个实体是一个客户端并且该客户端的帐号由该服务器提供. 这种情况下, 实体可以在它们之间直接建立 客户端-服务器 流.&lt;br /&gt;
:# 双方实体都是客户端并且它们的帐号由同一个服务器提供. 这种情况下, 实体不能在它们之间建立直接的流, 但是在它们之间只有一个中间实体, 它们能理解该实体的策略并且它们对它有同等的信任级别(例如, 该服务器可能要求所有客户端连接使用传输层安全(TLS)).&lt;br /&gt;
:# 双方实体都是客户端但是它们的帐号由不同服务器提供. 这种情况下, 实体不能在它们之间建立直接的流并且它们之间有两个中间实体; 每个客户端可能对它的帐号所在的服务器有一定的信任度但是可能不知道另一个客户端连接的服务器的策略.&lt;br /&gt;
&lt;br /&gt;
本协议仅覆盖了两个服务器或客户端和服务器之间的直接XML流的安全性(情景#1和情景#2), 这里每个流可以被认为是一个通讯路径中的一&amp;quot;跳&amp;quot;. 对于一个多跳路径(情景#3和情景#4)的安全性的目标来说, 虽然非常需要, 但是超出了阿本协议的范围.&lt;br /&gt;
&lt;br /&gt;
按照[[RFC6120#参考文献|SEC‑GUIDE]], 本协议覆盖了通讯安全性(保密性, 数据完整性, 以及对端实体验证), 不可抵赖性, 和系统安全性(未经授权的使用, 不适当的使用, 和拒绝服务). 我们也讨论了常见的安全问题，类似信息泄露, 防火墙, 和目录获取, 以及和技术重用相关的最佳实践，类似 base 64, DNS, 加密哈希函数, SASL, TLS, UTF-8, 和XML.&lt;br /&gt;
&lt;br /&gt;
===威胁模型===&lt;br /&gt;
&lt;br /&gt;
对XMPP的威胁模型是基于[[RFC6120#参考文献|SEC‑GUIDE]]中描述的标准&amp;quot;互联网威胁模型&amp;quot;. 假定攻击者感兴趣的是针对未受保护的XMPP系统做出以下攻击:&lt;br /&gt;
&lt;br /&gt;
:* 窃听&lt;br /&gt;
:* 猜密码&lt;br /&gt;
:* 通过字典攻击来破解密码&lt;br /&gt;
:* 通过字典获取攻击来发现用户名&lt;br /&gt;
:* 重发, 插入, 删除, 或修改节&lt;br /&gt;
:* 欺骗用户&lt;br /&gt;
:* 增加未授权的条目到服务器或帐号&lt;br /&gt;
:* 不适当地使用一个服务器或帐号&lt;br /&gt;
:* 拒绝服务其他实体&lt;br /&gt;
:* 通过&amp;quot;中间人&amp;quot;攻击来破坏通讯流&lt;br /&gt;
:* 在路过的服务器上增加控制&lt;br /&gt;
&lt;br /&gt;
接下来一些相应的章节会描述如何防止这些威胁.&lt;br /&gt;
&lt;br /&gt;
===层顺序===&lt;br /&gt;
&lt;br /&gt;
协议被堆叠的层的顺序如下:&lt;br /&gt;
&lt;br /&gt;
:# TCP&lt;br /&gt;
:# TLS&lt;br /&gt;
:# SASL&lt;br /&gt;
:# XMPP&lt;br /&gt;
&lt;br /&gt;
这个顺序有重要的安全影响, 如各项安全事项所述.&lt;br /&gt;
&lt;br /&gt;
在XMPP内, XML节位于XML流之上, 如[[RFC6120#XML流|第四章]]所述.&lt;br /&gt;
&lt;br /&gt;
===保密性和完整性===&lt;br /&gt;
&lt;br /&gt;
对传输层安全(TLS)的适当密码组的使用提供了一个可靠的机制来确保保密性和在客户端和服务器之间以及两个服务器之间交换的数据的完整性. 所以, TLS能有助于阻止窃听, 密码嗅探, 中间人攻击, 和XML流上的节重发, 插入, 删除, 和修改. XMPP客户端和服务器必须如[[RFC6120#STARTTLS协商|第五章]]定义的那样支持TLS.&lt;br /&gt;
&lt;br /&gt;
:参考文献: 流的保密性和完整性可以有不同于TLS的保护方法, ；例如, 在安全层协商中引入一个SASL机制.&lt;br /&gt;
&lt;br /&gt;
:安全警告: 在XMPP中对TLS的使用适用于单个流. 因为XMPP典型地使用分布式的客户端-服务器体系架构来部署(详见[[RFC6120#客户端和服务器的分布式网络|2.5]]), 一个节可能经历多个流, 并且不是所有的那些流都是被TLS保护的. 例如, 某个以一个服务器上的会话从客户端发送的节(例如, &amp;lt;romeo@example.net/orchard&amp;gt;) 并且期望递送到一个另一台服务器上的会话的客户端(例如, &amp;lt;juliet@example.com/balcony&amp;gt;) 将经历三个流: (1) 从发送者的客户端到它的服务器的流, (2) 发送者服务器到接收者服务器的流, 和 (3) 从接收者的服务器到接收者的客户端的流. 此外, 该节将被作为明码被发送者的服务器和接收者的服务器处理. 所以, 即使从发送者的客户端到它的服务器的流是受保护的, 当一个节被发送者的服务器处理的时候，从发送者的服务器发送到接收者的服务器的时候，被接收者处理的时候，或从接收者的服务器发送到接收者的客户端的时候，在那个流上被发送的节的保密性和完整性也不能被保证. 只有一个用于端到端的加密鲁棒性技术能确保一个节的保密性和完整性，即使该节在一个通讯路径中经历了所有&amp;quot;跳&amp;quot;(例如, 一个满足[[RFC6120#参考文献|E2E‑REQS]]定义的需求的技术). 不幸的是, XMPP社区尚未产生一个适合广泛实现和部署的端到端加密技术, 并且这类技术的定义超出了本文的范围.&lt;br /&gt;
&lt;br /&gt;
===对端实体验证===&lt;br /&gt;
&lt;br /&gt;
用于验证的简单验证和安全层(SASL)的使用为对端实体验证提供了一个可靠的机制. 所以, SASL帮助防止用户欺骗, 未授权使用, 和中间人攻击. XMPP客户端和服务器必须如[[RFC6120#SASL协商|第六章]]所述支持SASL.&lt;br /&gt;
&lt;br /&gt;
===强安全性===&lt;br /&gt;
&lt;br /&gt;
[[RFC6120#规范引用|STRONGSEC]]定义了&amp;quot;强安全性&amp;quot;并且它对于在互联网上的通讯非常重要. 为了让XMPP在客户端-服务器和服务器-服务器流上通讯, 术语&amp;quot;强安全性&amp;quot;使用安全技术来同时提供互相验证和完整性检查(例如, 一个TLS加密和使用适当的SASL机制进行SASL验证的组合).&lt;br /&gt;
&lt;br /&gt;
实现必须支持强安全性. 服务供应者应该使用强安全性.&lt;br /&gt;
&lt;br /&gt;
实现应该能在该部署中让一个终端用户或服务管理员对一个已连接的实体(客户端或服务器)展示证书做特定信任动作(译者注：即做是否信任该证书的确认动作); 当一个应用提供了那些, 它就不能(MUST NOT)使用通用PKI信任库来验证连接的实体了. 更多关于证书验证的详细规则和指南在下一节提供.&lt;br /&gt;
&lt;br /&gt;
初始化流和应答流必须被安全地分开, 尽管可以通过机制提供双向验证来建立双向安全性.&lt;br /&gt;
&lt;br /&gt;
===证书===&lt;br /&gt;
&lt;br /&gt;
XML流的通道加密使用[[RFC6120#STARTTLS协商|第五章]]所述的传输层安全性, 和某些情况下也使用[[RFC6120#SASL协商|第六章]]描述的验证, 通常是基于一个由接收实体(或者, 在相互证书验证的情况下, 既有接收实体又有初始化实体)展示的PKIX证书. 本节描述的重点是由XMPP实体展示的PKIX证书的生成和验证的最佳实践.&lt;br /&gt;
&lt;br /&gt;
通常, 接下来的章节依靠并扩展[[RFC6120#规范引用|X509]]在[[RFC6120#规范引用|PKIX]]范本以及在[[RFC6120#规范引用|TLS‑CERTS]]中提供的规则和指南. 读者请参阅那些协议以便详细理解PKIX证书和它们在TLS中的的使用. &lt;br /&gt;
&lt;br /&gt;
====证书生成====&lt;br /&gt;
=====通用事项=====&lt;br /&gt;
&lt;br /&gt;
以下规则适用于被发行给XMPP服务器或客户端的终端实体的公共密钥证书:&lt;br /&gt;
&lt;br /&gt;
# 证书必须符合[[RFC6120#规范引用|PKIX]].&lt;br /&gt;
# 证书不能(MUST NOT)包含一个cA逻辑值为真的basicConstraints扩展.&lt;br /&gt;
# subject字段不能(MUST NOT)为空.&lt;br /&gt;
# signatureAlgorithm应该是 PKCS #1 版本 1.5 使用 SHA-256 的签名算法，定义于[[RFC6120#规范引用|PKIX‑ALGO]], 或如果可能则使用更强的算法.&lt;br /&gt;
# 证书应该包含一个授权信息访问(AIA)扩展，它指定一个在线证书状态协议地址[[RFC6120#规范引用|OCSP]]应答者(否则, 依赖的一方需要转去使用证书吊销列表(CRLs)，如[[RFC6120#规范引用|OPKIX]]所述).&lt;br /&gt;
&lt;br /&gt;
以下规则适用于发行证书给XMPP终端实体的权威认证(CA)证书:&lt;br /&gt;
&lt;br /&gt;
# 证书必须符合[[RFC6120#规范引用|PKIX]].&lt;br /&gt;
# 证书必须包含一个设置了digitalSignature比特值的keyUsage扩展.&lt;br /&gt;
# subject字段不能(MUST NOT)为空.&lt;br /&gt;
# signatureAlgorithm应该是 PKCS #1 版本 1.5 使用 SHA-256 的签名算法，定义于[[RFC6120#规范引用|PKIX‑ALGO]], 或如果可能则使用更强的算法.&lt;br /&gt;
# 对于公共密钥证书的发行者, 该发行者的证书必须包含一个cA逻辑值为真的basicConstraints扩展.&lt;br /&gt;
&lt;br /&gt;
=====服务器证书=====&lt;br /&gt;
======规则======&lt;br /&gt;
&lt;br /&gt;
在一个由XMPP服务器展示的PKIX证书里(即, 一个&amp;quot;服务器证书&amp;quot;), 该证书应该包含一个或多个和位于该服务器上的XMPP服务相关的XMPP地址(即, 域部分). 这些定义于[[RFC6120#规范引用|TLS‑CERTS]]的规则和指南适用于XMPP服务器证书, 有以下XMPP特有的事项:&lt;br /&gt;
&lt;br /&gt;
* 在XMPP客户端和服务器软件实现中要求支持 DNS-ID 标识类型 [[RFC6120#规范引用|PKIX]]. 发行XMPP特有证书的认证机构必须支持 DNS-ID 标识类型. XMPP服务提供者应该在证书请求中包含 DNS-ID 标识类型.&lt;br /&gt;
* 在XMPP客户端和服务器软件实现中要求支持 SRV-ID 标识类型 [[RFC6120#规范引用|PKIX‑SRV]](为了验证的目的，XMPP客户端实现只需要支持&amp;quot;_xmpp-client&amp;quot;服务类型，而XMPP服务器实现需要同时支持&amp;quot;_xmpp-client&amp;quot; 和 &amp;quot;_xmpp-server&amp;quot; 服务类型). 发行XMPP特有证书的认证机构必须支持 SRV-ID 标识类型. XMPP服务提供者应该在证书请求中包含 SRV-ID 标识类型. &lt;br /&gt;
* 为了向后兼容，在XMPP客户端和服务器软件实现中鼓励支持 XmppAddr 标识类型(定义域[[RFC6120#XmppAddr标识类型|13.7.1.4]]), 但是不再鼓励它出现在认证机构发布的证书中或XMPP服务提供者请求的证书中.&lt;br /&gt;
* 服务器证书中的DNS域名可以包含通配符 '*' 来完成标识中的最左边的标签.&lt;br /&gt;
&lt;br /&gt;
======示例======&lt;br /&gt;
&lt;br /&gt;
对我们的第一个例子(相对简单), 考虑一个名为&amp;quot;Example Products, Inc.&amp;quot;的公司，它在&amp;quot;im.example.com&amp;quot;跑了一个XMPP服务(即, 该服务器上的用户地址格式为&amp;quot;user@im.example.com&amp;quot;), 而查询到的用于&amp;quot;im.example.com&amp;quot;的xmpp-client和xmpp-server服务的SRV记录位于在一台机器上, 名为&amp;quot;x.example.com&amp;quot;, 如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
_xmpp-client._tcp.im.example.com. 400 IN SRV 20 0 5222 x.example.com&lt;br /&gt;
_xmpp-server._tcp.im.example.com. 400 IN SRV 20 0 5269 x.example.com&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
由x.example.com出示的证书包含以下陈述:&lt;br /&gt;
&lt;br /&gt;
* SRVName (id-on-dnsSRV)的一个otherName类型包含一个IA5String (ASCII) 字符串&amp;quot;_xmpp-client.im.example.com&amp;quot;&lt;br /&gt;
* SRVName (id-on-dnsSRV)的一个otherName类型包含一个IA5String (ASCII) 字符串&amp;quot;_xmpp-server.im.example.com&amp;quot;&lt;br /&gt;
* dNSName包含一个ASCII字符串&amp;quot;im.example.com&amp;quot;&lt;br /&gt;
* XmppAddr (id-on-xmppAddr)的一个otherName类型包含一个UTF-8字符串&amp;quot;im.example.com&amp;quot;&lt;br /&gt;
* CN包含一个ASCII字符串&amp;quot;Example Products, Inc.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
对我们的第二个例子(复杂一些), 考虑一个名为&amp;quot;Example Internet Services&amp;quot;的ISP. 它在&amp;quot;example.net&amp;quot;一个XMPP服务(即, 该服务器上的用户地址格式为&amp;quot;user@example.net&amp;quot;), 但是查询到的用于&amp;quot;example.net&amp;quot;的xmpp-client和xmpp-server服务的SRV记录位于在两台机器上(&amp;quot;x1.example.net&amp;quot;和&amp;quot;x2.example.net&amp;quot;), 如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
_xmpp-client._tcp.example.net. 68400 IN SRV 20 0 5222 x1.example.net.&lt;br /&gt;
_xmpp-client._tcp.example.net. 68400 IN SRV 20 0 5222 x2.example.net.&lt;br /&gt;
_xmpp-server._tcp.example.net. 68400 IN SRV 20 0 5269 x1.example.net.&lt;br /&gt;
_xmpp-server._tcp.example.net. 68400 IN SRV 20 0 5269 x2.example.net.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example Internet Services 也在chat.example.net上跑了一个聊天室服务, 并且为该服务提供了一个 xmpp-server SRV 记录(从而允许来自远端域的实体可以访问该服务). 它也可能在将来提供其他类似服务, 所以它希望在它的证书里展示一个通配符来处理这类发展.&lt;br /&gt;
&lt;br /&gt;
由x1.example.net或x2.example.net出示的证书包含以下陈述:&lt;br /&gt;
&lt;br /&gt;
* SRVName (id-on-dnsSRV)的一个otherName类型包含一个IA5String (ASCII) 字符串&amp;quot;_xmpp-client.example.net&amp;quot;&lt;br /&gt;
* SRVName (id-on-dnsSRV)的一个otherName类型包含一个IA5String (ASCII) 字符串&amp;quot;_xmpp-server.example.net&amp;quot;&lt;br /&gt;
* SRVName (id-on-dnsSRV)的一个otherName类型包含一个IA5String (ASCII) 字符串&amp;quot;_xmpp-server.chat.example.net&amp;quot;&lt;br /&gt;
* dNSName包含一个ASCII字符串&amp;quot;example.net&amp;quot;&lt;br /&gt;
* dNSName包含一个ASCII字符串&amp;quot;*.example.net&amp;quot;&lt;br /&gt;
* XmppAddr (id-on-xmppAddr)的一个otherName类型包含一个UTF-8字符串&amp;quot;example.net&amp;quot;&lt;br /&gt;
* XmppAddr (id-on-xmppAddr)的一个otherName类型包含一个UTF-8字符串&amp;quot;chat.example.net&amp;quot;&lt;br /&gt;
* CN包含一个ASCII字符串&amp;quot;Example Internet Services&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=====客户端证书=====&lt;br /&gt;
&lt;br /&gt;
在一个自然人用户控制的XMPP客户端展示的PKIX证书里(即, 一个 &amp;quot;客户端证书&amp;quot;), 建议该证书包含一个或多个和XMPP用户相关的JIDs. 如果包含了一个JID, 该JID必须被展示为一个如[[RFC6120#XmppAddr标识类型|13.7.1.4]]所述的的XmppAddr.&lt;br /&gt;
&lt;br /&gt;
=====XmppAddr标识类型=====&lt;br /&gt;
&lt;br /&gt;
XmppAddr标识类型是一个UTF8字符串，在subjectAltName里带了一个otherName实体, 使用[[RFC6120#参考文献|ASN.1]]对象标识&amp;quot;id-on-xmppAddr&amp;quot;，定义如下.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
id-pkix OBJECT IDENTIFIER ::= { iso(1) identified-organization(3)&lt;br /&gt;
        dod(6) internet(1) security(5) mechanisms(5) pkix(7) }&lt;br /&gt;
&lt;br /&gt;
id-on  OBJECT IDENTIFIER ::= { id-pkix 8 }  -- other name forms&lt;br /&gt;
&lt;br /&gt;
id-on-xmppAddr  OBJECT IDENTIFIER ::= { id-on 5 }&lt;br /&gt;
&lt;br /&gt;
XmppAddr ::= UTF8String&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作为一个替代&amp;quot;id-on-xmppAddr&amp;quot;的标记, 该对象标识符可以被展示为带点分隔的显示格式(即, &amp;quot;1.3.6.1.5.5.7.8.5&amp;quot;)或定义于[[RFC6120#参考文献|URN‑OID]]的统一资源名称标记(即, &amp;quot;urn:oid:1.3.6.1.5.5.7.8.5&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
所以在证书中包含JID &amp;lt;juliet@im.example.com&amp;gt; 的例子可以被用以下三种方法中的任何一种进行格式化:&lt;br /&gt;
&lt;br /&gt;
: id-on-xmppAddr:&lt;br /&gt;
:: subjectAltName=otherName:id-on-xmppAddr;UTF8:juliet@im.example.com &lt;br /&gt;
: dotted display format:&lt;br /&gt;
:: subjectAltName=otherName:1.3.6.1.5.5.7.8.5;UTF8:juliet@im.example.com &lt;br /&gt;
: URN notation:&lt;br /&gt;
:: subjectAltName=otherName:urn:oid:1.3.6.1.5.5.7.8.5;UTF8:juliet@im.example.com &lt;br /&gt;
&lt;br /&gt;
推荐在证书生成中使用&amp;quot;id-on-xmppAddr&amp;quot;格式, 但是在证书验证的时候必须支持三种格式.&lt;br /&gt;
&lt;br /&gt;
为了显式地定义和限制XMPP网络中一个证书的期望的使用,&amp;quot;id-on-xmppAddr&amp;quot;对象标识符可被用于插入[[RFC6120#规范引用|PKIX]]的4.2.1.12]]定义的扩展密钥.&lt;br /&gt;
&lt;br /&gt;
====证书验证====&lt;br /&gt;
&lt;br /&gt;
当对端如[[RFC6120#STARTTLS协商|第五章]]和[[RFC6120#SASL协商|第六章]]所述，为了加密或验证XML流而向一个XMPP实体出示一个服务器证书或客户端证书, 该实体必须尝试验证这个证书来决定该证书是否被视为一个&amp;quot;受信任的证书&amp;quot;, 即, 一个可接受用于加密和/或验证的证书要符合该XMPP实体的本地服务策略或已配置的设置.&lt;br /&gt;
&lt;br /&gt;
对于服务器证书和客户端, 验证的实体都必须做以下的事情:&lt;br /&gt;
&lt;br /&gt;
# 尝试验证该证书的完整性.&lt;br /&gt;
# 尝试验证该证书已经被发行的认证机构正确地签名.&lt;br /&gt;
# 尝试验证完整的证书路径.&lt;br /&gt;
# 检查[[RFC6120#通用事项|13.7.1.1]]定义的常规情况下终端实体的公开密钥和认证机构证书的规则或[[RFC6120#服务器证书|13.7.1.2]]和[[RFC6120#客户端证书|13.7.1.3]]分别定义的服务器证书和客户端证书.&lt;br /&gt;
# 通过证书收回列表(CRLs)或在线证书状态协议[[RFC6120#规范引用|OCSP]]检查证书收回消息, 或两者都检查.&lt;br /&gt;
&lt;br /&gt;
如果那些验证尝试中的任何一种失败了, 验证实体必须单方面中止该会话.&lt;br /&gt;
&lt;br /&gt;
接下来的章节描述适用于服务器-服务器流和客户端-客户端流的额外的身份验证规则.&lt;br /&gt;
&lt;br /&gt;
一旦流的一端的身份被验证了, 该验证实体应该也把已验证的身份关联到它从对端接收到的流头的'from'地址(如果有的话). 如果两个身份不匹配, 验证实体应该中止连接尝试(无论如何, 可能有好的原因导致身份不匹配, 如[[RFC6120#from|4.7.1]]所述).&lt;br /&gt;
&lt;br /&gt;
=====服务器证书=====&lt;br /&gt;
&lt;br /&gt;
对服务器证书, 适用定义于[[RFC6120#规范引用|TLS‑CERTS]]的规则和指南, 条件是[[RFC6120#XmppAddr标识类型|13.7.1.4]]定义的XmppAddr标识符被允许作为一个参考标识符.&lt;br /&gt;
&lt;br /&gt;
标识符的检查设置如下:&lt;br /&gt;
&lt;br /&gt;
* 初始化实体把它的参考标识符的源域设为它在初始化流头中通讯的'to'地址; 即, 这是它希望接收实体在一个PKIX证书里提供的身份.&lt;br /&gt;
* 接收实体把它的参考标识符的源域设为初始化实体在初始化流头中与它通讯的'from'地址; 即, 这是初始化实体试图确认的.&lt;br /&gt;
&lt;br /&gt;
在服务器－服务器通讯的情形中, 当(初始化实体)验证来自一个对端服务器的入站服务器－服务器连接时，[[RFC6120#规范引用|TLS‑CERTS]]中描述的匹配过程由一个应用服务器(接收实体)来执行. 在这种情况下, 接收方实体验证初始化实体的身份并把初始化实体在初始化流头中的'from'属性中声明的DNS域名用作它的参考身份的源域. 然而, [[RFC6120#规范引用|TLS‑CERTS]]描述的匹配过程保持不变并适用于同一方法.&lt;br /&gt;
&lt;br /&gt;
=====客户端证书=====&lt;br /&gt;
&lt;br /&gt;
当一个XMPP服务器验证一个客户端出示的证书时, 有三种可能的情况, 下面的章节将会描述.&lt;br /&gt;
&lt;br /&gt;
被检查的身份设置如下:&lt;br /&gt;
&lt;br /&gt;
* 该客户端把它的参考身份的源域设为它在初始化流头中通讯的'to'地址; 即, 这个身份是它期望服务器在一个PKIX证书中提供的.&lt;br /&gt;
* 该服务器把它的参考身份的纯JID设为初始化流头中与之通讯的'from'地址; 即, 这个身份是该客户端尝试断言的.&lt;br /&gt;
&lt;br /&gt;
======场景#1======&lt;br /&gt;
&lt;br /&gt;
如果似乎被一个证书路径来验证的客户端证书在一个信任锚中止了(如[[RFC6120#规范引用|PKIX]]的6.1所述), 该服务器必须为[[RFC6120#XmppAddr标识类型|13.7.1.4]]描述的XmppAddr的任何实例检查证书. 有三种可能的子场景:&lt;br /&gt;
&lt;br /&gt;
: 子场景#1:&lt;br /&gt;
:: 该服务器找到一个XmppAddr，它的展示的JID的域部分和该服务器配置的FQDNs(完整合格域名)之一相匹配; 该服务器应该把这个展示的JID当作该客户端的已验证身份. &lt;br /&gt;
: 子场景#2:&lt;br /&gt;
:: 该服务器找到多个XmppAddr，它们展示的JID的域部分和该服务器配置的FQDNs(完整合格域名)之一相匹配; 该服务器应该使用这些展示的JID中的一个作为该客户端的已验证身份, 对它们的选择基于初始化流头中'from'地址的的纯JID(如果有的话), 基于包含在初始化流头的'to'地址的域部分, 或遵循本地服务策略(例如在一个基于该客户端证书中其他信息的用户数据库中查找). &lt;br /&gt;
: 子场景#3:&lt;br /&gt;
:: 该服务器没找到XmppAddrs, 或至少找到一个XmppAddr但是其展示的JID的域部分和该服务器的FQDNs(完整合格域名)中的任何一个都不匹配; 该服务器不能(MUST NOT)使用该展示的JID(如果有)作为该客户端的已验证身份，而必须使用符合本地服务策略(例如在一个基于该客户端证书中其他信息的用户数据库中查找)的其他办法来验证该客户端. 如果该身份不能这样被验证, 该服务器可以中止验证过程并终止TLS协商.&lt;br /&gt;
&lt;br /&gt;
======场景#2======&lt;br /&gt;
&lt;br /&gt;
如果该客户端证书是被一个服务器不知道的证书颁发机构认证的, 该服务器必须按场景#1的子场景#3处理. &lt;br /&gt;
&lt;br /&gt;
======场景#3======&lt;br /&gt;
&lt;br /&gt;
如果该客户端证书是自签名的, 该服务器必须按场景#1的子场景#3处理.&lt;br /&gt;
&lt;br /&gt;
=====在长连接流中检查证书=====&lt;br /&gt;
&lt;br /&gt;
因为XMPP使用长连接XML流, 在流协商期间出示的证书可能会超时或在流仍处于活跃状态的时候被撤销(这特别对应于服务器-服务器流的上下文中). 所以, 每一方对长连接流应该:&lt;br /&gt;
&lt;br /&gt;
# 缓存其他方出示的证书以及该证书依赖的任何证书(类似一个根证书或一个认证机构的中间证书)的过期日期, 并且当任何这类证书过期的时候以一个流错误 &amp;lt;reset/&amp;gt; ([[RFC6120#reset|4.9.3.16]])关闭流.&lt;br /&gt;
# 根据在其他方出示的证书以及该证书依赖的任何证书(类似一个根证书或一个认证机构的中间证书)的授权信息访问(AIA)扩展定期查询在线证书状态协议[[RFC6120#规范引用|OCSP]]应答者列表, 并且当任何这类证书被撤销的时候以一个流错误&amp;lt;reset/&amp;gt; ([[RFC6120#reset|4.9.3.16]])挂比流. 建议在通讯时通过OCSP应答接收到的nextUpdate字段的时间快到的时候查询OSCP应答者, 或者如果未设置nextUpdate字段, 则每隔24小时查询一次.&lt;br /&gt;
&lt;br /&gt;
在流被关闭之后, 来自关闭的流的初始化实体需要重连，并且接收实体需要基于新流协商期间出示的证书来验证初始化实体.&lt;br /&gt;
&lt;br /&gt;
=====在XMPP扩展中使用证书=====&lt;br /&gt;
&lt;br /&gt;
证书可以被用于XMPP扩展，为了应用层加密或在XML流这一级进行验证(例如, 用于点对点加密). 这类扩展将定义他它们自己的证书处理规则. 最低限度, 这类扩展是被鼓励和本协议定义的规则保持一致性, 特别是只在必要的时候定义额外的规则.&lt;br /&gt;
&lt;br /&gt;
===强制实现的TLS和SASL技术===&lt;br /&gt;
&lt;br /&gt;
接下来的TLSm密码套件和SASL机制是强制实现的(自然的, 实现可以同时支持其他密码套件和机制). 对于和TLS密码套件相关的安全性事项, 参见[[RFC6120#使用TLS|13.9.4]]和[[RFC6120#规范引用|TLS]]. 对于和SASL机制相关的安全性事项, 参见[[RFC6120#使用SASL|13.9.4]], [[RFC6120#规范引用|SASL]], 和用于特定SASL机制的协议，类似 [[RFC6120#规范引用|SCRAM]], [[RFC6120#参考文献|DIGEST‑MD5]], 和 [[RFC6120#规范引用|PLAIN]]. &lt;br /&gt;
&lt;br /&gt;
====仅用于验证====&lt;br /&gt;
&lt;br /&gt;
对于仅用于验证, 服务器和客户端必须支持SASL的[[RFC6120#规范引用|SCRAM]]机制 -- 特别是, SCRAM-SHA-1 和 SCRAM-SHA-1-PLUS 变种.&lt;br /&gt;
&lt;br /&gt;
: 安全警告: 即使可能只是在不保密的情况下完成验证, 建议服务器和客户端在尝试以SASL验证之前用TLS来保护流, 同时帮助保护SASL协商期间交换的信息比并帮助防止特定的如[[RFC6120#使用SASL|13.9.4]]和[[RFC6120#使用TLS|13.9.5]]所述的降级攻击. 即使使用了TLS, 实现也应该如[[RFC6120#使用SASL|13.9.4]]所述强迫通道绑定.&lt;br /&gt;
&lt;br /&gt;
: 互操作性备注: SCRAM机制的 SCRAM-SHA-1 或 SASL-SCRAM-SHA-1-PLUS 变种替代 SASL DIGEST-MD5 机制成为在只验证的场景中XMPP的强制实现的基于密码的方法. 为了保持对已部署的基础设施的向后兼容性, 鼓励实现继续支持[[RFC6120#参考文献|DIGEST‑MD5]]定义的DIGEST-MD5; 无论如何, 和DIGEST-MD5的互操作性问题广为人知并将长期存在.&lt;br /&gt;
&lt;br /&gt;
====仅用于保密====&lt;br /&gt;
&lt;br /&gt;
对于仅保密的情况, 服务器必须支持带TLS_RSA_WITH_AES_128_CBC_SHA密码套件的TLS.&lt;br /&gt;
&lt;br /&gt;
: 安全警告: 因为一个仅保密的连接的安全性能弱于保密加验证, 建议服务器和客户端尽量使用双保险来连接(例如, 在尝试以SASL验证之前先用TLS保护流). 在实践中, 当对端服务器没有出示一个被信任的证书而是使用服务器回拨[[RFC6120#参考文献|XEP‑0220]]用于弱身份验证的时候,仅保密几乎不用于服务器-服务器连接, 但是仅保密的TLS仍能防止对连接的随意窃听.&lt;br /&gt;
&lt;br /&gt;
====保密加密码验证====&lt;br /&gt;
&lt;br /&gt;
对于保密加密码验证, 服务器和客户端必须实现带TLS_RSA_WITH_AES_128_CBC_SHA密码套件的TLS加上SASL SCRAM, 特别是 SCRAM‑SHA‑1 和 SCRAM‑SHA‑1‑PLUS 变种(倾向于 SCRAM‑SHA1‑PLUS , 如[[RFC6120#使用SASL|13.9.4]]所述).&lt;br /&gt;
&lt;br /&gt;
如下面的安全性警告里面的详细解释所说, 在特定情况下，当它不可能提供更多替代安全的时候,服务器可提供带TLS_RSA_WITH_AES_128_CBC_SHA套件的TLS加SASL PLAIN; 另外, 客户端应该实现TLS上的PLAIN，为了最大化和那些无法部署更多替代安全的服务器的互操作性.&lt;br /&gt;
&lt;br /&gt;
: 安全警告: 实践中, 很多服务器提供, 很多客户端使用, TLS 加 SASL PLAIN. 强烈建议使用SCRAM机制中的 SCRAM-SHA-1，特别是 SCRAM-SHA-1-PLUS 变种来取代 PLAIN 机制，因为它们优越的安全性能(包括强迫通道绑定 SCRAM-SHA-1-PLUS 的能力，如[[RFC6120#使用SASL|13.9.4]]所述). 客户端应该把TLS加SASL PLAIN当成最低优先级的技术,只在和无法提供SCRAM(或其他提供超过TLS加SASL PLAIN的安全替代)的服务器交互时使用, 必须优先使用更安全的机制(例如, EXTERNAL, SCRAM-SHA-1-PLUS, SCRAM-SHA-1, 或老的 DIGEST-MD5 机制)来取代PLAIN机制, 并且如果该流没有如[[REC6120#服务器证书|13.7.2.1]]所述通过使用完整证书验证的TLS的来获得最低限度的保密性和完整性的话，该客户端不能(MUST NOT)使用PLAIN机制.如果流的保密性和完整性没有被TLS或同等安全层的保护, 服务器不能(MUST NOT)提供SASL PLAIN. 服务器应该不提供TLS加SASL PLAIN，除非它不能提供一些SASL SCRAM的变种(或其他比TLS加SASL PLAIN更安全的替代), 例如, 因为XMPP服务依赖于不受XMPP管理员控制的数据库或目录的验证, 类似插件式验证模块(PAM), 轻量级目录访问协议(LDAP)目录[[RFC6120#参考文献|LDAP]],  或验证, 授权, 和 核查 (AAA) 密钥管理协议 (关于指南, 参考 [RFC6120#参考文献|AAA]]). 无论如何, 如果服务器需要和已安装的不支持SCRAM或其他比TLS加SASL PLAIN更安全的替代的客户端交互，即使服务器支持更安全的替代的时候，它提供TLS加SASL PLAIN可能也是适当的.&lt;br /&gt;
&lt;br /&gt;
====保密加无密码验证====&lt;br /&gt;
&lt;br /&gt;
对于保密加无密码验证, 服务器必须而且客户端应该实现带TLS_RSA_WITH_AES_128_CBC_SHA密码套件的TLS加上带PKIX证书的SASL EXTERNAL机制(见[[RFC6120#规范引用|SASL]]的的附录A).&lt;br /&gt;
&lt;br /&gt;
===技术重用===&lt;br /&gt;
====在SASL中使用Base 64====&lt;br /&gt;
&lt;br /&gt;
客户端和服务器都必须验证[[RFC6120#SASL协商|SASL协商]]期间收到的任何 base 64 数据. 实现必须拒绝(不是忽略)任何没有显式地被base 64字母所允许的字符串; 这帮助防止创建可能用于&amp;quot;泄露&amp;quot;信息的隐蔽通道.&lt;br /&gt;
&lt;br /&gt;
如果('=') 字符被包含在其他字符串数据里但又不是最后一个字符的话(例如, &amp;quot;=AAA&amp;quot; 或 &amp;quot;BBBB=CCC&amp;quot;)，实现不能(MUST NOT)在非法输入上中断而必须拒绝任何包含填充 ('=') 字符的base 64字符串序列; 这帮助防止缓冲区溢出攻击和该实现上的其他攻击.&lt;br /&gt;
&lt;br /&gt;
因为base 64编码是在视觉上隐藏那些很容易识别的信息（如密码），所以它不提供任何计算的保密性.&lt;br /&gt;
&lt;br /&gt;
对base 64编码的所有使用必须按照[[RFC6120#规范引用|BASE64]]第四章的定义并且填充比特值必须设为零.&lt;br /&gt;
&lt;br /&gt;
====使用DNS====&lt;br /&gt;
&lt;br /&gt;
XMPP典型地依赖域名系统(特别是 [[RFC6120#规范引用|DNS‑SRV]] 记录) 在客户端连接到服务器或对端服务器连接到另一个服务器之前把完整合格域名解析成一个IP地址. 在尝试协商XML流之前, 除非初始化实体已经如[[RFC6120#TCP绑定|第三章]]定义的那样解析了接收实体的DNS域名(尽管在每一次连接尝试之前去解析DNS域名不是必要的, 因为DNS解析结果可能被当成长时间存在的值暂时缓存了)，否则它不能(MUST NOT)进行下一步动作. 无论如何, 在缺乏安全DNS选项(例如, 由[[RFC6120#参考文献|DNSSEC]]提供的)的情况下, 一个能访问DNS服务器数据的恶意攻击者, 或能导致一个欺骗性的应答被缓存在一个递归的解析者器中, 可能会导致初始化实体连接到任何由攻击者选择的XMPP服务器上. 部署和验证服务器证书有助于防止这类攻击.&lt;br /&gt;
&lt;br /&gt;
====使用哈希函数====&lt;br /&gt;
&lt;br /&gt;
XMPP本身不直接强制任何特定的加密哈希函数的使用. 然而, 在XMPP以来的技术上(例如, TLS和特定的SASL机制), 以及各个XMPP扩展, 可能强制加密哈希函数的使用. 建议那些实现XMPP技术的人或开发XMPP扩展的人密切监视对和XMPP相关的互联网协议的最先进的加密散列函数的攻击. 一些有用的指导, 参考[[RFC6120#参考文献|HASHES]].&lt;br /&gt;
&lt;br /&gt;
====使用SASL====&lt;br /&gt;
&lt;br /&gt;
因为初始化实体选择从接收实体出示的列表中选择一个可接受的SASL机制, 初始化实体依赖接收实体的列表用于验证. 如果攻击者能获得通道的控制权并因而出示一个弱的机制列表，那么这个依赖会导致某种降级攻击的可能. 为了减轻这种攻击, 在尝试SASL协商之前双方应该使用TLS保护通道并且要么如[[RFC6120#服务器证书|13.7.2.1]]所述执行完整证书验证，要么使用一个提供通道绑定的SASL机制, 类似 SCRAM-SHA-1-PLUS. (使用完整证书验证的TLS保护通道有助于确保SASL协商期间的信息交换的保密性和完整性.)&lt;br /&gt;
&lt;br /&gt;
SASL框架本身不提供办法把SASL验证绑定到一个在更底层协商中提供保密性和完整性保护的安全层(例如, TLS). 这类的绑定众所周知是一个 &amp;quot;通道绑定&amp;quot; (见 [[RFC6120#规范引用|CHANNEL]]). 一些SASL机制提供了通道绑定, 在XMPP的场景中它典型地表现为绑定到 TLS (见 [[RFC6120#规范引用|CHANNEL‑TLS]]). 如果一个SASL机制提供了一个通道绑定(例如, [[RFC6120#规范引用|SCRAM]] 就是这样), 那么使用那个机制的XMPP实体应该优先选择该通道绑定变种(例如, &amp;quot;SCRAM-SHA-1-PLUS&amp;quot; 优先于 &amp;quot;SCRAM-SHA-1&amp;quot;). 如果一个SASL机制不提供通道绑定, 那么该机制不能提供方法来验证正在使用SASL验证的源和目标端的低层安全性; 进一步, 如果端点不是同一个, 那么低层安全性不能被信任用来保护SASL验证的实体的数据传输. 在这种情况下, 一个SASL安全层应该有效地忽略低层安全性的联机状态来被协商.&lt;br /&gt;
&lt;br /&gt;
很多部署的XMPP服务使用密码验证客户端连接. 众所周知大部分自然人用户选择相对弱的密码. 尽管服务的开通超出了本文的范围, 允许基于密码验证的XMPP服务器应该对密码强度强制最低标准来帮助阻止字典攻击. 因为所有基于密码验证的机制都易受到猜密码攻击, XMPP服务器必须在SASL验证时限制允许的重试次数, 如[[RFC6120#SASL失败|6.4.5]]所述.&lt;br /&gt;
&lt;br /&gt;
一些SASL机制(例如, [[RFC6120#参考文献|ANONYMOUS]]) 不对客户端到服务器提供强的对端实体验证. 建议在服务管理员允许这类机制的时候警告. 在XMPP中使用SASL ANONYMOUS机制的最佳实践参见[[RFC6120#参考文献|XEP‑0175]].&lt;br /&gt;
&lt;br /&gt;
====使用TLS====&lt;br /&gt;
&lt;br /&gt;
TLS的实现典型地支持传输层安全性协议的多个版本以及旧的安全套接字层(SSL)协议. 因为已知的安全性漏洞, XMPP服务器和客户端不能(MUST NOT)请求, 提供, 或使用SSL 2.0. 更多细节, 参见跟随[[RFC6120#规范引用|TLS‑SSL2]]的[[RFC6120#规范引用|TLS]]的附录E.2.&lt;br /&gt;
&lt;br /&gt;
为阻止中间人攻击, TLS客户端(它可能是一个XMPP客户端或一个XMPP服务器) 必须验证TLS服务器的证书并且必须和对服务器的完整合格域名和TLS证书消息中出示的服务器身份，如[[RFC6120#服务器证书|13.7.2.1]]所述(详见[[RFC6120#规范引用|TLS‑CERTS]].&lt;br /&gt;
&lt;br /&gt;
对TLS协商的支持严格来说是可选的. 然而, 支持TLS再协商的实现必须实现和使用TLS重协商扩展[[RFC6120#规范引用|TLS‑NEG]]. 更多细节在[[RFC6120#TLS重协商|5.3.5]]中.&lt;br /&gt;
&lt;br /&gt;
====使用UTF-8====&lt;br /&gt;
&lt;br /&gt;
使用UTF-8使得传输非ASCII字符串成为可能, 并且从而允许字符&amp;quot;哄骗&amp;quot;情节, 这里显示的值和它本身的值不一样. 此外, 已知有一些和解码UTF-8相关的攻击情节. 对于这两中情况, 详见[[RFC6120#规范引用|UTF‑8]].&lt;br /&gt;
&lt;br /&gt;
====使用XML====&lt;br /&gt;
&lt;br /&gt;
因为XMPP是一个可扩展标记语言[[RFC6120#规范引用|XML]]的应用范例, 很多[[RFC6120#规范引用|XML‑MEDIA]]和[[RFC6120#规范引用|XML‑GUIDE]]里描述的安全性事项也适用于XMPP. XMPP从几个方面减轻上述的风险, 类似[[RFC6120#XML约束|11.1]]下的禁令以及减少外部参考样式表或转换, 但是这些缓解因素是不全面的.&lt;br /&gt;
&lt;br /&gt;
===信息泄露===&lt;br /&gt;
====IP地址====&lt;br /&gt;
&lt;br /&gt;
客户端的IP地址和访问方法不能(MUST NOT)被服务器公开(例如, 典型地发生在[[RFC6120#参考文献|IRC]]).&lt;br /&gt;
&lt;br /&gt;
====联机状态信息====&lt;br /&gt;
&lt;br /&gt;
XMPP的核心方面之一是联机状态信息: 关于一个XMPP实体的网络可用性信息(即, 该实体当前是在线还是离线). nce leak&amp;quot; occurs 当一个实体的网络可用性被疏忽和偶然地泄露给第二个未被授权了解第一个实体的网络可用性的实体的时候，就发生了&amp;quot;出席信息泄漏&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
尽管联机状态信息更完整的讨论是在[[RFC6121|XMPP‑IM]], 注意XMPP服务器不能(MUST NOT)泄露联机状态信息是非常重要的. 特别是在核心XMPP级, 即时寻址和网络可用性是和特定的已连接资源相关的; 所以, 任何对已连接的资源的全JID的泄露都会构成一个联机状态泄露. 为了帮助阻止这类的联机状态泄露, 服务器不能(MUST NOT)对可能发生的潜在攻击者向某实体的纯JID(&amp;lt;localpart@domainpart&amp;gt;)或全JID(&amp;lt;localpart@domainpart/resourcepart&amp;gt;)发送XML节的时候返回不同的节错误.&lt;br /&gt;
&lt;br /&gt;
===目录搜集===&lt;br /&gt;
&lt;br /&gt;
如果服务器在应答一个不存在的用户帐号的节的时候生成了一个节错误, 使用 &amp;lt;service-unavailable/&amp;gt; 节错误条件([[RFC6120#service-unavailable|8.3.3.19]])能帮助防止目录搜集攻击, 因为它和其他集中错误返回同样的错误条件, 例如, 未知的IQ子元素的命名空间, 对于某个域不允许&amp;quot;离线消息存储&amp;quot; ([[XEP‑0160]]) 或消息转发. 无论如何, 当没有使用更高级的屏蔽技术的时候，错误节的确切的XML的细微差别, 以及这类错误返回的时机, 都能让攻击者确定一个用户的出席信息(见[[XEP‑0016]] 和 [[XEP‑0191]]). 所以, 一个实行高警告级别的服务器可能对于收到的某些特定类型的节的所有应答中都不返回任何错误, 这样一个不存在的用户似乎表现得像一个没兴趣和发送者交谈的用户.&lt;br /&gt;
&lt;br /&gt;
===拒绝服务===&lt;br /&gt;
&lt;br /&gt;
[[RFC6120#参考文献|DOS]] 定义的拒绝服务如下:&lt;br /&gt;
&lt;br /&gt;
:拒绝服务(DoS)攻击是一种这样的攻击， 使用一个或多个机器攻击一个受害者并试图阻止受害者做有用的工作. 受害者可能是一个网络服务器, 客户端 或路由器, 一个网络连接或整个网络, 一个单独的互联网用户或一个使用互联网的商业公司, 一个互联网服务提供商(ISP), 国家, 或这些变种的任意组合. &lt;br /&gt;
&lt;br /&gt;
本文讨论的一些事项有助于防止拒绝服务攻击(例如, 要求服务器不能(MUST NOT)处理未提供适当的验证身份的客户端发来的XML节，也不能(MUST NOT)处理其身份未通过SASL验证或只被服务器回拨弱验证的对端服务器发来的XML节).&lt;br /&gt;
&lt;br /&gt;
另外, [[RFC6120#参考文献|XEP‑0205]] 提供了一个防止潜在的对于XMPP系统的拒绝服务攻击的最佳实践的详细讨论. 建议包括:&lt;br /&gt;
&lt;br /&gt;
# 服务器实现应该允许服务器管理员限制它在任何时候从给定IP地址接受的TCP连接数量. 如果一个实体尝试连接但是已经达到了TCP连接数量的上限, 接收服务器不能(MUST NOT)允许继续新的连接.&lt;br /&gt;
# 服务器实现应该允许服务器管理员限制它在给定时间间隔里从给定IP地址接收的TCP连接尝试的数量. 如果一个实体尝试连接但是已经达到了连接尝试次数的上限, 接收服务器不能(MUST NOT)允许继续新的连接.&lt;br /&gt;
# 服务器实现应该允许服务器管理员限制它在任何时候允许一个帐号绑定的已连接资源的数量. 如果客户端尝试绑定一个资源但是已经达到了配置的允许资源数量, 接收服务器必须返回一个&amp;lt;resource-constraint/&amp;gt;节错误([[RFC6120#resource-constraint|8.3.3.18]]).&lt;br /&gt;
# 服务器实现应该允许服务器管理员限制它从一个已连接的客户端或对端服务器接收到的节的大小(这里 &amp;quot;大小&amp;quot; 是包含定义于[[RFC6120#规范引用|XML]] 2.4节的所有XML, 从该节打开的 &amp;quot;&amp;lt;&amp;quot; 字符到关闭的 &amp;quot;&amp;gt;&amp;quot; 字符). 一个已部署的服务器的最大节大小不能(MUST NOT)小于 10000 字节, 它体现了有利于发起方实体的表达和服务器处理节的开销之间的妥协. 服务器实现不应该盲目地为所有的部署设置 10000 字节的值，而应该允许服务器管理员设置他们自己的限制.如果一个已连接的资源或对端服务器发送一个违反了字节数上限的节, 接收服务器必须要么返回一个&amp;lt;policy-violation/&amp;gt;节错误([[RFC6120#policy-violation|8.3.3.12]]), 这将允许发送者纠错, 或以一个&amp;lt;policy-violation/&amp;gt;流错误([[RFC6120#policy-violation|4.9.3.14]])关闭该流.&lt;br /&gt;
# 服务器实现应该允许服务器管理员限制一个已连接的客户端在给定时间段发送给单个接收者的XML节的数量. 如果一个已连接客户端在给定时间段内发送太多节给单个的接收者, 接收服务器应该不(SHOULD NOT)该节而是并应该返回&amp;lt;policy-violation/&amp;gt;节错误([[RFC6120#policy-violation|8.3.3.12]]).&lt;br /&gt;
# 服务器实现应该允许服务器管理员限制它允许一个已连接客户端或对端服务器在给定的时间段内使用的带宽.&lt;br /&gt;
# 服务器实现可以允许服务器管理员限制它允许一个已连接资源或对端服务器通过活动的连接发送的节的类型(基于扩展的内容 &amp;quot;载荷&amp;quot;). 这个限制和约束是部署策略的事情.&lt;br /&gt;
# 服务器实现可以拒绝路由或递送任何它认为是滥用的节, 可以返回或不返回一个错误给发送者.&lt;br /&gt;
&lt;br /&gt;
更多关于对XMPP系统拒绝服务攻击的详细建议, 参考[[RFC6120#参考文献|XEP‑0205]].&lt;br /&gt;
&lt;br /&gt;
===防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管 DNS SRV记录能指示连接的实体使用5222(客户端-服务器)和5269 (服务器-服务器)以外的TCP端口, XMPP通讯典型地发生在那些在IANA(见 [[RFC6120#IANA事项|第14章]])注册了的端口. 使用那些广为人知的端口让管理员们很容易地通过现有的常见部署的防火墙来允许或禁止XMPP活动.&lt;br /&gt;
&lt;br /&gt;
===域间联盟===&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;联盟&amp;quot; 常用于描述两个服务器域之间的通讯.&lt;br /&gt;
&lt;br /&gt;
因为服务配置是一个策略的问题, 对于任何给定的服务器来说，支持联盟是可选的. 如果一个特定的服务器允许联盟, 它应该允许前面说过的强安全性来确保身份验证和保密性; 为支持达到这个目的，兼容的实现应该支持TLS和SASL.&lt;br /&gt;
&lt;br /&gt;
在RFC 3920定义 TLS 加上带证书的 SASL EXTERNAL 来加密和验证服务器-服务器流之前, 只有一个对于对端服务器进行弱身份验证的方法，就是定义于[[XEP-0220]]的服务器回拨. 即使同时使用了[[RFC6120#参考文献|DNSSEC]], 服务器回拨也只提供了弱身份验证而未提供保密性或完整性. 在撰写本文的时候, 服务器回拨仍是被广泛使用的技术,用来对服务器-服务器流提供一定程度的保证. 这一现实导致了从TLS + SASL EXTERNAL到服务器回拨的降级攻击的可能性，如果攻击者能获得通道的控制权从而让初始化服务器以为接收服务器不支持TLS或没有适当的证书的话. 为阻止这一攻击, 即使当前证书是自签名或不可信的证书，双方也应该在进行下一步之前使用TLS保护通道.&lt;br /&gt;
&lt;br /&gt;
===不可抵赖===&lt;br /&gt;
&lt;br /&gt;
提供双方实体的身份验证和数据完整性的系统有潜在的能力让一个实体证明另一个实体打算发送特定的数据给第三方实体. 尽管XMPP系统能提供双方实体身份验证和数据完整性, XMPP从未被定义为提供不可抵赖性.&lt;br /&gt;
&lt;br /&gt;
==IANA事项==&lt;br /&gt;
&lt;br /&gt;
以下小节更新了[[RFC3920]]提供的注册项. 本章是根据[[RFC6120#参考文献|IANA‑GUIDE]]来解释的. &lt;br /&gt;
&lt;br /&gt;
===TLS数据的XML命名空间名===&lt;br /&gt;
&lt;br /&gt;
用于在可扩展的消息和出席信息协议(XMPP)中的STARTTLS协商数据的URN子命名空间定义如下. (该命名空间坚持[[RFC6120#参考文献|XML‑REG]]定义的格式.)&lt;br /&gt;
&lt;br /&gt;
:URI:&lt;br /&gt;
::urn:ietf:params:xml:ns:xmpp-tls &lt;br /&gt;
:协议:&lt;br /&gt;
::RFC 6120 &lt;br /&gt;
:描述:&lt;br /&gt;
::这是定义于RFC 6120中的可扩展消息和出席信息协议(XMPP)中的STARTTLS协商数据的XML命名空间名. &lt;br /&gt;
:注册联系人:&lt;br /&gt;
::IESG &amp;lt;iesg@ietf.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SASL数据的XML命名空间名===&lt;br /&gt;
&lt;br /&gt;
用于在可扩展的消息和出席信息协议(XMPP)中的SASL协商数据的URN子命名空间定义如下. (该命名空间坚持[[RFC6120#参考文献|XML‑REG]]定义的格式.)&lt;br /&gt;
&lt;br /&gt;
:URI:&lt;br /&gt;
::urn:ietf:params:xml:ns:xmpp-sasl &lt;br /&gt;
:协议:&lt;br /&gt;
::RFC 6120 &lt;br /&gt;
:描述:&lt;br /&gt;
::这是定义于RFC 6120中的可扩展消息和出席信息协议(XMPP)中的SASL协商数据的XML命名空间名. &lt;br /&gt;
:注册联系人:&lt;br /&gt;
::IESG &amp;lt;iesg@ietf.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===流错误的XML命名空间名===&lt;br /&gt;
&lt;br /&gt;
用于在可扩展的消息和出席信息协议(XMPP)中的流错误数据的URN子命名空间定义如下. (该命名空间坚持[[RFC6120#参考文献|XML‑REG]]定义的格式.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:URI:&lt;br /&gt;
::urn:ietf:params:xml:ns:xmpp-streams &lt;br /&gt;
:协议:&lt;br /&gt;
::RFC 6120 &lt;br /&gt;
:描述:&lt;br /&gt;
::这是定义于RFC 6120中的可扩展消息和出席信息协议(XMPP)中的流错误数据的XML命名空间名. &lt;br /&gt;
:注册联系人:&lt;br /&gt;
::IESG &amp;lt;iesg@ietf.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===资源绑定的XML命名空间名===&lt;br /&gt;
&lt;br /&gt;
用于在可扩展的消息和出席信息协议(XMPP)中的资源绑定的URN子命名空间定义如下. (该命名空间坚持[[RFC6120#参考文献|XML‑REG]]定义的格式.)&lt;br /&gt;
&lt;br /&gt;
:URI:&lt;br /&gt;
::urn:ietf:params:xml:ns:xmpp-bind &lt;br /&gt;
:协议:&lt;br /&gt;
::RFC 6120 &lt;br /&gt;
:描述:&lt;br /&gt;
::这是定义于RFC 6120中的可扩展消息和出席信息协议(XMPP)中的资源绑定的XML命名空间名. &lt;br /&gt;
:注册联系人:&lt;br /&gt;
::IESG &amp;lt;iesg@ietf.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===节错误的XML命名空间名===&lt;br /&gt;
&lt;br /&gt;
用于在可扩展的消息和出席信息协议(XMPP)中的节错误数据的URN子命名空间定义如下. (该命名空间坚持[[RFC6120#参考文献|XML‑REG]]定义的格式.)&lt;br /&gt;
&lt;br /&gt;
:URI:&lt;br /&gt;
::urn:ietf:params:xml:ns:xmpp-stanzas &lt;br /&gt;
:协议:&lt;br /&gt;
::RFC 6120 &lt;br /&gt;
:描述:&lt;br /&gt;
::这是定义于RFC 6120中的可扩展消息和出席信息协议(XMPP)中的节错误数据的XML命名空间名. &lt;br /&gt;
:注册联系人:&lt;br /&gt;
::IESG &amp;lt;iesg@ietf.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===GSSAPI服务名===&lt;br /&gt;
&lt;br /&gt;
IANA已经把&amp;quot;xmpp&amp;quot;注册为一个[[RFC6120#参考文献|GSS‑API]]服务名, 如[[RFC6120#SASL定义|6.6章]]所述.&lt;br /&gt;
&lt;br /&gt;
===端口号和服务名===&lt;br /&gt;
&lt;br /&gt;
IANA已经把&amp;quot;xmpp-client&amp;quot;和&amp;quot;xmpp-server&amp;quot;分别注册为[[RFC6120#规范引用|TCP]端口号5222和5269的关键字. 依据[[RFC6120#参考文献|IANA‑PORTS]], 本文更新了现有的注册项如下.&lt;br /&gt;
&lt;br /&gt;
:服务名:&lt;br /&gt;
::xmpp-client &lt;br /&gt;
:传输协议:&lt;br /&gt;
::TCP &lt;br /&gt;
:描述:&lt;br /&gt;
::一个为XMPP客户端应用的连接提供支持的服务&lt;br /&gt;
:注册机构:&lt;br /&gt;
::IETF XMPP Working Group &lt;br /&gt;
:联系方式:&lt;br /&gt;
::IESG &amp;lt;iesg@ietf.org&amp;gt; &lt;br /&gt;
:参考:&lt;br /&gt;
::RFC 6120 &lt;br /&gt;
:端口号:&lt;br /&gt;
::5222 &lt;br /&gt;
&lt;br /&gt;
:服务名:&lt;br /&gt;
::xmpp-server &lt;br /&gt;
:传输协议:&lt;br /&gt;
::TCP &lt;br /&gt;
:描述:&lt;br /&gt;
::一个为XMPP服务器应用的连接提供支持的服务&lt;br /&gt;
:注册机构:&lt;br /&gt;
::IETF XMPP Working Group &lt;br /&gt;
:联系方式:&lt;br /&gt;
::IESG &amp;lt;iesg@ietf.org&amp;gt; &lt;br /&gt;
:参考:&lt;br /&gt;
::RFC 6120 &lt;br /&gt;
:端口号:&lt;br /&gt;
::5269&lt;br /&gt;
&lt;br /&gt;
==一致性需求==&lt;br /&gt;
&lt;br /&gt;
本章描述了一个协议特性集合来概述本协议的一致性需求. 本特性集合适用于软件认证, 互操作性测试, 和实现报告. 对于每个特性, 本章提供了以下信息: &lt;br /&gt;
&lt;br /&gt;
:* 自然人可读的名称&lt;br /&gt;
:* 描述信息&lt;br /&gt;
:* 本文特定章节的参考，该章节规范化地定义了该特性&lt;br /&gt;
:* 该特性是否适用于客户端角色，服务器角色，或同时适用于两者(这里 &amp;quot;N/A&amp;quot; 表示该特性不适用于该特定角色)&lt;br /&gt;
:* 该特性是必须(MUST)还是应该(SHOULD)被实现, 这里大写的术语被视为[[RFC6120#规范引用|KEYWORDS]]所描述的含义&lt;br /&gt;
&lt;br /&gt;
这里定义的特性集合尝试坚持Larry Masinter于2005年在IETF的NEWTRK工作组中建议的概念和格式, 摘自[[RFC6120#参考性文献|INTEROP]]. 尽管该特性集合比[[RFC6120#参考性文献|REPORTS]]中说的更详细, 它为实现报告的生成提供了一个合适的基础，这些报告将被提交以支持本协议按照[[RFC6120#参考性文献|PROCESS]]从建议标准发展成草案标准.&lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        bind-gen &lt;br /&gt;
    描述:&lt;br /&gt;
        根据需求生成一个随机资源. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#服务器生成的资源标识符|7.6]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 N/A, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        bind-mtn &lt;br /&gt;
    描述:&lt;br /&gt;
        把资源绑定作为强制协商的. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#强制协商|7.3.1]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        bind-restart &lt;br /&gt;
    描述:&lt;br /&gt;
        在资源绑定的协商之后不重启该流. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#重启|7.3.2]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        bind-support &lt;br /&gt;
    描述:&lt;br /&gt;
        支持客户端把资源绑定到一个已验证的流上. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#资源绑定|7]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        sasl-correlate &lt;br /&gt;
    描述:&lt;br /&gt;
        当使用SASL验证一个流对端的时候, 把认证标识符结果关联到它从对端接收到的SASL协商的流头中的'from'地址(如果有的话). &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#SASL成功|6.4.6]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 应该, 服务器 应该. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        sasl-errors &lt;br /&gt;
    描述:&lt;br /&gt;
        支持协商过程中的SASL错误. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#SASL错误|6.5]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        sasl-mtn &lt;br /&gt;
    描述:&lt;br /&gt;
        把SASL作为强制协商. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#强制协商|6.3.1]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        sasl-restart &lt;br /&gt;
    描述:&lt;br /&gt;
        在SASL协商之后发起或处理流重启. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#重启|6.3.2]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        sasl-support &lt;br /&gt;
    描述:&lt;br /&gt;
        支持简单验证和安全层用于验证. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#SASL协商|6]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        security-mti-auth-scram &lt;br /&gt;
    描述:&lt;br /&gt;
        仅支持 SASL SCRAM 机制用于验证(这表示同时支持 SCRAM‑SHA‑1 和 SCRAM‑SHA‑1‑PLUS 变种). &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#强制实现的TLS和SASL技术|13.8]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        security-mti-both-external &lt;br /&gt;
    描述:&lt;br /&gt;
        支持 TLS 和 SASL EXTERNAL 用于保密和验证. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#强制实现的TLS和SASL技术|13.8]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 应该, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        security-mti-both-plain &lt;br /&gt;
    描述:&lt;br /&gt;
        支持TLS使用TLS_RSA_WITH_AES_128_CBC_SHA密码组加上SASL PLAIN机制用于保密和验证. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#强制实现的TLS和SASL技术|13.8]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 应该, 服务器 可以. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        security-mti-both-scram &lt;br /&gt;
    描述:&lt;br /&gt;
        支持TLS使用TLS_RSA_WITH_AES_128_CBC_SHA密码组加上SASL SCRAM机制的SCRAM-SHA-1和SCRAM-SHA-1-PLUS变种用于保密和验证. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#强制实现的TLS和SASL技术|13.8]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        security-mti-confidentiality &lt;br /&gt;
    描述:&lt;br /&gt;
        支持TLS使用TLS_RSA_WITH_AES_128_CBC_SHA密码组只用于保密. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#强制实现的TLS和SASL技术|13.8]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 N/A, 服务器 应该. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-attribute-from &lt;br /&gt;
    描述:&lt;br /&gt;
        支持所有节种类共有的'from'属性. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#from|8.1.2]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-attribute-from-stamp &lt;br /&gt;
    描述:&lt;br /&gt;
        标记或重写所有从已连接的客户端收到的节的'from'地址. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#客户端-服务器流|8.1.2.1]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 N/A, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-attribute-from-validate &lt;br /&gt;
    描述:&lt;br /&gt;
        验证所有从对端服务器收到的节的'from'地址. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#服务器-服务器流|8.1.2.2]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 N/A, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-attribute-id &lt;br /&gt;
    描述:&lt;br /&gt;
        支持所有节类型共有的'id'属性. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#id|8.1.3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-attribute-to &lt;br /&gt;
    描述:&lt;br /&gt;
        支持所有节类型共有的'to'属性. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#to|8.1.1]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-attribute-to-validate &lt;br /&gt;
    描述:&lt;br /&gt;
        确保所有从对端服务器收到的节包含一个'to'地址. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#to|8.1.1]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 N/A, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-attribute-type &lt;br /&gt;
    描述:&lt;br /&gt;
        支持所有节类型共有的'type'属性. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#type|8.1.4]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-attribute-xmllang &lt;br /&gt;
    描述:&lt;br /&gt;
        支持所有节类型共有的'xml:lang'属性. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#xml:lang|8.1.5]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-error &lt;br /&gt;
    描述:&lt;br /&gt;
        为所有节种类生成和处理&amp;quot;error&amp;quot;类型的节. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#节错误|8.3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-error-child &lt;br /&gt;
    描述:&lt;br /&gt;
        确保&amp;quot;error&amp;quot;类型的节包含一个&amp;lt;error/&amp;gt;子元素. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#节错误|8.3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-error-id &lt;br /&gt;
    描述:&lt;br /&gt;
        确保&amp;quot;error&amp;quot;类型的节保留出发该错误的节提供的'id'. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#节错误|8.3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-error-reply &lt;br /&gt;
    描述:&lt;br /&gt;
        不对一个&amp;quot;error&amp;quot;类型的节应答另一个&amp;quot;error&amp;quot;类型的节. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#节错误|8.3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-extension &lt;br /&gt;
    描述:&lt;br /&gt;
        正确地处理由一个不被支持的XML命名空间限定的XML数据, 这里&amp;quot;正确地处理&amp;quot;意味着在一个消息或出席信息节的情况下忽略该节的那一部分或在一个IQ节的情况下返回一个错误(对期望的接收者), 以及路由或递送该节(对于一个路由的实体，例如一个服务器). &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#扩展内容|8.4]]&lt;br /&gt;
    章节:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-iq-child &lt;br /&gt;
    描述:&lt;br /&gt;
        确切地在一个类型为&amp;quot;get&amp;quot;或&amp;quot;set&amp;quot;的&amp;lt;iq/&amp;gt;节中包含一个子元素, 在一个类型为&amp;quot;result&amp;quot;的&amp;lt;iq/&amp;gt;节中包含零或一个子元素, 在一个类型为&amp;quot;error&amp;quot;的&amp;lt;iq/&amp;gt;中包含一个或两个子元素. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#IQ语义|8.2.3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-iq-id &lt;br /&gt;
    描述:&lt;br /&gt;
        确保所有&amp;lt;iq/&amp;gt;节包含一个'id'属性. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#IQ语义|8.2.3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须.&lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-iq-reply &lt;br /&gt;
    描述:&lt;br /&gt;
        以一个类型为&amp;quot;result&amp;quot;或 &amp;quot;error&amp;quot;的&amp;lt;iq/&amp;gt;节应答一个类型为&amp;quot;get&amp;quot;或&amp;quot;set&amp;quot;的&amp;lt;iq/&amp;gt;节. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#IQ语义|8.2.3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须.&lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-iq-type &lt;br /&gt;
    描述:&lt;br /&gt;
        确保所有&amp;lt;iq/&amp;gt;节包含一个'type'属性，它的值为&amp;quot;get&amp;quot;, &amp;quot;set&amp;quot;, &amp;quot;result&amp;quot;, 或 &amp;quot;error&amp;quot;. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#IQ语义|8.2.3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须.&lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-kind-iq &lt;br /&gt;
    描述:&lt;br /&gt;
        支持&amp;lt;iq/&amp;gt;节. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#IQ语义|8.2.3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须.&lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-kind-message &lt;br /&gt;
    描述:&lt;br /&gt;
        支持&amp;lt;message/&amp;gt;节. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#消息语义|8.2.1]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须.&lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stanza-kind-presence &lt;br /&gt;
    描述:&lt;br /&gt;
        支持&amp;lt;presence/&amp;gt;节. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#联机状态语义|8.2.2]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须.&lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stream-attribute-initial-from &lt;br /&gt;
    描述:&lt;br /&gt;
        在发起流头中包含一个'from'属性. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC8120#from|4.7.1]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 应该, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stream-attribute-initial-lang &lt;br /&gt;
    描述:&lt;br /&gt;
        在发起流头中包含一个'xml:lang'属性. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#xml:lang|4.7.4]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 应该, 服务器 应该. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stream-attribute-initial-to &lt;br /&gt;
    描述:&lt;br /&gt;
        在发起流头中包含一个'to'属性. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#to|4.7.2]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stream-attribute-response-from &lt;br /&gt;
    描述:&lt;br /&gt;
        在应答流头中包含一个'from'属性. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC8120#from|4.7.1]]&lt;br /&gt;
    惧色:&lt;br /&gt;
        客户端 N/A, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stream-attribute-response-id &lt;br /&gt;
    描述:&lt;br /&gt;
        在应答流头中包含一个'id'属性. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC8120#id|4.7.3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 N/A, 服务器 必须.&lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stream-attribute-response-id-unique &lt;br /&gt;
    描述:&lt;br /&gt;
        确保应答流头中的'id'属性在接收实体的上下文中是唯一的. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC8120#id|4.7.3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 N/A, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stream-attribute-response-to &lt;br /&gt;
    描述:&lt;br /&gt;
        在应答流头中包含一个'to'属性. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#to|4.7.2]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 N/A, 服务器 应该. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stream-error-generate &lt;br /&gt;
    描述:&lt;br /&gt;
        在探测到一个流相关的错误条件时生成一个流错误(跟随一个关闭流的标签并且中止该TCP连接). &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#流错误|4.9]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stream-fqdn-resolution &lt;br /&gt;
    描述:&lt;br /&gt;
        在打开一个到接收尸体的TCP连接之前解析FQDNs. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#合格的全域名解析|3.2]] &lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stream-negotiation-complete &lt;br /&gt;
    描述:&lt;br /&gt;
        在接收实体发送空的或仅包含自愿协商特性的流特性声明之前，不认为流协商已经完成. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#完成流协商|4.3.5]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    流特性:&lt;br /&gt;
        stream-negotiation-features &lt;br /&gt;
    描述:&lt;br /&gt;
        在发送一个应答流头之后发送流特性. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#流特性格式|4.3.2]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 N/A, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stream-negotiation-restart &lt;br /&gt;
    描述:&lt;br /&gt;
        当流特性协商需要流重启时，认为前一个流被替换了, 并在这样一个流特性协商之后发送或接收一个新的发起流头. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#重启|4.3.3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stream-reconnect &lt;br /&gt;
    描述:&lt;br /&gt;
        如果TCP连接被意外中止，以指数退避算法重连. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#重连|3.3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        stream-tcp-binding &lt;br /&gt;
    描述:&lt;br /&gt;
        绑定一个XML流到一个TCP连接. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#TCP绑定|3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        tls-certs &lt;br /&gt;
    描述:&lt;br /&gt;
        在TLS协商期间出示的证书所指定的身份. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#证书验证|13.7.2]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        tls-mtn &lt;br /&gt;
    描述:&lt;br /&gt;
        如果STARTTLS是被声明的唯一特性或如果STARTTLS特性声明包含了一个空的&amp;lt;required/&amp;gt;元素，认为TLS是强制协商的. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#强制协商|5.3.1]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        tls-restart &lt;br /&gt;
    描述:&lt;br /&gt;
        在TLS协商之后发起或处理一个流重启. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#重启|5.3.2]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        tls-support &lt;br /&gt;
    描述:&lt;br /&gt;
        支持传输层安全用于流加密. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#STARTTLS协商|5]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        tls-correlate &lt;br /&gt;
    描述:&lt;br /&gt;
        当验证一个在TLS协商期间由流对端出示的证书时, 关联该已验证身份到它从该对端接收的流头的'from'地址(如果存在). &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#证书验证|13.7.2]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 应该, 服务器 应该. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        xml-namespace-content-client &lt;br /&gt;
    描述:&lt;br /&gt;
        支持'jabber:client'作为内容命名空间. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#内容命名空间|4.8.2]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        xml-namespace-content-server &lt;br /&gt;
    描述:&lt;br /&gt;
        支持'jabber:server'作为内容命名空间. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#内容命名空间|4.8.2]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 N/A, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        xml-namespace-streams-declaration &lt;br /&gt;
    描述:&lt;br /&gt;
        确保有一个命名空间声明用于'http://etherx.jabber.org/streams'命名空间. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#流命名空间|4.8.1]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        xml-namespace-streams-prefix &lt;br /&gt;
    描述:&lt;br /&gt;
        确保所有由'http://etherx.jabber.org/streams'命名空间限定的元素的前缀(如果有)被定义于该命名空间声明中. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#流命名空间|4.8.1]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        xml-restriction-comment &lt;br /&gt;
    描述:&lt;br /&gt;
        不生成或接受XML注释. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#XML限制|11.1]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        xml-restriction-dtd &lt;br /&gt;
    描述:&lt;br /&gt;
        不生成或接受内部或外部的DTD子集. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#XML限制|11.1]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        xml-restriction-pi &lt;br /&gt;
    描述:&lt;br /&gt;
        不生成或接受XML处理指示. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#XML限制|11.1]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        xml-restriction-ref &lt;br /&gt;
    描述:&lt;br /&gt;
        不生成或接受预定义的实体之外的内部或外部的实体参考. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#XML限制|11.1]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        xml-wellformed-xml &lt;br /&gt;
    描述:&lt;br /&gt;
        不生成或接不良格式XML的数据. &lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#良好格式|11.3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须. &lt;br /&gt;
&lt;br /&gt;
    特性:&lt;br /&gt;
        xml-wellformed-ns &lt;br /&gt;
    描述:&lt;br /&gt;
        不生成或接不良格式命名空间的数据.&lt;br /&gt;
    章节:&lt;br /&gt;
        [[RFC6120#良好格式|11.3]]&lt;br /&gt;
    角色:&lt;br /&gt;
        客户端 必须, 服务器 必须.&lt;br /&gt;
&lt;br /&gt;
==参考==&lt;br /&gt;
===规范引用===&lt;br /&gt;
&lt;br /&gt;
[BASE64] 	Josefsson, S., “The Base16, Base32, and Base64 Data Encodings,” RFC 4648, October 2006 (TXT).&lt;br /&gt;
&lt;br /&gt;
[CHANNEL] 	Williams, N., “On the Use of Channel Bindings to Secure Channels,” RFC 5056, November 2007 (TXT).&lt;br /&gt;
&lt;br /&gt;
[CHANNEL-TLS] 	Altman, J., Williams, N., and L. Zhu, “Channel Bindings for TLS,” RFC 5929, July 2010 (TXT).&lt;br /&gt;
&lt;br /&gt;
[CHARSETS] 	Alvestrand, H., “IETF Policy on Character Sets and Languages,” BCP 18, RFC 2277, January 1998 (TXT, HTML, XML).&lt;br /&gt;
&lt;br /&gt;
[DNS-CONCEPTS] 	Mockapetris, P., “Domain names - concepts and facilities,” STD 13, RFC 1034, November 1987 (TXT).&lt;br /&gt;
&lt;br /&gt;
[DNS-SRV] 	Gulbrandsen, A., Vixie, P., and L. Esibov, “A DNS RR for specifying the location of services (DNS SRV),” RFC 2782, February 2000 (TXT).&lt;br /&gt;
&lt;br /&gt;
[IPv6-ADDR] 	Kawamura, S. and M. Kawashima, “A Recommendation for IPv6 Address Text Representation,” RFC 5952, August 2010 (TXT).&lt;br /&gt;
&lt;br /&gt;
[KEYWORDS] 	Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels,” BCP 14, RFC 2119, March 1997 (TXT, HTML, XML).&lt;br /&gt;
&lt;br /&gt;
[LANGMATCH] 	Phillips, A. and M. Davis, “Matching of Language Tags,” BCP 47, RFC 4647, September 2006 (TXT).&lt;br /&gt;
&lt;br /&gt;
[LANGTAGS] 	Phillips, A. and M. Davis, “Tags for Identifying Languages,” BCP 47, RFC 5646, September 2009 (TXT).&lt;br /&gt;
&lt;br /&gt;
[OCSP] 	Myers, M., Ankney, R., Malpani, A., Galperin, S., and C. Adams, “X.509 Internet Public Key Infrastructure Online Certificate Status Protocol - OCSP,” RFC 2560, June 1999 (TXT).&lt;br /&gt;
&lt;br /&gt;
[PKIX] 	Cooper, D., Santesson, S., Farrell, S., Boeyen, S., Housley, R., and W. Polk, “Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile,” RFC 5280, May 2008 (TXT).&lt;br /&gt;
&lt;br /&gt;
[PKIX-ALGO] 	Jonsson, J. and B. Kaliski, “Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1,” RFC 3447, February 2003 (TXT).&lt;br /&gt;
&lt;br /&gt;
[PKIX-SRV] 	Santesson, S., “Internet X.509 Public Key Infrastructure Subject Alternative Name for Expression of Service Name,” RFC 4985, August 2007 (TXT).&lt;br /&gt;
&lt;br /&gt;
[PLAIN] 	Zeilenga, K., “The PLAIN Simple Authentication and Security Layer (SASL) Mechanism,” RFC 4616, August 2006 (TXT).&lt;br /&gt;
&lt;br /&gt;
[RANDOM] 	Eastlake, D., Schiller, J., and S. Crocker, “Randomness Requirements for Security,” BCP 106, RFC 4086, June 2005 (TXT).&lt;br /&gt;
&lt;br /&gt;
[SASL] 	Melnikov, A. and K. Zeilenga, “Simple Authentication and Security Layer (SASL),” RFC 4422, June 2006 (TXT).&lt;br /&gt;
&lt;br /&gt;
[SCRAM] 	Newman, C., Menon-Sen, A., Melnikov, A., and N. Williams, “Salted Challenge Response Authentication Mechanism (SCRAM) SASL and GSS-API Mechanisms,” RFC 5802, July 2010 (TXT).&lt;br /&gt;
&lt;br /&gt;
[STRONGSEC] 	Schiller, J., “Strong Security Requirements for Internet Engineering Task Force Standard Protocols,” BCP 61, RFC 3365, August 2002 (TXT).&lt;br /&gt;
&lt;br /&gt;
[TCP] 	Postel, J., “Transmission Control Protocol,” STD 7, RFC 793, September 1981 (TXT).&lt;br /&gt;
&lt;br /&gt;
[TLS] 	Dierks, T. and E. Rescorla, “The Transport Layer Security (TLS) Protocol Version 1.2,” RFC 5246, August 2008 (TXT).&lt;br /&gt;
&lt;br /&gt;
[TLS-CERTS] 	Saint-Andre, P. and J. Hodges, “Representation and Verification of Domain-Based Application Service Identity within Internet Public Key Infrastructure Using X.509 (PKIX) Certificates in the Context of Transport Layer Security (TLS),” RFC 6125, March 2011.&lt;br /&gt;
&lt;br /&gt;
[TLS-NEG] 	Rescorla, E., Ray, M., Dispensa, S., and N. Oskov, “Transport Layer Security (TLS) Renegotiation Indication Extension,” RFC 5746, February 2010 (TXT).&lt;br /&gt;
&lt;br /&gt;
[TLS-SSL2] 	Turner, S. and T. Polk, “Prohibiting Secure Sockets Layer (SSL) Version 2.0,” RFC 6176, March 2011.&lt;br /&gt;
&lt;br /&gt;
[UCS2] 	International Organization for Standardization, “Information Technology - Universal Multiple-octet coded Character Set (UCS) - Amendment 2: UCS Transformation Format 8 (UTF-8),” ISO Standard 10646-1 Addendum 2, October 1996.&lt;br /&gt;
&lt;br /&gt;
[UNICODE] 	The Unicode Consortium, “The Unicode Standard, Version 6.0,” 2010.&lt;br /&gt;
&lt;br /&gt;
[UTF-8] 	Yergeau, F., “UTF-8, a transformation format of ISO 10646,” STD 63, RFC 3629, November 2003 (TXT).&lt;br /&gt;
&lt;br /&gt;
[URI] 	Berners-Lee, T., Fielding, R., and L. Masinter, “Uniform Resource Identifier (URI): Generic Syntax,” STD 66, RFC 3986, January 2005 (TXT, HTML, XML).&lt;br /&gt;
&lt;br /&gt;
[X509] 	International Telecommunications Union, “Information technology - Open Systems Interconnection - The Directory: Public-key and attribute certificate frameworks,” ITU-T Recommendation X.509, ISO Standard 9594-8, March 2000.&lt;br /&gt;
&lt;br /&gt;
[XML] 	Maler, E., Yergeau, F., Sperberg-McQueen, C., Paoli, J., and T. Bray, “Extensible Markup Language (XML) 1.0 (Fifth Edition),” World Wide Web Consortium Recommendation REC-xml-20081126, November 2008 (HTML).&lt;br /&gt;
&lt;br /&gt;
[XML-GUIDE] 	Hollenbeck, S., Rose, M., and L. Masinter, “Guidelines for the Use of Extensible Markup Language (XML) within IETF Protocols,” BCP 70, RFC 3470, January 2003 (TXT, HTML, XML).&lt;br /&gt;
&lt;br /&gt;
[XML-MEDIA] 	Murata, M., St. Laurent, S., and D. Kohn, “XML Media Types,” RFC 3023, January 2001 (TXT).&lt;br /&gt;
&lt;br /&gt;
[XML-NAMES] 	Thompson, H., Hollander, D., Layman, A., Bray, T., and R. Tobin, “Namespaces in XML 1.0 (Third Edition),” World Wide Web Consortium Recommendation REC-xml-names-20091208, December 2009 (HTML).&lt;br /&gt;
&lt;br /&gt;
[XMPP-ADDR] 	Saint-Andre, P., “Extensible Messaging and Presence Protocol (XMPP): Address Format,” RFC 6122, March 2011.&lt;br /&gt;
&lt;br /&gt;
[XMPP-IM] 	Saint-Andre, P., “Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence,” RFC 6121, March 2011.&lt;br /&gt;
&lt;br /&gt;
===参考文献===&lt;br /&gt;
&lt;br /&gt;
[AAA] 	Housley, R. and B. Aboba, “Guidance for Authentication, Authorization, and Accounting (AAA) Key Management,” BCP 132, RFC 4962, July 2007 (TXT).&lt;br /&gt;
&lt;br /&gt;
[ABNF] 	Crocker, D. and P. Overell, “Augmented BNF for Syntax Specifications: ABNF,” STD 68, RFC 5234, January 2008 (TXT).&lt;br /&gt;
&lt;br /&gt;
[ACAP] 	Newman, C. and J. Myers, “ACAP -- Application Configuration Access Protocol,” RFC 2244, November 1997 (TXT).&lt;br /&gt;
&lt;br /&gt;
[ANONYMOUS] 	Zeilenga, K., “Anonymous Simple Authentication and Security Layer (SASL) Mechanism,” RFC 4505, June 2006 (TXT).&lt;br /&gt;
&lt;br /&gt;
[ASN.1] 	CCITT, “Recommendation X.208: Specification of Abstract Syntax Notation One (ASN.1),” 1988.&lt;br /&gt;
&lt;br /&gt;
[DIGEST-MD5] 	Leach, P. and C. Newman, “Using Digest Authentication as a SASL Mechanism,” RFC 2831, May 2000 (TXT).&lt;br /&gt;
&lt;br /&gt;
[DNSSEC] 	Arends, R., Austein, R., Larson, M., Massey, D., and S. Rose, “DNS Security Introduction and Requirements,” RFC 4033, March 2005 (TXT).&lt;br /&gt;
&lt;br /&gt;
[DNS-TXT] 	Rosenbaum, R., “Using the Domain Name System To Store Arbitrary String Attributes,” RFC 1464, May 1993 (TXT).&lt;br /&gt;
&lt;br /&gt;
[DOS] 	Handley, M., Rescorla, E., and IAB, “Internet Denial-of-Service Considerations,” RFC 4732, December 2006 (TXT).&lt;br /&gt;
&lt;br /&gt;
[E2E-REQS] 	Saint-Andre, P., “Requirements for End-to-End Encryption in the Extensible Messaging and Presence Protocol (XMPP),” Work in Progress, March 2010.&lt;br /&gt;
&lt;br /&gt;
[EMAIL-ARCH] 	Crocker, D., “Internet Mail Architecture,” RFC 5598, July 2009 (TXT).&lt;br /&gt;
&lt;br /&gt;
[ETHERNET] 	“Information technology - Telecommunications and information exchange between systems - Local and metropolitan area networks - Specific requirements - Part 3: Carrier sense multiple access with collision detection (CSMA/CD) access method and physical layer specifications,” IEEE Standard 802.3, September 1998.&lt;br /&gt;
&lt;br /&gt;
[GSS-API] 	Linn, J., “Generic Security Service Application Program Interface Version 2, Update 1,” RFC 2743, January 2000 (TXT).&lt;br /&gt;
&lt;br /&gt;
[HASHES] 	Hoffman, P. and B. Schneier, “Attacks on Cryptographic Hashes in Internet Protocols,” RFC 4270, November 2005 (TXT).&lt;br /&gt;
&lt;br /&gt;
[HTTP] 	Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L., Leach, P., and T. Berners-Lee, “Hypertext Transfer Protocol -- HTTP/1.1,” RFC 2616, June 1999 (TXT, PS, PDF, HTML, XML).&lt;br /&gt;
&lt;br /&gt;
[IANA-GUIDE] 	Narten, T. and H. Alvestrand, “Guidelines for Writing an IANA Considerations Section in RFCs,” BCP 26, RFC 5226, May 2008 (TXT).&lt;br /&gt;
&lt;br /&gt;
[IANA-PORTS] 	Cotton, M., Eggert, L., Touch, J., Westerlund, M., and S. Cheshire, “Internet Assigned Numbers Authority (IANA) Procedures for the Management of the Transport Protocol Port Number and Service Name Registry,” Work in Progress, February 2011.&lt;br /&gt;
&lt;br /&gt;
[IMAP] 	Crispin, M., “INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1,” RFC 3501, March 2003 (TXT).&lt;br /&gt;
&lt;br /&gt;
[IMP-REQS] 	Day, M., Aggarwal, S., and J. Vincent, “Instant Messaging / Presence Protocol Requirements,” RFC 2779, February 2000 (TXT).&lt;br /&gt;
&lt;br /&gt;
[INTEROP] 	Masinter, L., “Formalizing IETF Interoperability Reporting,” Work in Progress, October 2005.&lt;br /&gt;
&lt;br /&gt;
[IRC] 	Kalt, C., “Internet Relay Chat: Architecture,” RFC 2810, April 2000 (TXT).&lt;br /&gt;
&lt;br /&gt;
[IRI] 	Duerst, M. and M. Suignard, “Internationalized Resource Identifiers (IRIs),” RFC 3987, January 2005 (TXT).&lt;br /&gt;
&lt;br /&gt;
[LDAP] 	Zeilenga, K., “Lightweight Directory Access Protocol (LDAP): Technical Specification Road Map,” RFC 4510, June 2006 (TXT).&lt;br /&gt;
&lt;br /&gt;
[LINKLOCAL] 	Cheshire, S., Aboba, B., and E. Guttman, “Dynamic Configuration of IPv4 Link-Local Addresses,” RFC 3927, May 2005 (TXT).&lt;br /&gt;
&lt;br /&gt;
[MAILBOXES] 	Crocker, D., “MAILBOX NAMES FOR COMMON SERVICES, ROLES AND FUNCTIONS,” RFC 2142, May 1997 (TXT, HTML, XML).&lt;br /&gt;
&lt;br /&gt;
[POP3] 	Myers, J. and M. Rose, “Post Office Protocol - Version 3,” STD 53, RFC 1939, May 1996 (TXT).&lt;br /&gt;
&lt;br /&gt;
[PROCESS] 	Bradner, S., “The Internet Standards Process -- Revision 3,” BCP 9, RFC 2026, October 1996 (TXT).&lt;br /&gt;
&lt;br /&gt;
[REPORTS] 	Dusseault, L. and R. Sparks, “Guidance on Interoperation and Implementation Reports for Advancement to Draft Standard,” BCP 9, RFC 5657, September 2009 (TXT).&lt;br /&gt;
&lt;br /&gt;
[REST] 	Fielding, R., “Architectural Styles and the Design of Network-based Software Architectures,”  2000.&lt;br /&gt;
&lt;br /&gt;
[RFC3920] 	Saint-Andre, P., Ed., “Extensible Messaging and Presence Protocol (XMPP): Core,” RFC 3920, October 2004 (TXT, HTML, XML).&lt;br /&gt;
&lt;br /&gt;
[RFC3921] 	Saint-Andre, P., Ed., “Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence,” RFC 3921, October 2004 (TXT, HTML, XML).&lt;br /&gt;
&lt;br /&gt;
[SASLPREP] 	Zeilenga, K., “SASLprep: Stringprep Profile for User Names and Passwords,” RFC 4013, February 2005 (TXT).&lt;br /&gt;
&lt;br /&gt;
[SEC-TERMS] 	Shirey, R., “Internet Security Glossary, Version 2,” RFC 4949, August 2007 (TXT).&lt;br /&gt;
&lt;br /&gt;
[SMTP] 	Klensin, J., “Simple Mail Transfer Protocol,” RFC 5321, October 2008 (TXT).&lt;br /&gt;
&lt;br /&gt;
[SEC-GUIDE] 	Rescorla, E. and B. Korver, “Guidelines for Writing RFC Text on Security Considerations,” BCP 72, RFC 3552, July 2003 (TXT).&lt;br /&gt;
&lt;br /&gt;
[TLS-EXT] 	Eastlake 3rd, D., “Transport Layer Security (TLS) Extensions: Extension Definitions,” RFC 6066, January 2011 (TXT).&lt;br /&gt;
&lt;br /&gt;
[TLS-RESUME] 	Salowey, J., Zhou, H., Eronen, P., and H. Tschofenig, “Transport Layer Security (TLS) Session Resumption without Server-Side State,” RFC 5077, January 2008 (TXT).&lt;br /&gt;
&lt;br /&gt;
[URN-OID] 	Mealling, M., “A URN Namespace of Object Identifiers,” RFC 3061, February 2001 (TXT).&lt;br /&gt;
&lt;br /&gt;
[USINGTLS] 	Newman, C., “Using TLS with IMAP, POP3 and ACAP,” RFC 2595, June 1999 (TXT).&lt;br /&gt;
&lt;br /&gt;
[UUID] 	Leach, P., Mealling, M., and R. Salz, “A Universally Unique IDentifier (UUID) URN Namespace,” RFC 4122, July 2005 (TXT, HTML, XML).&lt;br /&gt;
&lt;br /&gt;
[XEP-0001] 	Saint-Andre, P., “XMPP Extension Protocols,” XSF XEP 0001, March 2010.&lt;br /&gt;
&lt;br /&gt;
[XEP-0016] 	Millard, P. and P. Saint-Andre, “Privacy Lists,” XSF XEP 0016, February 2007.&lt;br /&gt;
&lt;br /&gt;
[XEP-0045] 	Saint-Andre, P., “Multi-User Chat,” XSF XEP 0045, July 2007.&lt;br /&gt;
&lt;br /&gt;
[XEP-0060] 	Millard, P., Saint-Andre, P., and R. Meijer, “Publish-Subscribe,” XSF XEP 0060, July 2010.&lt;br /&gt;
&lt;br /&gt;
[XEP-0071] 	Saint-Andre, P., “XHTML-IM,” XSF XEP 0071, September 2008.&lt;br /&gt;
&lt;br /&gt;
[XEP-0077] 	Saint-Andre, P., “In-Band Registration,” XSF XEP 0077, September 2009.&lt;br /&gt;
&lt;br /&gt;
[XEP-0086] 	Norris, R. and P. Saint-Andre, “Error Condition Mappings,” XSF XEP 0086, February 2004.&lt;br /&gt;
&lt;br /&gt;
[XEP-0100] 	Saint-Andre, P. and D. Smith, “Gateway Interaction,” XSF XEP 0100, October 2005.&lt;br /&gt;
&lt;br /&gt;
[XEP-0114] 	Saint-Andre, P., “Jabber Component Protocol,” XSF XEP 0114, March 2005.&lt;br /&gt;
&lt;br /&gt;
[XEP-0124] 	Paterson, I., Smith, D., and P. Saint-Andre, “Bidirectional-streams Over Synchronous HTTP (BOSH),” XSF XEP 0124, July 2010.&lt;br /&gt;
&lt;br /&gt;
[XEP-0138] 	Hildebrand, J. and P. Saint-Andre, “Stream Compression,” XSF XEP 0138, May 2009.&lt;br /&gt;
&lt;br /&gt;
[XEP-0156] 	Hildebrand, J. and P. Saint-Andre, “Discovering Alternative XMPP Connection Methods,” XSF XEP 0156, June 2007.&lt;br /&gt;
&lt;br /&gt;
[XEP-0160] 	Saint-Andre, P., “Best Practices for Handling Offline Messages,” XSF XEP 0160, January 2006.&lt;br /&gt;
&lt;br /&gt;
[XEP-0174] 	Saint-Andre, P., “Link-Local Messaging,” XSF XEP 0174, November 2008.&lt;br /&gt;
&lt;br /&gt;
[XEP-0175] 	Saint-Andre, P., “Best Practices for Use of SASL ANONYMOUS,” XSF XEP 0175, September 2009.&lt;br /&gt;
&lt;br /&gt;
[XEP-0178] 	Saint-Andre, P. and P. Millard, “Best Practices for Use of SASL EXTERNAL with Certificates,” XSF XEP 0178, February 2007.&lt;br /&gt;
&lt;br /&gt;
[XEP-0191] 	Saint-Andre, P., “Simple Communications Blocking,” XSF XEP 0191, February 2007.&lt;br /&gt;
&lt;br /&gt;
[XEP-0198] 	Karneges, J., Hildebrand, J., Saint-Andre, P., Forno, F., Cridland, D., and M. Wild, “Stream Management,” XSF XEP 0198, February 2011.&lt;br /&gt;
&lt;br /&gt;
[XEP-0199] 	Saint-Andre, P., “XMPP Ping,” XSF XEP 0199, June 2009.&lt;br /&gt;
&lt;br /&gt;
[XEP-0205] 	Saint-Andre, P., “Best Practices to Discourage Denial of Service Attacks,” XSF XEP 0205, January 2009.&lt;br /&gt;
&lt;br /&gt;
[XEP-0206] 	Paterson, I. and P. Saint-Andre, “XMPP Over BOSH,” XSF XEP 0206, July 2010.&lt;br /&gt;
&lt;br /&gt;
[XEP-0220] 	Miller, J., Saint-Andre, P., and P. Hancke, “Server Dialback,” XSF XEP 0220, March 2010.&lt;br /&gt;
&lt;br /&gt;
[XEP-0225] 	Saint-Andre, P., “Component Connections,” XSF XEP 0225, October 2008.&lt;br /&gt;
&lt;br /&gt;
[XEP-0233] 	Miller, M., Saint-Andre, P., and J. Hildebrand, “Domain-Based Service Names in XMPP SASL Negotiation,” XSF XEP 0233, June 2010.&lt;br /&gt;
&lt;br /&gt;
[XEP-0288] 	Hancke, P. and D. Cridland, “Bidirectional Server-to-Server Connections,” XSF XEP 0288, October 2010.&lt;br /&gt;
&lt;br /&gt;
[XML-FRAG] 	Grosso, P. and D. Veillard, “XML Fragment Interchange,” World Wide Web Consortium CR CR-xml-fragment-20010212, February 2001 (HTML).&lt;br /&gt;
&lt;br /&gt;
[XML-REG] 	Mealling, M., “The IETF XML Registry,” BCP 81, RFC 3688, January 2004 (TXT).&lt;br /&gt;
&lt;br /&gt;
[XML-SCHEMA] 	Thompson, H., Maloney, M., Mendelsohn, N., and D. Beech, “XML Schema Part 1: Structures Second Edition,” World Wide Web Consortium Recommendation REC-xmlschema-1-20041028, October 2004 (HTML).&lt;br /&gt;
&lt;br /&gt;
[XMPP-URI] 	Saint-Andre, P., “Internationalized Resource Identifiers (IRIs) and Uniform Resource Identifiers (URIs) for the Extensible Messaging and Presence Protocol (XMPP),” RFC 5122, February 2008 (TXT).&lt;br /&gt;
&lt;br /&gt;
==附录A. XML Schemas==&lt;br /&gt;
&lt;br /&gt;
以下schemas正式定义了本文用到的各命名空间, 符合[[RFC6120#参考文献|XML‑SCHEMA]]. 因为XML流和节的验证是可选的, 这些schemas不是规范性的并且只被提供为描述的目的.&lt;br /&gt;
&lt;br /&gt;
===A.1. Stream命名空间===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://etherx.jabber.org/streams'&lt;br /&gt;
    xmlns='http://etherx.jabber.org/streams'&lt;br /&gt;
    elementFormDefault='unqualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:import namespace='jabber:client'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:import namespace='jabber:server'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:import namespace='urn:ietf:params:xml:ns:xmpp-sasl'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:import namespace='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:import namespace='urn:ietf:params:xml:ns:xmpp-tls'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='stream'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence xmlns:client='jabber:client'&lt;br /&gt;
                   xmlns:server='jabber:server'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='features'&lt;br /&gt;
                    minOccurs='0'&lt;br /&gt;
                    maxOccurs='1'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:any namespace='urn:ietf:params:xml:ns:xmpp-tls'&lt;br /&gt;
                minOccurs='0'&lt;br /&gt;
                maxOccurs='1'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:any namespace='urn:ietf:params:xml:ns:xmpp-sasl'&lt;br /&gt;
                minOccurs='0'&lt;br /&gt;
                maxOccurs='1'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:any namespace='##other'&lt;br /&gt;
                minOccurs='0'&lt;br /&gt;
                maxOccurs='unbounded'&lt;br /&gt;
                processContents='lax'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:choice minOccurs='0' maxOccurs='1'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:choice minOccurs='0' maxOccurs='unbounded'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:element ref='client:message'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:element ref='client:presence'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:element ref='client:iq'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
          &amp;lt;xs:choice minOccurs='0' maxOccurs='unbounded'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:element ref='server:message'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:element ref='server:presence'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:element ref='server:iq'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='error' minOccurs='0' maxOccurs='1'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='id' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='version' type='xs:decimal' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:anyAttribute namespace='##other' processContents='lax'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='features'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:any namespace='##other'&lt;br /&gt;
                minOccurs='0'&lt;br /&gt;
                maxOccurs='unbounded'&lt;br /&gt;
                processContents='lax'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='error'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence  xmlns:err='urn:ietf:params:xml:ns:xmpp-streams'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:group   ref='err:streamErrorGroup'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='err:text'&lt;br /&gt;
                    minOccurs='0'&lt;br /&gt;
                    maxOccurs='1'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:any     namespace='##other'&lt;br /&gt;
                    minOccurs='0'&lt;br /&gt;
                    maxOccurs='1'&lt;br /&gt;
                    processContents='lax'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===A.2. Stream Error命名空间===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='urn:ietf:params:xml:ns:xmpp-streams'&lt;br /&gt;
    xmlns='urn:ietf:params:xml:ns:xmpp-streams'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='bad-format' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='bad-namespace-prefix' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='conflict' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='connection-timeout' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='host-gone' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='host-unknown' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='improper-addressing' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='internal-server-error' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='invalid-from' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='invalid-id' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='invalid-namespace' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='invalid-xml' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='not-authorized' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='not-well-formed' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='policy-violation' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='remote-connection-failed' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='reset' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='resource-constraint' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='restricted-xml' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='see-other-host' type='xs:string'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='system-shutdown' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='undefined-condition' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='unsupported-encoding' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='unsupported-stanza-type' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='unsupported-version' type='empty'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:group name='streamErrorGroup'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:choice&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='bad-format'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='bad-namespace-prefix'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='conflict'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='connection-timeout'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='host-gone'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='host-unknown'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='improper-addressing'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='internal-server-error'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='invalid-from'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='invalid-id'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='invalid-namespace'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='invalid-xml'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='not-authorized'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='not-well-formed'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='policy-violation'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='remote-connection-failed'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='reset'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='resource-constraint'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='restricted-xml'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='see-other-host'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='system-shutdown'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='undefined-condition'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='unsupported-encoding'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='unsupported-stanza-type'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='unsupported-version'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:group&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='text'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='xs:string'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===A.3. STARTTLS命名空间===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='urn:ietf:params:xml:ns:xmpp-tls'&lt;br /&gt;
    xmlns='urn:ietf:params:xml:ns:xmpp-tls'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='starttls'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:choice minOccurs='0' maxOccurs='1'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='required' type='empty'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='proceed' type='empty'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='failure' type='empty'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===A.4. SASL命名空间===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='urn:ietf:params:xml:ns:xmpp-sasl'&lt;br /&gt;
    xmlns='urn:ietf:params:xml:ns:xmpp-sasl'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='mechanisms'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='mechanism'&lt;br /&gt;
                    minOccurs='1'&lt;br /&gt;
                    maxOccurs='unbounded'&lt;br /&gt;
                    type='xs:NMTOKEN'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:any namespace='##other'&lt;br /&gt;
                minOccurs='0'&lt;br /&gt;
                maxOccurs='unbounded'&lt;br /&gt;
                processContents='lax'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='abort' type='empty'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='xs:string'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='mechanism'&lt;br /&gt;
                        type='xs:NMTOKEN'&lt;br /&gt;
                        use='required'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='challenge' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='response' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='success' type='xs:string'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='failure'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:choice minOccurs='0'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element name='aborted' type='empty'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element name='account-disabled' type='empty'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element name='credentials-expired' type='empty'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element name='encryption-required' type='empty'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element name='incorrect-encoding' type='empty'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element name='invalid-authzid' type='empty'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element name='invalid-mechanism' type='empty'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element name='malformed-request' type='empty'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element name='mechanism-too-weak' type='empty'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element name='not-authorized' type='empty'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element name='temporary-auth-failure' type='empty'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='text' minOccurs='0' maxOccurs='1'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='text'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='xs:string'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===A.5. Client命名空间===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='jabber:client'&lt;br /&gt;
    xmlns='jabber:client'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:import&lt;br /&gt;
      namespace='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='message'&amp;gt;&lt;br /&gt;
     &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
          &amp;lt;xs:choice minOccurs='0' maxOccurs='unbounded'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:element ref='subject'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:element ref='body'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:element ref='thread'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
          &amp;lt;xs:any     namespace='##other'&lt;br /&gt;
                      minOccurs='0'&lt;br /&gt;
                      maxOccurs='unbounded'&lt;br /&gt;
                      processContents='lax'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element ref='error'&lt;br /&gt;
                      minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:attribute name='from'&lt;br /&gt;
                      type='xs:string'&lt;br /&gt;
                      use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:attribute name='id'&lt;br /&gt;
                      type='xs:NMTOKEN'&lt;br /&gt;
                      use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:attribute name='to'&lt;br /&gt;
                      type='xs:string'&lt;br /&gt;
                      use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:attribute name='type'&lt;br /&gt;
                      use='optional'&lt;br /&gt;
                      default='normal'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
            &amp;lt;xs:restriction base='xs:NMTOKEN'&amp;gt;&lt;br /&gt;
              &amp;lt;xs:enumeration value='chat'/&amp;gt;&lt;br /&gt;
              &amp;lt;xs:enumeration value='error'/&amp;gt;&lt;br /&gt;
              &amp;lt;xs:enumeration value='groupchat'/&amp;gt;&lt;br /&gt;
              &amp;lt;xs:enumeration value='headline'/&amp;gt;&lt;br /&gt;
              &amp;lt;xs:enumeration value='normal'/&amp;gt;&lt;br /&gt;
            &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
        &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='body'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='xs:string'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='subject'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='xs:string'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='thread'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='xs:NMTOKEN'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='parent'&lt;br /&gt;
                        type='xs:NMTOKEN'&lt;br /&gt;
                        use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='presence'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:choice minOccurs='0' maxOccurs='unbounded'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element ref='show'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element ref='status'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element ref='priority'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
        &amp;lt;xs:any     namespace='##other'&lt;br /&gt;
                    minOccurs='0'&lt;br /&gt;
                    maxOccurs='unbounded'&lt;br /&gt;
                    processContents='lax'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='error'&lt;br /&gt;
                    minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from'&lt;br /&gt;
                    type='xs:string'&lt;br /&gt;
                    use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='id'&lt;br /&gt;
                    type='xs:NMTOKEN'&lt;br /&gt;
                    use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to'&lt;br /&gt;
                    type='xs:string'&lt;br /&gt;
                    use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='type' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NMTOKEN'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='error'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='probe'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='subscribe'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='subscribed'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='unavailable'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='unsubscribe'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='unsubscribed'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='show'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:restriction base='xs:NMTOKEN'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:enumeration value='away'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:enumeration value='chat'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:enumeration value='dnd'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:enumeration value='xa'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='status'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='string1024'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='string1024'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:minLength value='1'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:maxLength value='1024'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='priority' type='xs:byte'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='iq'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:any     namespace='##other'&lt;br /&gt;
                    minOccurs='0'&lt;br /&gt;
                    maxOccurs='1'&lt;br /&gt;
                    processContents='lax'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='error'&lt;br /&gt;
                    minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from'&lt;br /&gt;
                    type='xs:string'&lt;br /&gt;
                    use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='id'&lt;br /&gt;
                    type='xs:NMTOKEN'&lt;br /&gt;
                    use='required'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to'&lt;br /&gt;
                    type='xs:string'&lt;br /&gt;
                    use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='type' use='required'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NMTOKEN'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='error'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='get'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='result'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='set'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='error'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence xmlns:err='urn:ietf:params:xml:ns:xmpp-stanzas'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:group ref='err:stanzaErrorGroup'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='err:text'&lt;br /&gt;
                    minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='by'&lt;br /&gt;
                    type='xs:string'&lt;br /&gt;
                    use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='type' use='required'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NMTOKEN'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='auth'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='cancel'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='continue'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='modify'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='wait'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===A.6. Server命名空间===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='jabber:server'&lt;br /&gt;
    xmlns='jabber:server'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:import&lt;br /&gt;
      namespace='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='message'&amp;gt;&lt;br /&gt;
     &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
          &amp;lt;xs:choice minOccurs='0' maxOccurs='unbounded'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:element ref='subject'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:element ref='body'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:element ref='thread'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
          &amp;lt;xs:any namespace='##other'&lt;br /&gt;
                  minOccurs='0'&lt;br /&gt;
                  maxOccurs='unbounded'&lt;br /&gt;
                  processContents='lax'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element ref='error'&lt;br /&gt;
                      minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:attribute name='from'&lt;br /&gt;
                      type='xs:string'&lt;br /&gt;
                      use='required'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:attribute name='id'&lt;br /&gt;
                      type='xs:NMTOKEN'&lt;br /&gt;
                      use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:attribute name='to'&lt;br /&gt;
                      type='xs:string'&lt;br /&gt;
                      use='required'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:attribute name='type'&lt;br /&gt;
                      use='optional'&lt;br /&gt;
                      default='normal'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
            &amp;lt;xs:restriction base='xs:NMTOKEN'&amp;gt;&lt;br /&gt;
              &amp;lt;xs:enumeration value='chat'/&amp;gt;&lt;br /&gt;
              &amp;lt;xs:enumeration value='error'/&amp;gt;&lt;br /&gt;
              &amp;lt;xs:enumeration value='groupchat'/&amp;gt;&lt;br /&gt;
              &amp;lt;xs:enumeration value='headline'/&amp;gt;&lt;br /&gt;
              &amp;lt;xs:enumeration value='normal'/&amp;gt;&lt;br /&gt;
            &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
        &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
     &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='body'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='xs:string'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='subject'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='xs:string'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='thread'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='xs:NMTOKEN'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='parent'&lt;br /&gt;
                        type='xs:NMTOKEN'&lt;br /&gt;
                        use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='subject'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='xs:NMTOKEN'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='parent'&lt;br /&gt;
                        type='xs:NMTOKEN'&lt;br /&gt;
                        use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='presence'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:choice minOccurs='0' maxOccurs='unbounded'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element ref='show'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element ref='status'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element ref='priority'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
        &amp;lt;xs:any     namespace='##other'&lt;br /&gt;
                    minOccurs='0'&lt;br /&gt;
                    maxOccurs='unbounded'&lt;br /&gt;
                    processContents='lax'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='error'&lt;br /&gt;
                    minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from'&lt;br /&gt;
                    type='xs:string'&lt;br /&gt;
                    use='required'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='id'&lt;br /&gt;
                    type='xs:NMTOKEN'&lt;br /&gt;
                    use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to'&lt;br /&gt;
                    type='xs:string'&lt;br /&gt;
                    use='required'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='type' use='optional'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NMTOKEN'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='error'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='probe'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='subscribe'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='subscribed'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='unavailable'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='unsubscribe'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='unsubscribed'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='show'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:restriction base='xs:NMTOKEN'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:enumeration value='away'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:enumeration value='chat'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:enumeration value='dnd'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:enumeration value='xa'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='status'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='string1024'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='string1024'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:minLength value='1'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:maxLength value='1024'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='priority' type='xs:byte' default='0'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='iq'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:any namespace='##other'&lt;br /&gt;
                minOccurs='0'&lt;br /&gt;
                maxOccurs='1'&lt;br /&gt;
                processContents='lax'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='error'&lt;br /&gt;
                    minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='from'&lt;br /&gt;
                    type='xs:string'&lt;br /&gt;
                    use='required'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='id'&lt;br /&gt;
                    type='xs:NMTOKEN'&lt;br /&gt;
                    use='required'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='to'&lt;br /&gt;
                    type='xs:string'&lt;br /&gt;
                    use='required'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='type' use='required'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NMTOKEN'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='error'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='get'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='result'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='set'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='error'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence xmlns:err='urn:ietf:params:xml:ns:xmpp-stanzas'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:group ref='err:stanzaErrorGroup'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='err:text'&lt;br /&gt;
                    minOccurs='0'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='by'&lt;br /&gt;
                    type='xs:string'&lt;br /&gt;
                    use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='type' use='required'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NMTOKEN'&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='auth'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='cancel'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='continue'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='modify'/&amp;gt;&lt;br /&gt;
            &amp;lt;xs:enumeration value='wait'/&amp;gt;&lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===A.7. Resource Binding命名空间===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='urn:ietf:params:xml:ns:xmpp-bind'&lt;br /&gt;
    xmlns='urn:ietf:params:xml:ns:xmpp-bind'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='bind'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:choice&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='resource' type='resourceType'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='jid' type='fullJIDType'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='fullJIDType'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:minLength value='8'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:maxLength value='3071'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='resourceType'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:minLength value='1'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:maxLength value='1023'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===A.8. Stanza Error命名空间===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='urn:ietf:params:xml:ns:xmpp-stanzas'&lt;br /&gt;
    xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='bad-request' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='conflict' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='feature-not-implemented' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='forbidden' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='gone' type='xs:string'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='internal-server-error' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='item-not-found' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='jid-malformed' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='not-acceptable' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='not-allowed' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='not-authorized' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='policy-violation' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='recipient-unavailable' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='redirect' type='xs:string'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='registration-required' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='remote-server-not-found' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='remote-server-timeout' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='resource-constraint' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='service-unavailable' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='subscription-required' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='undefined-condition' type='empty'/&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name='unexpected-request' type='empty'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:group name='stanzaErrorGroup'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:choice&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='bad-request'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='conflict'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='feature-not-implemented'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='forbidden'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='gone'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='internal-server-error'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='item-not-found'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='jid-malformed'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='not-acceptable'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='not-authorized'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='not-allowed'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='policy-violation'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='recipient-unavailable'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='redirect'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='registration-required'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='remote-server-not-found'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='remote-server-timeout'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='resource-constraint'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='service-unavailable'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='subscription-required'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='undefined-condition'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:element ref='unexpected-request'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:group&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='text'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='xs:string'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute ref='xml:lang' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==附录B. 联系地址==&lt;br /&gt;
&lt;br /&gt;
和[[RFC6120#参考文献|MAILBOXES]]一致, 提供XMPP服务的组织被鼓励提供一个&amp;quot;XMPP&amp;quot;的互联网邮箱用于查询那个服务相关的事情, 这里最终的mailto URI的host部分是组织的域, 而不是XMPP服务本身的域(例如, XMPP服务可以在im.example.com提供但是互联网邮箱是&amp;lt;xmpp@example.com&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==附录C. 帐户设置==&lt;br /&gt;
&lt;br /&gt;
帐户设置超出了本文的范围. 对于帐户设置可能的方法包括由一个服务器管理员创建帐户和使用[[XEP-0077]]所述的'jabber:iq:register'命名空间进行带内帐户注册. 一个XMPP服务器实现或管理功能必须确保在帐户设置期间被分配的任何JID(包括 本地部分, 域部分, 资源部分, 和分隔符)符合[[RFC6120#规范引用|XMPP‑ADDR]]定义的XMPP地址的规范格式.&lt;br /&gt;
&lt;br /&gt;
==附录D. 和RFC 3920的不同==&lt;br /&gt;
&lt;br /&gt;
基于从实现和部署经验衍生的共识以及正式的互操作性测试, 以下是对 RFC 3920的实质性修改(除了许多编辑性质的修改).&lt;br /&gt;
&lt;br /&gt;
:* 把XMPP地址格式的规范移到单独的文档中去了.&lt;br /&gt;
:* 在流头上建议或要求使用'from'和'to'属性.&lt;br /&gt;
:* 更完整地定义了流关闭握手.&lt;br /&gt;
:* 定义了建议的流重连算法.&lt;br /&gt;
:* 把&amp;lt;xml-not-well-formed/&amp;gt;流错误条件的名字改成&amp;lt;not-well-formed/&amp;gt;以符合XML规范.&lt;br /&gt;
:* 移除不必要和不用的&amp;lt;invalid-id/&amp;gt;流错误(见RFC 3920的历史文档).&lt;br /&gt;
:* 定义了收到被禁止的XML特性之后返回的&amp;lt;restricted-xml/&amp;gt;流错误应答.&lt;br /&gt;
:* 更全面的定义了&amp;lt;see-other-host/&amp;gt;流错误的格式和处理, 包括和RFC 3986以及RFC 5952关于IPv6地址的一致性(例如, 以方括号'[' 和 ']'关闭IPv6地址).&lt;br /&gt;
:* 定义了对于客户端-服务器流SASL SCRAM机制是一个强制协商的技术.&lt;br /&gt;
:* 定义了对于客户端-服务器流TLS加上SASL PLAIN机制是一个强制实现的技术.&lt;br /&gt;
:* 定义了服务器必须支持SASL EXTERNAL机制，但是客户端只是推荐支持它(因为最终用户X.509证书很难获得并且没有被广泛地部署).&lt;br /&gt;
:* 移除对于服务器-服务器流困难的 两个连接 规则.&lt;br /&gt;
:* 更清晰地定义了公共密钥证书和发行者证书的证书范例.&lt;br /&gt;
:* 增加了&amp;lt;reset/&amp;gt;流错误([[RFC6120#reset|4.9.3.16]])条件来处理过期/撤销的证书或一个现有的流上的附加安全关键特性.&lt;br /&gt;
:* 增加了&amp;lt;account-disabled/&amp;gt;, &amp;lt;credentials-expired/&amp;gt;, &amp;lt;encryption-required/&amp;gt;, 和 &amp;lt;malformed-request/&amp;gt; SASL错误条件来处理被RFC 3920误漏或在RFC 4422中讨论过但是不在RFC 2222中的的错误流.&lt;br /&gt;
:* 移除不用的&amp;lt;payment-required/&amp;gt;节错误.&lt;br /&gt;
:* 移除对于映射到特定的预定义实体的转义字符的不必要需求, 因为它们在XML中不需要被转义.&lt;br /&gt;
:* 澄清DNS SRV查询和回退的过程.&lt;br /&gt;
:* 澄清SASL安全层的处理.&lt;br /&gt;
:* 澄清一个SASL简单用户名是本地部分, 而不是纯JID.&lt;br /&gt;
:* 澄清流协商过程和相关的流程图.&lt;br /&gt;
:* 澄清流特性的处理.&lt;br /&gt;
:* 增加了'by'属性到用于节错误的&amp;lt;error/&amp;gt;元素，这样检测到错误的实体可以把它的JID包含在里面用于诊断或跟踪的目的.&lt;br /&gt;
:* 澄清违反XML1.0和XML namespaces定义的良好格式的数据的处理.&lt;br /&gt;
:* 定义了更多安全事项的细节, 特别是关于联机状态泄露和拒绝服务攻击.&lt;br /&gt;
:* 从本文中移除服务器回拨协议到由XMPP标准基金会维护的一个独立的协议.&lt;br /&gt;
&lt;br /&gt;
==附录E. 致谢==&lt;br /&gt;
&lt;br /&gt;
本文衍生自自RFC 3920，是对它的更新. 没有贡献者们和评论者们的工作，本文是不可能完成的.&lt;br /&gt;
&lt;br /&gt;
从RFC 3920发布以来，数百人提供了实现反馈, 错误报告, 澄清的请求, 和改善建议. 尽管本文的编辑已经努力找出所有这类反馈, 但他独自对任何其余的错误和含糊的地方负责.&lt;br /&gt;
&lt;br /&gt;
特别感谢 Kevin Smith, Matthew Wild, Dave Cridland, Philipp Hancke, Waqas Hussain, Florian Zeitz, Ben Campbell, Jehan Pages, Paul Aurich, Justin Karneges, Kurt Zeilenga, Simon Josefsson, Ralph Meijer, Curtis King, 和其他在工作组最后召集期间做评论的人.&lt;br /&gt;
&lt;br /&gt;
也分别感谢代表安全局进行复审的 Yaron Sheffer 和 Elwyn Davies和通用领域复审小组.&lt;br /&gt;
&lt;br /&gt;
工作组主席是 Ben Campbell 和 Joe Hildebrand. 责任区域编辑是 Gonzalo Camarillo.&lt;br /&gt;
&lt;br /&gt;
==作者的地址==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  	Peter Saint-Andre&lt;br /&gt;
  	Cisco&lt;br /&gt;
  	1899 Wyknoop Street, Suite 600&lt;br /&gt;
  	Denver, CO 80202&lt;br /&gt;
  	USA&lt;br /&gt;
  Phone:+1-303-308-3282&lt;br /&gt;
  EMail:psaintan@cisco.com&lt;br /&gt;
&lt;br /&gt;
[[Category:XMPP相关RFC]]&lt;br /&gt;
[[Category:XMPP核心RFC]]&lt;br /&gt;
[[Category:已翻译]]&lt;/div&gt;</summary>
		<author><name>Zyhserry</name></author>	</entry>

	</feed>