XEP-0048
本文的英文原文来自XEP-0048
XEP-0048: 书签
摘要: | 本协议定义了一个XML数据格式让XMPP客户端存储多用户聊天室和web页面的书签。聊天室书签功能还包括登录时自动加入房间的功能. |
---|---|
作者: | Rachel Blackman, Peter Millard, Peter Saint-Andre |
版权: | © 1999 - 2011 XMPP标准化基金会(XSF). 参见法律通告. |
状态: | 草案 |
类型: | 标准跟踪 |
版本: | 1.1 |
最后更新日期: | 2007-11-07 |
注意: 这里定义的协议是XMPP标准化基金会的一个 草案标准 .对本协议的执行是被鼓励的,也适于部署到生产系统,但是在它成为最终标准之前可能还会有一些变动.
目录 |
简介
为了让Jabber客户端易于使用, 需要一个办法把很多服务和资源 (例如会议室和web页面) 的快捷方式存储成为可以在用户的客户端显示的 "书签". 许多Jabber客户端已经同意并实现了一个方法来提供这个服务; 这个非正式的约定在本文中做了记录和扩展. 典型的, 我们引入 <storage/> 元素 (由 'storage:bookmarks' 命名空间限定) 作为一个这类数据的容器. 因为书签数据可能使用任何XML存储机制来存储, 本文推荐了一个特定的用于XMPP的方法.
数据格式
一个由 'storage:bookmarks' 命名空间限定的 storage 元素可以包含一组子元素, 每个子元素代表一个书签显示在客户端上. 目前, 只定义了两个子元素: <conference/> 用于 多用户聊天 室 1 的书签 , <url/> 用于web页面的书签.
所有子元素允许有一个 'name' 属性, 它是一个显示给客户端的友好的名字. 如果一个元素缺少 'name' 属性, 客户端应该基于可用的其他数据生成一个适当的替代品.
conference元素
常见的用例是多用户聊天室的书签. 一个房间使用 <conference/> 子元素来标记书签. 语法如下.
- 表1: conference元素的语法
元素或属性 定义 数据类型 必要性 'autojoin' 属性 客户端是否应该在登录时自动加入会议室. boolean,缺省为false 2 可选 'jid' 属性 聊天室的JabberID. string 必需 'name' 属性 书签的一个友好名字. string 推荐 <nick/> 元素 用户在这个聊天室中的首选昵称. string 可选 <password/>元素 未加密的字符串,用来加入一个密码保护的房间. 处于安全性的原因, 不推荐使用这个元素. string 不推荐
注意: datatypes(数据类型) 定义于 XML Schema Part 2 3 .
示例1. 一个conference元素的例子
<storage xmlns='storage:bookmarks'> <conference name='Council of Oberon' autojoin='true' jid='council@conference.underhill.org'> <nick>Puck</nick> </conference> </storage>
- 这个书签将显示为 'Council of Oberon' 并且, 如果激活它, 将尝试以昵称 'Puck' 加入会议室 'council@conference.underhill.org' .
- 注意: 一个书签组可以包含不限数量的会议室.
url元素
<url/>元素设计用于标记web页面, 例如, HTTP 或 HTTPS URLs. 语法如下.
- 表2: url元素的语法
属性 定义 数据类型 必要性 'name' 属性 书签的一个友好名字. string 推荐 'url' 属性 web页面的HTTP或HTTPS URL. anyURI 必需
当用户选择一个URL书签, 该客户端应该启动一个适当的浏览器或直接把URL装载到客户端 (如果那个客户端是一个web客户端或包含web浏览功能).
示例2. 一个url元素的例子
<storage xmlns='storage:bookmarks'> <url name='Complete Works of Shakespeare' url='http://the-tech.mit.edu/Shakespeare/'/> </storage>
这个书签将在客户端显示为 'Complete Works of Shakespeare' 并且当它被选中的时候会把用户带到 <http://the-tech.mit.edu/Shakespeare/> .
注意: 一个书签组可以包含任意数量的URLs.
存储
建议使用 发行-订阅 4 来作数据存储, 特别是通过使用位于用户的虚拟"发行-订阅"服务(见 通过发行-订阅实现私有数据的持久存储的最佳实践 5 和接下来的章节)上的个人数据节点.
注意: 过去, 私有XML存储 6 是推荐的方法 (参见本协议的归档版本 <http://www.xmpp.org/extensions/attic/xep-0048-1.0.html>). 另外, 也可以使用其他方法, 例如 HTTP 或 WebDAV.
上传数据
示例3. 客户端上传数据
<iq from='juliet@capulet.lit/balcony' type='set' id='pip1'> <pubsub xmlns='http://jabber.org/protocol/pubsub'> <publish node='storage:bookmarks'> <item id='current'> <storage xmlns='storage:bookmarks'> <conference name='The Play's the Thing' autojoin='true' jid='theplay@conference.shakespeare.lit'> <nick>JC</nick> </conference> </storage> </item> </publish> <publish-options> <x xmlns='jabber:x:data' type='submit'> <field var='FORM_TYPE' type='hidden'> <value>http://jabber.org/protocol/pubsub#publish-options</value> </field> <field var='pubsub#persist_items'> <value>true</value> </field> <field var='pubsub#access_model'> <value>whitelist</value> </field> </x> </publish-options> </pubsub> </iq>
示例4. 服务器承认成功存储
<iq to='juliet@capulet.lit/balcony' type='result' id='pip1'/>
接收通知
存储的数据自动推送到该用户的所有已连接资源.
示例5. 发行者接收事件通知
<message from='juliet@capulet.lit' to='juliet@capulet.lit/balcony' type='headline' id='rnfoo1'> <event xmlns='http://jabber.org/protocol/pubsub#event'> <items node='storage:bookmarks'> <item id='current'> <storage xmlns='storage:bookmarks'> <conference name='The Play's the Thing' autojoin='true' jid='theplay@conference.shakespeare.lit'> <nick>JC</nick> </conference> </storage> </item> </items> </event> </message> <message from='juliet@capulet.lit' to='juliet@capulet.lit/chamber' type='headline' id='rnfoo2'> <event xmlns='http://jabber.org/protocol/pubsub#event'> <items node='storage:bookmarks'> <item id='current'> <storage xmlns='storage:bookmarks'> <note jid='hamlet@shakespeare.lit' cdate='2004-09-24T15:23:21Z' mdate='2004-09-24T15:23:21Z'>Seems to be a good writer</note> <note jid='juliet@capulet.com' cdate='2004-09-27T17:23:14Z' mdate='2004-09-28T12:43:12Z'>Oh my sweetest love ...</note> </storage> </item> </items> </event> </message>
接收数据
为了在不需要接收通知的情况下接收存储的数据 (比如, 初始化登录的时候), 用户的客户端发送一个 XEP-0060 定义的 接收-条目 请求.
示例6. 客户端请求所有条目
<iq from='juliet@capulet.lit/randomID' type='get' id='retrieve1'> <pubsub xmlns='http://jabber.org/protocol/pubsub'> <items node='storage:bookmarks'/> </pubsub> </iq>
示例7. 服务器返回所有条目
<iq type='result' to='juliet@capulet.lit/randomID' id='retrieve1'> <pubsub xmlns='http://jabber.org/protocol/pubsub'> <items node='storage:bookmarks'> <item id='current'> <storage xmlns='storage:bookmarks'> <conference name='The Play's the Thing' autojoin='true' jid='theplay@conference.shakespeare.lit'> <nick>JC</nick> </conference> </storage> </item> </items> </pubsub> </iq>
安全事项
和发行-订阅的对象持久性相关的安全事项参见 XEP-0060 和 XEP-0223 .
不建议使用 <conference/> 元素的 <password/> 子元素, 因为密码可能被第三方截取到, 例如 一个窃听者 (如果没有使用频道加密) 或一个服务器管理员. 无论如何, 这个元素还是可以在安全环境下使用的 (例如, 通讯不会使用未加密频道的地方以及管理员是可信任的情况下). 客户端缺省不应该存储密码并且必须允许用户禁止任何密码存储功能.