archive-org.com » ORG » J » JABBERCN.ORG

Total: 303

Choose link from "Titles, links and description words view":

Or switch to "Titles and links view".
  • “RFC3921”的版本历史 - Jabber/XMPP中文翻译计划
    02 03 Chruse arroyo 讨论 贡献 181 029字节 当前 先前 2011年6月2日 四 16 46 Admin 讨论 贡献 小 180 969字节 当前 先前 2011年5月18日 三 20 12 Snowqiang 讨论 贡献 180 948字节 当前 先前 2011年5月18日 三 20 09 Snowqiang 讨论 贡献 180 965字节 当前 先前 2010年6月4日 五 12 03 Fantasysoft 讨论 贡献 小 180 999字节 会话的建立 当前 先前 2010年6月2日 三 12 21 Jreros 讨论 贡献 小 181 005字节 屏蔽出站出席信息通知 当前 先前

    Original URL path: http://wiki.jabbercn.org/index.php?title=RFC3921&action=history (2016-04-25)
    Open archived version from archive


  • 链接至“RFC3921”的页面 - Jabber/XMPP中文翻译计划
    500 首页 链入页面 RFC3920 链入页面 RFC4622 链入页面 XEP 0030 链入页面 XEP 0045 链入页面 XEP 0060 链入页面 XEP 0073 链入页面 XEP 0077 链入页面 XEP 0079 链入页面 XEP 0085 链入页面 XEP 0211 链入页面 XEP 0212 链入页面 模板 最新消息 链入页面 Ejabberd2 安装和操作指南 链入页面 XEP 0084 链入页面 RFC6120 链入页面 Jabber XMPP中文翻译计划 关于 链入页面 Jabber XMPP中文翻译计划 新闻动态 链入页面 RFC6121 链入页面 XEP 0147 链入页面 查看 上50个 下50个 20 50 100 250 500 来自 http wiki jabbercn

    Original URL path: http://wiki.jabbercn.org/%E7%89%B9%E6%AE%8A:%E9%93%BE%E5%85%A5%E9%A1%B5%E9%9D%A2/RFC3921 (2016-04-25)
    Open archived version from archive

  • RFC3921 - Jabber/XMPP中文翻译计划
    推送更新的名册信息给所有已请求名册的可用资源 并且 2 以一个IO结果应答发送的资源 iq to juliet example com balcony type set id a78b4q6ha463 query xmlns jabber iq roster item jid nurse example com name Nurse subscription none group Servants group item query iq iq to juliet example com chamber type set id a78b4q6ha464 query xmlns jabber iq roster item jid nurse example com name Nurse subscription none group Servants group item query iq iq to juliet example com balcony type result id roster 2 正如IQ节类型 定义在 XMPP CORE XMPP文档列表 XMPP正式RFC标准 RFC3920 的语义所要求的 每个接收到了名册推送的资源必须 MUST 应答一个类型为 result 或 error 的IQ节 例子 资源应答一个IQ结果给服务器 iq from juliet example com balcony to example com type result id a78b4q6ha463 iq from juliet example com chamber to example com type result id a78b4q6ha464 更新名册条目 更新一个已有的名册条目 例如 改变组 的方法和增加一个新的名册条目是一样的 换言之 在IQ set 节中发送名册条目给服务器 例子 用户更新名册条目 增加组 iq from juliet example com chamber type set id roster 3 query xmlns jabber iq roster item jid romeo example net name Romeo subscription both group Friends group group Lovers group item query iq 正如增加一个名册条目 当更新一个名册条目时服务器必须 MUST 在持久信息存储机构中更新名册信息 并且也要初始化一个名册推送给这个用户的所有已请求名册的可用资源 删除一个名册条目 任何时候 用户可以 MAY 从他或她的名册中删除一个条目 只要发送一个 IQ set 给服务器并确保其 subscription 属性值为 remove 如果从一个客户端接收到 subscription 属性的任何其他值 一个兼容的服务器必须 MUST 忽略它 例子 客户端移除一个条目 iq from juliet example com balcony type set id roster 4 query xmlns jabber iq roster item jid nurse example com subscription remove query iq 和增加一个名册条目一样 删除一个名册条目的时候服务器必须 MUST 在持久信息存储机构中更新名册信息 初始化一个名册推送给这个用户的所有已请求名册的可用资源 伴随着把 subscription 属性值设为 remove 并且发送一个 IQ result 给初始化资源 关于这个命令的含义的更多信息 见 移除一个名册条目并取消所有订阅Removing a Roster Item and Cancelling All Subscriptions 第八章第六节 名册条目和出席信息订阅的集成 概览 关于用户从或向别的联系人订阅出席信息 一个即时消息用户通常希望在名册条目和出席信息订阅之间有某些层次的集成 本章描述了在XMPP即时消息应用中必须 MUST 支持的那些层次的集成 有四种主要的订阅状态 None 这个用户没有对这个联系人出席信息的订阅 这个联系人也没有订阅用户的出席信息 To 这个用户订阅了这个联系人的出席信息 但是这个联系人没有订阅用户的出席信息 From 这个联系人订阅了用户的出席信息 但是这个用户没有订阅这个联系人的出席信息 Both 用户和联系人互相订阅了对方的出席信息 例如 联合 from 和 to 这些状态的每一个都被反射到用户和联系人双方的名册中 从而导致持久的订阅状态 在以下的子章节中将叙述这些订阅状态如何为了完成特定的已定义的用例而进行交互 关于服务器和客户端处理所有订阅状态的细节 包括处于以上所列的状态之外的未决状态 在 订阅状态Subscription States 第九章 服务器不能 MUST NOT 发送出席信息订阅请求或名册推送给不可用的资源 也不能给没有已请求的名册的可用资源 在名册推送中 from 和 to 地址是可选的 OPTIONAL 如果包含了 它们的值应该 SHOULD 是那个会话的资源的全JID 一个客户端必须 MUST 以一个类型为 result 的IQ节来承认每个名册推送 为了暂时的原因 这些节不显示在以下的例子中但是按 XMPP CORE XMPP文档列表 XMPP正式RFC标准 RFC3920 定义的IQ语义学的规定它们是必需的 用户向联系人订阅 以下描述一个用户向一个联系人订阅的过程 包括名册条目和订阅状态之间的互动 1 为了能够在用户的客户端界面处理联系人以及在服务器跟踪订阅 用户的客户端应该 SHOULD 为新的名册条目执行一个 roster set 这个请求包括发送一个类型为 set 的IQ节并拥有符合 jabber iq roster 名字空间的 query 子元素 它 query 元素 再包含一个 item 子元素来定义新的名册条目 这个 item 元素必须 MUST 拥有一个 jid 属性 可以 MAY 拥有一个 name 属性 不能 MUST NOT 拥有一个 subscription 属性 并且可以 MAY 包含一个或多个 group 子元素 iq type set id set1 query xmlns jabber iq roster item jid contact example org name MyContact group MyBuddies group item query iq 2 作为结果 这个用户的服务器 1 必须 MUST 为这个新的名册条目初始化一个名册推送给这个用户的所有已经请求名册的可用资源 其 subscription 属性的值为 none 并且 2 必须 MUST 以一个 IQ result 应答发送的资源表明名册设置成功了 iq type set query xmlns jabber iq roster item jid contact example org subscription none name MyContact group MyBuddies group item query iq iq type result id set1 3 如果用户想向这个联系人请求出席信息的订阅 用户的客户端必须 MUST 发送一个类型为 subscribe 的出席信息节给联系人 presence to contact example org type subscribe 4 作为结果 用户的服务器必须 MUST 初始化第二个名册推送给这个用户的所有已经请求名册的可用资源 把这个联系人设置成 none 订阅状态的未决子状态 这个未决子状态是由名册条目中包含的ask subscribe 属性所指示的 iq type set query xmlns jabber iq roster item jid contact example org subscription none ask subscribe name MyContact group MyBuddies group item query iq 注意 如果用户在发送订阅请求之前没有新建一个名册条目 服务器必须 MUST 现在代替用户新建一个 然后发送一个名册推送给这个用户的所有已经请求名册的可用资源 不含以上所示的 name 属性和 group 子元素 5 用户的服务器也必须 MUST 把这个类型为 subscribe 的出席信息节的 from 地址设置为用户的纯JID 例如 user example com 如果用户提供了设置为用户的全JID的 from 地址 服务器应该 SHOULD 移除资源ID 如果联系人和用户在不同的主机上 用户的服务器必须 MUST 路由这个出席信息节到联系人的服务器来递送到这个联系人 这种情形的假定贯穿本文 无论如何 如果联系人在同一台主机 那么服务器可以简单地直接递送出席信息节 presence from user example com to contact example org type subscribe 注意 如果用户的服务器从联系人的服务器收到了一个类型为 error 的出席信息节 它必须 MUST 这个错误节给用户 用户的客户端可以 MAY 确定那个错误是否对于上次用户发出的 subscribe 类型的出席信息节 例如 通过跟踪 id 属性 的应答 然后选择重新发送 subscribe 请求还是发送一个 unsubscribe 类型的出席信息节给联系人以恢复到它的上一个状态 6 接收到指向联系人的 subscribe 类型的出席信息节之后 这个联系人的服务器必须 MUST 决定是否至少有一个已请求名册的联系人的可用资源 如果是 它必须 MUST 递送这个订阅请求给这个联系人 如果不是 联系人的服务器必须 MUST 离线存储这个订阅请求用于递送 when this condition is next met 通常这是通过增加一个关于这个联系人的名册条目到用户名册中来实现的 伴随着一个 None Pending In 的状态 定义在 订阅状态Subscription States 第九章 无论如何一个服务器不应该 SHOULD NOT 在那种状态下推送或递送名册条目给联系人 不论何时订阅请求被递送到了 联系人必须决定是否批准它 根据联系人的配置选项 联系人的客户端可以 MAY 批准或拒绝订阅请求而无需向联系人显示 这里我们假定这个 happy path 即联系人批准了订阅请求 替代的拒绝订阅请求的流程定义在第八章第二节第一小节 在这种情形下 这个联系人的客户端 1 应该 SHOULD 执行一个roster set 为这个用户指明期望的昵称和组 如果有的话 并且 2 必须 MUST 发送一个 subscribed 类型的出席信息节给这个用户以批准这个订阅请求 iq type set id set2 query xmlns jabber iq roster item jid user example com name SomeUser group SomeGroup group item query iq presence to user example com type subscribed 7 作为结果 联系人的服务器 1 必须 MUST 初始化一个名册推送给所有联系人已请求名册的可用资源 包含一个关于那个用户的名册条目 并且其订阅状态为 from 甚至联系人不执行roster set 服务器也必须 MUST 发送它 2 必须 MUST 返回一个 IQ result 给发送的资源表示名册设置 roster set 成功了 3 必须 MUST 路由这个 subscribed 类型的出席信息节给用户 首先把 from 地址设为联系人的纯JID contact example org 然后 4 必须 MUST 从所有联系人的可用资源向用户发送可用的出席信息 iq type set to contact example org resource query xmlns jabber iq roster item jid user example com subscription from name SomeUser group SomeGroup group item query iq iq type result to contact example org resource id set2 presence from contact example org to user example com type subscribed presence from contact example org resource to user example com 注意 如果联系人的服务器从用户的服务器收到一个 error 类型的出席信息节 它必须 MUST 递送这个错误节给联系人 联系人的客户端可以 MAY 确定那个错误是否对于上次联系人发出的 subscribe 类型的出席信息节 例如 通过跟踪 id 属性 的应答 然后选择重新发送 subscribe 请求还是发送一个 unsubscribe 类型的出席信息节给用户以恢复到它的上一个状态 8 接收到一个指向用户的 subscribed 类型的出席信息节之后 用户的服务器必须 MUST 首先检查在用户名册中的这个联系人的状态是 a subscription none and ask subscribe 还是 b subscription from and ask subscribe 如果联系人不是以上述的状态在用户的名册中 用户的服务器必须 MUST 安静的忽略这个 subscribed 类型的出席信息节 例如 服务器不能 MUST NOT 路由它到用户 修改用户的名册 或生成一个名册推送到用户的可用资源 如果联系人以上述任何一种状态存在于用户的名册中 用户的服务器 1 必须 MUST 从联系人向用户递送这个 subscribed 类型的出席信息节 2 必须 MUST 初始化一个名册推送给所有已请求名册的这个用户的可用资源 包含一个关于这个联系人的更新的名册条目 同时其 subscription 属性值设置为 to 并且 3 必须 MUST 从每一个联系人的可用资源向每一个用户的可用资源递送服务器接收到的可用的出席信息节 presence to user example com from contact example org type subscribed iq type set query xmlns jabber iq roster item jid contact example org subscription to name MyContact group MyBuddies group item query iq presence from contact example org resource to user example com resource 9 接收到 subscribed 类型的出席信息节之后 用户应该 SHOULD 承认接收到了订阅状态通知 要么发送一个 subscribe 类型的出席信息节给联系人证实它 要么发送一个 unsubscribe 类型的出席信息节给联系人否认它 这个步骤不一定影响订阅状态 见 订阅状态Subscription States 第九章 的细节 但是会让用户用户的服务器知道它必须 MUST 不再发送订阅状态改变通知给用户 见第九章第四节 从用户这方面看 现在存在一个向联系人的出席信息的订阅 从联系人的方面看 现在存在一个从用户的来的订阅 替代流程 联系人拒绝订阅请求 以上活动流程展示了关于用户向联系人的订阅请求的 happy path 如果联系人拒绝用户的订阅请求 那么主要的替代流程如下所述 1 如果联系人想拒绝这个请求 联系人的客户端必须 MUST 发送一个 unsubscribed 类型的出席信息节给用户 取代第八章第二节中步骤6发送的 subscribed 类型的出席信息节 presence to user example com type unsubscribed 2 作为结果 联系人的服务器必须 MUST 路由这个 unsubscribed 类型的出席信息节给用户 首先把 from 地址设为联系人的纯JID contact example org presence from contact example org to user example com type unsubscribed 注意 如果联系人的服务器之前把用户添加到了联系人的名册中用来跟踪 这时它必须 MUST 移除这个相关的条目 3 接收到指向用户的 unsubscribed 类型出席信息节之后 用户的服务器 1 必须 MUST 地送那个出席信息节给用户 并且 2 必须 MUST 初始化一个名册推送给这个用户的所有已请求名册的可用资源 包含一个关于这个联系人的一个更新条目 其 subscription 属性设为 none 并且没有 ask 属性 presence from contact example org to user example com type unsubscribed iq type set query xmlns jabber iq roster item jid contact example org subscription none name MyContact group MyBuddies group item query iq 4 接收到类型为 unsubscribed 出席信息节之后 用户应该 SHOULD 承认收到订阅状态通知 要么发送一个 unsubscribe 类型的出席信息节给联系人证实它 要么发送一个 subscribe 类型的出席信息节给联系人否认它 这一步骤不影响订阅状态 见 订阅状态Subscription States 第九章 的细节 但是让用户的服务器知道它必须 MUST 不再发送订阅状态改变的通知给用户 见第九章第四节 作为这一行为的结果 联系人现在在用户的名册中 状态为 none 而用户根本不在联系人的名册中 建立一个相互的订阅 用户和联系人可以在前述 happy path 的基础上建立一个相互的订阅 例如 一个 both 的订阅类型 流程如下 1 如果联系人想建立一个相互的订阅 联系人必须 MUST 发送一个订阅请求给用户 视联系人的配置选项而定 联系人的客户端可以 MAY 自动发送它 presence to user example com type subscribe 2 作为结果 联系人的服务器 1 必须 MUST 初始化一个名册推送给联系人的所有已请求名册的可用资源 伴随着用户仍在 from 订阅状态但同时有一个未决的 to 订阅状态 通过在名册条目中包含一个ask subscribe 的属性来指示 并且 2 必须 MUST 路由这个 subscribe 类型的出席信息节给用户 先把 from 地址设为联系人的纯JID contact example org iq type set query xmlns jabber iq roster item jid user example com subscription from ask subscribe name SomeUser group SomeGroup group item query iq presence from contact example org to user example com type subscribe 注意 如果联系人的服务器从用户的服务器收到一个 error 类型的出席信息节 它必须 MUST 递送这个错误节给联系人 它的客户端可以 MAY 确定这个错误是用来应答上次发送的 subscribe 类型的出席信息节 换言之 通过跟踪 id 属性 并且选择重发这个 subscribe 请求还是发送一个 unsubscribe 类型的出席信息节给用户以把名册恢复到它的前一个状态 3 接收到指向用户的 subscribe 类型出席信息节之后 用户的服务器必须确定是否至少有一个已请求名册可用资源 如果是 用户的服务器必须 MUST 递送这个订阅请求给用户 如果不是 它必须 MUST 离线存储这个订阅请求等这种情形再次发生时递送 无论何时订阅请求被递送了 用户必须决定是否批准它 视用户的配置选项而定 用户的客户端可以 MAY 批准或拒绝这个订阅请求而不需要向用户显示 这里我们假定这是 happy path 用户批准了订阅请求 替代的拒绝订阅请求的流程定义在第八章第三节第一小节 在这种情形下 用户的客户端必须 MUST 发送一个 subscribed 类型的出席信息节给联系人表示批准了订阅请求 presence to contact example org type subscribed 4 作为结果 用户的服务器 1 必须 MUST 初始化一个名册推送给用户的所有已请求名册的可用资源 包含一个关于联系人的名册条目 其 subscription 属性设为 both 2 必须 MUST 路由这个 subscribed 类型的出席信息节给联系人 先把 from 地址设为用户的纯JID user example com 并且 3 必须 MUST 向联系人发送它从用户的每个可用资源收到的最近一次出席信息节的全XML 不带 to 属性 强制每个会话遵守隐私列表 iq type set query xmlns jabber iq roster item jid contact example org subscription both name MyContact group MyBuddies group item query iq presence from user example com to contact example org type subscribed presence from user example com resource to contact example org 注意 如果用户的服务器从联系人的服务器接收到一个 error 类型的出席信息节 它必须 MUST 递送这个错误节给用户 它客户端可以 MAY 确定这个错误是用来应答上次发出去的 subscribed 类型的出席信息节 换言之 通过跟踪 id 属性 并且选择重发这个订阅请求还是发送一个 unsubscribed 类型的出席信息节给联系人以把名册恢复到上次的状态 5 接收到指向联系人的 subscribed 类型的出席信息节之后 联系人的服务器必须 MUST 首先检查用户在联系人的名册中的状态是否以下状态之一 a subscription none and ask subscribe 或 b subscription from and ask subscribe 如果用户不是以上述两种状态之一存在于联系人的名册中 联系人的服务器必须 MUST 安静地忽略这个 subscribed 类型的出席信息节 例如 它不能 MUST NOT 路由它给联系人 修改联系人的名册 或生成一个名册推送给联系人的可用资源 如果用户以上述两种状态之一存在于联系人的名册中 联系人的服务器 1 必须 MUST 从用户向联系人递送这个 subscribed 类型的出席信息节 2 必须 MUST 初始化一个名册推送给这个联系人的所有已请求名册的可用资源 包含一个关于这个用户的更新的名册条目 其 subscription 属性值设为 both 并且 3 必须 MUST 向这个联系人的每个可用资源递送它从这个用户的每个资源收到的可用出席信息节 presence from user example com to contact example org type subscribed iq type set query xmlns jabber iq roster item jid user example com subscription both name SomeUser group SomeGroup group item query iq presence from user example com resource to contact example org resource 6 收到 subscribed 类型的出席信息节之后 联系人应该 SHOULD 承认收到订阅请求通知 要么发送一个 subscribe 的出席信息节给用户证实它 要么发送一个 unsubscribe 类型的出席信息节给用户否认它 这一步骤不影响订阅状态 细节见 订阅状态Subscription States 第九章 但是让联系人的服务器知道它必须 MUST 不再发送订阅状态变更通知给联系人 见第九章第四节 用户和联系人现在有了对双方的出席信息的一个相互订阅 换言之 这个订阅类型为 both 替代流程 用户拒绝订阅请求 以上活动流程展示了关于联系人对用户的订阅请求的 happy path 如果用户拒绝了联系人的订阅请求 其主要流程如下 1 如果用户想拒绝请求 用户的客户端必须 MUST 发送一个 unsubscribed 类型的出席信息节给联系人 替代第八章第三节中的第三步中所发送的 subscribed 类型出席信息节 presence to contact example org type unsubscribed 2 作为结果 用户的服务器必须 MUST 路由这个 unsubscribed 类型的出席信息节给联系人 首先把 from 地址设为用户的纯JID user example com presence from user example com to contact example org type unsubscribed 3 接收到指向联系人的 unsubscribed 类型的出席信息节之后 联系人的服务器 1 必须 MUST 递送这个出席信息节给联系人 并且 2 必须 MUST 初始化一个名册推送给这个联系人的所有已请求名册的可用资源 包含关于这个用户的更新的名册条目 其 subscription 属性的值设为 from 并且没有 ask 属性 presence from user example com to contact example org type unsubscribed iq type set query xmlns jabber iq roster item jid user example com subscription from name SomeUser group SomeGroup group item query iq 4 接收到 unsubscribed 类型的出席信息节之后 联系人应该 SHOULD 承认收到那个订阅状态通知 要么向用户发送一个 unsubscribe 类型的出席信息节以证实它 要么向用户发送一个 subscribe 类型的出席信息以否认它 这个步骤不会影响订阅状态 详见 订阅状态Subscription States 第九章 但是让联系人的服务器知道它必须 MUST 不再发送订阅状态变更通知给联系人 见第九章第四节 作为这一活动的结果 订阅状态没有任何改变 换言之 联系人在用户的名册中的订阅状态为 to 并且用户在联系人的名册中的订阅状态为 from 取消订阅 在订阅了一个联系人的出席信息之后的任何时候 一个用户可以 MAY 取消订阅 在所有实例中用户发送来执行这一动作的XML是相同的 接下来的订阅状态根据发出取消订阅命令时获得的订阅状态的情况而不同 两种可能的情节描述如下 情形 1 当订阅不是相互的时候取消订阅 在第一种情形 用户有一个向联系人的出席信息的订阅但是联系人没有对用户的出席信息的订阅 换言之 订阅不是相互的 1 如果用户想取消对联系人的出席信息的订阅 用户必须 MUST 发送一个 unsubscribe 类型的出席信息节给联系人 presence to contact example org type unsubscribe 2 作为一个结果 用户的服务器 1 必须 MUST 发送一个名册推送给这个用户的所有已请求名册的可用资源 包含一个关于这个联系人的更新名册条目 其 subscription 属性设为 none 并且 2 必须 MUST 路由这个 unsubscribe 类型的出席信息节给联系人 首先把 from 地址设为用户的纯JID user example com iq type set query xmlns jabber iq roster item jid contact example org subscription none name MyContact group MyBuddies group item query iq presence from user example com to contact example org type unsubscribe 3 接收到指向联系人的 unsubscribe 类型出席信息节之后 联系人的服务器 1 必须 MUST 初始化一个名册推送给这个联系人的所有已请求名册的可用资源 包含一个关于这个用户的名册条目 其 subscription 属性值设为 none 如果联系人不可用或未曾请求名册 联系人的服务器必须 MUST 修改名册条目并在下次联系人请求名册时发送那个已修改的条目 并且 2 必须 MUST 递送这个 unsubscribe 状态改变通知给联系人 iq type set query xmlns jabber iq roster item jid user example com subscription none name SomeUser group SomeGroup group item query iq presence from user example com to contact example org type unsubscribe 4 接收到 unsubscribe 类型的出席信息节之后 联系人应该 SHOULD 承认收到那个订阅状态通知 要么发送一个 unsubscribed 类型的出席信息节给用户以证实它 要么发送一个 subscribed 类型的出席信息节给用户否认它 这个步骤不影响订阅状态 详见 订阅状态Subscription States 第九章 但是让联系人的服务器知道它必须 MUST 不再发送订阅状态变更通知给联系人 见第九章第四节 5 联系人的服务器接着 1 必须 MUST 发送一个 unsubscribed 类型的出席信息节给用户 并且 2 应该 SHOULD 向用户发送从这个联系人的所有可用资源收到的不可用出席信息 presence from contact example org to user example com type unsubscribed presence from contact example org resource to user example com type unavailable 6 当用户的服务器收到类型为 unsubscribed 和 unavailable 的出席信息节 它必须 MUST 递送它们给用户 presence from contact example org to user example com type unsubscribed presence from contact example org resource to user example com type unavailable 7 接收到 unsubscribed 类型的出席信息节之后 用户应该 SHOULD 承认收到那个订阅状态变更通知 要么向联系人发送一个 unsubscribe 类型的出席信息节以证实它 要么向联系人发送一个 subscribe 的出席信息节以否认它 这步骤不影响订阅状态 详见 订阅状态Subscription States 第九章 但是让用户的服务器知道它必须 MUST 不在发送订阅状态变更通知给用户 见第九章第四节 情形 2 当订阅是相互的时候取消订阅 在第二种情形下 用户有一个向联系人的出席信息的订阅并且联系人也有一个向用户的出席信息的订阅 换言之 订阅是相互的 1 如果用户想从联系人的出席信息取消订阅 用户必须 MUST 发送一个 unsubscribe 类型的出席信息节给联系人 presence to contact example org type unsubscribe 2 作为一个结果 用户的服务器 1 必须 MUST 发送一个名册推送给这个用户的所有已请求名册的可用资源 包含一个关于这个联系人的更新名册条目 其 subscription 属性值设为 from 并且 2 必须 MUST 路由这个 unsubscribe 类型的出席信息节给这个联系人 首先把 from 地址设为这个用户的纯 JID user example com iq type set query xmlns jabber iq roster item jid contact example org subscription from name MyContact group MyBuddies group item query iq presence from user example com to contact example org type unsubscribe 3 接收到指向联系人的 unsubscribe 类型的出席信息节之后 联系人的服务器 1 必须 MUST 初始化一个名册推送给这个联系人的所有已请求名册的可用资源 包含一个关于这个用户的名册条目 其 subscription 属性值设为 to 如果联系人不可用或未曾请求名册 联系人的服务去必须 MUST 修改这个名册条目并且等下次联系人请求名册的时候再发送这个修改过的名册条目 并且 2 必须 MUST 递送这个 unsubscribe 状态变更通知给联系人 iq type set query xmlns jabber iq roster item jid user example com subscription to name SomeUser group SomeGroup group item query iq presence from user example com to contact example org type unsubscribe 4 接收到这个 unsubscribe 类型的出席信息节之后 联系人应该 SHOULD 承认收到了那个订阅状态通知 要么向用户发送一个 unsubscribed 类型的出席信息节以证实它 要么向用户发送一个 subscribed 类型的出席信息节以否认它 这个步骤不影响订阅状态 详见 订阅状态Subscription States 第九章 但是让联系人的服务器知道它必须 MUST 不再发送订阅状态变更通知给联系人 见第九章第四节 5 联系人的服务器然后 1 必须 MUST 发送一个 unsubscribed 类型的出席信息节给用户 并且 2 应该 SHOULD 向用户发送它从联系人的所有可用资源收到的不可用出席信息 presence from contact example org to user example com type unsubscribed presence from contact example org resource to user example com type unavailable 6 当用户的服务器收到 unsubscribed 和 unavailable 类型的出席信息节 它必须 MUST 递送它们给用户 presence from contact example org to user example com type unsubscribed presence from contact example org resource to user example com type unavailable 7 接收到 unsubscribed 类型的出席信息节之后 用户应该 SHOULD 承认收到了那个订阅状态的通知 要么向联系人发送一个 unsubscribe 类型的出席信息节以证实它 要么向联系人发送一个 subscribe 类型的出席信息节以否认它 这个步骤不影响订阅状态 详见 订阅状态Subscription States 第九章 但是让用户的服务器知道它必须 MUST 不在发送订阅状态变更通知给用户 见第九章第四节 注意 显然这不会导致名册条目从用户的名册移除 并且联系人仍然有一个对用户的出席信息的订阅 为了完全取消双向的订阅并完全从用户的名册中移除名册条目 用户应该 SHOULD 使用subscription remove 定义在 移除一个名册条目并取消所有订阅项Removing a Roster Item and Cancelling All Subscriptions 第八章第六节 更新名册条目 取消一个订阅项 在批准来自一个用户的任何订阅请求之后的任何时候 一个联系人可以 MAY 取消那个订阅项 联系人在所有实例中执行这个动作中发送的XML是相同的 接下来的订阅状态根据取消命令发出当时所获得的订阅状态而有所不同 所有可能的情节描述如下 情形 1 当订阅不是相互的时候取消订阅项 在第一种情形下 用户有一个对联系人的出席信息的订阅但是联系人没有对于用户的出席信息的订阅 换言之 订阅还不是相互的 1 如果联系人想取消用户的订阅项 联系人必须 MUST 发送一个 unsubscribed 类型的出席信息节给用户 presence to user example com type unsubscribed 2 作为一个结果 联系人的服务器 1 必须 MUST 发送一个名册推送给这个联系人的所有已请求名册的可用资源 包含一个关于这个用户的更新的名册条目 其 subscription 属性值设为 none 2 必须 MUST 路由这个 unsubscribed 类型的出席信息节给用户 首先把 from 地址设为联系人的纯JID contact example org 并且 3 应该 SHOULD 向用户发送它从联系人的所有可用资源收到的不可用出席信息 iq type set query xmlns jabber iq roster item jid user example com subscription none name SomeUser group SomeGroup group item query iq presence from contact example org to user example com type unsubscribed presence from contact example org resource to user example com type unavailable 3 接收到指向用户的 unsubscribed 类型的出席信息节之后 用户的服务器 1 必须 MUST 初始化一个名册推送给这个用户的所有已请求名册的可用资源 包含一个关于这个联系人的名册条目更新 其 subscription 属性值设为 none 如果用户不可用或未曾请求名册 用户的服务器必须 MUST 修改这个名册条目并且等下次用户请求名册的时候发送修改过的名册条目 2 必须 MUST 递送这个 unsubscribed 状态改变通知给这个用户的所有可用资源 并且 3 必须 MUST 向这个用户的所有可用资源递送不可用出席信息 iq type set query xmlns jabber iq roster item jid contact example org subscription none name MyContact group MyBuddies group item query iq presence from contact example org to user example com type unsubscribed presence from contact example org resource to user example com type unavailable 4 接收到 unsubscribed 类型的出席信息节之后 用户应该 SHOULD 承认收到了那个订阅状态通知 要么向联系人发送一个 unsubscribe 出席信息节以证实它 要么向联系人发送一个 subscribe 类型的出席信息节以否认它 这个步骤不影响订阅状态 详见 订阅状态Subscription States 第九章 但是让服务器知道它必须 MUST 不再发送订阅状态变更通知给用户 见第九章第四节 情形 2 当订阅项是相互的时候取消 在这种情形下 用户有一个对联系人的出席信息的订阅并且联系人也有一个对用户的出席信息的订阅 换言之 订阅是相互的 1 如果联系人想取消用户的订阅 联系人必须 MUST 发送一个 unsubscribed 类型的出席信息节给用户 presence to user example com type unsubscribed 2 作为结果 联系人的服务器 1 必须 MUST 发送一个名册推送给这个联系人的所有已请求名册的可用资源 包含关于这个用户的一个更新的名册条目 其 subscription 属性值设为 to 2 必须 MUST 路由这个 unsubscribed 类型的出席信息节给用户 首先把 from 地址设为联系人的纯JID contact example org 并且 3 应该 SHOULD 向这个用户的所有可用资源发送它从联系人的所有可用资源收到的不可用出席信息 iq type set query xmlns jabber iq roster item jid user example com subscription to name SomeUser group SomeGroup group item query iq presence from contact example org to user example com type unsubscribed presence from contact example org resource to user example com type unavailable 3 接收到指向用户的 unsubscribed 类型出席信息节之后 用户的服务器 1 必须 MUST 初始化一个名册推送给这个用户的所有已请求名册的可用资源 包含关于这个联系人的更新的名册条目 其 subscription 属性值设为 from 如果这个用户不可用或未曾请求名册 用户的服务器必须 MUST 修改这个名册条目并且等下次用户请求名册的时候发送修改过的条目给它 并且 2 必须 MUST 递送这个 unsubscribed 状态变更通知给用户的所有可用资源 并且 3 必须 MUST 向这个用户的所有可用资源递送这个不可用出席信息 iq type set query xmlns jabber iq roster item jid contact example org subscription from name MyContact group MyBuddies group item query iq presence from contact example org to user example com type unsubscribed presence from contact example org resource to user example com type unavailable 4 接收到这个 unsubscribed 类型的出席信息节之后 用户应该 SHOULD 承认收到了那个订阅状态通知 要么向联系人发送一个 unsubscribe 类型的出席信息节以证实它 要么向联系人发送一个 subscribe 类型的出席信息节以否认它 这一步骤不影响订阅状态 详见 订阅状态Subscription States 第九章 但是让用户的服务器知道它必须 MUST 不再发送订阅状态变更通知给用户 见第九章第四节 注意 显然这不会使得名册条目从联系人的名册中移除 并且联系人仍然有一个对用户的出席信息的订阅 为了完全双向的取消一个相互的订阅并且从联系人的名册中完全移除这个名册条目 联系人应该以subscription remove 定义在 移除一个名册条目并取消所有订阅项Removing a Roster Item and Cancelling All Subscriptions 第八章第六节 更新名册条目 移除一个名册条目并取消所有订阅项 因为在双向完整移除一个名册条目和取消所有订阅的过程中可能有很多步骤 名册管理协议包含一个 shortcut 方法来做这件事 无论当前的订阅状态是什么 这个过程可以通过发送一个roster set 包含一个用于这个联系人的条目 其 subscription 属性值设为 remove 来初始化 iq type set id remove1 query xmlns jabber iq roster item jid contact example org subscription remove query iq 当用户从他或她的名册中移除一个联系人 通过把 subscription 属性值设为 remove 用户的服务器 1 必须 MUST 自动取消用户和联系人之间的任何现存的出席信息订阅项 包括相应的 to 和 from 2 必须 MUST 从用户的名册移除这个名册条目并且通知这个用户的所有已请求名册的可用资源这个名册条目被移除了 3 必须 MUST 通知初始化的资源移除成功了 并且 4 应该 SHOULD 向联系人发送它从这个用户的所有可用资源收到的不可用出席信息 presence from user example com to contact example org type unsubscribe presence from user example com to contact example org type unsubscribed iq type set query xmlns jabber iq roster item jid contact example org subscription remove query iq iq type result id remove1 presence from user example com resource to contact example org type unavailable 收到 unsubscribe 类型的出席信息后 联系人的服务器 1 必须 MUST 初始化一个名册推送给这个联系人的所有已请求名册的可用资源 包含关于这个用户的一个更新的名册条目 其 subscription 属性值设为 to 如果这个联系人不可用或未曾请求名册 联系人的服务器必须 MUST 修改这个名册条目并且等下次联系人请求名册的时候发送这个修改过的条目给它 并且 2 也必须 MUST 递送这个 unsubscribe 状态变更通知给这个联系人的所有可用资源 iq type set query xmlns jabber iq roster item jid user example com subscription to name SomeUser group SomeGroup group item query iq presence from user example com to contact example org type unsubscribe 收到这个 unsubscribed 类型的出席信息节之后 联系人的服务器 1 必须 MUST 初始化一个名册推送给这个联系人的所有已请求名册的可用资源 包含一个关于这个用户的更新的名册条目 其 subscription 属性值设为 none 如果这个联系人不可用或未曾请求名册 联系人的服务器必须 MUST 修改名册条目并且等下次联系人请求名册的时候把修改过的条目发送给它 并且 2 也必须 MUST 递送这个 unsubscribe 状态改变通知给这个联系人的所有可用资源 iq type set query xmlns jabber iq roster item jid user example com subscription none name SomeUser group SomeGroup group item query iq presence from user example com to contact example org type unsubscribed 接收到指向联系人的 unavailable 出席信息节之后 联系人的服务器必须 MUST 递送这个不可用出席信息给这个用户的所有可用资源 presence from user example com resource to contact example org type unavailable 注意 当用户从用户的名册中移除联系人的时候 这个联系人的名册最后状态是用户仍然在联系人名册中但是订阅状态为 none 为了完全移除关于这个用户的名册条目 联系人也需要发送一个名册移除请求 订阅状态 本章提供关于订阅状态以及和订阅相关的出席信息节 换言之 类型为 subscribe subscribed unsubscribe 和 unsubscribed 的出席信息节 的服务器处理过程的详细信息 已定义的状态 有九种可能的订阅状态 从用户的 不是联系人的 角度描述如下 None 联系人和用户互相没有被对方订阅 并且也都没有从对方那里请求一个订阅 None Pending Out 联系人和用户互相没有被对方订阅 用户已经向联系人发送了一个订阅请求但还没有收到回复 None Pending In 联系人和用户互相没有被对方订阅 联系人已经向用户发送了一个订阅请求但还没有收到回复 注意 在这种状态下联系人的服务器不应该 SHOULD NOT 推送或递送名册条目 但是应该 SHOULD 等待 直到联系人的订阅请求已经从用户那里得到批准 None Pending Out In 联系人和用户互相没有被对方订阅 联系人已经向用户发送了一个订阅请求但还没有收到回复 用户已经向联系人发送了一个订阅请求但还没有收到回复 To 用户已订阅联系人 单向 To Pending In 用户已订阅联系人 联系人已经向用户发送了一个订阅请求但还没有收到回复 From 联系人已订阅用户 单向 From Pending Out 联系人已订阅用户 单向 用户已经向联系人发送了一个订阅请求但还没有收到回复 Both 用户和联系人互相被对方订阅了 双向 出站出席信息订阅节的服务器处理过程 出站出席信息订阅节使用户能管理他或她对联系人的出席信息的订阅 通过 subscribe 和 unsubscribe 类型 并且管理联系人对用户的出席信息的访问 通过 subscribed 和 unsubscribed 类型 因为用户的服务器和联系人的服务器有可能失去对于订阅状态的同步 用户的服务器必须 MUST 毫无例外地路由所有 subscribe 或 unsubscribe 类型的出站出席信息节给联系人 使用户能在需要的时候重新同步他或她的对联系人的出席信息的订阅 如果从用户的角度来看 一个 subscribed 或 unsubscribed 类型的出席信息节不会导致一个订阅状态的变更 用户的服务器不应该 SHOULD NOT 路由这个节到联系人那里 并且不能 MUST NOT 做出一个状态变更 如果这个节导致一个订阅状态的变更 用户的服务器必须 MUST 路由这个节到联系人 并且必须 MUST 做出相应的状态变更 这些规则总结如下这些表 表 1 推荐的出站 subscribed 节的处理 当前状态 路由 新状态 None 否 状态不变 None Pending Out 否 状态不变 None Pending In 是 From None Pending Out In 是 From Pending Out To 否 状态不变 To Pending In 是 Both From 否 状态不变 From Pending Out 否 状态不变 Both 否 状态不变 表 2 推荐的出站 unsubscribed 节处理 当前状态 路由 新状态 None 否 状态不变 None Pending Out 否 状态不变 None Pending In 是 None None Pending Out In 是 None Pending Out To 否 状态不变 To Pending In 是 To From 是 None From Pending Out 是 None Pending Out Both 是 To 入站出席信息订阅节的服务器处理过程 入站出席信息订阅节从用户请求一个订阅相关的动作 通过 subscribe 类型 通知用户由联系人所做的订阅状态相关的动作 通过 unsubscribe 类型 或使联系人能够管理用户对联系人的出席信息的访问 通过 subscribed 和 unsubscribed 类型 当用户的服务器为用户从联系人那里接收到一个订阅请求 换言之 一个 subscribe 类型的出席信息节 如果用户未曾允许联系人访问用户的出席信息或者没有未决的入站订阅请求 它必须 MUST 递送那个请求给用户 无论如何 如果有一个未决的入站订阅请求 用户的服务器不应该 SHOULD NOT 递送这个新的请求 因为上一个订阅请求可能已经被记录下来了 如果用户已经允许联系人访问用户的出席信息 用户的服务器应该 SHOULD 对一个从联系人发来的 subscribe 类型的入站出席信息节自动回复 通过代替用户向联系人发送一个 subscribed 类型的出席信息节 这个规则使得联系人可以在需要的时候重新同步订阅状态 这些规则总结如下面这些表 表 3 推荐的入站 subscribe 节处理 当前状态 递送 新状态 None 是 None Pending In None Pending Out 是 None Pending Out In None Pending In 否 状态不变 None Pending Out In 否 状态不变 To 是 To Pending In To Pending In 否 状态不变 From 否 状态不变 From Pending Out 否 状态不变 Both 否 状态不变 服务器应该 SHOULD 以 subscribed 节自动回复 当用户的服务器为用户从联系人那里收到一个 unsubscribe 类型的出席信息节 如果从用户的角度看这个节会导致一个订阅状态变更 那么用户的服务器应该 SHOULD 代替用户自动应答 发送一个 unsubscribed 类型的出席信息节给联系人 必须 MUST 递送这个 unsubscribe 节给用户 并且必须 MUST 改变状态 如果不会导致订阅状态变更 用户的服务器不应该 SHOULD NOT 递送这个节并且不能 MUST NOT 改变状态 这些规则总结如下表 表 4 推荐的入站 unsubscribe 节处理 当前状态 递送 新状态 None 否 状态不变 None Pending Out 否 状态不变 None Pending In 是 None None Pending Out In 是 None Pending Out To 否 状态不变 To Pending In 是 To From 是 None From Pending Out 是 None Pending Out Both 是 To 服务器应该 SHOULD 以 unsubscribed 节自动应答 当用户的服务器为用户从联系人那里收到一个 subscribed 类型的出席信息节 如果没有一个为访问联系人的出席信息的未决的出站请求 它不能 MUST NOT 递送这个节给用户并且不能 MUST NOT 改变订阅状态 如果有一个为了访问联系人的出席信息的未决的出站请求并且这个 subscribed 类型的入站出席信息请求会导致一个订阅状态的改变 用户的服务器必须 MUST 递送这个节给用户并且必须 MUST 改变订阅状态 如果用户已经有授权可以访问联系人的出席信息 这个 subscribed 类型的入站出席信息节不导致一个订阅状态的变更 从而用户的服务器不应该 SHOULD NOT 递送这个节给用户并且不能 MUST NOT 改变订阅状态 这些规则总结如下表 表 5 推荐的入站 subscribed 节处理 当前状态 递送 新状态 None 否 状态不变 None Pending Out 是 To None Pending In 否 状态不变 None Pending Out In 是 To Pending In To 否 状态不变 To Pending In 否 状态不变 From 否 状态不变 From Pending Out 是 Both Both 否 状态不变 当用户的服务器为用户从联系人那里收到了一个 unsubscribed 类型的出席信息节 如果有一个为了访问联系人的出席信息的未决的出站请求或者用户当前已经有授权可以访问联系人的出席信息 它必须 MUST 递送这个节给用户并且必须 MUST 改变订阅状态 否则 用户的服务器不应该 SHOULD NOT 递送这个节并且不能 MUST NOT 改变订阅状态 这些规则总结如下表 表 6 推荐的入站 unsubscribed 节处理 当前状态 递送 新状态 None 否 状态不变 None Pending Out 是 None None Pending In 否 状态不变 None Pending Out In 是 None Pending In To 是 None To Pending In 是 None Pending In From 否 状态不变 From Pending Out 是 From Both 是 From 服务器递送和客户端承认订阅请求以及状态变更通知 当一个服务器收到一个 subscribe 类型的入站出席信息节 换言之 一个订阅请求 或 subscribed 类型 unsubscribe 类型 或 unsubscribed 类型 换言之 一个订阅状态变更通知 除了发送适当的名册推送 或当下次名册被一个可用资源请求时发送更新的名册 它必须 MUST 递送这个请求或通知给预定的接收者至少一次 一个服务器可以 MAY 要求接收者的回执以承认接收到了所有状态变更通知 并且必须 MUST 要求承认订阅请求的情形 换言之 类型的出席信息节 subscribe 为了要求回执 一个服务器应该 SHOULD 在每次接收者登陆的时候发送这个请求或通知给它 直到这个接收者承认收到这个通知 通过证实 affirming 或禁止 denying 这个通知 如下表 表 7 订阅状态变更通知的承认 节类型 接受 禁止 subscribe subscribed unsubscribed subscribed subscribe unsubscribe unsubscribe unsubscribed subscribed unsubscribed unsubscribe subscribe 显然 根据前述的订阅状态图表 一些回执节将被路由到联系人并且导致状态的变更 而其他的则不会 无论如何 任何这样的节必须 MUST 导致服务器不再发送订阅状态变更通知给用户 因为在接收到roster set 其 subscription 属性值设为 remove 见 移除一个名册条目并且取消所有订阅项 Removing a Roster Item and Cancelling All Subscriptions 第八章第六节 之后 用户的服务器必须 MUST 自动生成 unsubscribe 和 unsubscribed 类型的出站出席信息节 服务器必须 MUST 把一个名册移除请求视为发送所有这些出席信息节 以决定是否继续向用户发送 subscribe 或 subscribed 类型的订阅状态变更通知 屏蔽通信 大多数即时消息系统已发现有必要实现一些方法来为用户屏蔽来自某些特定的其他用户的通信 这在 IMP REQS 的第五章第一节第五小节 第五章第一节第十五小节 第五章第三节第二小节 和第五章第四节第十小节中也有要求 在XMPP中这是由管理某人的隐私列表来实现的 使用 jabber iq privacy 名字空间 服务器端的隐私列表使得以下用例能够完成 接收某人的隐私列表 增加 移除 和 编辑某人的隐私列表 设置 改变 或 取消 激活的列表 设置 改变 或 取消 缺省的列表 换言之 缺省激活的那个列表 基于JID group 或 subscription 类型 或全局的 允许或屏蔽消息 允许或屏蔽入站出席信息通知 基于 JID group 或 subscription 类型 或全局的 允许或屏蔽出站出席信息通知 基于 JID group 或 subscription 类型 或全局的 允许或屏蔽 IQ 节 基于 JID group 或 subscription 类型 或全局的 允许或屏蔽所有通信 基于 JID group 或 subscription 类型 或全局的 注意 出席信息通知不包括出席信息订阅 只包括广播给那些已订阅了用户出席信息的实体的出席信息 因而这包括没有 type 属性或只包含type unavailable 的的出席信息节 语法和语义 一个用户可以 MAY 定义一个或更多的隐私列表 它们由用户的服务器保存 每个 list 元素包含一个或多个格式为 item 元素的规则 并且每个 item 元素使用属性来定义一个隐私规则类型 一个适用于规则的特定值 相应的动作 和处理顺序相应的条目位置 语法如下 iq query xmlns jabber iq privacy list name foo item type jid group subscription value bar action allow deny order unsignedInt message presence in presence out iq item list query iq 如果类型是 jid 那么 value 属性必须 MUST 包含一个合法的Jabber ID JIDs 应该 SHOULD 满足以下顺序 user domain resource 仅为匹配的资源 user domain 任何匹配的资源 domain resource 仅匹配的资源 domain 匹配这个域本身 正如任何 user domain domain resource 或 包含一个子域的地址 如果类型为 group 那么 value 属性应该 SHOULD 包含组在用户的名册中的名字 如果一个客户端尝试更新 新建 或删除一个不在用户名册中的组的列表条目 服务器应该 SHOULD 返回给客户端一个 item not found 节错误 如果类型是 subscription 那么 value 属性必须 MUST 是 both to from 或 none 定义在 名册语法和语义Roster Syntax and Semantics 第七章第一节 中的一个人 在这里 none 包括对于用户来说完全未知和根本不在用户名册中的实体 如果没有包含 type 属性 这个规则提供 失败 fall through 情景 action 属性必须 MUST 被包含并且它的值必须 MUST 是 允许 allow 或 禁止 deny order 属性必须 MUST 被包含并且它的值必须 MUST 是一个在列表的所有条目中具有唯一性的非负整数 如果一个客户端尝试以一个非唯一的order值建立或更新一个列表 服务器必须 MUST 返回给客户端一个 bad request 节错误 item 元素可以 MAY 包含一个或更多子元素 使得一个实体可以指明更多的细微控制包括屏蔽哪些种类的节 换言之 不只是简单地屏蔽所有节 允许的子元素包括 message 屏蔽引入消息节 iq 屏蔽引入 IQ 节 presence in 屏蔽引入出席信息通知 presence out 屏蔽外出出席信息通知 在 jabber iq privacy 名字空间之内 一个 set 类型的IQ节的 query 子元素不能 MUST NOT 包含超过一个子元素 换言之 这个节必须 MUST 只包含一个 active 元素 一个 default 元素 或一个 list 元素 如果一个发送中的实体违反了这个规则 接收中的实体必须 MUST 返回一个 return a bad request 节错误 当一个客户端增加或更新一个隐私列表 list 元素应该 SHOULD 包含至少一个 item 子元素 当一个客户端移除一个隐私列表的时候 list 元素不能 MUST NOT 包含任何 item 子元素 当一个客户端更新一个隐私列表的时候 它必须包含所有想得到的条目 换言之 不是一个 delta 商业规则 如果有一个为某会话设置的激活的列表 它只影响为其激活的那个会话 并且只在那一个会话的持续期间有效 服务器必须 MUST 只应用激活列表 并且不能 MUST NOT 应用缺省列表 换言之 列表没有层次 layering 缺省列表总体适用于用户 并且如果没有为一个节指向的目标session resource设置激活列表 或用户当前没有会话 它会被处理 如果没有为一个会话设置激活列表 或用户当前没有会话 并且没有缺省列表 那么所有节应该被 SHOULD BE 接受或由服务器代替用户做适当的处理 遵守 用于处理XML节的服务器规则 Server Rules for Handling XML Stanzas 第十一章 隐私列表必须 MUST 是第一个由服务器应用的递送规则 替代 1 定义在 用于处理XML节的服务器规则Server Rules for Handling XML Stanzas 第十一章 的路由和递送规则 以及 2 和订阅相关的出席信息节的处理 和相应的名册推送的生成 定义在 名册条目和出席信息订阅的集成Integration of Roster Items and Presence Subscriptions 第八章 服务器处理隐私列表条目的顺序是很重要的 列表条目必须 MUST 按照每个 item 的 order 属性的整数值的升序来处理 一旦节和一个隐私列表规则匹配 服务器必须 MUST 按照这个规则适当地处理这个节 然后终止处理 如果在一个列表中没有提供一个fall through的条目 fall through 动作被假定为 允许 allow 如果一个用户为一个激活列表更新定义 之后的基于那个激活列表的操作必须 MUST 使用更新的定义 为了那些激活列表正应用的所有资源 如果在用户的会话期间 在激活的或缺省的列表中定义的名册条目中的订阅状态改变了 或名册组改变了 接下来基于那个列表的处理必须 MUST 考虑计入这个已改变的状态或组 对那个列表当前应用的所有资源 当一个规则的定义修改了的时候 服务器必须 MUST 发送一个类型为 set 的IQ节给所有已连接的资源 包括一个只有一个 list 子元素的 query 元素 其 name 属性设为已修改的隐私列表的名字 这些 隐私列表推送 privacy list pushes 遵守和用于名册管理的名册推送 roster pushes 同样的语义 除了被推送给已连接的资源的列表名字本身 不是完整的列表定义或那个 delta 是否接受这个修改了的列表定义最终由接收中的资源来决定 尽管如果这个列表正在应用于一个已连接的资源 它应该 SHOULD 这样做 当一个已连接的资源尝试移除一个列表或指定一个新的缺省列表 而那个列表应用于一个已连接的资源而不是正在发送的资源 服务器必须 MUST 返回一个 conflict 错误给发送中的资源并且不能 MUST NOT 执行这个请求的改变 接收某人的隐私列表 例子 客户端向服务器请求隐私列表的名字 iq from romeo example net orchard type get id getlist1 query xmlns jabber iq privacy iq 例子 服务器发送隐私列表的名字给客户端 激活列表和缺省列表放在前面 iq type result id getlist1 to romeo example net orchard query xmlns jabber iq privacy active name private default name public list name public list name private list name special query iq 例子 客户端向服务器请求一个隐私列表 iq from romeo example net orchard type get id getlist2 query xmlns jabber iq privacy list name public query iq 例子 服务器发送一个隐私列表给客户端 iq type result id getlist2 to romeo example net orchard query xmlns jabber iq privacy list name public item type jid value tybalt example com action deny order 1 item action allow order 2 list query iq 例子 客户端向服务器请求另一个隐私列表 iq from romeo example net orchard type get id getlist3 query xmlns jabber iq privacy list name private query iq 例子 服务器发送另一个隐私列表给客户端 iq type result id getlist3 to romeo example net orchard query xmlns jabber iq privacy list name private item type subscription value both action allow order 10 item action deny order 15 list query iq 例子 客户端再向服务器请求另一个隐私列表 iq from romeo example net orchard type get id getlist4 query xmlns jabber iq privacy list name special query iq 例子 服务器再发送另一个隐私列表给客户端 iq type result id getlist4 to romeo example net orchard query xmlns jabber iq privacy list name special item type jid value juliet example com action allow order 6 item type jid value benvolio example org action allow order 7 item type jid value mercutio example org action allow order 42 item action deny order 666 list query iq 在这个例子中 用户有三个列表 1 public 它允许所有人的通信 除了一个指定的实体 这是缺省列表 2 private 它只允许和这个用户有双向订阅的联系人的通信 这是激活的列表 还有 3 special 它只允许三个指定的实体通信 如果用户尝试接收一个列表但是这个列表的名字不存在 服务器必须 MUST 返回一个 item not found 节错误给用户 例子 客户端尝试接收不存在的列表 iq to romeo example net orchard type error id getlist5 query xmlns jabber iq privacy list name The Empty Set query error type cancel item not found xmlns urn ietf params xml ns xmpp stanzas error iq 用户在一次只被允许接收一个列表 如果用户尝试同一个请求中接收超过一个列表 服务器必须 MUST 返回一个 bad request 节错误给用户 例子 客户端尝试接收多于一个的列表 iq to romeo example net orchard type error id getlist6 query xmlns jabber iq privacy list name public list name private list name special query error type modify bad request xmlns urn ietf params xml ns xmpp stanzas error iq 管理激活列表 为了设置或改变服务器当前应用的激活列表 用户必须 MUST 发送一个类型为 set 的IQ节 包含一个符合 jabber iq privacy 名字空间的 query 元素 这个元素 query 又包含一个空的 active 子元素 而这个 active 拥有一个 name 属性 name 属性值则设为期望的列表名 例子 客户端请求激活列表变更 iq from romeo example net orchard type set id active1 query xmlns jabber iq privacy active name special query iq 服务器必须 MUST 在返回结果给客户端之前激活并应用这个已请求的列表 例子 服务器承认激活列表变更成功 iq type result id active1 to romeo example net orchard 如果用户尝试设置一个激活列表但是列表名不存在 服务器必须 MUST 返回一个 item not found 节错误给用户 例子 客户端尝试设置一个不存在的列表作为激活列表 iq to romeo example net orchard type error id active2 query xmlns jabber iq privacy active name The Empty Set query error type cancel item not found xmlns urn ietf params xml ns xmpp stanzas error iq 为了取消使用任何激活列表 已连接的资源必须 MUST 发送一个空的 active 元素 并且不带 name 属性 例子 客户端取消使用激活列表 iq from romeo example net orchard type set id active3 query xmlns jabber iq privacy active query iq 例子 服务器承认取消任何激活列表成功 iq type result id active3 to romeo example net orchard 管理缺省列表 为了改变它的缺省列表 它对用户来说是全局应用的 不只是发送中的资源 用户必须 MUST 发送一个类型为 set 的IQ节 它包含一个符合 jabber iq privacy 名字空间的 query 元素 这个 query 元素包含一个空的 default 子元素 这个 default 子元素拥有一个 name 属性 这个 name 属性的值设为期望的列表名 例子 用户请求变更缺省列表 iq from romeo example net orchard type set id default1 query xmlns jabber iq privacy default name special query iq 例子 服务器承认缺省列表变更成功 iq type result id default1 to romeo example net orchard 如果用户尝试变更一个缺省列表但是这个缺省列表正在由至少一个已连接的但不是当前发送中的这个资源使用着 服务器必须 MUST 返回一个 conflict 节错误给发送中的资源 例子 客户端尝试改变一个缺省列表但是这个列表正在被另一个资源使用 iq to romeo example net orchard type error id default1 query xmlns jabber iq privacy default name special query error type cancel conflict xmlns urn ietf params xml ns xmpp stanzas error iq 如果用户尝试设置一个缺省列表但是这个列表的名字不存在 服务器必须 MUST 返回一个 item not found 节错误给用户 例子 客户端尝试设置一个不存在的列表作为缺省列表 iq to romeo example net orchard type error id default1 query xmlns jabber iq privacy default name The Empty Set query error type cancel item not found xmlns urn ietf params xml ns xmpp stanzas error iq 为了取消使用缺省列表 换言之 任何时候都使用域的节路由规则 用户必须 MUST 发送一个空的不带 name 属性的 default 元素 例子 客户端取消使用缺省列表 iq from romeo example net orchard type set id default2 query xmlns jabber iq privacy default query iq 例子 服务器承认成功地取消了任何缺省列表 iq type result id default2 to romeo example net orchard 如果一个已连接的资源尝试取消一个用户全局的缺省列表但是这个缺省列表正在应用于另一个已连接的资源 服务器必须 MUST 返回一个 conflict 错误给发送中的资源 例子 客户端尝试取消一个缺省列表但是这个列表正在被另一个资源使用 iq to romeo example net orchard type error id default3 query xmlns jabber iq privacy default query error type cancel conflict xmlns urn ietf params xml ns xmpp stanzas error iq 编辑一个隐私列表 为了编辑一个隐私列表 用户必须 MUST 一个类型为 set 的IQ节 包含一个符合 jabber iq privacy 名字空间的 query 元素 这个 query 元素包含一个拥有一个 list 子元素 这个 list 子元素拥有一个 name 属性 这个 name 属性的值设为用户想编辑的列表名 这个 list 元素必须 MUST 包含一个或多个 item 元素 它们包含了列表中的所有元素以指明用户期望的对列表的变更 不是the delta 例子 客户端编辑隐私列表 iq from romeo example net orchard type set id edit1 query xmlns jabber iq privacy list name public item type jid value tybalt example com action deny order 3 item type jid value paris example org action deny order 5 item action allow order 68 list query iq 例子 服务器承认列表编辑成功 iq type result id edit1 to romeo example net orchard 注意 任何给定的条目的 order 属性值不是固定的 因而在前述的例子中如果用户想在 tybalt example com 条目和 paris example org 条目之间增加4个条目 用户的客户端必须 MUST 在向服务器提交列表之前对相关的条目重新编号 服务器必须 MUST 现在发送一个 隐私列表推送 privacy list push 给所有已连接的资源 例子 基于列表编辑的隐私列表推送 iq to romeo example net orchard type set id push1 query xmlns jabber iq privacy list name public query iq iq to romeo example net home type set id push2 query xmlns jabber iq privacy list name public query iq 按照定义在 XMPP CORE XMPP文档列表 XMPP正式RFC标准 RFC3920 的IQ节语义 每个已连接的子元素必须 MUST 返回一个如下的 IQ result 给服务器 例子 承认收到一个隐私列表推送 iq from romeo example net orchard type result id push1 iq from romeo example net home type result id push2 增加一个新的隐私列表 增加一个新的列表和编辑一个现有的列表使用的协议是相同的 如果列表名和现有的列表名吻合 这个增加新列表的请求将覆写那个旧的列表 正如编辑列表一样 服务器也必须 MUST 发送一个 隐私列表推送 privacy list push 给所有已连接的资源 移除一个隐私列表 为了移除一个隐私列表 用户必须 MUST 发送一个类型为 set 的IQ节 包含一个符合 jabber iq privacy 名字空间的 query 元素 这个 query 元素包含一个空的 list 子元素 这个 list 子元素拥有一个 name 属性 这个 name 属性的值设为用户想移除的列表名 例子 客户端移除一个隐私列表 iq from romeo example net orchard type set id remove1 query xmlns jabber iq privacy list name private query iq 例子 服务器承认成功地移除列表 iq type result id remove1 to romeo example net orchard 如果一个用户尝试移除一个列表而这个列表正在被应用于至少一个和发送中的资源不同的已连接的资源 服务器必须 MUST 返回一个 conflict 节错误给用户 换言之 用户在尝试移除它之前必须 MUST 先设置另一个列表成为激活或缺省列表 如果用户尝试移除一个列表但是列表名字不存在 服务器必须 MUST 返回一个 item not found 节错误给用户 如果用户尝试在同一个请求中移除超过一个的列表 服务器必须 MUST 反回一个 bad request 节错误给用户 屏蔽消息 服务器端的隐私列表使得一个用户可以基于实体的JID 名册组 或订阅状态 或全局地 来屏蔽从其他实体引入的消息 以下例子阐明这个协议 注意 为了精简 result 类型的IQ节没有在以下例子中显示 隐私列表推送也没有显示 例子 基于JID的用户屏蔽 iq from romeo example net orchard type set id msg1 query xmlns jabber iq privacy list name message jid example item type jid value tybalt example com action deny order 3 message item list query iq 作为建立和应用前述列表的结果 用户将不会接收到从特定JID发来的消息 例子 基于名册组的用户屏蔽 iq from romeo example net orchard type set id msg2 query xmlns jabber iq privacy list name message group example item type group value Enemies action deny order 4 message item list query iq 作为建立和应用前述列表的结果 用户将不会收到从指定名册组中的任何实体发来的消息 例子 基于订阅状态的用户屏蔽 iq from romeo example net orchard type set id msg3 query xmlns jabber iq privacy list name message sub example item type subscription value none action deny order 5 message item list query iq 作为建立和应用前述列表的结果 用户将不会收到从任何指定订阅状态的实体发来的消息 例子 全局的用户屏蔽 iq from romeo example net orchard type set id msg4 query xmlns jabber iq privacy list name message global example item action deny order 6 message item list query iq 作为建立和应用前述列表的结果 用户将不会收到从任何其他用户发来的消息 屏蔽入站出席信息通知 服务器端的隐私列表使得用户可以基于实体的JID 名册组 或订阅状态 或全局地 屏蔽来自其他实体的入站出席信息通知 以下例子阐明了这个协议 注意 出席信息通知不包括出席信息订阅 只是把出席信息广播给当前已订阅某个联系人的出席信息的用户 所以它只包括没有 type 属性的或type unavailable 的出席信息节 例子 基于JID的用户屏蔽 iq from romeo example net orchard type set id presin1 query xmlns jabber iq privacy list name presin jid example item type jid value tybalt example com action deny order 7 presence in item list query iq 作为建立和应用前述列表的结果 用户将不会收到从指定JID发来的出席信息通知 例子 基于名册组的用户屏蔽 iq from romeo example net orchard type set id presin2 query xmlns jabber iq privacy list name presin group example item type group value Enemies action deny order 8 presence in item list query iq 作为建立和应用前述列表的结果 用户将不会从指定的名册组中的任何实体收到出席信息通知 例子 基于订阅状态的用户屏蔽 iq from romeo example net orchard type set id presin3 query xmlns jabber iq privacy list name presin sub example item type subscription value to action deny order 9 presence in item list query iq 作为建立和应用前述列表的结果 用户将不会从指定订阅状态的任何实体收到出席信息通知 例子 全局的用户屏蔽 iq from romeo example net orchard type set id presin4 query xmlns jabber iq privacy list name presin global example item action deny order 11 presence in item list query iq 作为建立和应用前述列表的结果 用户将不会从任何其他实体收到出席信息通知 屏蔽出站出席信息通知 服务器端的隐私列表使用户能够屏蔽发出到其他实体的出席信息通知 基于实体的JID 名册组 或订阅状态 或全局的 以下例子阐明了这个协议 注意 出席信息通知不包括出席信息订阅 只把出席信息广播给已订阅了用户的出席信息的联系人 所以 只包括没有 type 属性或type unavailable 的出席信息节 例子 基于JID的用户屏蔽 iq from romeo example net orchard type set id presout1 query xmlns jabber iq privacy list name presout jid example item type jid value tybalt example com action deny order 13 presence out item list query iq 作为建立和应用前述列表的结果 用户将不会给指定JID发送出席信息通知 例子 基于名册组的用户屏蔽 iq from romeo example net orchard type set id presout2 query xmlns jabber iq privacy list name presout group example item type group value Enemies action deny order 15 presence out item list query iq 作为建立和应用前述列表的结果 用户将不会向指定名册组的任何实体发送出席信息通知 例子 基于订阅状态的用户屏蔽 iq from romeo example net orchard type set id presout3 query xmlns jabber iq privacy list name presout sub example item type subscription value from action deny order 17 presence out item list query iq 作为建立和应用前述列表的结果 用户将不会向指定订阅状态的任何实体发送出席信息通知 例子 全局的用户屏蔽 iq from romeo example net orchard type set id presout4 query xmlns jabber iq privacy list name presout global example item action deny order 23 presence out item list query iq 作为建立和应用前述列表的结果 用户将不会向任何其他用户发送出席信息通知 屏蔽IQ节 服务器端的隐私列表使用户能够屏蔽从其他实体进来的IQ节 基于实体的JID 名册组 或订阅状态 或全局地 以下例子阐明了这个协议 例子 基于JID的用户屏蔽 iq from romeo example net orchard type set id iq1 query xmlns jabber iq privacy list name iq jid example item type jid value tybalt example com action deny order 29 iq item list query iq 作为建立和应用这个列表的结果 用户将不会收到从指定JID发来的IQ节 例子 基于名册组的用户屏蔽 iq from romeo example net orchard type set id iq2 query xmlns jabber iq privacy list name iq group example item type group value Enemies action deny order 31 iq item list query iq 作为建立和应用前述列表的结果 用户将不会收到从指定名册组的任何实体发来的IQ节 例子 基于订阅状态的用户屏蔽 iq from romeo example net orchard type set id iq3 query xmlns jabber iq privacy list name iq sub example item type subscription value none action deny order 17 iq item list query iq 作为建立和应用前述列表的结果 用户将不会收到从指定订阅状态的任何实体发来的IQ节 例子 全局的用户屏蔽 iq from romeo example net orchard type set id iq4 query xmlns jabber iq privacy list name iq global example item action deny order 1 iq item list query iq 作为建立和应用前述列表的结果 用户将不会收到从任何其他用户发来的IQ节 屏蔽所有通信 服务器端的隐私列表使用户能够基于其他实体的JID 名册组 或订阅状态 或全局的 屏蔽所有进来和出去的节 注意那部包括订阅相关的出席信息节 它们被排除在外 定义在 屏蔽入站出席信息通知Blocking Inbound Presence Notifications 第十章第十节 以下例子阐明了这个协议 例子 基于JID的用户屏蔽 iq from romeo example net orchard type set id all1 query xmlns jabber iq privacy list name all jid example item type jid value tybalt example com action deny order 23 list query iq 作为建立和应用这个列表的结果 用户将不会收到和发送任何通信给指定JID 例子 基于名册组的用户屏蔽 iq from romeo example net orchard type set id all2 query xmlns jabber iq privacy list name all group example item type group value Enemies action deny order 13 list query iq 作为建立和应用前述列表的结果 用户将不会收到和发送和指定名册组的任何实体的通信 例子 基于订阅状态的用户屏蔽 iq from romeo example net orchard type set id all3 query xmlns jabber iq privacy list name all sub example item type subscription value none action deny order 11 list query iq 作为建立和应用前述列表的结果 用户将不会收到和发送和指定订阅状态的任何实体的通信 例子 全局的用户屏蔽 iq from romeo example net orchard type set id all4 query xmlns jabber iq privacy list name all global example item action deny order 7 list query iq 作为建立和应用前述列表的结果 用户将不会收到和发送和任何其他用户的通信 已被屏蔽的实体尝试和用户通信 如果一个已被屏蔽的实体尝试发送消息或出席信息给用户 用户的服务器应该 SHOULD 安静的丢掉这个节并且不能 MUST NOT 返回一个错误给发送的实体 如果一个已被屏蔽的实体尝试发送一个类型为 get 或 set 的IQ节给用户 用户的服务器必须 MUST 给发送的实体一个 service unavailable 节错误 因为这是一个客户端不理解IQ get或set的名字空间的时候所发送的标准错误码 其他类型的IQ节应该 SHOULD 被服务器安静的丢弃 例子 已被屏蔽的实体尝试发送 IQ get iq type get to romeo example net from tybalt example com pda id probing1 query xmlns jabber iq version iq 例子 服务器返回一个错误给已被屏蔽的实体 iq type error from romeo example net to tybalt example com pda id probing1 query xmlns jabber iq version error type cancel service unavailable xmlns urn ietf params xml ns xmpp stanzas error iq 高级启发 当建立一个高级隐私启发的表达式的时候 客户端应该 SHOULD 使用尽可能简单的表达式 例如 启发 屏蔽不在我名册中的任何用户的通信 可以使用以下任何一种方式来构造 允许任何来自我的名册中的JID的通信 换言之 列出每个JID成为单独的列表条目 但是屏蔽和其他任何人的通信 允许任何来自我的名册的某个组中的用户的通信 换言之 列出每个组作为单独的条目 但是屏蔽和任何其他人的通信 允许任何我的他 她 之间的订阅状态为 both 或 to 或 from 的用户的通信 换言之 单独列出每个订阅状态值 但是屏蔽和任何其他人的通信 屏蔽和任何订阅状态为 none 的用户的通信 最后一个表达式是最简单的并且应该 SHOULD 被使用 这种情形下将被发送的XML如下 iq type set id heuristic1 query xmlns jabber iq privacy list name heuristic example item type subscription value none action deny order 437 list query iq 服务器处理XML节的规则 用于服务器的基本路由和递送规则定义在 XMPP CORE XMPP文档列表 XMPP正式RFC标准 RFC3920 中 本章定义附加的用于XMPP兼容的即时消息和出席信息服务器规则 入站节 如果一个入站的节的 to 属性的JID中的域标识符部分的主机名和服务器自身的主机名相同并且 to 属性的JID的格式是 user example com 或 user example com resource 服务器必须 MUST 首先强制应用任何隐私列表 第十章 然后服从以下定义的规则 如果JID的格式是 user domain resource 并且有一个可用的资源和这个全JID吻合 接受这得服务器必须 MUST 递送这个节给那个资源 然后如果JID的格式是 user domain 或格式是 user domain resource 并且和用户相关的帐号不存在 接收者的服务器 a 如果它是一个出席信息节 应该 SHOULD 安静的忽略这个节 换言之 既不递送它也不返回一个错误 b 如果它是一个IQ节 必须 MUST 返回一个 service unavailable 节错误给发送者 并且 c 如果它是一个消息节 应该 SHOULD 返回一个 service unavailable 节错误给发送者 然后如果JID的格式是 user domain resource 并且没有可用的资源和它的全JID匹配 接收者的服务器 a 如果它是一个出席信息节 应该 SHOULD 安静地忽略这个节 换言之 既不递送它也不返回一个错误 b 如果它是一个IQ节 必须 MUST 返回一个 service unavailable 节错误给发送者 并且 c 如果它是一个消息节 应该 SHOULD 把这个节视为发往 user domain 然后如果JID的格式是 user domain 并且这个用户至少有一个可用的资源 接收者的服务器必须 MUST 遵守以下规则 对于消息节 服务器应该 SHOULD 递送这个节给高优先级的可用资源 如果这个资源没有提供 priority 元素的值 服务器应该 SHOULD 认为它提供的值为零 如果两个或更多的可用资源有相同的优先级 服务器可以 MAY 使用一些其他的规则 例如 最近的连接时间 最近的活动时间 或由一些 show 值的层次所定义的最高的可用性 来从它们中间选择 或可以 MAY 递送这个消息到所有这些资源 无论如何 服务器不能 MUST NOT 这个节到一个优先级为负数的可用资源 如果唯一的一个可用资源的优先级是负数 服务器应该 SHOULD 当成没有可用资源一样处理这个消息 定义在后面 另外 服务器不能 MUST NOT 重写 to 属性 换言之 它必须 MUST 让它保持 user domain 而不是改成 user domain resource 对于类型不是 probe 的出席信息节 服务器必须 MUST 递送这个节给所有可用的资源 对于出席信息调查 服务器应该 SHOULD 基于定义在 出席信息调查Presence Probes 第五章第一节第三小节 的规则来应答 另外 服务器不能 MUST NOT 重写 to 属性 换言之 它必须 MUST 保持 user domain 而不是改为 user domain resource 对于IQ节 服务器本身必须 MUST 代替用户应答一个IQ result或一个IQ error 并且不能

    Original URL path: http://wiki.jabbercn.org/index.php?title=RFC3921&printable=yes (2016-04-25)
    Open archived version from archive

  • XEP-0143 - Jabber/XMPP中文翻译计划
    其 中包含标题行的 th 元素和数据行的 td 元素 而 colspan 和 rowspan的属性也可以用 如果需要他们的话 表格展现由XSLT和CSS样式表 如cellpadding和cellspacing 处理 但是记住 这并不意味着表是用来显示了大量文本的 xep xsl文件执行各种魔法 在XML文件转换成HTML 包括前面的问题创建 表的内容 章节编号 备注 和修订历史记录 请随意对此文件提交补丁 但不要向源 代码控制提交修改后的版本 虽然HTML是XEPs的主要发行格式 自2009年以来XMPP扩展编辑也发布XEPs的PDF文件的形式 牢记这一点 尽量避免表中的列太多 这可能需要比正常更宽的纸张 XEP文档的章节 大部分XEP协议有以下大部分章节 经常以下面所述的顺序排列 其他章节可以是适当的 例如 XHTML IM 13 有一个章节是讲W3C事项 关于为了阐述你的论据而需要的章节你要使用你自己的最佳判断 或针对你的需要咨询XMPP扩展编辑 简介 一个XEP文档的简介是非常重要的 因为它提供了考虑的提案的基本原理 特别是 简介应该包含类似如下信息 因为缺少你提议的协议而使用户现在不能完成的任务 注意 用户不只是IM用户 而可以是任何人 系统 或可以通过XMPP网络和其他实体交互而带来价值的应用 其他项目或协议以及XMPP技术如何因为你提议的协议而与它们交互 例如 XML RPC SOAP XMPP技术和 竞争者 之间的比较 例如 其他IM系统或消息协议 描述为了提供类似功能XMPP协议簇中需要填补的空白 XMPP社区中思考的相关历史 真实世界中该协议能解决的问题的例子 需求 每个XEP文档应该包含一个章节来描述该文档所代表的需求 这个信息是关键和重要的 因为它清楚地定义本提案的范围以及在协议设计上的任何相关的约束 词汇表 如果你的XEP文档使用读者不熟悉的术语 请在一个词汇表中定义它们 推荐的词汇表的布局是一个定义列表 使用HTML的 标签 示例见现有的XEPs 用例 建议文档作者根据提案将要阐述的用例来结构化他们的提案 14 我们发现用例强迫作者专注于功能而不是 为了协议而做协议 它也有助于根据参与者来排列用例 比如在 Multi User Chat 15 中就是这样做的 每个用例包含一个子章节 写用例和相关协议的时候 确保以下要点 清晰地定义成功场景 候补流程 和可能的错误 描述使用本协议的时候XMPP客户端 服务器 和外部组件的预期行为 包含很多协议示例 16 我们重申 包含很多协议示例 示例不仅帮助实现者而且也帮助那些在标准SIG和XMPP理事会中审核你的提案的人 如果你遵循Jabber传统使用莎士比亚戏剧中的角色和情景 你将得到XMPP扩展编辑的额外信任 示例1 一个来自莎士比亚的例子 message from juliet capulet com balcony to romeo montague net garden type chat body Wherefore art thou Romeo body message 错误代码 如果你的提案定义了一些错误和状态码 如XEP 0045中做的那样 包含一个你文档中定义的所有代码的表格是个好主意 商业规则 你可能希望包含一个章节来描述各种商业规则 基本上 是关于应用行为的 MUSTs SHOULDs 和 MAYs 的变种 这不是必需的但有助于实现者 实现备注 你可能希望包含一个实现备注章节 同样 这不是必需的但是有助于实现者 国际化事项 如果有任何和你的提案相关的国际化或本地化的问题 例如 是否包含 xml lang 属性 在这个可选的章节定义它们 安全事项 你的提案必须包含一个 安全事项 的章节 即使没有和你的提案相关的安全特性或关系 你也必需标注那种情况 有益的指南请参考 RFC 3552 17 核心XMPP协议 RFC 6120 也包含非常全面的安全事项章节 可作为范例来参考 IANA事项 本章是必需的 IANA即 互联网号码分配机构 IANA 18 互联网协议的唯一性参数值分配的核心协调者 例如号码和URI schemes 大部分提案不要求和IANA的互动 这种情况下本章的文本应为 本文不需要和互联网号码分配机构 IANA 交互 如果你的提案要求和IANA交互 和XMPP扩展编辑的XMPP注册处讨论这件事 不要自己直接联系IANA XMPP注册处事项 本章是必需的 XMPP注册处 19 维护了保留的XMPP协议命名空间的列表和XMPP标准基金会批准的协议的上下文中使用了的参数的注册项 如果提案不需要和XMPP注册处交互 本章的文本应为 本文不需要向XMPP注册处注册命名空间或参数 其他情况下的适当文本请参考草案或最终XEPs 或咨询XMPP扩展编辑的XMPP注册处 XML Schema 为了协议被XMPP委员会批准 一个XML Schema是必需的 XMPP扩展编辑能帮助你为你建议的协议定义一个XML Schemae 致谢 大部分XEP文档在结尾会加上一个章节来感谢那些做出显著贡献或对该协议提供了反馈的非作者 XEP样式指南 XMPP扩展协议是用英语写的 你不一定是一个好的提案撰写者 但是要尝试以清晰 易于理解的方式来撰写 XMPP扩展编辑将纠正任何从你的提案中发现的语法 拼写 XEP 0143 附录G 备注 20 标点 以及用法的错误 但是可能会在你的提案开始排队等待XMPP委员会升级到草案或激活状态时才会这么做 另外 XMPP扩展编辑保留改善不清晰或不贴切的说法 调整章节 修改示例以使用莎士比亚人物 以及其他改善你的提案的论据和逻辑流程 当然不会改变含义 的权利 接下来提供的样式指南是用来补充标准的英文样式指南 类似 样式元素 21 和 芝加哥样式手册 22 通用的英语 特别是美国英语 使用信息请参考那些资源 而这里的样式指南是XEP特有的指南 属性 当我们用名字来谈到属性的时候 会用单引号来代表它 例如 to 属性 当我们谈到属性的值的时候 会用双引号代表它 例如 subscription 属性的值为 both 元素拥有属性并且包含字符串数据 和 或 子元素 不要混淆这些术语 代码示例 在示例中 使用单引号而不是双引号 它们更易读 为了展示XML元素的层次 每一级缩进两个空格 如果一个元素拥有多个属性 请以 Canonical XML 23 决定的顺序展示 如果一个元素拥有大量的属性 在每个属性前面包含一个换行并且缩进 这样它们就垂直对齐而易读了 如果一个元素的XML字符数据很长 包含一个换行并缩进两个空格 在我们的HTML输出文件中示例是主要的右滚动的来源 右滚动是有害的 所以 要相应调整你的示例的布局 行宽不应超过110个字符之类的 示例 iq from darkcave macbeth shakespeare lit id config1 to crone1 shakespeare lit desktop type result query xmlns http jabber org protocol muc roomconfig x xmlns jabber x data type form title Configuration for darkcave Room title instructions Please complete this form to make changes to the configuration of your room to add room owners and administrators use the appropriate room commands rather than this form instructions field type hidden var FORM TYPE value http jabber org protocol muc roomconfig value field query iq 一些示例包含的字符串是由哈希算法 类似 SHA 1 见 RFC 3174 24 或 SHA 256 见 在XMPP中使用加密哈希函数 25 输出的 生成这些码的一个简单办法是使用 OpenSSL 的 dgst 指令来生成哈希值 例如 以下指令将生成 SHA 1 哈希值 9f5f9fdab9da7fc12e3c52b258acbcb4bb8e66ac echo n bard shakespeare lit openssl dgst hex sha1 一些示例 例如 SASL 示例 包含的字符串是使用 Base64 见 RFC 4648 26 编码的 生成这些的一个简单办法是使用 OpenSSL 的 enc 指令来生成 base64编码的等价值 例如 以下命令将生成base64编码的字符串 YmFyZEBzaGFrZXNwZWFyZS5saXQ echo n bard shakespeare lit openssl enc nopad base64 一致性术语 一致性术语 例如 MUST and SHOULD 定义于 RFC 2119 要使用它们 当这些术语不是全部大写的时候 则特有的一致性含义则不适用 尽管使用术语 might 替代 may 和以 ought 替代 should 更好 元素 当我们用名字谈到一个元素的时候 所指的是一个空的XML元素 例如 query 元素 message presence 和 iq 元素的最外一层实际上是XML节 参见 RFC 6120 请用stanza 节 来指代它们 而不要用元素 来指代它们 元素拥有属性并包含字符数据 和 或 子元素 不要混淆这些术语 当你想说 element 元素 的时候不要使用术语 tag 标签 不要添加所属关系到元素本身 反例 body 的字符数据 正例 body 元素的字符数据 注意 在xep ent文件里 节名称和一些通用元素名称有缩写 错误 当我们谈到一个错误条件时 使用定义于 RFC 6120 的XML元素名称e而不是旧的HTTP格式的代码数字 例如 feature not implemented 错误 注意

    Original URL path: http://wiki.jabbercn.org/index.php?title=XEP-0143&oldid=3075 (2016-04-25)
    Open archived version from archive

  • 查看源代码 - Jabber/XMPP中文翻译计划
    元素应具备的 caption属性说明表的内容 标准的XHTML表结构适用 tr 定义一行 其 中包含标题行的 th 元素和数据行的 td 元素 而 colspan 和 rowspan的属性也可以用 如果需要他们的话 表格展现由XSLT和CSS样式表 如cellpadding和cellspacing 处理 但是记住 这并不意味着表是用来显示了大量文本的 xep xsl文件执行各种魔法 在XML文件转换成HTML 包括前面的问题创建 表的内容 章节编号 备注 和修订历史记录 请随意对此文件提交补丁 但不要向源 代码控制提交修改后的版本 虽然HTML是XEPs的主要发行格式 自2009年以来XMPP扩展编辑也发布XEPs的PDF文件的形式 牢记这一点 尽量避免表中的列太多 这可能需要比正常更宽的纸张 source XEP文档的章节 大部分XEP协议有以下大部分章节 经常以下面所述的顺序排列 其他章节可以是适当的 例如 http xmpp org extensions xep 0071 html XHTML IM XEP 0143 附录G 备注 13 有一个章节是讲W3C事项 关于为了阐述你的论据而需要的章节你要使用你自己的最佳判断 或针对你的需要咨询XMPP扩展编辑 简介 一个XEP文档的简介是非常重要的 因为它提供了考虑的提案的基本原理 特别是 简介应该包含类似如下信息 因为缺少你提议的协议而使用户现在不能完成的任务 注意 用户不只是IM用户 而可以是任何人 系统 或可以通过XMPP网络和其他实体交互而带来价值的应用 其他项目或协议以及XMPP技术如何因为你提议的协议而与它们交互 例如 XML RPC SOAP XMPP技术和 竞争者 之间的比较 例如 其他IM系统或消息协议 描述为了提供类似功能XMPP协议簇中需要填补的空白 XMPP社区中思考的相关历史 真实世界中该协议能解决的问题的例子 需求 每个XEP文档应该包含一个章节来描述该文档所代表的需求 这个信息是关键和重要的 因为它清楚地定义本提案的范围以及在协议设计上的任何相关的约束 词汇表 如果你的XEP文档使用读者不熟悉的术语 请在一个词汇表中定义它们 推荐的词汇表的布局是一个定义列表 使用HTML的 dl 标签 示例见现有的XEPs 用例 建议文档作者根据提案将要阐述的用例来结构化他们的提案 XEP 0143 附录G 备注 14 我们发现用例强迫作者专注于功能而不是 为了协议而做协议 它也有助于根据参与者来排列用例 比如在 XEP 0045 Multi User Chat XEP 0143 附录G 备注 15 中就是这样做的 每个用例包含一个子章节 写用例和相关协议的时候 确保以下要点 清晰地定义成功场景 候补流程 和可能的错误 描述使用本协议的时候XMPP客户端 服务器 和外部组件的预期行为 包含很多协议示例 XEP 0143 附录G 备注 16 我们重申 包含很多协议示例 示例不仅帮助实现者而且也帮助那些在标准SIG和XMPP理事会中审核你的提案的人 如果你遵循Jabber传统使用莎士比亚戏剧中的角色和情景 你将得到XMPP扩展编辑的额外信任 示例1 一个来自莎士比亚的例子 source lang xml message from juliet capulet com balcony to romeo montague net garden type chat body Wherefore art thou Romeo body message source 错误代码 如果你的提案定义了一些错误和状态码 如XEP 0045中做的那样 包含一个你文档中定义的所有代码的表格是个好主意 商业规则 你可能希望包含一个章节来描述各种商业规则 基本上 是关于应用行为的 MUSTs SHOULDs 和 MAYs 的变种 这不是必需的但有助于实现者 实现备注 你可能希望包含一个实现备注章节 同样 这不是必需的但是有助于实现者 国际化事项 如果有任何和你的提案相关的国际化或本地化的问题 例如 是否包含 xml lang 属性 在这个可选的章节定义它们 安全事项 你的提案必须包含一个 安全事项 的章节 即使没有和你的提案相关的安全特性或关系 你也必需标注那种情况 有益的指南请参考 http tools ietf org html rfc3552 RFC 3552 XEP 0143 附录G 备注 17 核心XMPP协议 RFC 6120 也包含非常全面的安全事项章节 可作为范例来参考 IANA事项 本章是必需的 IANA即 http www iana org 互联网号码分配机构 IANA XEP 0143 附录G 备注 18 互联网协议的唯一性参数值分配的核心协调者 例如号码和URI schemes 大部分提案不要求和IANA的互动 这种情况下本章的文本应为 本文不需要和互联网号码分配机构 IANA 交互 如果你的提案要求和IANA交互 和XMPP扩展编辑的XMPP注册处讨论这件事 不要自己直接联系IANA XMPP注册处事项 本章是必需的 http xmpp org registrar XMPP注册处 XEP 0143 附录G 备注 19 维护了保留的XMPP协议命名空间的列表和XMPP标准基金会批准的协议的上下文中使用了的参数的注册项 如果提案不需要和XMPP注册处交互 本章的文本应为 本文不需要向XMPP注册处注册命名空间或参数 其他情况下的适当文本请参考草案或最终XEPs 或咨询XMPP扩展编辑的XMPP注册处 XML Schema 为了协议被XMPP委员会批准 一个XML Schema是必需的 XMPP扩展编辑能帮助你为你建议的协议定义一个XML Schemae 致谢 大部分XEP文档在结尾会加上一个章节来感谢那些做出显著贡献或对该协议提供了反馈的非作者 XEP样式指南 XMPP扩展协议是用英语写的 你不一定是一个好的提案撰写者 但是要尝试以清晰 易于理解的方式来撰写 XMPP扩展编辑将纠正任何从你的提案中发现的语法 拼写 XEP 0143 附录G 备注 20 标点 以及用法的错误 但是可能会在你的提案开始排队等待XMPP委员会升级到草案或激活状态时才会这么做 另外 XMPP扩展编辑保留改善不清晰或不贴切的说法 调整章节 修改示例以使用莎士比亚人物 以及其他改善你的提案的论据和逻辑流程 当然不会改变含义 的权利 接下来提供的样式指南是用来补充标准的英文样式指南 类似 样式元素 XEP 0143 附录G 备注 21 和 芝加哥样式手册 XEP 0143 附录G 备注 22 通用的英语 特别是美国英语 使用信息请参考那些资源 而这里的样式指南是XEP特有的指南 属性 当我们用名字来谈到属性的时候 会用单引号来代表它 例如 to 属性 当我们谈到属性的值的时候 会用双引号代表它 例如 subscription 属性的值为 both 元素拥有属性并且包含字符串数据 和 或 子元素 不要混淆这些术语 代码示例 在示例中 使用单引号而不是双引号 它们更易读 为了展示XML元素的层次 每一级缩进两个空格 如果一个元素拥有多个属性 请以 http www w3 org TR xml c14n Canonical XML XEP 0143 附录G 备注 23 决定的顺序展示 如果一个元素拥有大量的属性 在每个属性前面包含一个换行并且缩进 这样它们就垂直对齐而易读了 如果一个元素的XML字符数据很长 包含一个换行并缩进两个空格 在我们的HTML输出文件中示例是主要的右滚动的来源 右滚动是有害的 所以 要相应调整你的示例的布局 行宽不应超过110个字符之类的 示例 source lang XML iq from darkcave macbeth shakespeare lit id config1 to crone1 shakespeare lit desktop type result query xmlns http jabber org protocol muc roomconfig x xmlns jabber x data type form title Configuration for darkcave Room title instructions Please complete this form to make changes to the configuration of your room to add room owners and administrators use the appropriate room commands rather than this form instructions field type hidden var FORM TYPE value http jabber org protocol muc roomconfig value field query iq source 一些示例包含的字符串是由哈希算法 类似 SHA 1 见 http tools ietf org html rfc3174 RFC 3174 XEP 0143 附录G 备注 24 或 SHA 256 见 http xmpp org extensions xep 0300 html 在XMPP中使用加密哈希函数 XEP 0143 附录G 备注 25 输出的 生成这些码的一个简单办法是使用 http www openssl org OpenSSL 的 dgst 指令来生成哈希值 例如 以下指令将生成 SHA 1 哈希值 9f5f9fdab9da7fc12e3c52b258acbcb4bb8e66ac source lang

    Original URL path: http://wiki.jabbercn.org/index.php?title=XEP-0143&action=edit (2016-04-25)
    Open archived version from archive

  • “XEP-0143”的版本历史 - Jabber/XMPP中文翻译计划
    21 731字节 一致性术语 当前 先前 2013年5月10日 五 16 52 Admin 讨论 贡献 21 488字节 代码示例 当前 先前 2013年5月10日 五 16 40 Admin 讨论 贡献 小 21 251字节 代码示例 当前 先前 2013年5月10日 五 16 26 Admin 讨论 贡献 19 049字节 属性 当前 先前 2013年5月8日 三 11 53 Admin 讨论 贡献 18 749字节 XEP样式指南 当前 先前 2013年5月7日 二 13 37 Admin 讨论 贡献 17 831字节 致谢 当前 先前 2013年5月7日 二 13 35 Admin 讨论 贡献 小 17 698字节 XEP文档的章节 当前 先前 2013年5月7日 二 13 33 Admin 讨论 贡献 17 572字节 XML Schema 当前 先前 2013年5月7日 二 13 31 Admin 讨论 贡献 17 429字节 XMPP注册处事项 当前 先前 2013年5月7日 二 13 28 Admin 讨论 贡献 小 16 969字节 IANA事项 当前 先前 2013年5月6日 一 12 09 Admin 讨论 贡献 16 968字节 IANA事项 当前 先前 2013年5月2日 四 21 32 Admin 讨论 贡献 16 501字节 安全事项 当前 先前 2013年4月24日 三 11 50 Admin 讨论 贡献 16 147字节 国际化事项 当前 先前 2013年4月24日 三 11 46 Admin 讨论 贡献 15 998字节 实现备注 当前 先前 2013年4月24日 三 11 45 Admin 讨论 贡献 15 897字节 商业规则 当前 先前 2013年4月24日 三 11 43 Admin 讨论 贡献 15 720字节 错误代码 当前 先前 2013年4月23日 二 10 36 Admin 讨论 贡献 15 566字节 用例 当前 先前 2013年4月19日 五 11 26 Admin 讨论 贡献 14 427字节 词汇表 当前 先前 2013年4月19日 五 11 24 Admin 讨论 贡献 14 231字节 需求 当前 先前 2013年4月19日 五 11 21 Admin 讨论 贡献 14 025字节 简介 当前 先前 2013年4月19日 五 11 12 Admin 讨论 贡献 13 310字节 XEP文档的章节 当前 先前 2013年4月19日 五 11 06 Admin 讨论 贡献 小 12 940字节 文件内容 当前 先前 2013年4月19日 五 11 02 Admin 讨论 贡献 小 12 917字节 文件内容 当前 先前 2013年4月13日 六 21 21 Admin 讨论 贡献 12 885字节 文件内容 当前 先前 2013年4月13日 六 21 18 Admin 讨论 贡献 12 635字节 文件内容 当前 先前 2013年4月11日

    Original URL path: http://wiki.jabbercn.org/index.php?title=XEP-0143&action=history (2016-04-25)
    Open archived version from archive

  • 链接至“XEP-0143”的页面 - Jabber/XMPP中文翻译计划
    模板 模板讨论 帮助 帮助讨论 分类 分类讨论 过滤器 隐藏 包含 隐藏 链接 隐藏 重定向 下列页面链接至 XEP 0143 查看 上50个 下50个 20 50 100 250 500 首页 链入页面 模板 最新消息 链入页面 Jabber XMPP中文翻译计划 新闻动态 链入页面 XEP 0143 链入页面 查看 上50个 下50个 20 50 100 250 500 来自 http wiki jabbercn org E7 89 B9 E6 AE 8A E9 93 BE E5 85 A5 E9 A1 B5 E9 9D A2 XEP 0143 查看

    Original URL path: http://wiki.jabbercn.org/%E7%89%B9%E6%AE%8A:%E9%93%BE%E5%85%A5%E9%A1%B5%E9%9D%A2/XEP-0143 (2016-04-25)
    Open archived version from archive

  • XEP-0143 - Jabber/XMPP中文翻译计划
    如果需要他们的话 表格展现由XSLT和CSS样式表 如cellpadding和cellspacing 处理 但是记住 这并不意味着表是用来显示了大量文本的 xep xsl文件执行各种魔法 在XML文件转换成HTML 包括前面的问题创建 表的内容 章节编号 备注 和修订历史记录 请随意对此文件提交补丁 但不要向源 代码控制提交修改后的版本 虽然HTML是XEPs的主要发行格式 自2009年以来XMPP扩展编辑也发布XEPs的PDF文件的形式 牢记这一点 尽量避免表中的列太多 这可能需要比正常更宽的纸张 XEP文档的章节 大部分XEP协议有以下大部分章节 经常以下面所述的顺序排列 其他章节可以是适当的 例如 XHTML IM 13 有一个章节是讲W3C事项 关于为了阐述你的论据而需要的章节你要使用你自己的最佳判断 或针对你的需要咨询XMPP扩展编辑 简介 一个XEP文档的简介是非常重要的 因为它提供了考虑的提案的基本原理 特别是 简介应该包含类似如下信息 因为缺少你提议的协议而使用户现在不能完成的任务 注意 用户不只是IM用户 而可以是任何人 系统 或可以通过XMPP网络和其他实体交互而带来价值的应用 其他项目或协议以及XMPP技术如何因为你提议的协议而与它们交互 例如 XML RPC SOAP XMPP技术和 竞争者 之间的比较 例如 其他IM系统或消息协议 描述为了提供类似功能XMPP协议簇中需要填补的空白 XMPP社区中思考的相关历史 真实世界中该协议能解决的问题的例子 需求 每个XEP文档应该包含一个章节来描述该文档所代表的需求 这个信息是关键和重要的 因为它清楚地定义本提案的范围以及在协议设计上的任何相关的约束 词汇表 如果你的XEP文档使用读者不熟悉的术语 请在一个词汇表中定义它们 推荐的词汇表的布局是一个定义列表 使用HTML的 标签 示例见现有的XEPs 用例 建议文档作者根据提案将要阐述的用例来结构化他们的提案 14 我们发现用例强迫作者专注于功能而不是 为了协议而做协议 它也有助于根据参与者来排列用例 比如在 Multi User Chat 15 中就是这样做的 每个用例包含一个子章节 写用例和相关协议的时候 确保以下要点 清晰地定义成功场景 候补流程 和可能的错误 描述使用本协议的时候XMPP客户端 服务器 和外部组件的预期行为 包含很多协议示例 16 我们重申 包含很多协议示例 示例不仅帮助实现者而且也帮助那些在标准SIG和XMPP理事会中审核你的提案的人 如果你遵循Jabber传统使用莎士比亚戏剧中的角色和情景 你将得到XMPP扩展编辑的额外信任 示例1 一个来自莎士比亚的例子 message from juliet capulet com balcony to romeo montague net garden type chat body Wherefore art thou Romeo body message 错误代码 如果你的提案定义了一些错误和状态码 如XEP 0045中做的那样 包含一个你文档中定义的所有代码的表格是个好主意 商业规则 你可能希望包含一个章节来描述各种商业规则 基本上 是关于应用行为的 MUSTs SHOULDs 和 MAYs 的变种 这不是必需的但有助于实现者 实现备注 你可能希望包含一个实现备注章节 同样 这不是必需的但是有助于实现者 国际化事项 如果有任何和你的提案相关的国际化或本地化的问题 例如 是否包含 xml lang 属性 在这个可选的章节定义它们 安全事项 你的提案必须包含一个 安全事项 的章节 即使没有和你的提案相关的安全特性或关系 你也必需标注那种情况 有益的指南请参考 RFC 3552 17 核心XMPP协议 RFC 6120 也包含非常全面的安全事项章节 可作为范例来参考 IANA事项 本章是必需的 IANA即 互联网号码分配机构 IANA 18 互联网协议的唯一性参数值分配的核心协调者 例如号码和URI schemes 大部分提案不要求和IANA的互动 这种情况下本章的文本应为 本文不需要和互联网号码分配机构 IANA 交互 如果你的提案要求和IANA交互 和XMPP扩展编辑的XMPP注册处讨论这件事 不要自己直接联系IANA XMPP注册处事项 本章是必需的 XMPP注册处 19 维护了保留的XMPP协议命名空间的列表和XMPP标准基金会批准的协议的上下文中使用了的参数的注册项 如果提案不需要和XMPP注册处交互 本章的文本应为 本文不需要向XMPP注册处注册命名空间或参数 其他情况下的适当文本请参考草案或最终XEPs 或咨询XMPP扩展编辑的XMPP注册处 XML Schema 为了协议被XMPP委员会批准 一个XML Schema是必需的 XMPP扩展编辑能帮助你为你建议的协议定义一个XML Schemae 致谢 大部分XEP文档在结尾会加上一个章节来感谢那些做出显著贡献或对该协议提供了反馈的非作者 XEP样式指南 XMPP扩展协议是用英语写的 你不一定是一个好的提案撰写者 但是要尝试以清晰 易于理解的方式来撰写 XMPP扩展编辑将纠正任何从你的提案中发现的语法 拼写 XEP 0143 附录G 备注 20 标点 以及用法的错误 但是可能会在你的提案开始排队等待XMPP委员会升级到草案或激活状态时才会这么做 另外 XMPP扩展编辑保留改善不清晰或不贴切的说法 调整章节 修改示例以使用莎士比亚人物 以及其他改善你的提案的论据和逻辑流程 当然不会改变含义 的权利 接下来提供的样式指南是用来补充标准的英文样式指南 类似 样式元素 21 和 芝加哥样式手册 22 通用的英语 特别是美国英语 使用信息请参考那些资源 而这里的样式指南是XEP特有的指南 属性 当我们用名字来谈到属性的时候 会用单引号来代表它 例如 to 属性 当我们谈到属性的值的时候 会用双引号代表它 例如 subscription 属性的值为 both 元素拥有属性并且包含字符串数据 和 或 子元素 不要混淆这些术语 代码示例 在示例中 使用单引号而不是双引号 它们更易读 为了展示XML元素的层次 每一级缩进两个空格 如果一个元素拥有多个属性 请以 Canonical XML 23 决定的顺序展示 如果一个元素拥有大量的属性 在每个属性前面包含一个换行并且缩进 这样它们就垂直对齐而易读了 如果一个元素的XML字符数据很长 包含一个换行并缩进两个空格 在我们的HTML输出文件中示例是主要的右滚动的来源 右滚动是有害的 所以 要相应调整你的示例的布局 行宽不应超过110个字符之类的 示例 iq from darkcave macbeth shakespeare lit id config1 to crone1 shakespeare lit desktop type result query xmlns http jabber org protocol muc roomconfig x xmlns jabber x data type form title Configuration for darkcave Room title instructions Please complete this form to make changes to the configuration of your room to add room owners and administrators use the appropriate room commands rather than this form instructions field type hidden var FORM TYPE value http jabber org protocol muc roomconfig value field query iq 一些示例包含的字符串是由哈希算法 类似 SHA 1 见 RFC 3174 24 或 SHA 256 见 在XMPP中使用加密哈希函数 25 输出的 生成这些码的一个简单办法是使用 OpenSSL 的 dgst 指令来生成哈希值 例如 以下指令将生成 SHA 1 哈希值 9f5f9fdab9da7fc12e3c52b258acbcb4bb8e66ac echo n bard shakespeare lit openssl dgst hex sha1 一些示例 例如 SASL 示例 包含的字符串是使用 Base64 见 RFC 4648 26 编码的 生成这些的一个简单办法是使用 OpenSSL 的 enc 指令来生成 base64编码的等价值 例如 以下命令将生成base64编码的字符串 YmFyZEBzaGFrZXNwZWFyZS5saXQ echo n bard shakespeare lit openssl enc nopad base64 一致性术语 一致性术语 例如 MUST and SHOULD 定义于 RFC 2119 要使用它们 当这些术语不是全部大写的时候 则特有的一致性含义则不适用 尽管使用术语 might 替代 may 和以 ought 替代 should 更好 元素 当我们用名字谈到一个元素的时候 所指的是一个空的XML元素 例如 query 元素 message presence 和 iq 元素的最外一层实际上是XML节 参见 RFC 6120 请用stanza 节 来指代它们 而不要用元素 来指代它们 元素拥有属性并包含字符数据 和 或 子元素 不要混淆这些术语 当你想说 element 元素 的时候不要使用术语 tag 标签 不要添加所属关系到元素本身 反例 body 的字符数据 正例 body 元素的字符数据 注意 在xep ent文件里 节名称和一些通用元素名称有缩写 错误 当我们谈到一个错误条件时 使用定义于 RFC 6120 的XML元素名称e而不是旧的HTTP格式的代码数字 例如 feature not implemented 错误 注意 在xep ent文件中节错误有缩写 命名空间 当以名称谈到一个命名空间的时候 指的是单引号中的内容 例如 jabber iq roster 命名空间

    Original URL path: http://wiki.jabbercn.org/index.php?title=XEP-0143&printable=yes (2016-04-25)
    Open archived version from archive



  •