1
0
mirror of https://github.com/moparisthebest/xeps synced 2024-11-24 10:12:19 -05:00
xeps/xep-0402.xml
2019-09-25 17:36:15 +02:00

245 lines
11 KiB
XML

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE xep SYSTEM 'xep.dtd' [
<!ENTITY namespace "urn:xmpp:bookmarks:0">
<!ENTITY % ents SYSTEM 'xep.ent'>
%ents;
]>
<?xml-stylesheet type='text/xsl' href='xep.xsl'?>
<xep>
<header>
<title>Bookmarks 2 (This Time it's Serious)</title>
<abstract>This specification defines a syntax and storage profile for keeping a list of chatroom bookmarks on the server.</abstract>
&LEGALNOTICE;
<number>0402</number>
<status>Experimental</status>
<type>Standards Track</type>
<sig>Standards</sig>
<approver>Council</approver>
<dependencies>
<spec>XEP-0223</spec>
</dependencies>
<supersedes/>
<supersededby/>
<shortname>bookmarks2</shortname>
<registry/>
<discuss>standards</discuss>
&dcridland;
&jcbrand;
<revision>
<version>0.2.1</version>
<date>2018-07-22</date>
<initials>egp</initials>
<remark><ul>
<li>Add missing dependency on XEP-0223.</li>
<li>Remove extra whitespace at the end of examples.</li>
</ul></remark>
</revision>
<revision>
<version>0.2.0</version>
<date>2018-03-28</date>
<initials>jcb</initials>
<remark>Remove password element, add examples, update security considerations.</remark>
</revision>
<revision>
<version>0.1.0</version>
<date>2018-03-28</date>
<initials>XEP Editor (jwi)</initials>
<remark>Accepted by vote of Council on 2018-03-21.</remark>
</revision>
<revision>
<version>0.0.1</version>
<date>2018-03-17</date>
<initials>dwd/jcb</initials>
<remark><p>First draft</p></remark>
</revision>
</header>
<section1 topic='Introduction' anchor='intro'>
<p>The original Bookmarks specification (&xep0048;) used the widely available
Private XML Storage (&xep0049;), but stored all bookmarks in a single element.
When the specification was moved to the Standards Track and Draft, it was also
updated to use the user's Pubsub service (&xep0223;), but kept this single element
containing all bookmarks inside a single Pubsub item.</p>
<p>Most implementations have kept to the original, Private XML Storage based solution, and
while some newer implementations have used Pubsub, these are limited in capability by the use of
a single item.</p>
<p>This specification resolves both issues by providing a new Bookmarks specification to migrate to,
and takes the opportunity to update the XML namespace in use as well. The URL storage is dropped,
since it is rarely used. Storage of URL bookmarks is therefore out of scope.</p>
</section1>
<section1 topic="Outline of use">
<p>Clients store each bookmarked chatroom as a Pubsub item within the '&namespace;' node. Each
item SHALL have, as item id, the Room JID of the chatroom (eg, coven@chat.shakespeare.lit).</p>
<p>The payload of the item SHALL be a conference element qualified by the '&namespace;' namespace, with the following syntax:</p>
<table caption='Syntax of conference element'>
<tr>
<th>Element or Attribute</th>
<th>Definition</th>
<th>Datatype</th>
<th>Inclusion</th>
</tr>
<tr>
<td>'autojoin' attribute</td>
<td>Whether the client should automatically join the conference room on login.</td>
<td>boolean defaulting to false &BOOLEANNOTE;</td>
<td>OPTIONAL</td>
</tr>
<tr>
<td>'name' attribute</td>
<td>A friendly name for the bookmark.</td>
<td>string</td>
<td>RECOMMENDED</td>
</tr>
<tr>
<td>&lt;nick/&gt; element</td>
<td>The user's preferred roomnick for the chatroom.</td>
<td>string</td>
<td>OPTIONAL</td>
</tr>
</table>
<p>Note: The datatypes are as defined in &w3xmlschema2;.</p>
<example caption='An example of the conference element'><![CDATA[
<conference xmlns=']]>&namespace;<![CDATA['
name='Council of Oberon'
autojoin='true'>
<nick>Puck</nick>
</conference>
]]></example>
<p>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'.</p>
<p>Note that a bookmark item MUST contain only one conference room.</p>
<p>Note also that a conference element has no truly mandatory attributes or child elements, though a name SHOULD be given. Thus the following is legal:</p>
<example caption='Minimalist conference element'><![CDATA[
<conference xmlns=']]>&namespace;<![CDATA['/>
]]></example>
</section1>
<section1 topic='Examples' anchor='examples'>
<section2 topic='Retrieving all bookmarks' anchor='retrieving-bookmarks'>
<example caption='Client retrieves all bookmarks'><![CDATA[
<iq from='juliet@capulet.lit/balcony' type='get' id='retrieve1'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<items node='urn:xmpp:bookmarks:0'/>
</pubsub>
</iq>
]]></example>
<example caption='Server returns the bookmarks'><![CDATA[
<iq type='result'
to='juliet@capulet.lit/balcony'
id='retrieve1'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<items node='urn:xmpp:bookmarks:0'>
<item id='theplay@conference.shakespeare.lit'>
<conference name='The Play&apos;s the Thing'
autojoin='true'>
<nick>JC</nick>
</conference>
</item>
<item id='orchard@conference.shakespeare.lit'>
<conference name='The Orchard'
autojoin='true'>
<nick>JC</nick>
</conference>
</item>
</items>
</pubsub>
</iq>
]]></example>
</section2>
<section2 topic='Adding a bookmark' anchor='adding-a-bookmark'>
<p>Adding a bookmark means publishing a new item, with the bookmark JID as id, to the '&namespace;' node.</p>
<example caption='Client adds a new bookmark'><![CDATA[
<iq from='juliet@capulet.lit/balcony' type='set' id='pip1'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<publish node='urn:xmpp:bookmarks:0'>
<item id='theplay@conference.shakespeare.lit'>
<conference name='The Play&apos;s the Thing'
autojoin='true'>
<nick>JC</nick>
</conference>
</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>
<example caption='Server acknowledges successful storage'><![CDATA[
<iq to='juliet@capulet.lit/balcony' type='result' id='pip1'/>
]]></example>
</section2>
<section2 topic='Removing a bookmark' anchor='removing-a-bookmark'>
<p>Removing a bookmark means retracting an existing item, identified by the bookmark's JID, form the '&namespace;' node.</p>
<p>This implies that server support for the "delete-items" pubsub feature is REQUIRED.</p>
<example caption='Client removes a new bookmark'><![CDATA[
<iq from='juliet@capulet.lit/balcony' type='set' id='remove-bookmark1'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<retract node='urn:xmpp:bookmarks:0'>
<item id='theplay@conference.shakespeare.lit'/>
</retract>
</pubsub>
</iq>
]]></example>
<example caption='Server acknowledges successful retraction'><![CDATA[
<iq to='juliet@capulet.lit/balcony' type='result' id='remove-bookmark1'/>
]]></example>
</section2>
</section1>
<section1 topic="Bookmark Notifications">
<p>When a client is sent an event from the Pubsub service for the '&namespace;' node, it MUST check the 'autojoin' attribute if present, and join the room immediately if the attribute is both present and true.</p>
</section1>
<section1 topic="Implementation Notes">
<section2 topic="Differences to XEP-0048">
<ul>
<li>The conference element does not contain the jid - this is present only in the item id.</li>
<li>Each conference element is contained within an item.</li>
<li>The storage MUST be &xep0223;</li>
</ul>
</section2>
<section2 topic='Storage' anchor='storage'>
<p>&xep0060; is used for data storage, specifically through the use of private, personal pubsub nodes (described in &xep0223;) hosted at the user's virtual pubsub service (see &xep0163;).</p>
</section2>
<section2 topic="Compatibility">
<p>A server MAY choose to unify the bookmarks from both &xep0049; based and the current &xep0048;.</p>
<section3 topic="Publishing via this specification">
<p>When a client publishes a new item, the server MAY collate all items, casting them into the 'storage:bookmarks' namespace and setting the jid attribute to the item id in each case. When contained within a storage element qualified by the 'storage:bookmarks' namespace, this will be the correct format for both current and previous variants of &xep0048;</p>
</section3>
<section3 topic="Publishing via the old specification">
<p>If a client publishes a replacement list of bookmarks via the older specifications, a server MAY examine the list and update the individual items as required, sending updates or retraction notifications as needed. Servers electing to perform this OPTIONAL behaviour SHOULD NOT send notifications for unchanged items.</p>
</section3>
</section2>
</section1>
<section1 topic='Determining Support' anchor='support'>
<p>This specification relies fully on a number of others. Most particularly, support for this protocol is available if &xep0223; is supported.</p>
</section1>
<section1 topic="Acknowledgements">
<p>The authors would like to note that much of the syntax description was copied exactly from &xep0048; by Rachel Blackman, Peter Millard, and Peter Saint-Andre. Much of the remainder of this specification is based closely on their work.</p>
</section1>
<section1 topic='Security Considerations' anchor='security'>
<p>Security considerations related to object persistence via publish-subscribe are described in <cite>XEP-0060</cite> and <cite>XEP-0223</cite>.</p>
<p>The client needs to make sure that the server actually supports the "http://jabber.org/protocol/pubsub#publish-options" feature, before relying on it. If it's not supported, the client should configure the '&namespace;' node first (see <cite>xep-0060</cite>), before adding any bookmarks.</p>
</section1>
</xep>