| Abstract: | This specification defines an XML data format for use by XMPP clients in storing bookmarks to mult-user chatrooms and web pages. The chatroom bookmarking function includes the ability to auto-join rooms on login. |
| Authors: | Rachel Blackman, Peter Millard, Peter Saint-Andre |
| Copyright: | © 1999 - 2013 XMPP Standards Foundation. SEE LEGAL NOTICES. |
| Status: | Draft |
| Type: | Standards Track |
| Version: | 1.1 |
| Last Updated: | 2007-11-07 |
NOTICE: The protocol defined herein is a Draft Standard of the XMPP Standards Foundation. Implementations are encouraged and the protocol is appropriate for deployment in production systems, but some changes to the protocol are possible before it becomes a Final Standard.
1. Introduction
2. Data Format
2.1. The conference element
2.2. The url element
3. Storage
3.1. Uploading Data
3.2. Receiving Notifications
3.3. Retrieving Data
4. Security Considerations
5. IANA Considerations
6. XMPP Registrar Considerations
7. XML Schema
8. Author Note
Appendices
A: Document Information
B: Author Information
C: Legal Notices
D: Relation to XMPP
E: Discussion Venue
F: Requirements Conformance
G: Notes
H: Revision History
For ease-of-use in a Jabber client, it is desirable to have a way to store shortcuts to various services and resources (such as conference rooms and web pages) as "bookmarks" that can be displayed in the user's client. Several Jabber clients have already agreed on and implemented a method to provide this service; that informal agreement is documented and expanded upon in this document. In particular, we introduce the <storage/> element (qualified by the 'storage:bookmarks' namespace) as a container for this sort of this data. While bookmarks data can be stored using any XML storage mechanism, this document recommends one method that is specific to XMPP.
A storage element qualified by the 'storage:bookmarks' namespace may contain a collection of child elements, each representing a bookmark to be displayed in a client. At present, only two sub-elements are defined: <conference/> for bookmarking of Multi-User Chat [1] rooms and <url/> for bookmarking of web pages.
All child elements allow a 'name' attribute, which is the friendly name by which they will be displayed in the client. If an element lacks a 'name' attribute, the client SHOULD generate an appropriate substitution based on the other available data.
A common use case is bookmarking of multi-user chat rooms. A room is bookmarked using the <conference/> child element. The syntax is as follows.
Table 1: Syntax of conference element
| Element or Attribute | Definition | Datatype | Inclusion |
|---|---|---|---|
| 'autojoin' attribute | Whether the client should automatically join the conference room on login. | boolean defaulting to false [2] | OPTIONAL |
| 'jid' attribute | The JabberID of the chat room. | string | REQUIRED |
| 'name' attribute | A friendly name for the bookmark. | string | RECOMMENDED |
| <nick/> element | The user's preferred roomnick for the chatroom. | string | OPTIONAL |
| <password/> element | Unencrypted string for the password needed to enter a password-protected room. For security reasons, use of this element is NOT RECOMMENDED. | string | NOT RECOMMENDED |
Note: The datatypes are as defined in XML Schema Part 2 [3].
Example 1. An example of the conference element
<storage xmlns='storage:bookmarks'>
<conference name='Council of Oberon'
autojoin='true'
jid='council@conference.underhill.org'>
<nick>Puck</nick>
</conference>
</storage>
This bookmark would be displayed as 'Council of Oberon' and, if activated, would attempt to join the conference room 'council@conference.underhill.org' with nickname 'Puck'.
Note: A bookmark set may contain any number of conference rooms.
The <url/> element is designed for bookmarking web pages, i.e., HTTP or HTTPS URLs. The syntax is as follows.
Table 2: Syntax of url element
| Attribute | Definition | Datatype | Inclusion |
|---|---|---|---|
| 'name' attribute | A friendly name for the bookmark. | string | RECOMMENDED |
| 'url' attribute | The HTTP or HTTPS URL of the web page. | anyURI | REQUIRED |
When the user chooses a URL bookmark, the client should launch an appropriate browser or load the URL directly in the client (if the client is a web-client or includes web browsing functionality).
Example 2. An example of the url element
<storage xmlns='storage:bookmarks'>
<url name='Complete Works of Shakespeare'
url='http://the-tech.mit.edu/Shakespeare/'/>
</storage>
This bookmark would be displayed in the client as 'Complete Works of Shakespeare' and would take the user to <http://the-tech.mit.edu/Shakespeare/> when selected.
Note: A bookmark set can contain any number of URLs.
It is RECOMMENDED to use Publish-Subscribe [4] for data storage, specifically through the use of personal data nodes hosted at the user's virtual publish-subscribe service as described in Best Practices for Persistent Storage of Private Data via Publish-Subscribe [5] and illustrated in the following sections.
Note: In the past, Private XML Storage [6] was the recommended method (see the archived version of this specification at <http://www.xmpp.org/extensions/attic/xep-0048-1.0.html>). In addition, other methods could be used, such as HTTP or WebDAV.
Example 3. Client uploads data
<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>
Example 4. Server acknowledges successful storage
<iq to='juliet@capulet.lit/balcony' type='result' id='pip1'/>
The stored data is automatically pushed to all of the user's connected resources.
Example 5. Publisher receives event notification
<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'>
<conference name='The Play's the Thing'
autojoin='true'
jid='theplay@conference.shakespeare.lit'>
<nick>JC</nick>
</conference>
</storage>
</item>
</items>
</event>
</message>
In order to retrieve stored data without receiving notifications (e.g., upon initial login), the user's client sends a retrieve-items request as specified in XEP-0060.
Example 6. Client requests all items
<iq from='juliet@capulet.lit/randomID' type='get' id='retrieve1'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<items node='storage:bookmarks'/>
</pubsub>
</iq>
Example 7. Server returns all items
<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>
Security considerations related to object persistent via publish-subscribe are described in XEP-0060 and XEP-0223.
Use of the <password/> child of the <conference/> element is NOT RECOMMENDED, since the password could be discovered by a third party, e.g. an eavesdropper (if channel encryption is not used) or a server administrator. However, the element MAY be used in suitably secure environments (e.g., where it is known that communications will not be sent over unencrypted channels and the server administrators are trusted). Clients SHOULD NOT default to storing passwords and MUST enable users to disable any password storage.
This document requires no interaction with the Internet Assigned Numbers Authority (IANA) [7].
No action by the XMPP Registrar [8] is required, since the 'storage:bookmarks' namespace is already included in the protocol namespaces registry (see <http://xmpp.org/registrar/namespaces.html>).
<?xml version='1.0' encoding='UTF-8'?>
<xs:schema
xmlns:xs='http://www.w3.org/2001/XMLSchema'
targetNamespace='storage:bookmarks'
xmlns='storage:bookmarks'
elementFormDefault='qualified'>
<xs:annotation>
<xs:documentation>
The protocol documented by this schema is defined in
XEP-0048: http://www.xmpp.org/extensions/xep-0048.html
</xs:documentation>
</xs:annotation>
<xs:element name='storage'>
<xs:complexType>
<xs:choice>
<xs:element ref='conference'/>
<xs:element ref='url'/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name='conference'>
<xs:complexType>
<xs:sequence>
<xs:element name='nick' type='xs:string' minOccurs='0'/>
<xs:element name='password' type='xs:string' minOccurs='0'/>
</xs:sequence>
<xs:attribute name='autojoin' type='xs:boolean' use='optional' default='false'/>
<xs:attribute name='jid' type='xs:string' use='required'/>
<xs:attribute name='name' type='xs:string' use='required'/>
</xs:complexType>
</xs:element>
<xs:element name='url'>
<xs:complexType>
<xs:simpleContent>
<xs:extension base='empty'>
<xs:attribute name='name' type='xs:string' use='required'/>
<xs:attribute name='url' type='xs:string' use='required'/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:simpleType name='empty'>
<xs:restriction base='xs:string'>
<xs:enumeration value=''/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
Peter Millard, a co-author of this specification from version 0.1 through version 1.0, died on April 26, 2006.
Series: XEP
Number: 0048
Publisher: XMPP Standards Foundation
Status:
Draft
Type:
Standards Track
Version: 1.1
Last Updated: 2007-11-07
Approving Body: XMPP Council
Dependencies: XMPP Core, XEP-0060, XEP-0223
Supersedes: None
Superseded By: None
Short Name: bookmarks
Schema: <http://www.xmpp.org/schemas/bookmarks.xsd>
Source Control:
HTML
This document in other formats:
XML
PDF
Email:
rcb@ceruleanstudios.com
JabberID:
sparks@jabber.org
See Author Note
Email:
stpeter@jabber.org
JabberID:
stpeter@jabber.org
URI:
https://stpeter.im/
The Extensible Messaging and Presence Protocol (XMPP) is defined in the XMPP Core (RFC 6120) and XMPP IM (RFC 6121) specifications contributed by the XMPP Standards Foundation to the Internet Standards Process, which is managed by the Internet Engineering Task Force in accordance with RFC 2026. Any protocol defined in this document has been developed outside the Internet Standards Process and is to be understood as an extension to XMPP rather than as an evolution, development, or modification of XMPP itself.
The primary venue for discussion of XMPP Extension Protocols is the <standards@xmpp.org> discussion list.
Discussion on other xmpp.org discussion lists might also be appropriate; see <http://xmpp.org/about/discuss.shtml> for a complete list.
Errata can be sent to <editor@xmpp.org>.
The following requirements keywords as used in this document are to be interpreted as described in RFC 2119: "MUST", "SHALL", "REQUIRED"; "MUST NOT", "SHALL NOT"; "SHOULD", "RECOMMENDED"; "SHOULD NOT", "NOT RECOMMENDED"; "MAY", "OPTIONAL".
1. XEP-0045: Multi-User Chat <http://xmpp.org/extensions/xep-0045.html>.
2. In accordance with Section 3.2.2.1 of XML Schema Part 2: Datatypes, the allowable lexical representations for the xs:boolean datatype are the strings "0" and "false" for the concept 'false' and the strings "1" and "true" for the concept 'true'; implementations MUST support both styles of lexical representation.
3. XML Schema Part 2: Datatypes <http://www.w3.org/TR/xmlschema-2/>.
4. XEP-0060: Publish-Subscribe <http://xmpp.org/extensions/xep-0060.html>.
5. XEP-0223: Best Practices for Persistent Storage of Private Data via Publish-Subscribe <http://xmpp.org/extensions/xep-0223.html>.
6. XEP-0049: Private XML Storage <http://xmpp.org/extensions/xep-0049.html>.
7. The Internet Assigned Numbers Authority (IANA) is the central coordinator for the assignment of unique parameter values for Internet protocols, such as port numbers and URI schemes. For further information, see <http://www.iana.org/>.
8. The XMPP Registrar maintains a list of reserved protocol namespaces as well as registries of parameters used in the context of XMPP extension protocols approved by the XMPP Standards Foundation. For further information, see <http://xmpp.org/registrar/>.
Note: Older versions of this specification might be available at http://xmpp.org/extensions/attic/
For security reasons, actively discouraged use of the password element; specified use of publish-subscribe private information nodes as the preferred storage mechanism; cleaned up the text and examples.
(psa)Per a vote of the Jabber Council, changed status to Active; also added XML schema.
(psa)Re-focused to document only the existing protocol in use.
(rcb)Typos, etc...
(pgm)Initial version.
(pgm)END