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".
  • RFC6120 - Jabber/XMPP中文翻译计划
    元素的适当子元素 如 6 5 定义的 R failure xmlns urn ietf params xml ns xmpp sasl not authorized failure 为了选择适当的SASL机制 接收方实体应该允许一个可配置的但是合理的重试次数 至少2次但不超过5次 这让初始化实体能 例如 一个终端用户客户端 容忍不正确的凭证 例如 一个输错的密码 而不要强制重新连接 如果接收方实体立刻返回SASL失败并关闭流 如果初始化实体对同一个SASL机制尝试了合理的重试次数并且都失败了 它可以回滚到顺序列表中的下一个机制 只要发送一个新的 auth 请求给接收方实体 从而开始那个机制的新的握手 如果所有握手都失败了并且在初始化实体支持和可接受的机制列表里没有剩余的机制了 初始化实体应该简单地关闭这个流 如 4 4 所述 而不是等待这个流超时 如果初始化实体超出了重试次数 接收方实体必须以一个流错误关闭流 它应该是 policy violation 4 9 3 14 不过一些现有的实现发送的是 not authorized 4 9 3 12 实现备注 对于 服务器 服务器 流 如果接收方实体不能提供SASL EXTERNAL机制或其他基于TLS协商期间简历的安全上下文的SASL机制 接收方实体可以尝试使用服务器回拨协议 XEP 0220 来完成弱身份验证 无论如何 如果根据本地策略弱身份验证不足够的话 那么接收方实体应该以 policy violation 流错误 4 9 3 14 关闭这个流而不是等待这个流超时 SASL成功 在确定SASL握手成功之前 如果初始化实体在一个其保密和诚信得到TLS或同等的安全层 例如SASL GSSAPI机制 保护的初始化流头提供了一个 from 属性 那么接收方实体应该把这个验证身份结果关联到来自SASL协商的 from 地址 如果这两个身份不匹配 那么接收方实体应该终止连接尝试 然而 接收方实体可以有合法的理由不终止这个连接尝试 例如 因为它覆盖了一个连接的客户端的地址来纠正JID格式或根据终端用户的证书授予一个JID 接收方实体通过发送一个由 urn ietf params xml ns xmpp sasl 命名空间限定的 success 元素来汇报握手成功 这个元素可以包含XML字符串数据 在SASL 属于中 是 成功的附加数据 如果选择的SASL机制支持或者要求它 如果接收方实体需要发送零长度的附加数据 它必须传送一个单独的等号字符 数据 R success xmlns urn ietf params xml ns xmpp sasl 参考文献 对于 客户端 服务器 流 在SASL协商时通讯的授权身份是用来根据接收方服务器为初始化客户端确定的权威地址 如 4 3 6 所述 一旦接收到 success 元素 初始化实体必须在现有的TCP连接上发送一个新的初始化流头到接收方实体来初始化一个新的流 如 4 3 3 所述 在发送新的初始化流头之前 初始化实体不能 MUST NOT 发送一个关闭 stream 标签 因为接收方实体和初始化实体必须确定原始的流被替换成SASL协商成功之后的流 I stream stream from juliet im example com to im example com version 1 0 xml lang en xmlns jabber client xmlns stream http etherx jabber org streams 一旦从初始化实体接收到新的初始化流头 接收方实体必须发送一个新的流头给初始化实体来应答 为此它必须生成一个新的流ID而不是重用旧的流ID R stream stream from im example com id gPybzaOzBmaADgxKXu9UClbprp0 to juliet im example com version 1 0 xml lang en xmlns jabber client xmlns stream http etherx jabber org streams 接收方实体也必须发送流特性 包含任何更多的可用特性或不包含特性 通过一个空的 features 元素 R stream features bind xmlns urn ietf params xml ns xmpp bind stream features SASL错误 SASL错误的语法如下 那些用方括号 和 括起来的XML数据是可选的 failure xmlns urn ietf params xml ns xmpp sasl defined condition text xml lang langcode OPTIONAL descriptive text text failure defined condition 必须是在接下来的章节里的定义的SASL相关的错误条件之一 然而 因为将来可能定义额外的错误条件 如果一个实体收到一个它不理解的SASL错误条件 那么它必须把这个未知的条件视为一个通用的验证错误 即 等同于 not authorized 6 5 10 内含的 text 元素是可选的 并且可被用于提供关于这个错误条件的应用特有的信息 这个信息可以显示给人看但只是作为已定义的条件的补充 因为XMPP本身定义了一个SASL应用范本并且不期望有更多专门的XMPP应用建立在SASL之上 所以SASL错误格式不会像在XML流 4 9 4 和XML节 8 3 4 的做法一样 为应用特有的错误提供扩展性 aborted 接收方实体确认验证握手已经被初始化实体放弃 对 abort 元素发送应答 I abort xmlns urn ietf params xml ns xmpp sasl R failure xmlns urn ietf params xml ns xmpp sasl aborted failure account disabled 初始化实体的帐号已经被暂时禁用 对 auth 元素或 response 元素发送应答 可以包含或不包含初始化应答数据 I auth xmlns urn ietf params xml ns xmpp sasl mechanism PLAIN AGp1bGlldAByMG0zMG15cjBtMzA auth R failure xmlns urn ietf params xml ns xmpp sasl account disabled text xml lang en Call 212 555 1212 for assistance text failure credentials expired 因为初始化实体提供的证书过期而验证失败 对 response 元素或 auth 元素发送包含初始化应答数据的应答 I response xmlns urn ietf params xml ns xmpp sasl response R failure xmlns urn ietf params xml ns xmpp sasl credentials expired failure encryption required 初始化实体请求的机制不能使用 出非当前的流的保密性和完整性收到保护 典型的是通过TLS 对 auth 元素发送应答 包含或不包含初始化应答数据 I auth xmlns urn ietf params xml ns xmpp sasl mechanism PLAIN AGp1bGlldAByMG0zMG15cjBtMzA auth R failure xmlns urn ietf params xml ns xmpp sasl encryption required failure incorrect encoding 初始化实体提供的数据无法被处理 因为 base 64 编码不正确 例如 因为编码没有遵循 BASE64 的第四章的定义 对 response 元素或 auth 元素发送包含初始化应答数据的应答 I auth xmlns urn ietf params xml ns xmpp sasl mechanism DIGEST MD5 auth R failure xmlns urn ietf params xml ns xmpp sasl incorrect encoding failure invalid authzid 初始化实体提供的authzid是非法的 要么因为它格式不正确要么因为初始化实体没有权限授权那个ID 对 response 元素或 auth 元素发送包含初始化应答数据的应答 I response xmlns urn ietf params xml ns xmpp sasl response R failure xmlns urn ietf params xml ns xmpp sasl invalid authzid failure invalid mechanism 初始化实体没有指定一个机制 或请求的机制不被接收方实体支持 对 auth 元素发送应答 I auth xmlns urn ietf params xml ns xmpp sasl mechanism CRAM MD5 R failure xmlns urn ietf params xml ns xmpp sasl invalid mechanism failure malformed request 请求是不良的 例如 auth 元素包含了初始化应答数据但是机制不允许这个 或被发送的数据违反了指定的SASL机制的语法 对 abort auth challenge 或 response 元素发送应答 下例中 auth 元素的XML字符串数据包含了多于255个UTF 8编码的Unicode字符 所以违反了定义于 ANONYMOUS 的SASL ANONYMOUS的 token 生产 I auth xmlns urn ietf params xml ns xmpp sasl mechanism ANONYMOUS some long token auth R failure xmlns urn ietf params xml ns xmpp sasl malformed request failure mechanism too weak 初始化实体请求的机制弱于服务器策略允许初始化实体使用的机制 对 auth 元素发送应答 包含或不包含初始化应答数据 I auth xmlns urn ietf params xml ns xmpp sasl mechanism PLAIN AGp1bGlldAByMG0zMG15cjBtMzA auth R failure xmlns urn ietf params xml ns xmpp sasl mechanism too weak failure not authorized 验证失败 因为初始化实体没有提供正确的证书 或因为发生了一些普通的验证失败而接收方实体不希望泄露失败原因的特定信息 对 response 元素或 auth 元素发送包含初始化应答数据的应答 I response xmlns urn ietf params xml ns xmpp sasl response R failure xmlns urn ietf params xml ns xmpp sasl not authorized failure 安全警告 这个错误条件包含但不限于不正确的证书或不存在的用户名的情形 为了组织目录获取攻击 不正确的证书和不存在的用户名两者没有区别 temporary auth failure 验证失败 因为接收方实体的临时性错误 可以建议初始化实体晚点再试 对 auth 元素或 response 元素发送应答 I response xmlns urn ietf params xml ns xmpp sasl response R failure xmlns urn ietf params xml ns xmpp sasl temporary auth failure failure SASL定义 SASL 的范本需求里面要求使用中的协议定义必须提供以下信息 服务名 xmpp 初始化序列 在初始化实体提供一个打开的XML流头之后 接收方实体以同样的方式应答 接收方实体提供一个可接受的验证方法的列表 初始化实体从列表里选择一个方法并在放在 auth 元素的 mechanism 属性的值里发送给接收方实体 可选择包含一个初始化应答以避免多一个来回 交换序列 挑战和应答是通过从接收方实体发给初始化实体的 challenge 元素和从初始化实体发送给接收方实体的 response 元素 接收方实体通过发送 failure 元素来报告失败 通过发送 success 元素来报告成功 初始化实体通过发送 abort 元素来放弃交换 在成功协商之后 双方确认原始的XML流被关闭而双方发送新的流头 安全层协商 安全层 对于接收方实体来说 发送完 success 元素的 字符之后立刻生效 对于初始化实体来说 在接收到 success 元素的 字符之后立刻生效 层的顺序是先 TCP then TLS then SASL 然后 XMPP 授权身份的使用 授权身份在XMPP中可被用于指示客户端的非缺省的 localpart domainpart 空字符串等于缺少授权身份 资源绑定 原理 在客户端从一个服务器验证之后 它必须绑定一个特定的资源到这个流 这样服务器才能正确地对客户端寻址 就是说 必须有一个XMPP资源关联到客户端的纯JID localpart domainpart 所以在那个流上使用的地址是一个全JID 格式为 localpart domainpart resource 包含资源部分 这确保服务器可以向客户端相关的实体而不是服务器本身或客户端的帐号递送XML节和从客户端相关的实体而不是服务器本身或客户端的帐号接收XML节 详见 第十章 参考文献 在绑定资源之前 客户端可以和服务器本身或客户端帐号交换数据 因为全JID只在被这个客户端和服务器之间已协商好的流的上下文的外部寻址时需要用到 但这不是常规做法 在客户端已经绑定了一个资源到该流之后 它被视为一个 已连接的资源 服务器应该允许一个实体同时维持多个已连接资源 每个已连接的资源关联到一个唯一的XML流并且和其他已连接的资源的资源部分是不同的 安全警告 服务器应该允许一个XMPP服务的管理员限制已连接资源的数量 为了防止特定的拒绝服务攻击 详见 13 12 如果 在完成资源绑定步骤之前 客户端尝试发送一个XML节给另一个不是服务器本身或客户端的帐号的实体 服务器不能 MUST NOT 处理这个节而必须以 not authorized 流错误 4 9 3 12 关闭这个流 资源绑定扩展的XML命名空间是 urn ietf params xml ns xmpp bind 支持 在XMPP客户端和服务器实现中 对于资源绑定的支持是必需的 流协商规则 强制协商 流的双方必须确保资源绑定是强制协商的 重启 在资源绑定之后 双方不能 MUST NOT 重启该流 声明支持 在SASL协商成功之后 服务器发送一个新的应答流头给客户端 这时服务器必须在它展示给客户端的流特性中包含一个由 urn ietf params xml ns xmpp bind 命名空间限定的 bind 元素 服务器不能 MUST NOT 包含资源绑定流特性 直到客户端验证之后 通常就是SASL协商成功之后 S stream stream from im example com id gPybzaOzBmaADgxKXu9UClbprp0 to juliet im example com version 1 0 xml lang en xmlns jabber client xmlns stream http etherx jabber org streams S stream features bind xmlns urn ietf params xml ns xmpp bind stream features 在得到资源绑定是强制协商的通知之后 客户端必须绑定一个资源到流上 如下面章节所述 资源标识符的生成 最低限度 资源部分在 localpart domainpart 已连接的资源中必须是唯一的 这个强制性策略是由服务器来负责的 安全警告 资源部分可能是关乎安全的 例如 如果一个恶意的实体猜测一个客户端的资源部分然后它能确定该客户端 也就是控制的主体 是在线还是离线 所以导致如 13 10 2 所述的联机状态泄漏 为了防止那种可能性 客户端可以要么 1 它自己生成一个随机的资源部分 要么 2 请求服务器帮它生成一个资源部分 一个确保资源部分随机性的方法是生成一个通用唯一标识符 UUID 如 UUID 所述 服务器生成的资源标识符 一个服务器必须能代替客户端生成XMPP资源部分 由服务器生成的资源部分必须是随机的 参见 RANDOM 成功情形 客户端 通过发送一个类型为 set 并包含了一个由 urn ietf params xml ns xmpp bind 命名空间限定的空的 bind 元素的IQ节 见 8 2 3 来请求一个服务器生成的资源部分 C iq id tn281v37 type set bind xmlns urn ietf params xml ns xmpp bind iq 一旦服务器为该客户端生成了一个XMPP部分 它必须返回一个类型为 result 的IQ节给该客户端 这个节里面必须包含一个 jid 元素来指定服务器决定的已连接资源的全JID S iq id tn281v37 type result bind xmlns urn ietf params xml ns xmpp bind jid juliet im example com 4db06f06 1ea4 11dc aca3 000bcd821bfb jid bind iq 错误情形 当一个客户端在资源绑定时请求服务器生成一个资源部分 定义了以下节错误条件 该帐号已经达到了被允许的并发资源连接数量限制 该客户端不被允许绑定一个资源到该流 自然的 可能有这里没定义的错误条件发生 如 8 3 所述 资源约束 如果帐号已经达到被允许的并发连接资源数限制 服务器必须返回一个 resource constraint 节错误 8 3 3 18 S iq id tn281v37 type error error type wait resource constraint xmlns urn ietf params xml ns xmpp stanzas error iq 不允许 如果客户端不被允许绑定一个资源到该流 服务器必须返回一个 not allowed 节错误 8 3 3 10 S iq id tn281v37 type error error type cancel not allowed xmlns urn ietf params xml ns xmpp stanzas error iq 客户端提交的资源标识符 不同于请求服务器代替自己生成一个资源部分 一个客户端可以尝试提交一个它自己生成的或受控制的用户已经提供的资源部分 成功情形 客户端发送类型为 set 包含 bind 元素以及拥有非空XML字符串数据的 resource 子元素的IQ节 以请求它的服务器接受一个客户端提交的资源部分 C iq id wy2xa82b4 type set bind xmlns urn ietf params xml ns xmpp bind resource balcony resource bind iq 该服务器应该接受这个客户端提交的资源部分 它返回一个类型为 result 的IQ节给该客户端 其中包含一个 jid 子元素来为已连接的资源指定全JID并包含未修改的客户端提交的文本 S iq id wy2xa82b4 type result bind xmlns urn ietf params xml ns xmpp bind jid juliet im example com balcony jid bind iq 或者 基于本地服务策略 该服务器可以拒绝客户端提交的资源部分并以服务器生成的资源部分覆盖它 S iq id wy2xa82b4 type result bind xmlns urn ietf params xml ns xmpp bind jid juliet im example com balcony 4db06f06 1ea4 11dc aca3 000bcd821bfb jid bind iq 错误情形 当一个客户端在资源绑定期间尝试提交它自己的XMPP资源部分 除了 7 6 2 还定义了以下节错误条件 所提供的资源部分无法被服务器处理 所提供的资源部分已经被使用 自然的 有一些未在这里定义的错误条件可能发生 如 8 3 所述 坏请求 如果提供的资源部分无法被服务器处理 例如 因为它长度为零或因为它违反了定义于 XMPP ADDR 的资源部分的其他规则 该服务器可能返回一个 bad request 节错误 8 3 3 1 而不应该处理这个资源部分 这样就保持了一致性 S iq id wy2xa82b4 type error error type modify bad request xmlns urn ietf params xml ns xmpp stanzas error iq 冲突 如果当前有一个已连接的客户端的会话被新连接的客户端请求了 服务器必须做以下事情之一 该服务器做的这些事情之一对于实现或者本地服务策略是一个麻烦 尽管下面提供了一些建议 以一个服务器生成的资源部分覆盖新连接的客户端提供的资源部分 这一行为是被提倡的 因为对于客户端实现来说它简化了资源绑定过程 不允许新连接的客户端的资源绑定并保持当前已连接客户端的会话 这一行为既不提倡也不反对 尽管实际上它在 RFC 3920 中被隐性地提倡 然而 请注意对 conflict 错误的处理并不总是被现有的客户端实现支持的 它经常被当成一个验证错误并且当收到这个错误的时候丢弃缓存的凭证 中止当前已连接的客户端的会话并允许新连接的客户端的资源绑定尝试 尽管这是早期XMPP服务器实现的传统行为 现在不提倡这么做了 因为它可能导致两个客户端互相挂掉多方的无线循环 无论如何 注意这个行为在某些布署场景中可能是适当的 要么如果服务器知道当前已连接的客户端有一个死连接 要么有一个 4 6 所述的断裂的流 如果服务器遵循1号行为 它返回一个类型为 result 的 iq 节给新连接的客户端 这里的 bind 元素的 jid 子元素包含XML字符串数据指定该客户端的全JID 包含服务器生成的资源部分 S iq id wy2xa82b4 type result bind xmlns urn ietf params xml ns xmpp bind jid juliet im example com balcony 4db06f06 1ea4 11dc aca3 000bcd821bfb jid bind iq 如果服务器遵循2号行为 它发送一个 conflict 节错误 8 3 3 2 应答新连接的客户端的资源绑定尝试但是保持这个XML流 这样新连接的客户端有机会去协商一个不冲突的资源部分 即 新连接的客户端在做下一次绑定资源的尝试之前需要选择一个不同的资源部分 S iq id wy2xa82b4 type error error type modify conflict xmlns urn ietf params xml ns xmpp stanzas error iq 如果服务器遵循3号行为 它返回一个 conflict 流错误 4 9 3 3 给当前的已连接客户端 如 4 9 3 3 所述 并返回一个类型为 result 的IQ节 表示成功 新连接的应答资源绑定尝试 S iq id wy2xa82b4 type result bind xmlns urn ietf params xml ns xmpp bind jid juliet im example com balcony jid bind iq 重试 如果客户端提交资源部分的时候发生了一个错误 服务器应该允许可配置的但是合理的重试次数 至少5次且不高于10次 这让客户端能够不需要被迫重新连接就可以纠正不正确提通的资源部分 例如 坏的数据格式或重复的文本字符串 在客户端达到重试次数限制之后 服务器必须以 policy violation 流错误 4 9 3 14 关闭这个流 XML节 在一个客户端和一个服务器 或两个服务器 完成了流协商之后 双方就可以发送XML节了 对于 jabber client 和 jabber server 命名空间定义了三种XML节 message presence 和 iq 另外 这些节类型有五种常见属性 这些常见属性 以及这三种节类型的基本语义 定义于本协议 更多即时消息和联机状态应用相关以及有关XMPP扩展协议的应用的XML节语法的详细信息在 XMPP IM 里提供 XMPP客户端和服务器实现必须支持本协议所定义的XML节语法和语义 安全警告 服务器不能 MUST NOT 处理部分的节 也不能 MUST NOT 针对一个节的任何部分仍在传输时 在承认收到关闭标签之前 猜测其含义 常见属性 以下五种属性常见于 message presence 和 IQ 节 to to 属性指定该节期望的接收者的JID message to romeo example net body Art thou not Romeo and a Montague body message 关于基于 to 地址的入站和出站XML节的服务器处理的信息 参考 第十章 客户端 服务器流 以下规则适用于已连接客户端通过一个 jabber client 命名空间限定的XML流发送给它的服务器的节中包含的 to 属性 一个拥有特定接收者 例如 一个会话伙伴 一个远程服务 该服务器本身 甚至该用户的纯JID的另一个资源 的节必须拥有一个 to 属性 它的值是一个XMPP地址 一个从客户端发送到服务器的由该服务器直接处理的节 例如 XMPP IM 所述的好友列表处理或发送给服务器用来广播给其他实体的的联机状态信息 不能 MUST NOT 拥有 to 属性 以下规则适用于服务器通过一个 jabber client 命名空间限定的XML流发送到已连接客户端的节中包含的 to 属性 如果该服务器从另一个已连接客户端或从一个对端服务器接收到该节 在递送该节给该客户端之前该服务器不能 MUST NOT 修改 to 地址 如果该服务器本身生成了这个节 例如 对类型为 get 或 set 的IQ节的应答 即使该节不包含一个 to 地址 这个节可以包含一个 to 地址 这个地址必须是该客户端的全JID 如果这个节不包含 to 地址 那么该客户端必须把 to 地址视为等同于该客户端的全JID 实现备注 只递送节到客户端的全JID还是用户的纯JID 是服务器的责任 就是说 客户端不需要检查收到的节的 to 地址 然而 如果客户端不检查 to 地址 那么建议最好检查纯JID部分 不是全JID 因为 to 地址可能是该用户的纯JID 该客户端的当前全JID 或甚至是一个不同资源的全JID 例如 在 XEP 0160 所述的的所谓 离线消息 的情况下 服务器 服务器流 以下规则适用于一个 jabber server 命名空间限定的XML流 即 服务器 服务器 流 的上下文中包含的 to 属性 一个节必须拥有 to 属性 它的值是一个XMPP地址 如果服务器接收到一个不满足这一限定的节 它必须以一个 improper addressing 流错误 4 9 3 7 来关闭这个流 包含在这个节的 to 属性中的JID的域部分必须和通过SASL协商 见 第六章 与之通讯的 或服务器回拨 见 XEP 0220 或类似的接收方服务器 或其中任何有效的域名 的完全合法域名FQDN匹配 如果服务器接收到的节不满足这个限定 它必须以 host unknown 流错误 4 9 3 6 或 host gone 流错误 4 9 3 5 来关闭该流 from from 属性指定发送者的JID message from juliet im example com balcony to romeo example net body Art thou not Romeo and a Montague body message 客户端 服务器流 以下规则适用于被 jabber client 命名空间限定的XML流 即 客户端 服务器 流 上下文中的 from 属性 当服务器从一个已连接客户端接收到一个XML节 该服务器必须给这个节添加一个 from 属性或覆盖这个由客户端指定的 from 属性 这里 from 属性的值必须是服务器针对生成这个节的已连接资源确定的全JID localpart domainpart resource 见 4 3 6 或在和订阅相关的联机状态信息节 见 XMPP IM 的情况下则是纯JID localpart domainpart 当服务器为它自己生成一个从服务器本身发送给客户端的节的时候 这个节必须包含一个 from 属性 它的值是服务器在流协商中同意的纯JID 即 domainpart 例如 基于初始化流头中的 to 属性 当服务器生成一个从该服务器递送到已连接客户端的帐号本身的节的时候 例如 在服务器代表客户端提供的数据存储服务的上下文中 该节要么 a 不包含 from 属性 要么 b 包含一个值为该帐号纯JID localpart domainpart 的 from 属性 服务器不能 MUST NOT 给客户端发送不包含 from 属性的节 如果该节不是由服务器代表它本身生成的 例如 如果它是由另一个客户端或对端服务器生成的 而该服务器仅仅递送它到客户端或一些其他的实体 所以 当一个客户端接收到一个不包含 from 属性的节的时候 它必须假定这个节是从该用户帐号所在服务器发出的 服务器 服务器流 以下规则适用于一个 jabber server 命名空间限定的XML流 即 服务器 服务器 流 的上下文中包含的 from 属性 一个节必须拥有 from 属性 它的值是一个XMPP地址 如果服务器接收到一个不满足这一限定的节 它必须以一个 improper addressing 流错误 4 9 3 7 来关闭这个流 包含在这个节的 from 属性中的JID的域部分必须和通过SASL协商 见 第六章 与之通讯的 或服务器回拨 见 XEP 0220 或类似的发送方服务器 或其中任何有效的域名 的完全合法域名FQDN匹配 如果服务器接收到的节不满足这个限定 它必须以 invalid from 流错误 4 9 3 9 来关闭该流 强制执行这些规则有助于组织特定的如 13 12 所述的拒绝服务攻击 id id 属性是由发起方实体用来跟踪可能从其他实体 类似中间服务器或预期的接收者 收到的和它生成的节有关的任何应答或错误节 这个 id 属性仅在当前流保持唯一性还是全局保持唯一性 取决于发起方实体本身 对于 message 和 presence 节来说 建议发起方实体包含一个 id 属性 对于 iq 节来说 它是必需的 如果生成的节包含一个 id 属性 那么对于其相应的应答或错误节来说 也必须包含一个 id 属性 这个 id 属性的值必须和生成的节的那个 id 属性值匹配 IQ节语义强加了额外的约束 参见 8 2 3 type type 属性指定该消息 联机状态或IQ节的用途或上下文 type 属性的特定的允许值依赖于这个节是一个消息 联机状态 还是IQ节 为消息和联机状态节定义的值用于即时消息和联机状态应用 所以定义于 XMPP IM 中 而为IQ节定义的值指定所有结构化请求 应答交换中的语义部分 无论载荷是什么 所以它定义于 8 2 3 唯一通用于所有三种节的 type 值是 error 定义于 8 3 xml lang 一个节应该拥有 xml lang 属性 定义于的2 12节 XML 如果这个节包含了XML字符串数据打算展示给用户 如 CHARSETS 所解释的 可读国际化 xml lang 属性的值指定任何这类可读XML字符串数据的缺省语言 presence from romeo example net orchard xml lang en show dnd show status Wooing Juliet status presence xml lang 属性的指可以被特定子元素的 xml lang 属性覆写 presence from romeo example net orchard xml lang en show dnd show status Wooing Juliet status status xml lang cs Dvo x0159 x00ED m se Julii status presence 如果一个由客户端生成的出站节不拥有 xml lang 属性 该客户端的服务器应该添加一个 xml lang 属性 其值为客户端的出站流所指定的值 如 4 7 4 所述 C presence from romeo example net orchard show dnd show status Wooing Juliet status presence S presence from romeo example net orchard to juliet im example com xml lang en show dnd show status Wooing Juliet status presence 如果一个被客户端或服务器接收到的入站节不拥有 xml lang 属性 一个实现必须假定缺省语言是该实体的输入流所指定的值 如 4 7 4 所述 xml lang 属性的值必须遵循 NMTOKEN 数据类型 定义于 XML 的2 3节 并且必须遵循定义于 LANGTAGS 的格式 服务器不能 MUST NOT 修改或删除它从其他实体收到的节的 xml lang 属性 基本语义 消息语义 message 节是一个 推送 机制 这里一个实体推送信息到另一个实体 类似发生在email系统里的通讯一样 所有消息节将拥有 to 属性用来指定该消息期望的接收者 见 8 1 1 和 10 3 除非消息是被一个已连接的客户端帐号的纯JID发送的 接收到一个带有 to 地址的消息节之后 服务器应该尝试路由或递送它到期望的接收者那里 见 第十章 里和XML节相关的通用路由和递送规则 联机状态语义 presence 节是一个特定的 广播 或 发布 订阅 机制 这里多个实体接收关于他们订阅的一个实体的信息 在这个案例中 是网络可用性信息 通常 发布客户端应该发送一个不带有 to 属性的联机状态节 这种情况下该客户端连接的那个服务器将广播那个节给所有已订阅的实体 然而 发布客户端也可以发送一个带有 to 属性的联机状态节 这种情况下该服务器将路由或递送那个节到期望的接收者 尽管 presence 节大部分情况下是由XMPP客户端使用 它也可能被服务器 附加服务 以及任何其他类型呃XMPP实体使用 参见 第十章 中和XML节相关的通用路由和递送规则 以及 XMPP IM 中联机状态应用的特定规则 IQ语义 信息查询 Info Query 或IQ 是一个 请求 应答 机制 类似某些情况下的超文本传输协议 HTTP IQ的语义允许一个实体对另一个实体做出一个请求 并接收一个应答 这个请求和应答的数据内容由schema或其他限定IQ元素的直接子元素的XML命名空间相关的结构化定义 见 8 4 来限定 发出请求的实体使用 id 属性来跟踪交互过程 所以 IQ交互沿用了结构化数据交换的常见模式 类似 get result 或 set result 尽管适当的时候对于某个请求会返回一个error 请求实体 应答实体 iq id 1 type get payload iq iq id 1 type result payload iq iq id 2 type set payload iq iq id 2 type error condition iq 图5 IQ节的语义 为强制这些语义 以下规则适用 1 id 属性对于IQ节是必需的 2 type 属性对于IQ节是必需的 这个值必须是以下之一 如果不是 接收者或中间路由器必须返回一个 bad request 节错误 8 3 3 1 get 该节请求信息 查询需要什么数据以完成更多操作 等等 set 该节为完成某个操作提供需要的数据 设置新值 取代旧值 等等 result 该节是对成功的get或set请求的应答 error 该节报告关于处理或递送一个get或set请求时发生的错误 见 8 3 3 接收到类型为 get 或 set 的IQ请求的实体必须返回一个类型为 result 或 error 的IQ应答 该应答必须保留请求中的 id 属性 或为空 如果生成的节没有包含 id 属性 4 接收到类型为 result 或 error 节的实体不能 MUST NOT 发送更多的类型为 result 或 error 的IQ应答来应答 然而 请求实体可以发送另一个请求 例如 一个类型为 set 的IQ对之前在get result对中查询到的信息提供特定的信息 5 类型为 get 或 set 的IQ节必须严格地包含一个子元素 它定义特定请求的语义 6 类型为 result 的IQ节必须包含零或一个子元素 7 类型为 error 的IQ节可以包含相关的 get 或 set 子元素并且必须包含一个 error 子元素 详见 8 3 节错误 节相关的错误处理的方式类似流错误 流错误 但是不像流错误那样 节错误是可恢复的 所以 他们不会导致XML和当前TCP连接的中止 反之 发现错误条件的实体返回一个错误节 它是一个这样的节 是和触发这个错误的已生成的节同种类型 message presence 或 IQ type 属性值设为 error 通常是把已生成的节的 from 和 to 互换 镜像触发这个错误的已生成的节的 id 属性 如果有的话 包含一个 error 子元素以指明错误条件并且对发送者可以采取的补救措施提供一个暗示 然而 不可能总是能够不补救这个错误 规则 以下规则适用于节错误 检测到和节相关的错误条件的接收或处理实体应该返回一个错误节 对于IQ节必须这么做 该错误节应该简单地把生成的节中的 from 和 to 地址互换 除非这么做将会 1 导致信息泄漏 参见 RFC6120 信息泄露 13 10 或其他违反安全 或 2 强迫错误节的发送者在该错误节的 from 或 to 地址中包含一个异常的JID 如果生成的节是 message 或 presence 并且包含了 id 属性 那么该错误节必须也包含 id 属性 如果生成的节是 iq 那么该错误节必须包含一个 id 属性 在所有情况下 id 属性的值必须和生成节的相同 或者是空 如果生成的节没有包含 id 属性 错误节必须包含一个 error 子元素 返回错误节的实体可以传递它的JID给生成节的发送者 例如 为了诊断或跟踪的目的 通过附加一个 by 属性到 error 子元素 返回错误节的实体可以包含被发送的原始XML 这样发送者能够检查 如果必要的话 并在尝试重发之前纠正该XML 然而 这只是出于礼貌 并且原实体不能 MUST NOT 依赖接收到的原始载荷 自然地 该实体不能 MUST NOT 包含原始数据 如果它不是格式良好的XML 违反XMPP的XML限制 见 11 1 或反而是有害的 例如 超出大小限制 如果 type 属性值不是 error 或如果没有 type 属性 不能 MUST NOT 包含一个 error 子元素 接收到错误节的实体不能 MUST NOT 以更多的错误节来应答这个节 这有助于防止死循环 语法 节相关的错误的语法如下 这里展示的用方括号 和 括起来的XML数据是可选的 intended recipient 是原始节指定的地址的那个实体的JID sender 是原始实体的JID 而 error generator 是检测到错误的并方会错误节的那个实体 stanza kind from intended recipient to sender type error OPTIONAL to include sender XML here error by error generator type error type defined condition xmlns urn ietf params xml ns xmpp stanzas text xmlns urn ietf params xml ns xmpp stanzas xml lang langcode OPTIONAL descriptive text text OPTIONAL application specific condition element error stanza kind stanza kind 必须是 message presence 或 iq 之一 error type 必须是以下之一 auth 在提供身份之后重试 cancel 不要重试 该错误不能加以弥补 continue 继续 这个条件只是个警告 modify 在修改发送的数据之后重试 wait 等待之后重试 该错误是暂时的 defined condition 必须符合 8 3 3 定义的节错误条件之一 然而 因为将来可能会发生额外的错误条件 如果实体接受到一个它不理解的节错误条件 那么它必须把这个未知的条件当成 undefined condition 8 3 3 21 如果一个XMPP协议扩展的设计者或一个XMPP实现的开发者需要未在本协议中定义的节错误条件的通讯 他们可以定义应用特有的命名空间所限定的应用特有的错误条件元素来实现这个目标 error 元素 必须包含一个已定义的条件元素 可以包含一个包含XML字符串数据的 text 子元素 用来描述错误的详细信息 这个元素必须由 urn ietf params xml ns xmpp stanzas 命名空间来限定并且应该拥有 xml lang 属性来指定该XML字符串数据的自然语言 可以包含一个用于应用特有的错误条件的子元素 这个元素必须由一个应用特有的命名空间来限定 以定义该元素的语法和语义 text 元素是可选的 如果包含了它 它仅被用于提供描述和诊断信息以补充说明已定义条件或应用特有的条件的含义 它不能 MUST NOT 被应用程序当成编程信息来解释 它不应该被用于向自然人用户展示错误消息 但是可以被附加在该已定义条件元素 以及 可选的 应用特有的条件元素 的错误消息上展示 互操作性备注 定义于 RFC3920 的语法包含了一个遗留的 code 属性 它的语义已经被已定义的条件元素取代 关于已定义的条件元素和遗留的 code 属性值之间的对应关系 可以在 XEP 0086 找到 已定义的条件 以下条件是已定义好用于节错误的 error type 的值是被推荐用于每个已定义的条件通常预期的类型 无论如何 在某些情况下不同的类型可能更合适 bad request 发送者发送的节里包含的XML不符合适当的schema或不能被拥有 例如 IQ节的 type 属性包含一个不能识别的值 或一个被已知的命名空间限定的元素但是违反了该元素的已定义的语法 相关的错误类型应该是 modify C iq from juliet im example com balcony id zj3v142b to im example com type subscribe ping xmlns urn xmpp ping iq S iq from im example com id zj3v142b to juliet im example com balcony type error error type modify bad request xmlns urn ietf params xml ns xmpp stanzas error iq conflict 访问未被授权 因为一个现存的资源使用了相同的名字或地址 相关的错误类型应该是 cancel C iq id wy2xa82b4 type set bind xmlns urn ietf params xml ns xmpp bind resource balcony resource bind iq S iq id wy2xa82b4 type error error type cancel conflict xmlns urn ietf params xml ns xmpp stanzas error iq feature not implemented 出现在XML节里的特性没有被预定的接收方或中间服务器实现 所以该节无法被处理 例如 该实体知道该命名空间但是不认识元素名 相关的错误类型应该是 cancel 或 modify C iq from juliet im example com balcony id 9u2bax16 to pubsub example com type get pubsub xmlns http jabber org protocol pubsub subscriptions pubsub iq E iq from pubsub example com id 9u2bax16 to juliet im example com balcony type error error type cancel feature not implemented xmlns urn ietf params xml ns xmpp stanzas unsupported xmlns http jabber org protocol pubsub errors feature retrieve subscriptions error iq forbidden 请求的实体没有必要的许可来执行一个只允许特定授权角色或个体来完成的动作 即 它通常和授权而不是验证有关 相关的错误类型应该是 auth C presence from juliet im example com balcony id y2bs71v4 to characters muc example com JulieC x xmlns http jabber org protocol muc presence E presence from characters muc example com JulieC id y2bs71v4 to juliet im example com balcony type error error type auth forbidden xmlns urn ietf params xml ns xmpp stanzas error presence gone 接收者或服务器无法再用这个地址联系到 通常是永久意义上的 和 redirect 错误条件相反 它被用于临时的地址失败 相关的错误类型应该是 cancel 并且该错误节应该包含一个新的地址 如果可用的话 作为 gone 元素的XML字符串数据 它必须是一个实体可以联系的唯一资源标识符 URI 或国际化资源标识符 IRI 典型的是一个 XMPP URI 定义的XMPP IRI C message from juliet im example com churchyard id sj2b371v to romeo example net type chat body Thy lips are warm body message S message from romeo example net id sj2b371v to juliet im example com churchyard type error error by example net type cancel gone xmlns urn ietf params xml ns xmpp stanzas xmpp romeo afterlife example net gone error message internal server error 服务器发生了错误的配置或其他阻止它处理改节的内部错误 相关的错误类型应该是 cancel C presence from juliet im example com balcony id y2bs71v4 to characters muc example com JulieC x xmlns http jabber org protocol muc presence E presence from characters muc example com JulieC id y2bs71v4 to juliet im example com balcony type error error type cancel internal server error xmlns urn ietf params xml ns xmpp stanzas error presence item not found 找不到请求的JID地址或条目 相关的错误类型应该是 cancel C presence from userfoo example com bar id pwb2n78i to nosuchroom conference example org foo S presence from nosuchroom conference example org foo id pwb2n78i to userfoo example com bar type error error type cancel item not found xmlns urn ietf params xml ns xmpp stanzas error presence 安全警告 如果这样做将会提供预定的接收者的网络可用性信息给一个未被授权知道这些信息的实体 关于联机状态信息授权的更多细节讨论 参考 XMPP IM 联机状态订阅的讨论 那么应用不能 MUST NOT 返回这个错误 相反它应该返回一个 service unavailable 错误 8 3 3 19 jid malformed 发送的实体所提供 例如 在资源绑定的时候 或与之通讯 例如 一个节的 to 地址 的XMPP地址或其中一部分违反了 XMPP ADDR 定义的规则 相关的错误类型应该是 modify C presence from juliet im example com balcony id y2bs71v4 to ch r cters muc example com JulieC x xmlns http jabber org protocol muc presence E presence from ch r cters muc example com JulieC id y2bs71v4 to juliet im example com balcony type error error by muc example com type modify jid malformed xmlns urn ietf params xml ns xmpp stanzas error presence 实现备注 强制XMPP本地部分的格式主要是相关帐号或实体所在的服务的责任 例如 example com 服务负责返回所有和格式 localpart example com 相关的 jid malformed 错误 而强制XMPP域部分的格式主要是由路由一个节到域部分所指定的服务的那个服务的责任 例如 example org 服务负责返回该服务尝试发送的目标JID localpart example com 的格式的 jid malformed 错误 无论如何 任何检测到格式错误的JID的实体可以返回该错误 not acceptable 接收者或服务器理解该请求但是不能处理它 因为该请求不符合该接收者或服务器的标准 例如 请求订阅信息但是未同时包含接收者需要的配置参数 相关的错误类型应该是 modify C message to juliet im example com id yt2vs71m body the emacs manual body message S message from juliet im example com id yt2vs71m error type modify not acceptable xmlns urn ietf params xml ns xmpp stanzas error message not allowed 接收者或服务器不允许任何实体执行该动作 例如 向列入黑名单的域发送消息 相关的错误类型应该是 cancel C presence from juliet im example com balcony id y2bs71v4 to characters muc example com JulieC x xmlns http jabber org protocol muc presence E presence from characters muc example com JulieC id y2bs71v4 to juliet im example com balcony type error error type cancel not allowed xmlns urn ietf params xml ns xmpp stanzas error presence not authorized 发送者在被允许执行某动作之前需要提供凭证 或已经提供了错误的凭证 not authorized 的提法 来源于 HTTP 的 401 Unauthorized 错误 可能导致读者认为这个条件是和授权相关的 但其实它通常用于验证相关的领域 相关的错误类型应该是 auth C presence from juliet im example com balcony id y2bs71v4 to characters muc example com JulieC x xmlns http jabber org protocol muc presence E presence from characters muc example com JulieC id y2bs71v4 to juliet im example com balcony error type auth not authorized xmlns urn ietf params xml ns xmpp stanzas error presence policy violation 实体违反了一些本地服务策略 例如 一个消息包含了服务禁止的单词 而服务器可以选择在 text 元素里或在应用特有的条件元素里指定策略 相关的错误类型应该是 modify 或 wait 取决于被违反的策略 在下例中 客户端发送一个包含了根据服务器的本地服务策略被禁止的单词的XMPP消息 C message from romeo example net foo to bill im example com id vq71f4nb body body message S message from bill im example com id vq71f4nb to romeo example net foo error by example net type modify policy violation xmlns urn ietf params xml ns xmpp stanzas error message recipient unavailable 预期的接收者暂时不可用 正在维护 等等 相关的错误类型应该是 wait C presence from juliet im example com balcony id y2bs71v4 to characters muc example com JulieC x xmlns http jabber org protocol muc presence E presence from characters muc example com JulieC id y2bs71v4 to juliet im example com balcony error type wait recipient unavailable xmlns urn ietf params xml ns xmpp stanzas error presence 安全警告 如果这么做将提供关于预期接收者的网络可用性的信息给一个没有被授权可以知道这类信息的实体 对于联机状态授权方面的讨论的更多细节 参考联机状态信息订阅的讨论 XMPP IM 中 应用不能 MUST NOT 返回这个错误 反之 它必须返回一个 service unavailable 节错误 8 3 3 19 redirect 接收者或服务器重定向该信息的请求到另一个实体 典型的临时发生的情形 和 gone 错误条件相反 它用于永久性的地址错误 相关的错误类型应该是 modify 并且该错误节应该在 redirect 元素的XML字符串数据中包含替代的地址 它必须是一个发送者可以与之通讯的URI或IRI 通常是一个 XMPP URI 定义的XMPP IRI C presence from juliet im example com balcony id y2bs71v4 to characters muc example com JulieC x xmlns http jabber org protocol muc presence E presence from characters muc example com JulieC id y2bs71v4 to juliet im example com balcony type error error type modify redirect xmlns urn ietf params xml ns xmpp stanzas xmpp characters conference example org redirect error presence 安全警告 接收到一个节级别的重定向的应用应该向自然人用户警告这个重定向尝试并且在和包含在该 redirect 元素的XML字符串数据中的地址代表的实体通讯之前请求批准 因为那个实体可能有不同的身份或可能强制执行不同的安全策略 XMPP节的点对点验证或签名有助于减轻这个风险 因为它将允许发送者来决定是否被重定向到的实体和开始尝试联系的实体是同一个身份 应用可以有一个策略规定只有已经验证过接收实体才能重定向 另外 在成功地重定向了一定次数之后应用应该中止通讯尝试 例如 至少2次但不超过5次 registration required 请求的实体没有被授权访问请求的服务 因为需要事先注册 提前注册的例子包括XMPP多用户聊天 XEP 0045 中仅限会员的房间和到非XMPP即时消息服务的网关 传统上使用网关 XEP 0100 是需要注册的 相关的错误类型应该是 auth C presence from juliet im example com balcony id y2bs71v4 to characters muc example com JulieC x xmlns http jabber org protocol muc presence E presence from characters muc example com JulieC id y2bs71v4 to juliet im example com balcony error type auth registration required xmlns urn ietf params xml ns xmpp stanzas error presence remote server not found 一个远程服务器或预期的接收者的JID的一部分所代表的服务不存在或不能解析 例如 没有 xmpp server tcp DNS SRV记录 A记录或AAAA记录解析也失败了 或A AAAA查询成功了但是在IANA注册了的端口5269上没有应答 相关错误类型应该是 cancel C message from romeo example net home id ud7n1f4h to bar example org type chat body yt body message E message from bar example org id ud7n1f4h to romeo example net home type error error type cancel remote server not found xmlns urn ietf params xml ns xmpp stanzas error message remote server timeout 远程服务器或作为预定的接收者的全JID的一部分 或履行请求所需要的 的服务能被解析但是无法在合理的时间内与之建立通讯 例如 无法在解析到的IP地址和端口上建立一个XML流 或可以建立一个XML流但是因为TLS SASL Server Dialback的问题导致流协商失败 等等 相关的错误类型应该是 wait 除非该错误是更永久性的 例如 远程服务器能被找到但是无法被认证或它违反了安全策略 C message from romeo example net home id ud7n1f4h to bar example org type chat body yt body message E message from bar example org id ud7n1f4h to romeo example net home type error error type wait remote server timeout xmlns urn ietf params xml ns xmpp stanzas error message resource constraint 服务器或接收者忙或缺乏必要的系统资源来服务该请求 相关的错误类型应该是 wait C iq from romeo example net foo id kj4vz31m to pubsub example com type get pubsub xmlns http jabber org protocol pubsub items node my musings pubsub iq E iq from pubsub example com id kj4vz31m to romeo example net foo type error error type wait resource constraint xmlns urn ietf params xml ns xmpp stanzas error iq service unavailable 服务器或接收者当前未提供被请求的服务 相关的错误类型应该是 cancel C message from romeo example net foo to juliet im example com body Hello body message S message from juliet im example com foo to romeo example net error type cancel service unavailable xmlns urn ietf params xml ns xmpp stanzas error message 安全警告 应用程序必须返回一个 service unavailable 节错误 8 3 3 19 而不是 item not found 8 3 3 7 或 recipient unavailable 8 3 3 13 如果发送后面两个错误将提供关于预期的接收者的网络可用性信息给一个未被授权知道这写信息的实体 详见联机状态信息授权的讨论 参考 XMPP IM subscription required 提出请求的实体没有被授权访问所请求的服务 因为需要事先订阅 事先订阅的例子包括授权接收 XMPP IM 定义的联机状态信息和用于 XEP 0060 定义的XMPP发布 订阅的 opt in 数据种子 相关的错误类型应该是 auth C message from romeo example net orchard id pa73b4n7 to playwright shakespeare example com type chat subject ACT II SCENE II subject body help I forgot my lines body message E message from playwright shakespeare example com id pa73b4n7 to romeo example net orchard type error error type auth subscription required xmlns urn ietf params xml ns xmpp stanzas error message undefined condition 该错误条件不在本列表中的其他错误条件之中 任何错误类型都可能和本条件有关 并且除非和应用特有的条件联合在一起 它应该不被使用 C message from northumberland shakespeare example id richard2 4 1 247 to kingrichard royalty england example body My lord dispatch read o er these articles body amp xmlns http jabber org protocol amp rule action notify condition deliver value stored amp message S message from example org id amp1 to northumberland example net field type error amp xmlns http jabber org protocol amp from kingrichard example org status error to northumberland example net field rule action error condition deliver value stored amp error type modify undefined condition xmlns urn ietf params xml ns xmpp stanzas failed rules xmlns http jabber org protocol amp errors rule action error condition deliver value stored failed rules error message unexpected request 接收者或服务器理解这个请求但是不希望它在这个时候出现 即 该请求顺序错了 相关的错误类型应该是 wait 或 modify C iq from romeo example net foo id o6hsv25z to pubsub example com type set pubsub xmlns http jabber org protocol pubsub unsubscribe node my musings jid romeo example net pubsub iq E iq from pubsub example com id o6hsv25z to romeo example net foo type error error type modify unexpected request xmlns urn ietf params xml ns xmpp stanzas not subscribed xmlns http jabber org protocol pubsub errors error iq 应用特有的条件 大家知道 一个应用可以提供应用特有的节错误信息 通过在错误元素中包含一个正确的命名空间的子元素 典型的 该应用特有的元素补充或进一步限定一个已定义的元素 从而 该 error 元素将包含两个或三个子元素 iq id ixc3v1b9 type error error type modify bad request xmlns urn ietf params xml ns xmpp stanzas too many parameters xmlns http example org ns error iq message type error id 7h3baci9 error type modify undefined condition xmlns urn ietf params xml ns xmpp stanzas text xml lang en xmlns urn ietf params xml ns xmpp stanzas application specific information text too many parameters xmlns http example org ns error message 一个接收到它不理解的应用特有的错误条件的实体必须忽略那个条件但适当处理该错误节的其他部分 扩展内容 尽管 message presence 和 IQ 节为消息 可用性 和 请求 应答 交互 提供了基本的语义 XMPP还使用XML命名空间 见 XML NAMES 扩展基本的节语法来提供附加的功能 一个 message 或 presence 节可以包含一个或多个可选的子元素来指定扩展消息含义的内容 例如 XEP 0071 所述的的消息主体的XHTML格式版本 并且一个类型为 get 或 set 的IQ节必须包含一个这样的子元素 这样一个子元素可以使用任何名称并且必须拥有一个命名空间声明 不同于 jabber client jabber server 或 http etherx jabber org streams 来定义子元素中的数据 这样一个子元素被成为一个 扩展元素 扩展元素可能被包含在节的直属子元素中 也可能包含在任何混合的层级里面 类似的 扩展属性 也是允许的 表示说 一个节本身 即 一个 iq message 或 presence 元素 并由 jabber client 或 jabber server 内容命名空间限定 或这样一个节的任何子元素 一个由内容命名空间限定的扩展元素或子元素 也可以包含一个或多个由不同于内容命名空间或保留的 http www w3 org XML 1998 namespace 命名空间的其他命名空间 包括所谓 空命名空间 如果属性没有如 XML NAMES 所说的那样做前缀的话 限定的属性 互操作性备注 为了向后兼容和最大化互操作性 生成节的实体应该不在节本身或被内容命名空间 jabber client 或 jabber server 限定的节的子元素 例如 message 节的 body 子元素 中包含这类属性 一个扩展元素或扩展属性被称为 扩展内容 并且限定这样一个元素或属性的命名空间被称为 扩展命名空间 参考文献 尽管用于XMPP的扩展命名空间通常由XMPP标准化基金会 XSF 和IETF定义 对于定义扩展命名空间来说 没有协议或IETF标准行为是必需的 任何个体或组织都可以自由地定义XMPP扩展 为了说明这些概念 下面有些例子 以下的节包含一个直接子元素 它的扩展命名空间是 jabber iq roster iq from juliet capulet com balcony id h83vxa4c type get query xmlns jabber iq roster iq 以下节包含两个不同扩展命名空间的子元素 presence from juliet capulet com balcony c xmlns http jabber org protocol caps hash sha 1 node http code google com p exodus ver QgayPKawpkPSDYmwT WM94uAlu0 x xmlns vcard temp x update photo sha1 hash of image photo x presence 以下节包含两个子元素 其中一个被 jabber client 或 jabber server 内容命名空间限定 另一个被一个扩展命名空间限定 而该扩展元素包含了一个由另一个扩展命名空间限定的子元素 message to juliet capulet com body Hello body html xmlns http jabber org protocol xhtml im body xmlns http www w3 org 1999 xhtml p style font weight bold Hello p body html message 实现不为扩展命名空间限定的元素生成命名空间前缀在XMPP社区是常见的 在XML社区 这个惯例有时被称为 免前缀标准化 无论如何 如果一个实现生成了这类命名空间前缀那么它必须在该节本身或该节的一个子元素中包含该命名空间的声明 而不是在流头声明 见 4 8 4 路由实体 典型的是服务器 处理序列化XML节的时候应该尝试保持前缀 但是接收实体不能 MUST NOT 依赖该前缀字符串来获取任何特定的值 对于 stream 前缀的许可 如 4 8 5 所述 是这个规则的一个例外 尽管它是用于流而不是节的 在任何实现的特定部分对任何给定的扩展命名空间的支持都是可选的 如果一个实体不理解这样一个命名空间 该实体的的预期行为依赖于该实体是 1 接收者 还是 2 一个路由或递送该节给接收者的服务器 如果一个接收者收到一个包含了不理解的元素或属性的节 它不能 MUST NOT 尝试处理那个XML数据 而必须按以下方式处理 如果一个预定的接收者受到一个message节 它的唯一子元素由不理解的命名空间限定 那么根据XMPP应用它必须要么忽略整个节要么返回一个节错误 节错误应该是 service unavailable 8 3 3 19 如果预定的接收者接收到一个presence节 它的唯一子元素由它不理解的命名空间限定 那么它必须忽略该子元素 把它当成没有子元素的联机状态信息节 如果预定的接收者收到一个message或presence节 它包含的XML数据由它不理解的命名空间来限定 那么它必须忽略节的由未知的命名空间限定的那部分 如果预定的接收者接收到一个类型为 get 或 set 的IQ节 它包含的一个子元素由它不理解的命名空间限定 那么实体必须返回一个类型为 error 且错误条件为 service unavailable 的IQ节 如果一个服务器持有一个节 是用来递送到另一个实体的 并且这个节包含了一个该服务器不理解的子元素 它必须不加修改地路由或递送该节到一个和本地账户关联的已连接客户端 详细示例 本章的详细示例用来进一步说明本标准所定义的协议 客户端 服务器示例 以下例子展示客户端和服务器协商XML流 交换XML节 和关闭已协商的流的XMPP数据流 服务器是 im example com 该服务器要求使用TLS 客户端验证使用SASL SCRAM SHA 1机制 客户端帐号是 juliet im example com 而密码是 r0m30myr0m30 并且客户端在这个流上提交了一个资源绑定请求 我们假设在发送初始化流头之前 客户端已经解析了 xmpp client tcp im example com的SRV记录并已经打开一个TCP连接到已解析的IP地址和声明的端口上 TLS 第一步 客户端初始化流到服务器 C stream stream from juliet im example com to im example com version 1 0 xml lang en xmlns jabber client xmlns stream http etherx jabber org streams 第二步 服务器发送一个应答流头给客户端来应答 S stream stream from im example com id t7AMCin9zjMNwQKDnplntZPIDEI to juliet im example com version 1 0 xml lang en xmlns jabber client xmlns stream http etherx jabber org streams 第三步 服务器发送流特性给客户端 在这个点上只有STARTTLS扩展 它是强制协商的 S stream features starttls xmlns urn ietf params xml ns xmpp tls required starttls stream features 第四步 客户端发送STARTTLS命令给服务器 C starttls xmlns urn ietf params xml ns xmpp tls 第五步 服务器通知客户端允许继续 S proceed xmlns urn ietf params xml ns xmpp tls 第五步 替代 服务器通知客户端STARTTLS协商失败 关闭XML流 并中止TCP连接 所以 流协商处理以不成功而结束并且双方不再进入下一步 S failure xmlns urn ietf params xml ns xmpp tls stream stream 第六步 客户端和服务器尝试通过现有的TCP连接完成TLS协商 详见 TLS 第七步 如果TLS协商成功 客户端通过TLS保护的TCP连接初始化一个新的流到服务器 C stream stream from juliet im example com to im example com version 1 0 xml lang en xmlns jabber client xmlns stream http etherx jabber org streams 第七步 替代 如果TLS协商不成功 服务器关闭TCP连接 所以 流协商处理以不成功而结束并且双方不再进入下一步 SASL 第八步 服务器发送流头给客户端并带上任何可用的流特性来应答 S stream stream from im example com id vgKi bkYME8OAj4rlXMkpucAqe4 to juliet im example com version 1 0 xml lang en xmlns jabber client xmlns stream http etherx jabber org streams S stream features mechanisms xmlns urn ietf params xml ns xmpp sasl mechanism SCRAM SHA 1 PLUS mechanism mechanism SCRAM SHA 1 mechanism mechanism PLAIN mechanism mechanisms stream features 第九步 客户端选择一个验证机制 在这个场景中 是 SCRAM SHA 1 包含初始化应答数据 C auth xmlns urn ietf params xml ns xmpp sasl mechanism SCRAM SHA 1 biwsbj1qdWxpZXQscj1vTXNUQUF3QUFBQU1BQUFBTlAwVEFBQUFBQUJQVTBBQQ auth 解码之后的 base 64 数据是 n n juliet r oMsTAAwAAAAMAAAANP0TAAAAAABPU0AA 第十步 服务器发送挑战 S challenge xmlns urn ietf params xml ns xmpp sasl cj1vTXNUQUF3QUFBQU1BQUFBTlAwVEFBQUFBQUJQVTBBQWUxMjQ2OTViLTY5Y TktNGRlNi05YzMwLWI1MWIzODA4YzU5ZSxzPU5qaGtZVE0wTURndE5HWTBaaT AwTmpkbUxUa3hNbVV0TkRsbU5UTm1ORE5rTURNeixpPTQwOTY challenge 解码后的 base 64 数据是 r oMsTAAwAAAAMAAAANP0TAAAAAABPU0AAe124695b 69a9 4de6 9c30 b51b3808c59e s NjhkYTM0MDgtNGY0Zi00NjdmLTkxMmUtNDlmNTNmNDNkMDMz i 4096 实际数据中是没有换行的 第十一步 客户端发送一个应答 C response xmlns urn ietf params xml ns xmpp sasl Yz1iaXdzLHI9b01zVEFBd0FBQUFNQUFBQU5QMFRBQUFBQUFCUFUwQUFlMTI0N jk1Yi02OWE5LTRkZTYtOWMzMC1iNTFiMzgwOGM1OWUscD1VQTU3dE0vU3ZwQV RCa0gyRlhzMFdEWHZKWXc9 response 解码后的 base 64 数据是 c biws r oMsTAAwAAAAMAAAANP0TAAAAAABPU0 AAe124695b 69a9 4de6 9c30 b51b3808c59e p UA57tM SvpATBkH2FXs0WDXvJYw 实际数据中是没有换行的 第十二步 服务器通知客户端成功了 并且包含了额外的数据 S success xmlns urn ietf params xml ns xmpp sasl dj1wTk5ERlZFUXh1WHhDb1NFaVc4R0VaKzFSU289 success 解码后的 base 64 数据是 v pNNDFVEQxuXxCoSEiW8GEZ 1RSo 第十二步 替代 服务器返回一个SASL错误给客户端 所以 流协商处理以不成功结束并且双方不再进行下一步 S failure xmlns urn ietf params xml ns xmpp sasl not authorized failure stream 第十三步 客户端初始化一个新的流到服务器 C stream stream from juliet im example com to im example com version 1 0 xml lang en xmlns jabber client xmlns stream http etherx jabber org streams 资源绑定 第十四步 服务器发送一个流头到客户端并带上支持的特性 在这个场景中 是资源绑定 来应答 S stream stream from im example com id gPybzaOzBmaADgxKXu9UClbprp0 to juliet im example com version 1 0 xml lang en xmlns jabber client xmlns stream http etherx jabber org streams S stream features bind xmlns urn ietf params xml ns xmpp bind stream features 在被通知资源绑定是强制协商之后 客户端需要绑定一个资源到流 这里我们假定客户端提交了一个自然人可读的文本字符串 第十五步 客户端绑定一个资源 C iq id yhc13a95 type set bind xmlns urn ietf params xml ns xmpp bind resource balcony resource bind iq 第十六步 服务器接受提交的资源部分并通知客户端资源绑定成功 S iq id yhc13a95 type result bind xmlns urn ietf params xml ns xmpp bind jid juliet im example com balcony jid bind iq 第十六步 替代 服务器返回错误给客户端 所以 流协商处理以不成功结束并且双方不再进入下一步 S iq id yhc13a95 type error error type cancel conflict xmlns urn ietf params xml ns xmpp stanzas error iq 节交换 现在客户端被允许通过协商好的流发送XML节了 C message from juliet im example com balcony id ju2ba41c to romeo example net type chat xml lang en body Art thou not Romeo and a Montague body message 如果必要 发送者的服务器和预定的接收者的服务器协商XML流 见 9 2 预定的接收者应答 并且消息被递送到客户端 E message from romeo example net orchard id ju2ba41c to juliet im example com balcony type chat xml lang en body Neither fair saint if either thee dislike body message 客户端随后可以通过这个流继续发送和接收不限数量的XML节 关闭 不想发送更多的消息 客户端关闭它到服务器的流 不在等待来自服务器的入站数据了 C stream stream 和 4 4 一致 服务器可能发送额外的数据给客户端然后才关闭到该客户端的流 S stream stream 客户端现在发送一个 TLS close notify 警告 从服务器接收到一个 close notify 警告应答 然后中止当前的TCP连接 服务器 服务器示例 以下示例展示一个服务器和对端服务器协商XML流 交换XML节 和关闭已协商的流的数据流 初始化服务器 Server1 是im example com 接收服务器 Server2 是example net 并且要求使用TLS im example com递交一个证书并通过SASL EXTERNAL机制验证 假定在发送初始化流头之前 Server1已经解析了一个SRV记录 xmpp server tcp example net并且已经打开了一个TCP连接到已解析的IP地址的声明的端口上 注意Server1怎样声明内容命名空间 jabber server 作为缺省的命名空间并为流相关的元素使用前缀 反之Server2使用免前缀标准 TLS 第一步 Server1初始化流到Server2 S1 stream stream from im example com to example net version 1 0 xmlns jabber server xmlns stream http etherx jabber org streams 第二步 Server2发送一个应答流头到Server1来应答 S2 stream from example net id hTiXkW ih9k2SqdGkk AZi0OJ Q to im example com version 1 0 xmlns http etherx jabber org streams 第三步 Server2发送流特性给Server1 在这个点上只有STARTTLS扩展 它是强制协商的 S2 features xmlns http etherx jabber org streams starttls xmlns urn ietf params xml ns xmpp tls required starttls features 第四步 Server1发送STARTTLS指令给Server2 S1 starttls xmlns urn ietf params xml ns xmpp tls 第五步 Server2通知Server1它被允许继续 S2 proceed xmlns urn ietf params xml ns xmpp tls 第五步 替代 Server2通知Server1 STARTTLS协商失败了 关闭流 并中止TCP连接 于是 流协商过程以不成功结束并且双方不再进行下一步 S2 failure xmlns urn ietf params xml ns xmpp tls stream 第六步 Server1和Server2尝试通过TCP完成TLS协商 详见 TLS 第七步 如果TLS协商成功了 Server1在受TLS保护的TCP连接上初始化一个新流到Server2 S1 stream stream from im example com to example net version 1 0 xmlns jabber server xmlns stream http etherx jabber org streams 第七步 替代 如果TLS协商不成功 Server2关闭TCP连接 所以 流协商过程以不成功结束并且双方不再进行下一步 SASL 第八步 Server2发送一个应答流头给Server1并带上可用的流特性 包括优先的SASL EXTERNAL机制 S2 stream from example net id RChdjlgj TIBcbT9Keu31zDihH4 to im example com version 1 0 xmlns http etherx jabber org streams S2 features xmlns http etherx jabber org streams mechanisms xmlns urn ietf params xml ns xmpp sasl mechanism EXTERNAL mechanism mechanisms features 第九步 Server1选择EXTERNAL机制 包含一个 的空应答 S1 auth xmlns urn ietf params xml ns xmpp sasl mechanism EXTERNAL auth 第十步 Server2返回成功 S2 success xmlns urn ietf params xml ns xmpp sasl 第十步 替代 Server2通知Server1验证失败了 所以 流协商过程以不成功结束并且双方不再进行下一步 S2 failure xmlns urn ietf params xml ns xmpp sasl not authorized failure stream 第十一步 Server1初始化一个新流到Server2 S1 stream stream from im example com to example net version 1 0 xmlns jabber server xmlns stream http etherx jabber org streams 第十二步 Server2发送一个流头给并带上任何附加的特性 或 在这个例子中 一个空的特性元素 来应答 S2 stream from example net id MbbV2FeojySpUIP6J91qaa TWHM to im example com version 1 0 xmlns http etherx jabber org streams S2 features xmlns http etherx jabber org streams 节交换 现在Server1被允许通过已协商的从im example com到example net的流发送XML节给Server2 这里我们假定被传输的节就是前面演示的那些客户端 服务器通讯的节 尽管是在一个服务器 服务器由 jabber server 命名空间限定的流上 Server1发送XML节给Server2 S1 message from juliet im example com balcony id ju2ba41c to romeo example net type chat xml lang en body Art thou not Romeo and a Montague body message 关闭 想不再发送更多消息 Server1关闭它到Server2的流但是等待从Server2的入站数据 实践中 流大部分时候保持打开一段时间 因为Server1和Server2不是立刻知道流是否需要更多通讯 S1 stream stream 和建议的流关闭握手一致 Server2同样关闭流 S2 stream Server1现在发送一个TLS close notify警告 从Server2接收一个close notify警告应答 然后中止当前的TCP连接 处理XML节的服务器规则 每个服务器实现将包含它自己的处理接受的节的逻辑 这写逻辑决定服务器是需要路由一个给定的节到其他域 还是把它递送到一个本地实体 典型的是一个和本地帐号相关联的已连接客户端 或者直接由服务器本身处理它 本章提供处理XML节的通用规则 然而 特殊的XMPP应用可以定义递送规则来修改或补充以下规则 例如 定义于 XMPP IM 的用于即时消息和联机状态信息应用的一系列递送规则 顺序处理 一个XMPP服务器必须确保它从一个已连接的客户端或远端服务器的给定的入站流上收到的节和其他XML元素的顺序处理 顺序处理适用于 a 任何用来协商和管理XML流的XML元素 和 b 所有XML节 包括但不限于以下情况 由一个客户端发送到它的服务器或它自己的纯JID的由服务器直接处理的节 例如 XMPP IM 所述的获取好友名册和初始化出席信息的顺序处理 由一个已连接的客户端发送的节并且是用来递送到另一个和该服务器相关的实体 例如 从地址 juliet im example com 发到 nurse im example com 的节 服务器必须确保按照从发送的客户端的入站流上接收到节的顺序来递送那些到预期接收者的节 对递送目的接收者地址为纯JID和全JID的节等同对待 由一个已连接的客户端发送的节并且是用来递送到一个位于远端服务器上的实体 例如 从地址 juliet im example com 发到 romeo example net 路由的服务器必须确保按照从发送的客户端的入站流上接收到节的顺序来路由那些到预期接收者的节 对路由目的接收者地址为纯JID和全JID的节等同对待 为了帮助确保顺序处理 路由服务器必须通过单一的到远端域的出站流来路由这些节 而不是在一个服务器 服务器流上发送一些节而在另一个服务器 服务器流上发送另一些节 从一个服务器路由到另一个服务器的递送到远端服务器的一个相关实体的节 例如 从地址 juliet im example com 发到 romeo example net 并且由 im example com 在一个服务器 服务器流上路由到 example net 递送服务器必须确保按照它从路由服务器的入站流上接收到的顺序来递送节 对递送目的接收者地址为纯JID和全JID的节同等对待 由一个服务器发送到另一个服务器用于远端域直接处理的节 例如 从 im example com 发到 example net 如果服务器对于特定请求的处理对它接下来可能从入站流收到的数据的处理有影响 例如 强制性的通讯策略 它必须挂起接下来的数据的处理 直到它已经处理完该请求 顺序处理只适用于单一入站流 所以 服务器不负责保证它从相同本地帐号 例如 通过两个不同入站流从 juliet im example com balcony 和 juliet im example com chamber 接收到的节 或相同的远端域 例如 由一个远端域通过两个不同的入站流进行的流协商 然而 服务器可以以 conflict 流错误来关闭该流 4 9 3 3 如果远端服务器尝试协商多个流 详见 4 9 3 3 通过多个入站流接收到的数据的相干性 一般注意事项 在顶层 服务器处理XML节有三个主要的注意事项 它们有时候相左但需要一个一致的办法来管理 如果可能最好把一个节递送到预定的接收者 如果一个节不能被递送 通知发送者是有帮助的 促成目录获取攻击 13 11 和联机状态泄露 13 10 2 是不好的 对于可能的和递送相关的攻击 以下几点需要牢记 从攻击者的视角来看 在服务器 i 递送节或存储成离线消息稍后递送 见 RFC6121 XMPP IM 和 ii 安静地忽略它 因为在任何那种用例之下都不会立刻返回一个错误 之间是否有任何一点有效的不同 因此 在服务器递送一个节或吧这个节离线存储稍后递送的场景中 如果那个帐号不存在 它需要安静地忽略这个节 服务器如何处理发送到一个受到目录获取影响的纯JID localpart domainpart 的节 因为如果服务器根据一个给定的纯JID是否有帐号来做出不同应答 那么攻击者可以确定一个帐号是否存在 服务器如何处理发送到一个受到出席信息泄露影响的全JID的节 因为可以发送请求到多个全JID上并且根据该用户是否有一个全JID的设备在线来收到不同的应答 使用随机的资源部分 是由客户端还是服务器生成参见 第七章 明显减轻了这个攻击 所以在某种程度上它被关心的程度地狱目录获取攻击 很自然 如果收到从一个用户的服务器返回的错误的实体已经知道用户的出席信息或被授权知道它 那么出席信息就没有被泄露 例如 所谓出席信息订阅或直接的出席信息 如果服务器返回一个错误给一个已经知道某用户存在的实体 那么该服务器没有受到目录获取攻击 例如 因为实体在用户的联系人列表里 这些事情的更完整的讨论见 XMPP IM 没有 to 地址 如果节没有 to 属性 服务器必须代表发送它的实体来直接处理它 这里 直接处理它 的含义依赖于这个节是 message presence 还是 IQ 因为从其它服务器收到的所有节必须拥有 to 属性 这个规则只适用于从连接到该服务器的本地实体 通常是一个客户端 收到的节 Message 如果该服务器接收到一个没有 to 属性的message节 它必须把这个消息当作 to 地址是发送实体的纯JID localpart domainpart 那样来处理 Presence 如果该服务器接收到一个没有 to 属性的presence节 它必须广播这个节到订阅了发送者实体的出席信息的实体 如果适用的话 XMPP IM 定义了出席信息应用的这类广播的语义 IQ 如果服务器接收到一个没有 to 属性的IQ节 它必须代表发送这个节的帐户处理这个节 如下 如果IQ节的类型为 get 或 set 并且服务器理解限定载荷的命名空间 该服务器必须代表发送实体处理该节或返回一个适当的错误给发送实体 尽管 处理 的含义是由限定的命名空间的语义来决定的 通常服务器将返回一个适当的类型为 result 或 error 的IQ节来应答类型为 get 或 set 的节 应答就好像服务器就是发送实体的纯JID那样 作为一个例子 如果发送实体发送一个类型为 get 而载荷由 jabber iq roster 命名空间限定 参见 XMPP IM 的IQ节 那么服务器将返回和该发送实体的纯JID相关的roster给请求roster的发送实体的特定资源 如果IQ节的类型为 get 或 set 并且服务器不理解限定该载荷的命名空间 服务器必须返回一个错误给发送实体 这个错误必须是 service unavailable 如果IQ节的类型是 error 或 result 该服务器必须根据该IQ相关的载荷或类型是 get 或类型是 set 处理这个error或result 如果没有相关的节 服务器必须忽略该error或result节 远程域 如果JID的域部分包含一个 to 属性但是和该服务器配置的任何一个完整合格域名 FQDNs 都不匹配 该服务器应该尝试路由该节到远端域 服从本地服务器关于域间通讯的规定和安全策略 因为对于任何给定的部署来说这类通讯是可选的 如下章所述 有两个可能的用例 安全警告 这些规则仅适用于客户端 服务器流 如 8 1 1 2 所述 如果 to 属性里的JID的域部分和接收服务器的完全合格域名 FQDN 不匹配 那么服务器不能 MUST NOT 在一个服务器 服务器流上接收节 现有流 如果一个服务器 服务器流已经存在于两个域之间 发送者的服务器应该尝试在现有的流上为远端服务器路由这个节到授权服务器 无现有流 如果在两个域之间无现有的服务器 服务器流 发送者的服务器将如下处理 解析远端域的完整合格域名 FQDN 如 13 9 2 所述 在两个域之间协商服务器 服务器流 如 第五章 和 第六章 所述 在新建的流上为远端域路由该节到授权服务器 错误处理 如果一个到预期接收者服务器的节的路由不成功 发送者的服务器必须返回一个错误给发送者 如果远端域的解析不成功 节错误必须是 remote server not found 8 3 3 16 如果成功解析但是流无法协商 节错误必须是 remote server timeout 8 3 3 17 如果和期望的接收者的服务器的流协商成功了但是远端服务器不能递送该节到接收者 远端服务器必须通过发送者的服务器返回一个适当的错误给发送者 本地域 如果包含在 to 属性中的JID的域部分和该服务器的完整合格域名 FQDN 匹配 该服务器必须首先确定该FQDN是由服务器本身还是由特定的本地服务来提供服务 如果是后者 该服务器必须路由该节到那个服务 如果是前者 该服务器必须执行接下来的动作 无论如何 该服务器不能 MUST NOT 路由或 转发 该节到另一个域 因为处理所有 to 地址的域部分和该服务器的已配置FQDN匹配的节是服务器的责任 除此之外 这还可以防止循环处理 域部分 如果包含在 to 属性里的JID的格式为 domainpart 那个么该服务器必须要么 a 根据节类型做适当的处理 要么 b 返回一个错误节给发送者 域部分 资源部分 如果包含在 to 属性中的JID的格式为 domainpart resourcepart 那么该服务器必须要么 a 根据节类型做适当处理 要么 b 返回一个节错误给发送者 本地部分 域部分 这种类型的地址通常和该服务器上的一个帐号相关 以下规则提供一些通用方针 更多即时消息和出席信息场景中的详细规则参见 XMPP IM 没有此用户 如果没有本地帐号和 localpart domainpart 相关 节被如何处理取决于节的类型 对于message节 该服务器必须要么 a 安静地忽略该节 要么 b 返回一个 service unavailable 节错误 8 3 3 19 给发送者 对于presence节 该服务器应该忽略该节 或如 XMPP IM 所述那样表现 对于IQ节 该服务器必须返回一个 service unavailable 节错误 8 3 3 19 给发送者 用户存在 如果包含在

    Original URL path: http://wiki.jabbercn.org/RFC6120 (2016-04-25)
    Open archived version from archive


  • Jabber/XMPP中文翻译计划:关于 - Jabber/XMPP中文翻译计划
    创作公用协议 的 这个wiki采用的是最常用的mediawiki软件 页面名称和标题是一体的 可以让所有授权用户协作翻译同一篇文章 并且各用户可以同时编辑一篇文章的不同段落而不需要锁定整个文章 本站采用树状层次结构来组织文档的翻译 本站wiki的主要文档列表如下 所有文档列表 XMPP文档列表 XMPP服务器文档 其它翻译文档 原创文章 已翻译 模板 翻译中 二是 XMPP服务 用户在wiki注册的帐号xxx 就可以获得格式为 xx jabbercn org 的jid 它和wiki上帐号是统一验证的 需要注意的是 本站使用了 如意通公司 提供的免费群服务来作为站务及XMPP协议讨论用途 如何加入这个群 参见 使用RooyeeMessenger加入本站的群 三是 博客服务 用户在wiki注册的帐号xxx 可以直接去 XMPP中文博客 登录 就自动获得免费的个人博客 它和wiki上的帐号也是统一验证的 发表在 XMPP中文博客 上的文章 文章的所有权和编辑权属于用户本人 但是在用户本人同意的情况下 本站wiki对于它们拥有免费优先转贴权 本站的官方微博 新浪微博 如何联系管理员 管理员的JID为 helpdesk jabbercn org 可以直接加好友 也可以在 XMPP中文翻译计划 group rooyee im 群里找到 管理员的博客在 这里 也可以在本站的 新浪微博 联系 来自 http wiki jabbercn org

    Original URL path: http://wiki.jabbercn.org/index.php?title=Jabber/XMPP%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AF%91%E8%AE%A1%E5%88%92:%E5%85%B3%E4%BA%8E&oldid=3585 (2016-04-25)
    Open archived version from archive

  • 查看源代码 - Jabber/XMPP中文翻译计划
    categorytree mode pages style clear right margin left 1ex border 1px solid gray padding 0 7ex background color white 所有文档列表 categorytree 二是 XMPP服务 用户在wiki注册的帐号xxx 就可以获得格式为 xx jabbercn org 的jid 它和wiki上帐号是统一验证的 需要注意的是 本站使用了 http www rooyeetone com 如意通公司 提供的免费群服务来作为站务及XMPP协议讨论用途 如何加入这个群 参见 使用RooyeeMessenger加入本站的群 三是 博客服务 用户在wiki注册的帐号xxx 可以直接去 http blog jabbercn org XMPP中文博客 登录 就自动获得免费的个人博客 它和wiki上的帐号也是统一验证的 发表在 http blog jabbercn org XMPP中文博客 上的文章 文章的所有权和编辑权属于用户本人 但是在用户本人同意的情况下 本站wiki对于它们拥有免费优先转贴权 本站的官方微博 http weibo com xmppcn 新浪微博 如何联系管理员

    Original URL path: http://wiki.jabbercn.org/index.php?title=Jabber/XMPP%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AF%91%E8%AE%A1%E5%88%92:%E5%85%B3%E4%BA%8E&action=edit (2016-04-25)
    Open archived version from archive

  • “Jabber/XMPP中文翻译计划:关于”的版本历史 - Jabber/XMPP中文翻译计划
    一 22 33 Admin 讨论 贡献 小 3 226字节 已保护 Jabber XMPP中文翻译计划 关于 edit sysop 无期 move sysop 无期 当前 先前 2012年2月20日 一 21 13 Admin 讨论 贡献 小 3 226字节 当前 先前 2012年2月20日 一 21 08 Admin 讨论 贡献 小 3 240字节 当前 先前 2012年1月13日 五 02 03 Admin 讨论 贡献 小 3 240字节 当前 先前 2012年1月12日 四 17 39 Admin 讨论 贡献 小 3 130字节 当前 先前 2012年1月12日

    Original URL path: http://wiki.jabbercn.org/index.php?title=Jabber/XMPP%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AF%91%E8%AE%A1%E5%88%92:%E5%85%B3%E4%BA%8E&action=history (2016-04-25)
    Open archived version from archive

  • 登录/创建账户 - Jabber/XMPP中文翻译计划
    密码 您的域名 jabbercn org 在此浏览器上保留我的登录信息 最长30日 来自 http wiki jabbercn org E7 89 B9 E6 AE 8A E7 94 A8 E6 88 B7 E7 99 BB E5 BD 95 查看 特殊页面 个人工具 登录 创建账户 导航 首页 社区专页 新闻动态 最近更改 随机页面

    Original URL path: http://wiki.jabbercn.org/index.php?title=%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95&returnto=Jabber%2FXMPP%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AF%91%E8%AE%A1%E5%88%92%3A%E5%85%B3%E4%BA%8E (2016-04-25)
    Open archived version from archive

  • 链接至“Jabber/XMPP中文翻译计划:关于”的页面 - Jabber/XMPP中文翻译计划
    过滤器 隐藏 包含 隐藏 链接 隐藏 重定向 下列页面链接至 Jabber XMPP中文翻译计划 关于 查看 上50个 下50个 20 50 100 250 500 首页 链入页面 查看 上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 Jabber XMPP E4 B8 AD E6 96 87 E7 BF BB E8 AF 91 E8 AE A1 E5

    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/Jabber/XMPP%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AF%91%E8%AE%A1%E5%88%92:%E5%85%B3%E4%BA%8E (2016-04-25)
    Open archived version from archive

  • 对于“Jabber/XMPP中文翻译计划:关于”有关的链出更改 - Jabber/XMPP中文翻译计划
    匿名用户的编辑 隐藏 登录用户的编辑 隐藏 我的编辑 显示自 2016年4月25日 一 16 47 起的新更改 名字空间 全部 主要 讨论 用户 用户讨论 Jabber XMPP中文翻译计划 Jabber XMPP中文翻译计划讨论 文件 文件讨论 MediaWiki MediaWiki讨论 模板 模板讨论 帮助 帮助讨论 分类 分类讨论 反选 相关名字空间 页面名称 显示链到所给出的页面 在这一段时间中链接的页面并无更改 来自 http wiki jabbercn org E7 89 B9 E6 AE 8A E9 93 BE E5 87 BA E6 9B B4 E6 94 B9 Jabber XMPP E4 B8 AD E6 96 87 E7 BF BB

    Original URL path: http://wiki.jabbercn.org/%E7%89%B9%E6%AE%8A:%E9%93%BE%E5%87%BA%E6%9B%B4%E6%94%B9/Jabber/XMPP%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AF%91%E8%AE%A1%E5%88%92:%E5%85%B3%E4%BA%8E (2016-04-25)
    Open archived version from archive

  • Jabber/XMPP中文翻译计划:关于 - Jabber/XMPP中文翻译计划
    XMPP服务器文档 其它翻译文档 原创文章 已翻译 模板 翻译中 二是 XMPP服务 用户在wiki注册的帐号xxx 就可以获得格式为 xx jabbercn org 的jid 它和wiki上帐号是统一验证的 需要注意的是 本站使用了 如意通公司 提供的免费群服务来作为站务及XMPP协议讨论用途 如何加入这个群 参见 使用RooyeeMessenger加入本站的群 三是 博客服务 用户在wiki注册的帐号xxx 可以直接去 XMPP中文博客 登录 就自动获得免费的个人博客 它和wiki上的帐号也是统一验证的 发表在 XMPP中文博客 上的文章 文章的所有权和编辑权属于用户本人 但是在用户本人同意的情况下 本站wiki对于它们拥有免费优先转贴权 本站的官方微博 新浪微博 如何联系管理员 管理员的JID为 helpdesk jabbercn org 可以直接加好友 也可以在 XMPP中文翻译计划 group rooyee im 群里找到 管理员的博客在 这里 也可以在本站的 新浪微博 联系 来自 http wiki jabbercn org index php title Jabber XMPP E4 B8 AD E6 96

    Original URL path: http://wiki.jabbercn.org/index.php?title=Jabber/XMPP%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AF%91%E8%AE%A1%E5%88%92:%E5%85%B3%E4%BA%8E&printable=yes (2016-04-25)
    Open archived version from archive



  •