view Side-By-Side changes
Network Working Group P. Saint-Andre Internet-Draft J. Miller Expires:February 20,March 7, 2004 Jabber Software FoundationAugust 22,September 7, 2003 XMPP Instant Messagingdraft-ietf-xmpp-im-16draft-ietf-xmpp-im-17 Status of this Memo This document is an Internet-Draft and is in full conformance with all provisions of Section 10 of RFC2026. Internet-Drafts are working documents of the Internet Engineering Task Force (IETF), its areas, and its working groups. Note that other groups may also distribute working documents as Internet-Drafts. Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress." The list of current Internet-Drafts can be accessed at http:// www.ietf.org/ietf/1id-abstracts.txt. The list of Internet-Draft Shadow Directories can be accessed at http://www.ietf.org/shadow.html. This Internet-Draft will expire onFebruary 20,March 7, 2004. Copyright Notice Copyright (C) The Internet Society (2003). All Rights Reserved. Abstract This document describes specific extensions to and applications of the core features of the Extensible Messaging and Presence Protocol(XMPP)(XMPP Core [1]) that provide the basic instant messaging and presence functionality defined in RFC2779.2779 [2]. Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page 1] Internet-Draft XMPP Instant MessagingAugustSeptember 2003 Table of Contents 1. Introduction . . . . . . . . . . . . . . . . . . . . . . .56 1.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . .56 1.2 Requirements . . . . . . . . . . . . . . . . . . . . . . .56 1.3 Terminology . . . . . . . . . . . . . . . . . . . . . . .57 1.4 Discussion Venue . . . . . . . . . . . . . . . . . . . . .67 1.5 Intellectual Property Notice . . . . . . . . . . . . . . .67 2.Establishing a SessionSyntax of XML Stanzas . . . . . . . . . . . . . . . . . .7 3. Exchanging Messages8 2.1 Message Stanzas . . . . . . . . . . . . . . . . . . .10 3.1 Specifying an Intended Recipient. . 8 2.1.1 Types of Message . . . . . . . . . . .10 3.2 Specifying a Message Type. . . . . . . . . . 8 2.1.2 Child Elements . . . . . .10 3.3 Specifying a Message Body. . . . . . . . . . . . . . . .11 3.4 Specifying a Message Subject9 2.2 Presence Stanzas . . . . . . . . . . . . . . .12 3.5 Specifying a Conversation Thread. . . . . . 10 2.2.1 Types of Presence . . . . . . .12 4. Exchanging Presence Information. . . . . . . . . . . . .14 4.1 Client and Server Responsibilities10 2.2.2 Child Elements . . . . . . . . . . . .14 4.2 Specifying Availability Status. . . . . . . . . . 11 2.3 IQ Stanzas . . . .17 4.3 Specifying Detailed Status Information. . . . . . . . . .17 4.4 Specifying Presence Priority. . . . . . . . . . 13 2.4 Extended Namespaces . . . . .17 4.5 Determining When a Contact Went Offline. . . . . . . . .18 4.6 Presence Examples. . . . . 13 3. Establishing a Session . . . . . . . . . . . . . . . .19 5. Managing Subscriptions. . 15 4. Exchanging Messages . . . . . . . . . . . . . . . .24 5.1 Requesting a Subscription. . . 18 4.1 Specifying an Intended Recipient . . . . . . . . . . . . .24 5.2 Handling18 4.2 Specifying aSubscription RequestMessage Type . . . . . . . . . . . . .24 5.3 Cancelling a Subscription from Another Entity. . . 18 4.3 Specifying a Message Body . . .25 5.4 Unsubscribing from Another Entity's Presence. . . . . . .25 6. Managing One's Roster. . . . . . 18 4.4 Specifying a Message Subject . . . . . . . . . . . .26 6.1 Retrieving One's Roster on Login. . . 19 4.5 Specifying a Conversation Thread . . . . . . . . . .26 6.2 Adding a Roster Item. . . 19 5. Exchanging Presence Information . . . . . . . . . . . . . 21 5.1 Client and Server Presence Responsibilities . . .27 6.3 Updating a Roster Item. . . . 21 5.2 Specifying Availability Status . . . . . . . . . . . . . .28 6.4 Deleting a Roster Item24 5.3 Specifying Detailed Status Information . . . . . . . . . . 24 5.4 Specifying Presence Priority . . . . . . . .29 7. Integration of Roster Items and Presence Subscriptions. .30 7.1 Overview. . . . . 24 5.5 Presence Examples . . . . . . . . . . . . . . . . . . . .30 7.2 User Subscribes to Contact25 6. Managing Subscriptions . . . . . . . . . . . . . . . .30 7.2.1 Alternate Flow: Contact Declines Subscription Request. .35 7.3 Creating29 6.1 Requesting aMutualSubscription . . . . . . . . . . . . . .36 7.3.1 Alternate Flow: User Declines. . 29 6.2 Handling a Subscription Request . . . .39 7.4 Unsubscribing. . . . . . . . . 29 6.3 Cancelling a Subscription from Another Entity . . . . . . 30 6.4 Unsubscribing from Another Entity's Presence . . . . . . .40 7.4.1 Case #1: Unsubscribing When Subscription is Not Mutual30 7. Roster Management . .40 7.4.2 Case #2: Unsubscribing When Subscription is Mutual. . . .43 7.5 Cancelling a Subscription. . . . . . . . . . . . . . 31 7.1 Syntax and Semantics . .45 7.5.1 Case #1: Cancelling When Subscription is Not Mutual. . .45 7.5.2 Case #2: Cancelling When Subscription is Mutual. . . . .47 7.6 Removing a Roster Item and Cancelling All Subscriptions.49 8. Subscription States. . . . . . . . 31 7.2 Business Rules . . . . . . . . . . .52 8.1 Defined States. . . . . . . . . . . 31 7.3 Retrieving One's Roster on Login . . . . . . . . . . .52 8.2 Server Handling of Outbound Presence, Categorized by Saint-Andre & Miller Expires February 20, 2004 [Page 2] Internet-Draft XMPP Instant Messaging August 2003 Subscription State. . 32 7.4 Adding a Roster Item . . . . . . . . . . . . . . . . . .52 8.2.1 Subscription State = None. 32 7.5 Updating a Roster Item . . . . . . . . . . . . . . .53 8.2.2 Subscription State = None + Pending Out. . . 34 7.6 Deleting a Roster Item . . . . . .53 8.2.3 Subscription State = None + Pending In. . . . . . . . . .53 8.2.4 Subscription State = None + Pending Out/In. . 34 8. Integration of Roster Items and Presence Subscriptions . . 36 8.1 Overview . . . .53 8.2.5 Subscription State = To. . . . . . . . . . . . . . . . .54 8.2.6 Subscription State = To + Pending In. . . . 36 8.2 User Subscribes to Contact . . . . . . .54 8.2.7 Subscription State = From. . . . . . . . . 36 8.2.1 Alternate Flow: Contact Declines Subscription Request . . 41 8.3 Creating a Mutual Subscription . . . . .54 8.2.8 Subscription State = From + Pending Out. . . . . . . . .54 8.2.942 8.3.1 Alternate Flow: User Declines SubscriptionState = BothRequest . . . . 45 Saint-Andre & Miller Expires March 7, 2004 [Page 2] Internet-Draft XMPP Instant Messaging September 2003 8.4 Unsubscribing . . . . . . . . . . . .55 8.3 Server Handling of Outbound Presence, Categorized by Presence Type . . . . . . . . . . . . . . . . . . . . . . 55 8.3.1 Subscribe . . . . . . .. . . . . . . . . . 46 8.4.1 Case #1: Unsubscribing When Subscription is Not Mutual . . 46 8.4.2 Case #2: Unsubscribing When Subscription is Mutual . . . . 49 8.5 Cancelling a Subscription .55 8.3.2 Subscribed. . . . . . . . . . . . . . . 51 8.5.1 Case #1: Cancelling When Subscription is Not Mutual . . . 51 8.5.2 Case #2: Cancelling When Subscription is Mutual . . . . . 53 8.6 Removing a Roster Item and Cancelling All Subscriptions . 558.3.3 Unsubscribe . . . . .9. Subscription States . . . . . . . . . . . . . . . . . .56 8.3.4 Unsubscribed. 59 9.1 Defined States . . . . . . . . . . . . . . . . . . . . . .56 8.459 9.2 Server Handling ofInboundOutbound Presence, Categorized by Subscription State . . . . . . . . . . . . . . . . . . . .57 8.4.159 9.2.1 Subscription State = None . . . . . . . . . . . . . . . .57 8.4.260 9.2.2 Subscription State = None + Pending Out . . . . . . . . .57 8.4.360 9.2.3 Subscription State = None + Pending In . . . . . . . . . .57 8.4.460 9.2.4 Subscription State = None + Pending Out/In . . . . . . . .58 8.4.560 9.2.5 Subscription State = To . . . . . . . . . . . . . . . . .58 8.4.661 9.2.6 Subscription State = To + Pending In . . . . . . . . . . .58 8.4.761 9.2.7 Subscription State = From . . . . . . . . . . . . . . . .58 8.4.861 9.2.8 Subscription State = From + Pending Out . . . . . . . . .59 8.4.961 9.2.9 Subscription State = Both . . . . . . . . . . . . . . . .59 8.562 9.3 Server Handling ofInboundOutbound Presence, Categorized by Presence Type . . . . . . . . . . . . . . . . . . . . . .59 8.5.162 9.3.1 Subscribe . . . . . . . . . . . . . . . . . . . . . . . .59 8.5.262 9.3.2 Subscribed . . . . . . . . . . . . . . . . . . . . . . . .60 8.5.362 9.3.3 Unsubscribe . . . . . . . . . . . . . . . . . . . . . . .60 8.5.463 9.3.4 Unsubscribed . . . . . . . . . . . . . . . . . . . . . . .60 8.663 9.4 ServerDelivery and Client AcknowledgementHandling of Inbound Presence, Categorized by Subscription StateChange Notifications. . . . . . . . .61 9. Blocking Communication. . . . . . . . . . . 64 9.4.1 Subscription State = None . . . . . . .62 9.1 Syntax. . . . . . . . . 64 9.4.2 Subscription State = None + Pending Out . . . . . . . . . 64 9.4.3 Subscription State = None + Pending In . . . . . . . .62 9.2 Business Rules. . 64 9.4.4 Subscription State = None + Pending Out/In . . . . . . . . 65 9.4.5 Subscription State = To . . . . . . . . . . . .64 9.3 Retrieving One's Privacy Lists. . . . . 65 9.4.6 Subscription State = To + Pending In . . . . . . . . .65 9.4 Managing Active Lists. . 65 9.4.7 Subscription State = From . . . . . . . . . . . . . . . .68 9.5 Managing the Default List65 9.4.8 Subscription State = From + Pending Out . . . . . . . . . 66 9.4.9 Subscription State = Both . . . . . . .69 9.6 Editing a Privacy List. . . . . . . . . 66 9.5 Server Handling of Inbound Presence, Categorized by Presence Type . . . . . . . . .70 9.7 Adding a New Privacy List. . . . . . . . . . . . . 66 9.5.1 Subscribe . . .70 9.8 Removing a Privacy List. . . . . . . . . . . . . . . . .71 9.9 Blocking Messages. . . . 66 9.5.2 Subscribed . . . . . . . . . . . . . . . .71 9.10 Blocking Inbound Presence Notifications. . . . . . . . 67 9.5.3 Unsubscribe .73 9.11 Blocking Outbound Presence Notifications. . . . . . . . .75 9.12 Blocking IQs. . . . . . . . . . . . . 67 9.5.4 Unsubscribed . . . . . . . . . .76 Saint-Andre & Miller Expires February 20, 2004 [Page 3] Internet-Draft XMPP Instant Messaging August 2003 9.13 Blocking All Communication. . . . . . . . . . . . . 67 9.6 Server Delivery and Client Acknowledgement of Subscription State Change Notifications . . .78 9.14 Blocked Entity Attempts to Communicate with User. . . . .80 9.15 Higher-Level Heuristics. 68 10. Blocking Communication . . . . . . . . . . . . . . . .80 10. Server Rules for Handling XML Stanzas. . 69 10.1 Syntax and Semantics . . . . . . . .82 10.1 No 'to' Address. . . . . . . . . . . 69 10.2 Business Rules . . . . . . . . . .82 10.2 Foreign Domain. . . . . . . . . . . . 71 Saint-Andre & Miller Expires March 7, 2004 [Page 3] Internet-Draft XMPP Instant Messaging September 2003 10.3 Retrieving One's Privacy Lists . . . . . . . . . .82 10.3 Subdomain. . . . 72 10.4 Managing Active Lists . . . . . . . . . . . . . . . . . . 75 10.5 Managing the Default List . .82 10.4 Bare Domain or Specific Resource. . . . . . . . . . . . .82 10.5 User in Same Domain. 76 10.6 Editing a Privacy List . . . . . . . . . . . . . . . . . .83 11. IANA Considerations77 10.7 Adding a New Privacy List . . . . . . . . . . . . . . . . 78 10.8 Removing a Privacy List . . .85 11.1 XML Namespace Name for Session Data. . . . . . . . . . .85 12. Security Considerations. . . 78 10.9 Blocking Messages . . . . . . . . . . . . . .86 13. Compliance Requirements. . . . . . 78 10.10 Blocking Inbound Presence Notifications . . . . . . . . . 80 10.11 Blocking Outbound Presence Notifications . . .87 13.1 Servers. . . . . . 82 10.12 Blocking IQs . . . . . . . . . . . . . . . . . . .87 13.2 Clients. . . . 83 10.13 Blocking All Communication . . . . . . . . . . . . . . . . 85 10.14 Blocked Entity Attempts to Communicate with User . . . . . 8714. Differences Between Jabber and XMPP .10.15 Higher-Level Heuristics . . . . . . . . . .88 14.1 Session Creation. . . . . . . 87 11. IANA Considerations . . . . . . . . . . . . . .88 14.2 Privacy Rules. . . . . 89 11.1 XML Namespace Name for Session Data . . . . . . . . . . . 89 12. Internationalization Considerations . . . . . .88 Normative References. . . . . 90 13. Security Considerations . . . . . . . . . . . . . .89 Informative References. . . 91 14. Server Rules for Handling XML Stanzas . . . . . . . . . . 92 15. Compliance Requirements . . . . .90 Authors' Addresses. . . . . . . . . . . . 94 15.1 Servers . . . . . . . .90 A. vCards. . . . . . . . . . . . . . . . . 94 15.2 Clients . . . . . . . . .91 B. XML Schemas. . . . . . . . . . . . . . . . 94 Normative References . . . . . . . . . .92 B.1 session. . . . . . . . . 95 Informative References . . . . . . . . . . . . . . . .92 B.2 jabber:iq:last. . 96 Authors' Addresses . . . . . . . . . . . . . . . . . . . .9296 A. vCards . . . . . . . . . . . . . . . . . . . . . . . . . . 97 B. XML Schemas . . . . . . . . . . . . . . . . . . . . . . . 98 B.1 jabber:client namespace . . . . . . . . . . . . . . . . . 98 B.2 jabber:server namespace . . . . . . . . . . . . . . . . . 102 B.3jabber:iq:privacysession . . . . . . . . . . . . . . . . . . . .92. . . . . 106 B.4 jabber:iq:privacy . . . . . . . . . . . . . . . . . . . . 106 B.5 jabber:iq:roster . . . . . . . . . . . . . . . . . . . . .95109 C. Differences Between Jabber and XMPP . . . . . . . . . . . 111 C.1 Session Creation . . . . . . . . . . . . . . . . . . . . . 111 C.2 Privacy Rules . . . . . . . . . . . . . . . . . . . . . . 111 D. Revision History . . . . . . . . . . . . . . . . . . . . .97 C.1112 D.1 Changes from draft-ietf-xmpp-im-16 . . . . . . . . . . . . 112 D.2 Changes from draft-ietf-xmpp-im-15 . . . . . . . . . . . .97 C.2112 D.3 Changes from draft-ietf-xmpp-im-14 . . . . . . . . . . . .97 C.3113 D.4 Changes from draft-ietf-xmpp-im-13 . . . . . . . . . . . .97 C.4113 D.5 Changes from draft-ietf-xmpp-im-12 . . . . . . . . . . . .97 C.5113 D.6 Changes from draft-ietf-xmpp-im-11 . . . . . . . . . . . .98 C.6113 D.7 Changes from draft-ietf-xmpp-im-10 . . . . . . . . . . . .98 C.7114 D.8 Changes from draft-ietf-xmpp-im-09 . . . . . . . . . . . .98 C.8114 D.9 Changes from draft-ietf-xmpp-im-08 . . . . . . . . . . . .99 C.9114 D.10 Changes from draft-ietf-xmpp-im-07 . . . . . . . . . . . .99 C.10114 D.11 Changes from draft-ietf-xmpp-im-06 . . . . . . . . . . . .99 C.11114 D.12 Changes from draft-ietf-xmpp-im-05 . . . . . . . . . . . .99 C.12115 D.13 Changes from draft-ietf-xmpp-im-04 . . . . . . . . . . . .99 C.13115 Saint-Andre & Miller Expires March 7, 2004 [Page 4] Internet-Draft XMPP Instant Messaging September 2003 D.14 Changes from draft-ietf-xmpp-im-03 . . . . . . . . . . . .100 C.14115 D.15 Changes from draft-ietf-xmpp-im-02 . . . . . . . . . . . .100 C.15115 D.16 Changes from draft-ietf-xmpp-im-01 . . . . . . . . . . . .100 C.16116 D.17 Changes from draft-ietf-xmpp-im-00 . . . . . . . . . . . .100 C.17116 D.18 Changes from draft-miller-xmpp-im-02 . . . . . . . . . . .101116 Intellectual Property and Copyright Statements . . . . . .102117 Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page4]5] Internet-Draft XMPP Instant MessagingAugustSeptember 2003 1. Introduction 1.1 Overview Thecore features of theExtensible Messaging and Presence Protocol (XMPP) is a protocol for streaming XML [3] elements in order to exchange messages and presence information in close to real time. The core features of XMPP are defined in XMPP Core [1]. These features -- specifically XML streams, stream authentication and encryption, and the <message/>, <presence/>, and <iq/> children of the stream root -- provide the building blocks for many types of near-real-time applications, which may be layered on top of the core by sending application-specific data qualified by particular XMLnamespaces.namespaces [4]. This document describes extensions to and applications of XMPP Core that provide the basic functionality expected of an instant messaging (IM) and presence application as defined in RFC 2779 [2]. 1.2 Requirements For the purposes of this document, the requirements of a basic instant messaging and presence application are defined by RFC 2779 [2]. At a high level, RFC 2779 stipulates that a user must be able to complete the following use cases: o Exchange messages with other users o Exchange presence information with other users o Manage subscriptions to and from other users o Manage items in a contact list (in XMPP this is called a "roster") o Block communications to or from specific other users Detailed definitions of these functionality areas are contained in RFC 2779, and the interested reader is directed to that document regarding the requirements addressed herein. Note: while XMPP-based instant messaging and presence meets the requirements of RFC 2779, it was not designed explicitly with RFC 2779 in mind, since the base protocol evolved through an open development process within the Jabber open-source community before RFC 2779 was written. Note also that although protocols addressing many other functionality areas have been defined in the Jabber community, such protocols are not included in this document because they are not required by RFC 2779 [2]. Saint-Andre & Miller Expires March 7, 2004 [Page 6] Internet-Draft XMPP Instant Messaging September 2003 1.3 Terminology This document inherits the terminology defined in XMPP Core [1].Saint-Andre & Miller Expires February 20, 2004 [Page 5] Internet-Draft XMPP Instant Messaging August 2003The capitalized key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119[3].[5]. 1.4 Discussion Venue The authors welcome discussion and comments related to the topics presented in this document. The preferred forum is the <xmppwg@jabber.org> mailing list, for which archives and subscription information are available at <http://www.jabber.org/cgi-bin/mailman/ listinfo/xmppwg/>. 1.5 Intellectual Property Notice This document is in full compliance with all provisions of Section 10 of RFC 2026. Parts of this specification use the term "jabber" for identifying namespaces and other protocol syntax. Jabber[tm] is a registered trademark of Jabber, Inc. Jabber, Inc. grants permission to the IETF for use of the Jabber trademark in association with this specification and its successors, if any. Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page6]7] Internet-Draft XMPP Instant MessagingAugustSeptember 2003 2.Establishing a Session MostSyntax of XML Stanzas The basic semantics and common attributes of XML stanzas qualified by the 'jabber:client' and 'jabber:server' namespaces are defined in XMPP Core [1]. However, these namespaces also define various child elements, as well as values for the common 'type' attribute, that are specific to instant messaging and presenceapplications based onapplications. Thus, before addressing particular "use cases" for such applications, we here further describe the syntax of XML stanzas, thereby supplementing the discussion in XMPP Core [1]. 2.1 Message Stanzas Message stanzas in the 'jabber:client' or 'jabber:server' namespace areimplemented via a client-server architecture that requires a userused toestablish a session on a server in order"push" information toengageanother entity. Common uses in theexpectedcontext of instant messagingand presence activities. However, there are several pre-conditions that must be met before a user may establish such a session. These include: 1. Account Provisioning -- methods for account provisioningincludeaccount creation by a server administrator as well as in-band account registration usingsingle messages, messages sent in the'jabber:iq:register' namespace;context of a chat conversation, messages sent in thelatter methodcontext of a multi-user chat room, headlines, and errors. 2.1.1 Types of Message The 'type' attribute of a message stanza isdocumented byRECOMMENDED; if included, it specifies theJabber Software Foundation [5] at <http://www.jabber.org/protocol/> but is outconversational context ofscope for this document. 2. Authentication and Resource Authorization -- methods for completing these pre-conditions are documentedthe message thus providing a hint regarding presentation (e.g., inXMPP Core [1]; note that client authentication withaserver MUST include an authorization identity that specifiesGUI). If thefull JID (<user@somedomain/resource>) associated with'type' attribute is included, it SHOULD have one of theconnection for addressing purposes. Oncefollowing values (any other value MAY be ignored): o chat -- The message is sent in the context of a one-to-one chat conversation. A compliant clienthas authenticated with a server and has authorized a full JID, itSHOULDrequest that the server activatepresent aninstant messaging session forinterface enabling one-to-one chat between theclient. This is accomplishedtwo parties, including an appropriate conversation history. o error -- An error has occurred related to a previous message sent bymeans ofthe'urn:ietf:params:xml:ns:xmpp-session' namespace: Step 1: Client requests session with server: <iq type='set' id='sess_1'> <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/> </iq> Step 2: Server informs client that session has been created: <iq type='result' id='sess_1'/> Severalsender (for details regarding stanza errorconditions are possible. For example, the server may encountersyntax, refer to XMPP Core [1]). A compliant client SHOULD present aninternal condition that prevents it from creatingappropriate interface informing thesession,sender of theusername or authorization identity may lack permissions to create a session, or there may already be an active session associated with an authzidnature of thesame name. Iferror. o groupchat -- The message is sent in theserver encounterscontext of a multi-user chat environment. A compliant client SHOULD present aninternal condition that prevents it from creatinginterface enabling many-to-many chat between thesession, it MUST returnparties, including a roster of parties in the chatroom and anerror. Step 2 (alt): Server responds with error (internal server error):appropriate conversation history. Full definition of XMPP-based groupchat protocols is out of scope for this document. o headline -- The message is probably generated by an automated service that delivers or broadcasts content (news, sports, market information, RSS feeds, etc.). No reply to the message is expected, and a compliant client SHOULD present an interface that Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page7]8] Internet-Draft XMPP Instant MessagingAugustSeptember 2003<iq type='error' id='sess_1'> <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/> <error type='wait'> <internal-server-error xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> Ifappropriately differentiates theusernamemessage from standalone messages, chat sessions, orauthorization identity isgroupchat sessions (e.g., by notallowedproviding the recipient with the ability tocreatereply). o normal -- The message is asession,standalone message to which theserver MUST returnrecipient MAY reply if desired. An IM application SHOULD support all of the foregoing message types; if anerror. Step 2 (alt): Server respondsapplication receives a message witherror (usernameno 'type' attribute orauthzidthe application does notallowed to create session): <iq type='error' id='sess_1'> <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/> <error type='auth'> <not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> If there is already an active session associated with an authzid ofunderstand thesame name,value of theserver'type' attribute provided, it MUSTeither (1) terminate the active session and allow the newly-requested session, or (2) disallow the newly-requested session and maintainconsider theexisting session. Whichmessage to be ofthese the server doestype "normal" (i.e., "normal" isup totheimplementation, although it is RECOMMENDED to implement (1). In case (1),default). Although theserver SHOULD send a <conflict/> stream error'type' attribute is NOT REQUIRED, it is considered polite to mirror theactive session;type incase (2), the server SHOULD send a <conflict/> stanza errorany replies tothe newly-requested session. Step 2 (alt): Server informs active session of resource conflict (case 1): <stream:error> <conflict xmlns='urn:ietf:params:xml:ns:xmpp-streams'/> </stream:error> </stream:stream> Step 2 (alt): Server informs newly-requested session of resource conflict (case 2): <iq type='error' id='sess_1'> <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/> <error type='cancel'> <conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> Saint-Andre & Miller Expires February 20, 2004 [Page 8] Internet-Draft XMPP Instant Messaging August 2003 </error> </iq> After establishingasession, a client SHOULD send initial presence and request its roster as described below, although these actions are NOT REQUIRED. Saint-Andre & Miller Expires February 20, 2004 [Page 9] Internet-Draft XMPP Instant Messaging August 2003 3. Exchanging Messages Exchanging messages ismessage; furthermore, some specialized applications (e.g., abasicmulti-user chat service) MAY at their discretion enforce the use ofXMPP and is effected when a user generatesa particular messagestanza that is addressed to another user (or, more generally, another entity).type (e.g., type='groupchat'). 2.1.2 Child Elements Asdefineddescribed underSection 10,extended namespaces (Section 2.4), a message stanza MAY contain any properly-namespaced child element. In accordance with thesender's serverdefault namespace declaration, by default a message stanza isresponsible for deliveringin the 'jabber:client' or 'jabber:server' namespace, which defines certain allowable children of messageto the intended recipient (ifstanzas. If therecipientmessage stanza ison the same server) orof type "error", it MUST include an <error/> child; forroutingdetails, see XMPP Core [1]. Otherwise, the messageto the recipient's server (ifstanza MAY contain any of therecipient is on a different server). For information regarding the syntax of message stanzas as well as their defined attributes andfollowing childelements, refer to XMPP Core [1]. 3.1 Specifying an Intended Recipient An instant messaging client SHOULD specifyelements without anintended recipient for a message by providingexplicit namespace declaration: 1. <subject/> 2. <body/> 3. <thread/> 2.1.2.1 Subject The <subject/> element specifies theJIDtopic ofan entity other thanthesender inmessage. The <subject/> element SHOULD NOT possess any attributes, with the'to' attributeexception of the<message/> stanza. If the message is being sent in reply to a message previously received from an address'xml:lang' attribute. Multiple instances of theform <user@somedomain/resource> (e.g., within<subject/> element MAY be included for thecontextpurpose ofa chat session), the valueproviding alternate versions of the'to' address SHOULD be the full JID (<user@somedomain/resource>) rather than merely <user@somedomain> unlesssame subject, but only if each instance possesses an 'xml:lang' attribute with a distinct language value. The <subject/> element MUST NOT contain mixed content (as defined in Saint-Andre & Miller Expires March 7, 2004 [Page 9] Internet-Draft XMPP Instant Messaging September 2003 Section 3.2.2 of thesender has knowledge (via presence) thatXML specification [3]). 2.1.2.2 Body The <body/> element contains theintended recipient's resource is no longer available. Iftextual contents of themessagemessage; this child element isbeing sent outside the context ofnormally included but NOT REQUIRED. The <body/> element SHOULD NOT possess anyexisting chat session or received message,attributes, with thevalueexception of the'to' address SHOULD be'xml:lang' attribute. Multiple instances of theform <user@somedomain> rather than <user@somedomain/resource>. 3.2 Specifying<body/> element MAY be included but only if each instance possesses an 'xml:lang' attribute with aMessage Type As mentioned in XMPP Core [1], there are severaldistinct language value. The <body/> element MUST NOT contain mixed content (as definedtypes of messages (specified by means of a 'type' attribute within the <message/> element). In the context of an instant messaging application, a client SHOULD include a message typeinorder to capture the conversational contextSection 3.2.2 of themessage, thus providing a hint regarding presentation (e.g., inXML specification [3]). 2.1.2.3 Thread The <thread/> element contains aGUI). If the 'type' attributestring that isincluded, it SHOULD have one ofgenerated by thefollowing values (any other value MAYsender and that SHOULD beignored): o chat -- The message is sentcopied back inthe context ofreplies; it is used for tracking aone-to-one chat conversation. A compliant client SHOULD presentconversation thread (sometimes referred to as aninterface enabling one-to-one chat"instant messaging session") betweenthetwoparties, including an appropriate conversation history. o error -- An error has occurred relatedentities. If used, it MUST be unique toa previous message sent bythat conversation thread within thesender (for details regarding stanza error syntax, refer to XMPP Core [1]). A compliantstream and MUST be consistent throughout that conversation (a clientSHOULD present an appropriate interface informing the sender ofthat receives a message from thenature ofsame full JID but with a different thread ID MUST assume that theerror. Saint-Andre & Miller Expires February 20, 2004 [Page 10] Internet-Draft XMPP Instant Messaging August 2003 o groupchat -- Themessageis sentin question exists outside the context ofa multi-user chat environment. A compliant client SHOULD present an interface enabling many-to-many chat betweentheparties, including a rosterexisting conversation thread). The use ofparties inthechatroom<thread/> element is OPTIONAL andan appropriate conversation history. o headline -- The messageisprobably generated by an automated service that delivers or broadcasts content (news, sports, market information, RSS feeds, etc.). No replynot used totheidentify individual messages, only conversations. Only one <thread/> element MAY be included in a messageis expected,stanza, anda compliant client SHOULD presentit MUST NOT possess any attributes. The <thread/> element MUST be treated as aninterface that appropriately differentiates the message from standalone messages, chat sessions, or groupchat sessions (e.g.,opaque string bynot providingentities; no semantic meaning may be derived from it, and only exact comparisons may be made against it. The <thread/> element MUST NOT contain mixed content (as defined in Section 3.2.2 of therecipientXML specification [3]). 2.2 Presence Stanzas Presence stanzas are used in the 'jabber:client' or 'jabber:server' namespace to express an entity's current availability status (offline or online, along with various sub-states of theabilitylatter and optional user-defined descriptive text) and toreply). o normal -- The message is a standalone messagecommunicate that status to other entities. Presence stanzas are also used to negotiate and manage subscriptions towhich the recipient MAY reply if desired. This isthedefault type. An IM application SHOULD support allpresence ofthe foregoing message types; if an application receives a message with noother entities. 2.2.1 Types of Presence The 'type' attributeor the applicationof a presence stanza is OPTIONAL. A presence stanza that does notunderstand the value of thepossess a 'type' attributeprovided, it MUST consider the messageis used to signal tobe of type "normal". Althoughthe'type' attribute is NOT REQUIRED, itserver that the sender isconsidered polite to mirroronline and available for communication. If included, thetype in any replies'type' attribute specifies a lack of availability, a request to manage amessage; furthermore, some specialized applications (e.g., a multi-user chat service) MAY at their discretion enforce the use of a particular message type (e.g., type='groupchat'). 3.3 Specifying a Message Body A message stanza MAY (and often will) contain a child <body/> element specifying the primary meaning of the message. The content of the body element MUST be XML character data and the element MUST NOT contain mixed content. If it is necessary to provide the primary meaning in an alternate form (e.g., formatted using XHTML), the alternate form MUST be contained in some other child of the message stanza. However, multiple <body/> elements MAY be includedsubscription toprovide the primary meaning in different languages, as long as each such element possesses an 'xml:lang' attribute with a distinct value. Example: A message withanother entity's presence, abody: <message to='romeo@example.net' from='juliet@example.com/balcony' xml:lang='en'> <body>Wherefore art thou, Romeo?</body> <body xml:lang='cz'>PročeŽ jsi ty, Romeo?</body>Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page11]10] Internet-Draft XMPP Instant MessagingAugustSeptember 2003</message> 3.4 Specifyingrequest for another entity's current presence, or an error related to aMessage Subject A message stanzapreviously-sent presence stanza. The 'type' attribute MAYcontainhave oneor more child <subject/> elements specifying the topicof themessage.following values: o unavailable -- Signals that the entity is no longer available for communication. o subscribe -- Thecontent ofsender wishes to subscribe to thesubject element MUST be XML character data andrecipient's presence. o subscribed -- The sender has allowed theelement MUST NOT contain mixed content. Multiple <subject/> elements MAY be included, as long as each such element possesses an 'xml:lang' attribute with a distinct value. Example:recipient to receive their presence. o unsubscribe -- Amessage with a subject: <message to='romeo@example.net' from='juliet@example.com/balcony' xml:lang='en'> <subject>I implore you!</subject> <subject xml:lang='cz'> Úpěnlivě prosim! </subject> <body>Wherefore art thou, Romeo?</body> <body xml:lang='cz'> PročeŽ jsi ty, Romeo? </body> </message> 3.5 Specifyingnotification that an entity is unsubscribing from another entity's presence. o unsubscribed -- The subscription request has been denied or aConversation Threadpreviously-granted subscription has been cancelled. o probe -- Amessagerequest for an entity's current presence; in general, SHOULD NOT be sent by a client. o error -- An error has occurred regarding processing or delivery of a previously-sent presence stanza. For detailed information regarding presence semantics and the subscription model used in the context of XMPP-based instant messaging and presence applications, refer to the Exchanging Presence Information (Section 5) and Managing Subscriptions (Section 6) sections of this document. 2.2.2 Child Elements As described under extended namespaces (Section 2.4), a presence stanza MAY containaany properly-namespaced child<thread/> element specifyingelement. In accordance with theconversation threaddefault namespace declaration, by default a presence stanza is in the 'jabber:client' or 'jabber:server' namespace, which defines certain allowable children of presence stanzas. If themessagepresence stanza issituated, for the purposeoftrackingtype "error", it MUST include an <error/> child; for details, see XMPP Core [1]. If theconversation. The contentpresence stanza possesses no 'type' attribute, it MAY contain any of the<thread/> element is a random stringfollowing child elements (note thatis generated by the sender in accordance withthealgorithm specified in XMPP Core [1]; this string SHOULD<status/> child MAY becopied back to the sendersent insubsequent replies. Example: A threaded conversation: <message to='romeo@example.net/orchard' from='juliet@example.com/balcony' type='chat'> <body>Art thou not Romeo, andaMontague?</body> <thread>e0ffe42b28561960c6b12b944a092794b9683a38</thread> </message>presence stanza of type "unavailable" or, for historical reasons, "subscribe"): 1. <show/> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page12]11] Internet-Draft XMPP Instant MessagingAugust 2003 <message to='juliet@example.com/balcony' from='romeo@example.net/orchard' type='chat'> <body>Neither, fair saint, if either thee dislike.</body> <thread>e0ffe42b28561960c6b12b944a092794b9683a38</thread> </message> <message to='romeo@example.net/orchard' from='juliet@example.com/balcony' type='chat'> <body>How cam'st thou hither, tell me, and wherefore?</body> <thread>e0ffe42b28561960c6b12b944a092794b9683a38</thread> </message> Saint-Andre & Miller Expires February 20, 2004 [Page 13] Internet-Draft XMPP Instant Messaging AugustSeptember 20034. Exchanging Presence Information Exchanging presence information is made relatively straightforward within XMPP by using presence stanzas. However, we see here a contrast to2. <status/> 3. <priority/> 2.2.2.1 Show The OPTIONAL <show/> element specifies thehandlingparticular availability status ofmessages: althoughan entity or specific resource (if aclient MAY send directed presence information to another entity, normally presence information<show/> element issent from a client to its server (with no 'to' address) and then broadcasted by the server to any entities that are subscribed to the presence of the sending entity. (Note: in the terminology of RFC 2778 [6], the only watchersnot provided, default availability is assumed). Only one <show/> element MAY be included inXMPP are subscribers.) For information regarding the syntax ofa presencestanzas as well as their defined attributes and child elements, refer to XMPP Core [1]. 4.1 Clientstanza, andServer Responsibilities When a client connects to its server,it SHOULD(but isNOTREQUIRED to) send initial presence topossess any attributes. The CDATA value SHOULD be one of theserver in order to signal itsfollowing (values other than these four SHOULD be ignored; additional availabilityfor communications. Astypes could be definedherein,through a properly-namespaced child element of theinitialpresencestanza (1) MUST possess no 'to' address (signalling that itstanza): o away -- The entity or resource ismeant to be handled by the server on behalf of the user) and (2) MUST possesstemporarily away. o chat -- The entity or resource is actively interested in chatting. o xa -- The entity or resource is away for an extended period (xa = "eXtended Away"). o dnd -- The entity or resource is busy (dnd = "Do Not Disturb"). If no'type' attribute (signalling the user's availability). Upon receiving initial presence from a client, the user's server MUST do<show/> element is provided, thefollowing: 1. Send presence probes (i.e., presence stanzas whose 'type' attributeentity issetassumed to be online and available. 2.2.2.2 Status The OPTIONAL <status/> element contains avalue of "probe") from the full JID (<user@somedomain/resource>) of the user to the bare JID (<contact@otherdomain>)natural-language description ofany contacts to which the useravailability status. It issubscribed in order to determine if they are available; such contacts are those which are presentnormally used inthe user's rosterconjunction with the'subscription' attribute setshow element to provide avaluedetailed description of"to" or "both". (Note:an availability state (e.g., "In auser or clientmeeting"). The <status/> element SHOULD NOTsend presence probes.) 2. Broadcast initial presence frompossess any attributes, with thefull JID (<user@somedomain/ resource>)exception of theuser to the bare JID (<contact@otherdomain>)'xml:lang' attribute. Multiple instances ofany contacts that are subscribed to the user's presence; such contacts are those which are present in the user's roster withthe'subscription'<status/> element MAY be included but only if each instance possesses an 'xml:lang' attributeset to a value of "from" or "both". Upon receivingwith apresence probe fromdistinct language value. 2.2.2.3 Priority The OPTIONAL <priority/> element specifies theuser, the contact's server MUST send to the user the last known availability information (i.e., the full XMLpriority level of thelastconnected resource. The value may be any integer between -128 and +127. Only one <priority/> element MAY be included in a presencestanza) provided by each of the contact's active sessions (if there existstanza, and it MUST NOT possess any attributes. If noactive sessions, thepriority is provided, a server SHOULDNOT replyconsider the priority to be zero. For information regarding the semantics of priority values in stanza routing within instant messaging and presenceprobe). The server MUST sendapplications, refer to Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page14]12] Internet-Draft XMPP Instant MessagingAugustSeptember 2003this information subject to domain-specific access rules, and only if the user is inthecontact's roster withServer Rules for Handling XML Stanzas (Section 14) section of this document. 2.3 IQ Stanzas IQ stanzas provide asubscription statestructured request-response mechanism. The basic semantics of"from" or "both" andthat mechanism are defined in XMPP Core [1], whereas thecontact has not blocked outbound presence notificationsspecific semantics required tothe user's bare or full JID (ascomplete particular use cases are defined inSection 9.11). (Note: ifall cases by an extended namespace (Section 2.4) (note that theserver receives a presence probe from a subdomain'jabber:client' and 'jabber:server' namespaces do not define any children ofthe server's hostname or anotherIQ stanzas). This document defines two suchtrusted service, itextended namespaces, one for Roster Management (Section 7) and the other for Blocking Communication (Section 10); however, an IQ stanza MAYprovide presencecontain structured informationaboutqualified by any extended namespace. 2.4 Extended Namespaces While theuser to that entity.) Upon receiving initial presence fromthree XML stanza kinds defined in theuser,"jabber:client" or "jabber:server" namespace (along with their attributes and child elements) provide a basic level of functionality for messaging and presence, XMPP uses XML namespaces to extend thecontact's server MUST deliverstanzas for theuser's presencepurpose of providing additional functionality. Thus a message, presence, or IQ stanzatoMAY house one or more optional child elements containing content that extends thefull JIDs (<contact@otherdomain/resource>) associated with allmeaning of thecontact's active sessions, but only ifmessage (e.g., an XHTML-formatted version of theusermessage body). This child element MAY have any name and MUST possess an 'xmlns' namespace declaration (other than "jabber:client", "jabber:server", or "http:// etherx.jabber.org/streams") that defines all data contained within the child element. Support for any given extended namespace isinOPTIONAL on thecontact's roster with a subscription statepart of"to" or "both" and the contact hasany implementation. If an entity does notblocked inbound presence notifications fromunderstand such a namespace, theuser's bareentity's expected behavior depends on whether the entity is (1) the recipient orfull JID (as defined in Section 9.10). If(2) an entity that is routing theuser's server receives a presencestanzaof type "error" in responseto theinitial presencerecipient: Recipient: If a recipient receives a stanza thatit forwarded tocontains acontact on behalf of the user,child element it does not understand, it SHOULDNOT send further presence updates toignore thatcontact (until and unlessspecific XML data, i.e., itreceivesSHOULD not process it or present it to apresence probe from the contact). After sending initial presence, theuserMAY update and broadcast its presence information at any time during its active session by sendingor associated application (if any). In particular: * If an entity receives a message or presence stanzawith no 'to' address and either no 'type' attribute or a 'type' attribute with a value of "unavailable". (Note: a user's client SHOULD NOT send a presence update to broadcast informationthatchanges independently of the user's presence and availability.) If the presence stanza lacks a 'type' attribute (i.e., expresses availability), the user's server MUST broadcast the fullcontains XMLof that presence stanza to all contacts (1) that are in the user's roster withdata qualified by asubscription type of "from" or "both", (2) to whom the user has not blocked outbound presence, and (3) from whom the server hasnamespace it does notreceived a presence error during the user's session. Ifunderstand, thepresence stanza has a 'type' attribute set to a valueportion of"unavailable", the user's server MUST broadcastthefull XML of that presencestanzato all contacts meeting the three conditions just mentioned, as well as to any entities to which the user has sent directed available presence during the user's session (if the user has not yet sent directed unavailable presence tothatentity). A user MAY send directed presence to another entity (i.e., a presence stanza with a 'to' attribute whose valueis in theJID of the otherunknown namespace SHOULD be ignored. * If an entityand with either no 'type' attribute orreceives a'type' attribute whose value is "unavailable"). There are three possible cases: 1. If the user sends directed presence tomessage stanza containing only acontact that is in the user's roster withchild element qualified by asubscription type of "from" or "both" afternamespace it does not understand, it Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page15]13] Internet-Draft XMPP Instant MessagingAugustSeptember 2003having sent initial presence and before sending unavailable presence broadcast, the user's serverMUSTrouteignore the entire stanza. * If an entity receives an IQ stanza of type "get" ordeliver"set" containing a child element qualified by a namespace it does not understand, thefull XMLentity SHOULD return an IQ stanza ofthat presencetype "error" with an error condition of <feature-not-implemented/>. Router: If a routing entity (usually a server) handles a stanza(subject to privacy rules) but SHOULD NOT otherwise modify the contact's status regarding presence broadcast (i.e.,that contains a child element it does not understand, it SHOULDincludeignore thecontact's JID in any subsequent presence broadcasts initiatedassociated XML data bythe user). 2. If the user sends directed presencepassing it on untouched toan entity that is not intheuser's roster withrecipient. Saint-Andre & Miller Expires March 7, 2004 [Page 14] Internet-Draft XMPP Instant Messaging September 2003 3. Establishing asubscription type of "from" or "both" after having sent initial presenceSession Most instant messaging andbefore sending unavailablepresencebroadcast, the user's server MUST route or deliver the full XML ofapplications based on XMPP are implemented via a client-server architecture thatpresence stanzarequires a user tothe entity but MUST NOT modify the contact's status regarding available presence broadcast (i.e., it MUST NOT include the entity's JIDestablish a session on a server in order to engage inany subsequent broadcasts of available presence initiated by the user); however, if the connected resource from which the user sentthedirectedexpected instant messaging and presencebecome unavailable, the user's server MUST broadcastactivities. However, there are several pre-conditions thatunavailable presence to the entity (if the user has not yet sent directed unavailable presence to that entity). 3. If the user sends directed presence without first sending initial presence or after having sent unavailable presence broadcast, the user's server MUST treat the entities to which the user sends directed presence in the same way that it treats the entities listed in Case 2 above. Before ending its session withmust be met before aserver,user may establish such aclient SHOULD gracefully become unavailablesession. These include: 1. Account Provisioning -- methods for account provisioning include account creation bysending a final presence stanza that possesses no 'to' attribute and that possessesa'type' attribute whose value is "unavailable" (optionally, the final presence stanza MAY contain one or more <status/> elements specifyingserver administrator as well as in-band account registration using thereason why'jabber:iq:register' namespace; theuserlatter method isno longer available). However,documented by theuser'sJabber Software Foundation [7] at <http://www.jabber.org/protocol/> but is out of scope for this document. 2. Authentication and Resource Authorization -- methods for completing these pre-conditions are documented in XMPP Core [1]; note that client authentication with a server MUSTNOT depend on receiving final presence frominclude anavailable resource, since the resource may become unavailable unexpectedly. If the user's server detectsauthorization identity thatone ofspecifies theuser's resources has become unavailablefull JID (<user@somedomain/resource>) associated with the connection forany reason (either gracefully or ungracefully), it MUST broadcast unavailable presenceaddressing purposes. Before attempting toall contacts (1) that are in the user's rosterestablish a session, a client MUST authenticate with asubscription type of "from" or "both", (2) to whom the user has not blocked outbound presence, and (3) from whom theserverhas not receivedand authorize apresence error during the user's session; the user's serverfull JID; in order to then establish a session, it MUSTalsosendthat unavailable presence stanza to any entities to whicha session activation request (an IQ set containing a <session/gt; child element qualified by theuser'urn:ietf:params:xml:ns:xmpp-session' namespace) as follows: Step 1: Client requests session with server: <iq type='set' id='sess_1'> <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/> </iq> Step 2: Server informs client that session hassent directed presence duringbeen created: <iq type='result' id='sess_1'/> Several error conditions are possible. For example, theuser's session forserver may encounter an internal condition thatresource (ifprevents it from creating theuser has not yet sent directed unavailable presencesession, the username or authorization identity may lack permissions tothat entity). Any presence stanza with no 'type' attribute and no 'to' attribute that is sent after sending directed unavailable presencecreate a session, orbroadcasted unavailable presence MUSTthere may already bebroadcasted byan active session associated with an authzid of the same name. If the serverto all subscribers.encounters an internal condition that prevents it from creating the session, it MUST return an error. Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page16]15] Internet-Draft XMPP Instant MessagingAugustSeptember 20034.2 Specifying Availability Status A client MAY provide further information about its availability status by using the <show/> element. As mentioned in XMPP Core [1], the recognized values forStep 2 (alt): Server responds with error (internal server error): <iq type='error' id='sess_1'> <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/> <error type='wait'> <internal-server-error xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> If theshow element are: o away -- The entity or resource is temporarily away. o chat -- The entityusername orresourceauthorization identity isactively interested in chatting. o xa -- The entitynot allowed to create a session, the server MUST return an error. Step 2 (alt): Server responds with error (username orresourceauthzid not allowed to create session): <iq type='error' id='sess_1'> <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/> <error type='auth'> <not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> If there isaway foralready anextended period (xa = "eXtended Away"). o dnd -- The entityactive session associated with an authzid of the same name, the server MUST either (1) terminate the active session and allow the newly-requested session, orresource is busy (dnd = "Do Not Disturb"). Example: Availability status: <presence> <show>dnd</show> </presence> If no <show/> element(2) disallow the newly-requested session and maintain the existing session. Which of these the server does isprovided,up to theentityimplementation, although it isassumedRECOMMENDED tobe online and available. 4.3 Specifying Detailed Status Informationimplement (1). Inconjunction withcase (1), the<show/> element,server SHOULD send aclient MAY provide detailed status information by using<conflict/> stream error to the<status/> element. The content of this element isactive session; in case (2), the server SHOULD send anatural-language description of<conflict/> stanza error to theuser's current availability status. The contentnewly-requested session. Step 2 (alt): Server informs active session ofthe status element MUST be XML character data and the element MUST NOT contain mixed content. Multiple <status/> elements MAY be included, as long as each such element possesses an 'xml:lang' attribute with a distinct value. Example: Detailed status information: <presence xml:lang='en'> <show>dnd</show> <status>Wooing Juliet</status> <status xml:lang='cz'>Ja dvořím Juliet</status> </presence> 4.4 Specifying Presence Priority A client MAY provide a priority for itsresourceby using the <priority/> element. The contentconflict (case 1): <stream:error> <conflict xmlns='urn:ietf:params:xml:ns:xmpp-streams'/> </stream:error> </stream:stream> Step 2 (alt): Server informs newly-requested session ofthis element is an integer whose value is between -128 and +127. If a client does not provide theresource conflict (case 2): <iq type='error' id='sess_1'> <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/> <error type='cancel'> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page17]16] Internet-Draft XMPP Instant MessagingAugustSeptember 2003priority element in<conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> After establishing a session, a client SHOULD send initial presencestanza,and request itsserver SHOULD assume that the priority valueroster as described below, although these actions are NOT REQUIRED. Saint-Andre & Miller Expires March 7, 2004 [Page 17] Internet-Draft XMPP Instant Messaging September 2003 4. Exchanging Messages Exchanging messages iszero. Example: Presence priority: <presence xml:lang='en'> <show>dnd</show> <status>Wooing Juliet</status> <status xml:lang='cz'>Ja dvořím Juliet</status> <priority>1</priority> </presence> 4.5 Determining When a Contact Went Offline The server MUST maintainarecordbasic use ofthe time at whichXMPP and is effected when a userbecame unavailable (whether gracefully or ungracefully). An authorized subscriber to that user's presence MAY request the time of last activity by sending an IQgenerates a message stanza that is addressed to another user (or, more generally, another entity). As defined under Server Rules for Handling XML Stanzas (Section 14), theuser's bare JID (<user@somedomain>) containing an empty <query/> element qualified bysender's server is responsible for delivering the'jabber:iq:last' namespace: Example: Requestingmessage to thelast active time of an offline user: <iq type='get' to='user@somedomain'> <query xmlns='jabber:iq:last'/> </iq> Ifintended recipient (if theentity requesting the time of last activityrecipient isan authorized subscriberon the same server) or for routing the message to theuser's presence (i.e., exists inrecipient's server (if theuser's roster withrecipient is on a different server). For information regarding the'subscription' attribute setsyntax of message stanzas as well as their defined attributes and child elements, refer to XMPP Core [1]. 4.1 Specifying an Intended Recipient An instant messaging client SHOULD specify an intended recipient for avaluemessage by providing the JID of"from" or "both") andan entity other than theusersender in the 'to' attribute of the <message/> stanza. If the message isnot blocking IQ stanzasbeing sent in reply toanda message previously received from an address of theentity (as defined in Section 9.12),form <user@somedomain/resource> (e.g., within theserver SHOULD return an IQ stanzacontext oftype "result" witha chat session), thenumbervalue ofseconds sincetheuser was last active: Example: Returning'to' address SHOULD be thelast active time of an offline user: <iq from='user@somedomain' type='result' to='contact@otherdomain/resource'> <query seconds='76490' xmlns='jabber:iq:last'/> </iq> Iffull JID (<user@somedomain/resource>) rather than merely <user@somedomain> unless theentity requestingsender has knowledge (via presence) that thetime of last activityintended recipient's resource isnot an authorized subscriber to the user's presence (i.e., does not exist inno longer available. If theuser's roster withmessage is being sent outside the'subscription' attribute set to a valuecontext of"from"any existing chat session or"both"),received message, theserver MUST return an IQ stanza of type Saint-Andre & Miller Expires February 20, 2004 [Page 18] Internet-Draft XMPP Instant Messaging August 2003 "error" with an error conditionvalue offorbidden: Example: Requester is forbidden to viewthelast active time of an offline user: <iq from='user@somedomain' type='error' to='contact@otherdomain/resource'> <query xmlns='jabber:iq:last'/> <error type='auth'> <forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> Note: this document defines responses to requests for last active time only with regard to JIDs'to' address SHOULD be of the form<user@somedomain>, and only with regard to JIDs that correspond to an (offline) instant messaging user. The behavior of other JID forms (e.g., <user@somedomain/ resource> or <somedomain>) and entity types (e.g., online user or host) is out<user@somedomain> rather than <user@somedomain/resource>. 4.2 Specifying a Message Type xxx 4.3 Specifying a Message Body A message stanza MAY (and often will) contain a child <body/> element specifying the primary meaning ofscope and undefined. 4.6 Presence Examples The examples in this section illustratethepresence-related protocols described above.message. Theuser is romeo@example.net, he has authorized a resource "orchard",content of the body element MUST be XML character data andhe hasthefollowing individualselement MUST NOT contain mixed content (as defined inhis roster: o juliet@example.com (subscription="both" and she has two active sessions, one whose resource is "chamber" and another whose resource is "balcony") o benvolio@example.org (subscription="to") o mercutio@shakespeare.lit (subscription="from") Example 1: User sends initial presence: <presence/> Example 2: User's server sends presence probe to contacts with subscription="to" and subscription="both" on behalfSection 3.2.2 of theuser's connected resource: <presence type='probe' from='romeo@example.net/orchard' Saint-Andre & Miller Expires February 20, 2004 [Page 19] Internet-Draft XMPP Instant Messaging August 2003 to='juliet@example.com'/> <presence type='probe' from='romeo@example.net/orchard' to='benvolio@example.org'/> Example 3: User's server sends initial presenceXML specification [3]). If it is necessary tocontacts with subscription="from" and subscription="both" on behalfprovide the primary meaning in an alternate form (e.g., formatted using XHTML), the alternate form MUST be contained in some other child of theuser's connected resource: <presence from='romeo@example.net/orchard' to='juliet@example.com'/> <presence from='romeo@example.net/orchard' to='mercutio@shakespeare.lit'/> Example 4: Contacts' server replies to presence probe on behalf of all of the contact's available resources: <presence from='juliet@example.com/balcony' to='romeo@example.net/orchard' xml:lang='en'> <show>away</show> <status>be right back</status> <priority>0</priority> </presence> <presence from='juliet@example.com/chamber' to='romeo@example.net/orchard'> <priority>1</priority> </presence> <presence from='benvolio@example.org/pda' to='romeo@example.net/orchard' xml:lang='en'> <show>dnd</show> <status>gallivanting</status> </presence> Example 5: Contact's server delivers user's initial presencemessage stanza. However, multiple <body/> elements MAY be included toall ofprovide thecontact's available resources or returns error to user:primary meaning in different languages, as long as each such element possesses an 'xml:lang' attribute with a distinct value. Example: A message with a body: <message Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page20]18] Internet-Draft XMPP Instant MessagingAugustSeptember 2003<presence from='romeo@example.net/orchard' to='juliet@example.com/chamber'/> <presence from='romeo@example.net/orchard' to='juliet@example.com/balcony'/> <presence type='error' from='mercutio@shakespeare.lit' to='romeo@example.net/orchard'> <error type='cancel'> <remote-server-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </presence> Example 6: User sends directed presence to another user not in his roster: <presence from='romeo@example.net/orchard' to='nurse@example.com' xml:lang='en'> <show>dnd</show> <status>courting Juliet</status> <priority>0</priority> </presence> Example 7: User sends updated available presence information for broadcasting: <presenceto='romeo@example.net' from='juliet@example.com/balcony' xml:lang='en'><show>away</show> <status>I shall return!</status> <priority>1</priority> </presence> Example 8: Updated presence information is delivered only to<body>Wherefore art thou, Romeo?</body> <body xml:lang='cz'>PročeŽ jsi ty, Romeo?</body> </message> 4.4 Specifying a Message Subject A message stanza MAY contain onecontact (not those from whom an error was receivedorto whommore child <subject/> elements specifying theuser sent directed presence): <presence from='romeo@example.net/orchard' to='juliet@example.com/chamber' xml:lang='en'> <show>away</show> Saint-Andre & Miller Expires February 20, 2004 [Page 21] Internet-Draft XMPP Instant Messaging August 2003 <status>I shall return!</status> <priority>1</priority> </presence> <presence from='romeo@example.net/orchard' to='juliet@example.com/balcony' xml:lang='en'> <show>away</show> <status>I shall return!</status> <priority>1</priority> </presence> Example 9: Onetopic of thecontact's resources sends final presence: <presence type='unavailable'/> Example 10: Contact's server sends unavailable presence information to user: <presence type='unavailable'message. The content of the subject element MUST be XML character data and the element MUST NOT contain mixed content (as defined in Section 3.2.2 of the XML specification [3]). Multiple <subject/> elements MAY be included, as long as each such element possesses an 'xml:lang' attribute with a distinct value. Example: A message with a subject: <message to='romeo@example.net' from='juliet@example.com/balcony'to='romeo@example.net/orchard'/> Example 11: User sends final presence: <presence type='unavailable'xml:lang='en'><status>gone home</status> </presence> Example 12: Unavailable presence information<subject>I implore you!</subject> <subject xml:lang='cz'> Úpěnlivě prosim! </subject> <body>Wherefore art thou, Romeo?</body> <body xml:lang='cz'> PročeŽ jsi ty, Romeo? </body> </message> 4.5 Specifying a Conversation Thread A message stanza MAY contain a child <thread/> element specifying the conversation thread in which the message isdelivered to contact's one remaining resource as well as tosituated, for thepersonpurpose of tracking the conversation. The content of the <thread/> element is a random string that is generated by the sender in accordance with the algorithm specified in XMPP Core [1]; this string SHOULD be copied back towhomtheuser sent directed presence: <presence type='unavailable' from='romeo@example.net/orchard' to='juliet@example.com/chamber' xml:lang='en'> <status>gone home</status> </presence> <presence from='romeo@example.net/orchard' to='nurse@example.com' xml:lang='en'> <status>gone home</status>sender in subsequent replies. Example: A threaded conversation: <message to='romeo@example.net/orchard' from='juliet@example.com/balcony' Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page22]19] Internet-Draft XMPP Instant MessagingAugustSeptember 2003</presence>type='chat'> <body>Art thou not Romeo, and a Montague?</body> <thread>e0ffe42b28561960c6b12b944a092794b9683a38</thread> </message> <message to='juliet@example.com/balcony' from='romeo@example.net/orchard' type='chat'> <body>Neither, fair saint, if either thee dislike.</body> <thread>e0ffe42b28561960c6b12b944a092794b9683a38</thread> </message> <message to='romeo@example.net/orchard' from='juliet@example.com/balcony' type='chat'> <body>How cam'st thou hither, tell me, and wherefore?</body> <thread>e0ffe42b28561960c6b12b944a092794b9683a38</thread> </message> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page23]20] Internet-Draft XMPP Instant MessagingAugustSeptember 2003 5.Managing Subscriptions In order to protect the privacy of instant messaging users and any other entities,Exchanging Presence Information Exchanging presenceand availabilityinformation isdisclosed onlymade relatively straightforward within XMPP by using presence stanzas. However, we see here a contrast toother entities thattheuser has approved. Whenhandling of messages: although auser has agreed thatclient MAY send directed presence information to anotherentity may viewentity, normally presence information is sent from a client to itspresence,server (with no 'to' address) and then broadcasted by theentity is saidserver tohave a subscriptionany entities that are subscribed to theuser'spresenceinformation. A subscription lasts across sessions; indeed, it lasts untilof thesubscriber unsubscribes orsending entity. (Note: in thesubscribee cancelsterminology of RFC 2778 [8], we can say that thepreviously-granted subscription. Subscriptions are managed withinonly watchers in XMPPby sendingare subscribers.) For information regarding the syntax of presence stanzascontaining specially-defined attributes. Note: there are important interactions between subscriptions and rosters; these areas well as their definedunder Integration of Roster Items and Presence Subscriptions (Section 7),attributes andthe reader mustchild elements, refer tothat section for a complete understanding of presence subscriptions.XMPP Core [1]. 5.1RequestingClient and Server Presence Responsibilities When aSubscription A request to subscribeclient connects toanother entity's presenceits server, it SHOULD (but ismade by sending aNOT REQUIRED to) send initial presencestanza of type "subscribe". Example: Sending a subscription request: <presence to='juliet@example.com' type='subscribe'/> If the subscription request is being senttoanother instant messaging user,theJID suppliedserver inthe 'to' attribute SHOULD be of the form <contact@otherdomain> rather than <contact@otherdomain/ resource>. A user's serverorder to signal its availability for communications. As defined herein, the initial presence stanza (1) MUSTNOT automatically approve subscription requestspossess no 'to' address (signalling that it is meant to be handled by the server on behalf of theuser's behalf. All subscription requestsuser) and (2) MUSTbe directed topossess no 'type' attribute (signalling the user'sclient. If there is no available resource associated withavailability). Upon receiving initial presence from a client, theuser whenuser's server MUST do thesubscription requestfollowing: 1. Send presence probes (i.e., presence stanzas whose 'type' attribute isreceived byset to a value of "probe") from theserver,full JID (<user@somedomain/resource>) of theuser's server MUST storeuser to thesubscription request offline for delivery whenbare JID (<contact@otherdomain>) of any contacts to which the usernext becomes available. (Note:is subscribed in order to determine ifa resource has authorized a session but has not provided initial presence,they are available; such contacts are those which are present in theserver SHOULD NOT consider it to be available and therefore SHOULD NOT send subscription requestsuser's roster with the 'subscription' attribute set toit.) 5.2 HandlingaSubscription Request Whenvalue of "to" or "both". (Note: a user or clientreceives a subscription requestSHOULD NOT send presence probes.) 2. Broadcast initial presence fromanother entity, it MUST either approvetherequest by sending a presence stanzafull JID (<user@somedomain/ resource>) oftype "subscribed" or refusetherequest by sending a presence stanzauser to the bare JID (<contact@otherdomain>) oftype "unsubscribed". Saint-Andre & Miller Expires February 20, 2004 [Page 24] Internet-Draft XMPP Instant Messaging August 2003 Example: Approving a subscription request: <presence to='romeo@example.net' type='subscribed'/> Example: Refusing a presence subscription request: <presence to='romeo@example.net' type='unsubscribed'/> 5.3 Cancelling a Subscription from Another Entity If a user would likeany contacts that are subscribed to the user's presence; such contacts are those which are present in the user's roster with the 'subscription' attribute set tocancel a previously-granted subscription request, it sendsapresence stanzavalue oftype "unsubscribed". Example: Cancelling"from" or "both". Upon receiving apreviously granted subscription request: <presence to='romeo@example.net' type='unsubscribed'/> 5.4 Unsubscribingpresence probe fromAnother Entity's Presence If a user would likethe user, the contact's server MUST send tounsubscribe fromthepresenceuser the last known availability information (i.e., the full XML ofanother entity, it sends athe last presencestanzastanza) provided by each oftype "unsubscribe". Example: Unsubscribing from an entity's presence: <presence to='juliet@example.com' type='unsubscribe'/>the contact's active sessions (if there exist no active sessions, the server SHOULD NOT reply to the presence probe). The server MUST send Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page25]21] Internet-Draft XMPP Instant MessagingAugustSeptember 20036. Managing One's Roster In XMPP, one's contact listthis information subject to domain-specific access rules, and only if the user iscalled a roster, which consists of any number of specific roster items, eachin the contact's rosteritem being identified bywith aunique JID (usuallysubscription state of "from" or "both" and theform <contact@otherdomain>). A user's roster is stored bycontact has not blocked outbound presence notifications to the user'sserver onbare or full JID (as defined under Blocking Outbound Presence Notifications (Section 10.11)). (Note: if theuser's behalf so that the user may access roster informationserver receives a presence probe fromany available resource. Note: there are important interactions between rosters and subscriptions; these are defined under Integration of Roster Items and Presence Subscriptions (Section 7), and the reader must refer to that section foracomplete understandingsubdomain ofroster management. Note: a server MUST ignore any 'to' address on a roster "set", and MUST treat any roster "set" as applying tothesender. For added safety, a client SHOULD checkserver's hostname or another such trusted service, it MAY provide presence information about the"from" address of a roster "push"user toensurethatit isentity.) Upon receiving initial presence froma trusted source; specifically,the user, the contact's server MUST deliver the user's presence stanzashould have no 'from' attribute (i.e., implicitly fromto theserver) orfull JIDs (<contact@otherdomain/resource>) associated with all of theJID containedcontact's active sessions, but only if the user is in the'from' attribute should matchcontact's roster with a subscription state of "to" or "both" and the contact has not blocked inbound presence notifications from the user's bareJIDor fullJID; otherwise, the client SHOULD ignoreJID (as defined under Blocking Inbound Presence Notifications (Section 10.10)). If theroster "push". 6.1 Retrieving One's Roster on Login Upon connectinguser's server receives a presence stanza of type "error" in response to theserver,initial presence that it forwarded to aclientcontact on behalf of the user, it SHOULDrequestNOT send further presence updates to that contact (until and unless it receives a presence probe from theroster (however, because receivingcontact). After sending initial presence, theroster may not be desirable for all resources, e.g., a connection with limited bandwidth, the client's request for the roster is NOT REQUIRED). If an available resource does not request the rosteruser MAY update and broadcast its presence information at any time during its active session by sending asession, the server SHOULD NOT send itpresencesubscriptionsstanza with no 'to' address andassociated "roster pushes". Example: Client requests current roster from server: <iq type='get' id='roster_1'> <query xmlns='jabber:iq:roster'/> </iq> Example: Client receives roster from the server: <iq id='roster_1' type='result'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' name='Romeo' subscription='both'> <group>Friends</group> </item> <item jid='mercutio@shakespeare.lit' name='Mercutio' Saint-Andre & Miller Expires February 20, 2004 [Page 26] Internet-Draft XMPP Instant Messaging August 2003 subscription='both'> <group>Friends</group> </item> <item jid='benvolio@example.org' name='Benvolio' subscription='both'> <group>Friends</group> </item> </query> </iq> 6.2 Adding a Roster Item At any time, a user MAY add an item to hiseither no 'type' attribute orher roster. Example: Client addsanew item: <iq type='set' id='roster_2'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' name='Nurse'> <group>Servants</group> </item> </query> </iq> The'type' attribute with a value ofthe 'jid' attribute"unavailable". (Note: a user's client SHOULDbeNOT send a presence update to broadcast information that changes independently of theform <user@somedomain>, especially ifuser's presence and availability.) If theitem is associated with another (human) instant messaging user. Thepresence stanza lacks a 'type' attribute (i.e., expresses availability), the user's server MUSTupdate the roster information in persistent storage, and also pushbroadcast thechange outfull XML of that presence stanza to allof the user's available resourcescontacts (1) thathave requestedare in theroster. This "roster push" consistsuser's roster with a subscription type ofan IQ set"from" or "both", (2) to whom the user has not blocked outbound presence, and (3) from whom the server has not received a presence error during the user's session. If the presence stanza has a 'type' attribute set to a value of "unavailable", theclient and enablesuser's server MUST broadcast the full XML of that presence stanza to all contacts meeting the three conditions just mentioned, as well as to any entities to which the user has sent directed availableresourcespresence during the user's session (if the user has not yet sent directed unavailable presence toremain in syncthat entity). A user MAY send directed presence to another entity (i.e., a presence stanza with a 'to' attribute whose value is theserver-based roster information. Example: Server (1) pushesJID of theupdated roster information to all available resourcesother entity and(2) replieswithan IQ result to the sending resource: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' name='Nurse' subscription='none'> <group>Servants</group> </item>either no 'type' attribute or a 'type' attribute whose value is "unavailable"). There are three possible cases: Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page27]22] Internet-Draft XMPP Instant MessagingAugustSeptember 2003</query> </iq> <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' name='Nurse' subscription='none'> <group>Servants</group> </item> </query> </iq> <iq type='result' id='roster_2'/> Example: Connected resources reply with an IQ result to1. If theserver: <iq from='juliet@example.com/balcony' to='example.com' type='result'/> <iq from='juliet@example.com/chamber' to='example.com' type='result'/> 6.3 Updatinguser sends directed presence to aRoster Item Updating an existing roster item (e.g., changing the group)contact that isdonein thesame way as adding a new roster item, i.e., by sending theuser's rosteritem in an IQ set to the server. Example: User updates roster item (added group): <iq 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> Aswithadding a roster item, when updatingaroster itemsubscription type of "from" or "both" after having sent initial presence and before sending unavailable presence broadcast, the user's server MUSTupdateroute or deliver theroster information in persistent storage, and also initiate a "roster push" to allfull XML ofthe user's available resourcesthathave requestedpresence stanza (subject to privacy rules) but SHOULD NOT otherwise modify theroster. Saint-Andre & Miller Expires February 20, 2004 [Page 28] Internet-Draft XMPP Instant Messaging August 2003 6.4 Deleting a Roster Item Atcontact's status regarding presence broadcast (i.e., it SHOULD include the contact's JID in anytime, a user MAY delete an item from its rostersubsequent presence broadcasts initiated bydoing an IQ set and making sure thatthevalue ofuser). 2. If the'subscription' attributeuser sends directed presence to an entity that is"remove" (a compliant server MUST ignore any other values ofnot in the'subscription' attribute when received from a client). Example: Client removes an item: <iq type='set' id='roster_4'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' subscription='remove'/> </query> </iq> As with adding auser's rosteritem, when deletingwith aroster itemsubscription type of "from" or "both" after having sent initial presence and before sending unavailable presence broadcast, the user's server MUSTupdateroute or deliver theroster information in persistent storage, initiate a "roster push" to allfull XML ofthe user's available resourcesthathave requestedpresence stanza to theroster (withentity but MUST NOT modify the'subscription' attribute set to a value of "remove"), and send an IQ result to the initiating resource. For further information aboutcontact's status regarding available presence broadcast (i.e., it MUST NOT include theimplications of this command, see Section 7.6. Saint-Andre & Miller Expires February 20, 2004 [Page 29] Internet-Draft XMPP Instant Messaging August 2003 7. Integration of Roster Items and Presence Subscriptions 7.1 Overview Some levelentity's JID in any subsequent broadcasts ofintegration between roster items andavailable presencesubscriptions is normally expectedinitiated byan instant messaging user regardingtheuser's subscriptions to and from other contacts. This section describesuser); however, if thelevel of integration that must be supported within XMPP IM. There are four primary subscription states: o None -- Neitherconnected resource from which the usernor the contact is subscribed tosent theother'sdirected presenceo To -- The user is subscribed tobecome unavailable, thecontact'suser's server MUST broadcast that unavailable presencebut there is no subscription from the contact to the user o From -- There is a subscription from the contactto theuser, butentity (if the user has notsubscribedyet sent directed unavailable presence to that entity). 3. If thecontact'suser sends directed presenceo Both -- Bothwithout first sending initial presence or after having sent unavailable presence broadcast, theuser anduser's server MUST treat thecontact are subscribedentities toeach other's presence (i.e.,which theunion of 'from' and 'to') Each of these states is reflecteduser sends directed presence in theroster of both the user andsame way that it treats thecontact, thus resultingentities listed indurable subscription states. Narrative explanations of how these subscription states interact with roster items in order to complete certain defined use cases are provided in the following sub-sections. Full details regarding server andCase 2 above. Before ending its session with a server, a clienthandling of all subscription states (including pending states between the primary states listed above) is provided in Section 8. IfSHOULD gracefully become unavailable by sending aconnected resource does not both send initialfinal presence stanza that possesses no 'to' attribute andrequestthat possesses a 'type' attribute whose value is "unavailable" (optionally, theroster,final presence stanza MAY contain one or more <status/> elements specifying the reason why the user is no longer available). However, the user's serverSHOULDMUST NOTsend itdepend on receiving final presencesubscription requests or "roster pushes". The 'from' and 'to' addresess are OPTIONAL in roster pushes; if included, their values SHOULD be the full JID offrom an available resource, since the resourceformay become unavailable unexpectedly. If the user's server detects thatsession. A client MUST acknowledge each "roster push" with an IQ stanzaone oftype "result" (forthesake of brevity, these stanzasuser's resources has become unavailable for any reason (either gracefully or ungracefully), it MUST broadcast unavailable presence to all contacts (1) that arenot shownin thefollowing examples but are required by XMPP Core [1]). 7.2 User Subscribes to Contact The process by whichuser's roster with auser subscribessubscription type of "from" or "both", (2) toa contact, includingwhom theinteraction between roster itemsuser has not blocked outbound presence, andsubscription states, is defined below. Saint-Andre & Miller Expires February 20, 2004 [Page 30] Internet-Draft XMPP Instant Messaging August 2003 1. In preparation for being able to render(3) from whom thecontact inserver has not received a presence error during the user'sclient interface and forsession; the user's server MUST also send that unavailable presence stanza tokeep track ofany entities to which thesubscription,user has sent directed presence during the user'sclient SHOULD perform a "roster set"session forthe new roster item. This request consists of an IQ stanza of type='set' containing a <query/> element in the 'jabber:iq:roster' namespace, which in turn contains an <item/> elementthatdefines the new roster item;resource (if the<item/> element MUST possess a 'jid' attribute, MAY possess a 'name' attribute, MUST NOT possess a 'subscription' attribute,user has not yet sent directed unavailable presence to that entity). Any presence stanza with no 'type' attribute andMAY contain oneno 'to' attribute that is sent after Saint-Andre & Miller Expires March 7, 2004 [Page 23] Internet-Draft XMPP Instant Messaging September 2003 sending directed unavailable presence ormore <group/> child elements: <iq type='set' id='int1'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> 2. As a result, the user's server (1)broadcasted unavailable presence MUSTinitiate a "roster push" forbe broadcasted by thenew roster itemserver to allavailable resources associated with this user that have requestedsubscribers. 5.2 Specifying Availability Status A client MAY provide further information about its availability status by using theroster, setting<show/> element. Example: Availability status: <presence> <show>dnd</show> </presence> If no <show/> element is provided, the'subscription' attributeentity is assumed toa value of "none";be online and(2) MUST reply with an IQ stanza of type='result': <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain' subscription='none' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> <iq type='result' id='int1'/> 3. Ifavailable. 5.3 Specifying Detailed Status Information In conjunction with theuser wants to request<show/> element, asubscription toclient MAY provide detailed status information by using thecontact's presence,<status/> element. The content of this element is a natural-language description of the user'sclient MUST send a presence stanzacurrent availability status. The content oftype='subscribe' tothecontact: <presence to='contact@otherdomain' type='subscribe'/> 4. As a result,status element MUST be XML character data and theuser's serverelement MUSTinitiate a second "roster push" to allNOT contain mixed content (as defined in Section 3.2.2 of theuser's available resources that haveXML specification [3]). Multiple <status/> elements MAY be included, as long as each such element possesses an 'xml:lang' attribute with a distinct value. Example: Detailed status information: <presence xml:lang='en'> <show>dnd</show> <status>Wooing Juliet</status> <status xml:lang='cz'>Ja dvořím Juliet</status> </presence> 5.4 Specifying Presence Priority A client MAY provide a priority for its resource by using the <priority/> element (see Priority (Section 2.2.2.3)). Example: Presence priority: <presence xml:lang='en'> <show>dnd</show> <status>Wooing Juliet</status> <status xml:lang='cz'>Ja dvořím Juliet</status> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page31]24] Internet-Draft XMPP Instant MessagingAugustSeptember 2003requested the roster, setting the contact to the pending sub-state of the 'none' subscription state; this pending sub-state is denoted by the inclusion of the ask='subscribe' attribute<priority>1</priority> </presence> 5.5 Presence Examples The examples in this section illustrate theroster item: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain' subscription='none' ask='subscribe' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> Note: if thepresence-related protocols described above. The userdid not createis romeo@example.net, he has authorized aroster item before sending the subscription request,resource "orchard", and he has theserver MUST now createfollowing individuals in his roster: o juliet@example.com (subscription="both" and she has two active sessions, one whose resource is "chamber" andsend a "roster push"another whose resource is "balcony") o benvolio@example.org (subscription="to") o mercutio@shakespeare.lit (subscription="from") Example 1: User sends initial presence: <presence/> Example 2: User's server sends presence probe toallcontacts with subscription="to" and subscription="both" on behalf of the user'savailable resources that have requested the roster, absent the 'name' attributeconnected resource: <presence type='probe' from='romeo@example.net/orchard' to='juliet@example.com'/> <presence type='probe' from='romeo@example.net/orchard' to='benvolio@example.org'/> Example 3: User's server sends initial presence to contacts with subscription="from" and subscription="both" on behalf of the<group/ > child. 5. Theuser's connected resource: <presence from='romeo@example.net/orchard' to='juliet@example.com'/> <presence from='romeo@example.net/orchard' to='mercutio@shakespeare.lit'/> Saint-Andre & Miller Expires March 7, 2004 [Page 25] Internet-Draft XMPP Instant Messaging September 2003 Example 4: Contacts' serverMUST also stamp thereplies to presencestanzaprobe on behalf of all oftype "subscribe" with the user's bare JID (i.e., <user@somedomain>) as the 'from' address. If the contact is served by a different host than the user,theuser'scontact's available resources: <presence from='juliet@example.com/balcony' to='romeo@example.net/orchard' xml:lang='en'> <show>away</show> <status>be right back</status> <priority>0</priority> </presence> <presence from='juliet@example.com/chamber' to='romeo@example.net/orchard'> <priority>1</priority> </presence> <presence from='benvolio@example.org/pda' to='romeo@example.net/orchard' xml:lang='en'> <show>dnd</show> <status>gallivanting</status> </presence> Example 5: Contact's serverMUST route thedelivers user's initial presencestanzato all of the contact'sserver for deliveryavailable resources or returns error tothe contact (this case is assumed throughout; however, if the contact is served by the same host, then the server can simply deliver the presence stanza directly):user: <presencefrom='user@somedomain' to='contact@otherdomain' type='subscribe'/> 6. Upon receiving the presence stanza of type "subscribe" addressedfrom='romeo@example.net/orchard' to='juliet@example.com/chamber'/> <presence from='romeo@example.net/orchard' to='juliet@example.com/balcony'/> <presence type='error' from='mercutio@shakespeare.lit' to='romeo@example.net/orchard'> <error type='cancel'> <remote-server-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </presence> Saint-Andre & Miller Expires March 7, 2004 [Page 26] Internet-Draft XMPP Instant Messaging September 2003 Example 6: User sends directed presence tothe contact, the contact's server must determine if there is at least one active sessionanother user not inwhich the contact has senthis roster: <presence from='romeo@example.net/orchard' to='nurse@example.com' xml:lang='en'> <show>dnd</show> <status>courting Juliet</status> <priority>0</priority> </presence> Example 7: User sends updated available presenceand has requested the roster. If so, it MUST deliver the subscription request to the contact (if not, the contact's server MUST store the subscription request offlineinformation fordelivery when this condition is next met). No matter when the subscription requestbroadcasting: <presence xml:lang='en'> <show>away</show> <status>I shall return!</status> <priority>1</priority> </presence> Example 8: Updated presence information isdelivered, the contact must decide whether or not to approve it (subjectdelivered only toconfigured preferences, the contact's client MAY approveone contact (not those from whom an error was received orrefuse the subscription request without presenting itto whom thecontact). Here we assumeuser sent directed presence): <presence from='romeo@example.net/orchard' to='juliet@example.com/chamber' xml:lang='en'> <show>away</show> <status>I shall return!</status> <priority>1</priority> </presence> <presence from='romeo@example.net/orchard' to='juliet@example.com/balcony' xml:lang='en'> <show>away</show> <status>I shall return!</status> <priority>1</priority> </presence> Example 9: One of the contact's resources sends final presence: <presence type='unavailable'/> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page32]27] Internet-Draft XMPP Instant MessagingAugustSeptember 2003"happy path" that the contact approves the subscription request (the alternate flow of declining the subscription request is defined in Section 7.2.1). In this case, the contact's client (1) SHOULD perform a roster set specifying the desired nickname and group for the user; and (2) MUST send aExample 10: Contact's server sends unavailable presencestanza of type "subscribed" to the user in orderinformation toapprove the subscription request. <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@somedomain' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq>user: <presenceto='user@somedomain' type='subscribed'/> 7. As a result, the contact's server (1) MUST initiate a "roster push" to all available resources associated with the contact that have requested the roster, containing a roster item for the user with the subscription state set to 'from'; (2) MUST route thetype='unavailable' from='juliet@example.com/balcony' to='romeo@example.net/orchard'/> Example 11: User sends final presence: <presence type='unavailable' xml:lang='en'> <status>gone home</status> </presence> Example 12: Unavailable presencestanza of type "subscribed"information is delivered tothe user; and (3) MUST send available presence from all of thecontact'savailable resourcesone remaining resource as well as to theuser: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@somedomain' subscription='from' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq>person to whom the user sent directed presence: <presencefrom='contact@otherdomain/resource' to='user@somedomain' type='subscribed'/>type='unavailable' from='romeo@example.net/orchard' to='juliet@example.com/chamber' xml:lang='en'> <status>gone home</status> </presence> <presencefrom='contact@otherdomain/resource' to='user@somedomain'/>from='romeo@example.net/orchard' to='nurse@example.com' xml:lang='en'> <status>gone home</status> </presence> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page33]28] Internet-Draft XMPP Instant MessagingAugustSeptember 20038. Upon receiving6. Managing Subscriptions In order to protect thepresence stanzaprivacy oftype "subscribed" addressedinstant messaging users and any other entities, presence and availability information is disclosed only to other entities that theuser, the user's server MUST first verifyuser has approved. When a user has agreed that another entity may view its presence, thecontactentity isinsaid to have a subscription to the user'sroster with either ofpresence information. A subscription lasts across sessions; indeed, it lasts until thefollowing states: (a) subscription='none', ask='subscribe'subscriber unsubscribes or(b) subscription='from', ask='subscribe'. Ifthecontact is not insubscribee cancels theuser's roster with eitherpreviously-granted subscription. Subscriptions are managed within XMPP by sending presence stanzas containing specially-defined attributes. Note: there are important interactions between subscriptions and rosters; these are defined under Integration ofthose states, the user's server MUST silently ignoreRoster Items and Presence Subscriptions (Section 8), and the reader must refer to that section for a complete understanding of presence subscriptions. 6.1 Requesting a Subscription A request to subscribe to another entity's presence is made by sending a presence stanza of type"subscribed" (i.e., it MUST NOT route it to the user, modify the user's roster, or generate"subscribe". Example: Sending aroster push to the user's available resources).subscription request: <presence to='juliet@example.com' type='subscribe'/> If thecontactsubscription request is being sent to another instant messaging user, the JID supplied in theuser's roster with either'to' attribute SHOULD be ofthose states,the form <contact@otherdomain> rather than <contact@otherdomain/ resource>. A user's server(1)MUSTdeliver the presence stanza of type "subscribed" from the contact toNOT automatically approve subscription requests on theuser; (2)user's behalf. All subscription requests MUSTinitiate a "roster push"be directed toall ofthe user's client. If there is no availableresources that have requested the roster, containing an updated roster item for the contactresource associated with the'subscription' attribute set to a value of "to"; and (3) MUST deliveruser when theavailable presence stanzasubscription request is receivedfrom each ofby thecontact's available resources to each ofserver, the user'savailable resources: <presence to='user@somedomain' from='contact@otherdomain' type='subscribed'/> <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain' subscription='to' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> <presence from='contact@otherdomain/resource' to='user@somedomain/resource'/> 9. Upon receivingserver MUST store thepresence stanza of type "subscribed",subscription request offline for delivery when the user next becomes available. (Note: if a resource has authorized a session but has not provided initial presence, the server SHOULDacknowledge receipt of thatNOT consider it to be available and therefore SHOULD NOT send subscriptionstate notification through either "affirming"requests to it.) 6.2 Handling a Subscription Request When a client receives a subscription request from another entity, it MUST either approve the request by sending a presence stanza of type"subscribe" to the contact"subscribed" or"denying" itrefuse the request by sending a presence stanza of type"unsubscribe" to the contact; this step does not necessarily affect the subscription state (see Section 8 for details), but instead lets the user's server know that it must no longer send notification of the subscription state change to the user (see Section 8.6)."unsubscribed". Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page34]29] Internet-Draft XMPP Instant MessagingAugustSeptember 2003From the perspective of the user, there now existsExample: Approving a subscriptionto the contact; from the perspective of the contact, there now existsrequest: <presence to='romeo@example.net' type='subscribed'/> Example: Refusing a presence subscription request: <presence to='romeo@example.net' type='unsubscribed'/> 6.3 Cancelling a Subscription fromthe user. (Note:Another Entity Ifat this point thea user would like to cancel a previously-granted subscription request, it sendsanothera presence stanza of type "unsubscribed". Example: Cancelling a previously granted subscriptionrequest to the contact, the user's server MUST silently ignore that request.) 7.2.1 Alternate Flow: Contact Declines Subscription Request The above activity flow represents the "happy path" relatedrequest: <presence to='romeo@example.net' type='unsubscribed'/> 6.4 Unsubscribing from Another Entity's Presence If a user would like tothe user's subscription request to the contact. The main alternate flow occurs if the contact refuses the user's subscription request. 1. If the contact wants to refuse the request, the contact's client MUST send a presence stanza of type "unsubscribed" to the user (instead ofunsubscribe from the presencestanza of type "subscribed" sent in Step 6ofSection 7.2): <presence to='user@somedomain' type='unsubscribed'/> 2. Asanother entity, it sends aresult, the contact's server MUST route the presence stanza of type "unsubscribed" to the user, first stamping the 'from' address as the bare JID (<contact@otherdomain>) of the contact: <presence from='contact@otherdomain' to='user@somedomain' type='unsubscribed'/> 3. Upon receiving thepresence stanza of type"unsubscribed" addressed to the user, the user's server (1) MUST deliver that presence stanza to the user and (2) MUST initiate a "roster push" to all of the user's available resources that have requested the roster, containing"unsubscribe". Example: Unsubscribing from anupdated roster item for the contact with the 'subscription' attribute set to a value of "none" and with no 'ask' attribute:entity's presence: <presencefrom='contact@otherdomain' to='user@somedomain' type='unsubscribed'/> <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain' subscription='none' name='MyContact'> <group>MyBuddies</group>to='juliet@example.com' type='unsubscribe'/> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page35]30] Internet-Draft XMPP Instant MessagingAugustSeptember 2003</item> </query> </iq> 4. Upon receiving the presence stanza7. Roster Management In XMPP, one's contact list is called a roster, which consists oftype "unsubscribed", the user SHOULD acknowledge receiptany number ofthat subscription state notification through either "affirming" itspecific roster items, each roster item being identified bysendingapresence stanzaunique JID (usually oftype "unsubscribe" tothecontact or "denying" itform <contact@otherdomain>). A user's roster is stored bysending a presence stanza of type "subscribe" to the contact; this step does not necessarily affect the subscription state (see Section 8 for details), but instead letsthe user's serverknowon the user's behalf so thatit must no longer send notificationthe user may access roster information from any available resource. Note: there are important interactions between rosters and subscriptions; these are defined under Integration of Roster Items and Presence Subscriptions (Section 8), and thesubscription state changereader must refer tothe user (see Section 8.6). Asthat section for aresultcomplete understanding ofthis activity,roster management. 7.1 Syntax and Semantics Rosters are managed using IQ stanzas, specifically by means of a <query/> child element qualified by thecontact'jabber:iq:roster' namespace. The <query/> element may contain one or more <item/> children, each describing a unique roster item or "contact". The "key" or unique identifier for each roster item isnowa JID, encapsulated in theuser's rosterrequired 'jid' attribute of the <item/> element. The value of the 'jid' attribute SHOULD be of the form <user@somedomain>, especially if the item is associated witha subscriptionanother (human) instant messaging user. The state of"none", whereastheuserpresence subscription in relation to to a roster item isnotcaptured in thecontact's roster at all. 7.3 Creating a Mutual Subscription The user and contact can build on'subscription' attribute of theforegoing to create a mutual subscription (i.e.,<item/> element. Allowable values for this attribute are "none" (the user does not have a subscriptionof type "both"). The process is defined below. 1. If the contact wantstocreate a mutual subscription,the contact, and the contactMUST senddoes not have a subscriptionrequestto the user), "to" (the user(subjecthas a subscription toconfigured preferences,thecontact's client MAY send this automatically): <presence to='user@somedomain' type='subscribe'/> 2. As a result,contact, but thecontact's server (1) MUST initiatecontact does not have a"roster push"subscription toall available resources associated withthe user), "from" (the contactthathas a subscription to the user, but the user does not haverequesteda subscription to theroster, withcontact), and "both" (both the userstill inand the'from' subscription state but withcontact have subscriptions to each other). Each <item/> element MAY contain apending 'to' subscription denoted'name' attribute, which sets the "nickname" to be associated with the JID, as determined by theinclusionuser (not the contact). The value of theask='subscribe''name' attribute is opaque. Each <item/> element MAY contain one or more <group/> child elements, for use in categorizing JIDs in various "buckets". The CDATA text of the <group/> element is opaque. 7.2 Business Rules A server MUST ignore any 'to' address on a rosteritem;"set", and(2)MUSTroute the presence stanza of type "subscribe" to the user, first stamping the 'from' addresstreat any roster "set" as applying to thebare JID (<contact@otherdomain>) of the contact: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@somedomain' subscription='from' ask='subscribe' name='SomeUser'> <group>SomeGroup</group>sender. For added safety, a Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page36]31] Internet-Draft XMPP Instant MessagingAugustSeptember 2003</item> </query> </iq> <presence from='contact@otherdomain' to='user@somedomain' type='subscribe'/> 3. Upon receivingclient SHOULD check thepresence stanza"from" address oftype "subscribe" addresseda roster "push" to ensure that it is from a trusted source; specifically, theuser,stanza should have no 'from' attribute (i.e., implicitly from theuser's server must determine if there is at least one active sessionserver) or the JID contained inwhichtheuser has sent available presence and has requested the roster. If so,'from' attribute should match the user'sserver MUST deliver the subscription request to the user (if not, it MUST store the subscription request offline for delivery when this condition is next met). No matter when the subscription request is delivered, the user must then decide whetherbare JID ornot to approve it (subject to configured preferences,full JID; otherwise, theuser'sclientMAY approve or refuseSHOULD ignore thesubscription request without presenting itroster "push". 7.3 Retrieving One's Roster on Login Upon connecting to theuser). Here we assume the "happy path" that the user approves the subscription request (the alternate flow of declining the subscription request is defined in Section 7.3.1). In this case, the user's client MUST sendserver, apresence stanza of type "subscribed" toclient SHOULD request thecontact in order to approveroster (however, because receiving thesubscription request. <presence to='contact@otherdomain' type='subscribed'/> 4. Asroster may not be desirable for all resources, e.g., aresult,connection with limited bandwidth, theuser's server (1) MUST initiate a "roster push" to all ofclient's request for theuser'sroster is NOT REQUIRED). If an availableresources that have requestedresource does not request theroster, containing arosteritem for the contact with the 'subscription' attribute set toduring avalue of "both"; (2) MUST route the presence stanza of type "subscribed" to the contact, first stamping the 'from' address as the bare JID (<user@somedomain>) ofsession, theuser; and (3) MUSTserver SHOULD NOT sendavailableit presence subscriptions and associated "roster pushes". Example: Client requests current roster fromeach of the user's available resources to the contact:server: <iqtype='set'>type='get' id='roster_1'> <queryxmlns='jabber:iq:roster'> <item jid='contact@otherdomain' subscription='both' name='MyContact'> <group>MyBuddies</group>xmlns='jabber:iq:roster'/> </iq> Example: Client receives roster from the server: <iq id='roster_1' type='result'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' name='Romeo' subscription='both'> <group>Friends</group> </item> <item jid='mercutio@shakespeare.lit' name='Mercutio' subscription='from'> <group>Friends</group> </item> <item jid='benvolio@example.org' name='Benvolio' subscription='both'> <group>Friends</group> </item> </query> </iq> 7.4 Adding a Roster Item At any time, a user MAY add an item to his or her roster. Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page37]32] Internet-Draft XMPP Instant MessagingAugustSeptember 2003<presence from='user@somedomain' to='contact@otherdomain' type='subscribed'/> <presence from='user@somedomain/resource' to='contact@otherdomain'/> 5. Upon receiving the presence stanza of type "subscribed" addressed to the contact, the contact'sExample: Client adds a new item: <iq type='set' id='roster_2'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' name='Nurse'> <group>Servants</group> </item> </query> </iq> The server MUSTfirst verify that the user is inupdate thecontact'srosterwith either of the following states: (a) subscription='none', ask='subscribe' or (b) subscription='from', ask='subscribe'. If the user is notinformation in persistent storage, and also push thecontact's roster with eitherchange out to all ofthose states,thecontact's server MUST silently ignoreuser's available resources that have requested thepresence stanzaroster. This "roster push" consists oftype "subscribed" (i.e., it MUST NOT route it to the contact, modifyan IQ set from thecontact's roster, or generate a roster pushserver to thecontact'sclient and enables all availableresources). If the user isresources to remain inthe contact's rostersync witheither of those states,thecontact's serverserver-based roster information. Example: Server (1)MUST deliver the presence stanza of type "subscribed" from the user topushes thecontact; (2) MUST initiate a "roster push"updated roster information to all available resourcesassociatedand (2) replies withthe contact that have requested the roster, containinganupdated roster item forIQ result to theuser with the 'subscription' attribute set to a value of "both"; and (3) MUST deliver the available presence stanza received from each of the user's available resources to each of the contact's available resources: <presence from='user@somedomain' to='contact@otherdomain' type='subscribed'/>sending resource: <iq type='set'> <query xmlns='jabber:iq:roster'> <itemjid='user@somedomain' subscription='both' name='SomeUser'> <group>SomeGroup</group>jid='nurse@example.com' name='Nurse' subscription='none'> <group>Servants</group> </item> </query> </iq><presence from='user@somedomain/resource' to='contact@otherdomain/resource'/><iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' name='Nurse' subscription='none'> <group>Servants</group> </item> </query> </iq> <iq type='result' id='roster_2'/> Example: Connected resources reply with an IQ result to the server: <iq from='juliet@example.com/balcony' to='example.com' type='result'/> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page38]33] Internet-Draft XMPP Instant MessagingAugustSeptember 20036. Upon receiving<iq from='juliet@example.com/chamber' to='example.com' type='result'/> 7.5 Updating a Roster Item Updating an existing roster item (e.g., changing thepresence stanza of type "subscribed",group) is done in thecontact SHOULD acknowledge receipt of that subscription state notification through either "affirming" it by sendingsame way as adding apresence stanza of type "subscribe" to the user or "denying" itnew roster item, i.e., by sendinga presence stanza of type "unsubscribe" totheuser; this step does not necessarily affectroster item in an IQ set to thesubscription state (see Section 8 for details), but instead letsserver. Example: User updates roster item (added group): <iq 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> As with adding a roster item, when updating a roster item thecontact'sserverknow that it must no longer send notification of the subscription state change toMUST update thecontact (see Section 8.6). The userroster information in persistent storage, andthe contact now havealso initiate amutual subscription"roster push" toeach other's presence -- i.e., the subscription is of type "both". The user's server MUST now sendall of the user'scurrent presence information to the contact. (Note: If at this pointavailable resources that have requested theuser sendsroster. 7.6 Deleting asubscription request to the contact or the contact sendsRoster Item At any time, asubscription request touser MAY delete an item from its roster by doing an IQ set and making sure that theuser,value of thesending user's'subscription' attribute is "remove" (a compliant server MUSTsilentlyignorethat request and not route it toany other values of theintended recipient.) 7.3.1 Alternate Flow: User Declines Subscription Request The above activity flow represents'subscription' attribute when received from a client). Example: Client removes an item: <iq type='set' id='roster_4'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' subscription='remove'/> </query> </iq> As with adding a roster item, when deleting a roster item the"happy path" related toserver MUST update thecontact's subscription requestroster information in persistent storage, initiate a "roster push" to all of theuser. The main alternate flow occurs if the user refusesuser's available resources that have requested thecontact's subscription request. 1. Ifroster (with theuser wants'subscription' attribute set torefuse the request, the user's client MUST sendapresence stanzaSaint-Andre & Miller Expires March 7, 2004 [Page 34] Internet-Draft XMPP Instant Messaging September 2003 value oftype "unsubscribed""remove"), and send an IQ result to thecontact (instead ofinitiating resource. For further information about thepresence stanza of type "subscribed" sent in Step 3implications ofSection 7.3): <presence to='contact@otherdomain' type='unsubscribed'/> 2. Asthis command, see Removing aresult, the user's server MUST route the presence stanzaRoster Item and Cancelling All Subscriptions (Section 8.6). Saint-Andre & Miller Expires March 7, 2004 [Page 35] Internet-Draft XMPP Instant Messaging September 2003 8. Integration oftype "unsubscribed" to the contact, first stampingRoster Items and Presence Subscriptions 8.1 Overview Some level of integration between roster items and presence subscriptions is normally expected by an instant messaging user regarding the'from' address asuser's subscriptions to and from other contacts. This section describes thebare JID (<user@somedomain>)level of integration that must be supported within XMPP IM. There are four primary subscription states: o None -- Neither theuser: <presence from='user@somedomain' to='contact@otherdomain' type='unsubscribed'/> 3. Upon receivinguser nor thepresence stanza of type "unsubscribed" addressedcontact is subscribed to thecontact,other's presence o To -- The user is subscribed to the contact'sserver (1) MUST deliver thatpresencestanzabut there is no subscription from the contact to thecontact; and (2) MUST initiateuser o From -- There is a"roster push" to all available resources associated withsubscription from the contactthat have requestedto theroster, containing an updated roster item foruser, but the userwith the 'subscription' attribute sethas not subscribed toa value of "from" and with no 'ask' attribute: Saint-Andre & Miller Expires February 20, 2004 [Page 39] Internet-Draft XMPP Instant Messaging August 2003 <presence from='user@somedomain' to='contact@otherdomain' type='unsubscribed'/> <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@somedomain' subscription='from' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> 4. Upon receivingthe contact's presencestanza of type "unsubscribed",o Both -- Both the user and the contactSHOULD acknowledge receipt of that subscription state notification through either "affirming" it by sending aare subscribed to each other's presencestanza(i.e., the union oftype "unsubscribe" to'from' and 'to') Each of these states is reflected in theuser or "denying" it by sending a presence stanzaroster oftype "subscribe" toboth theuser; this step does not necessarily affectuser and the contact, thus resulting in durable subscriptionstate (see Section 8 for details), but instead lets the contact's server know that it must no longer send notificationstates. Narrative explanations ofthehow these subscriptionstate changestates interact with roster items in order tothe contact (see Section 8.6). As a result of this activity, there has been no changecomplete certain defined use cases are provided in the following sub-sections. Full details regarding server and client handling of all subscriptionstate; i.e.,states (including pending states between thecontactprimary states listed above) is provided inthe user's roster withSubscription States (Section 9). If asubscription state of "to"connected resource does not both send initial presence and request theuser is inroster, thecontact's roster with aserver SHOULD NOT send it presence subscriptionstaterequests or "roster pushes". The 'from' and 'to' addresess are OPTIONAL in roster pushes; if included, their values SHOULD be the full JID of"from". 7.4 Unsubscribing At any time after subscribing to a contact's presence, a user MAY unsubscribe. WhiletheXMLresource for that session. A client MUST acknowledge each "roster push" with an IQ stanza of type "result" (for the sake of brevity, these stanzas are not shown in the following examples but are required by XMPP Core [1]). 8.2 User Subscribes to Contact The process by which a usersendssubscribes tomake this happen isa contact, including thesame in all instances, the subsequentinteraction between roster items and subscriptionstatestates, isdifferent depending on the subscription state obtaining when the unsubscribe "command" was sent. Both possible scenarios aredefined Saint-Andre & Miller Expires March 7, 2004 [Page 36] Internet-Draft XMPP Instant Messaging September 2003 below.7.4.1 Case #1: Unsubscribing When Subscription is Not Mutual1. Inthe first case, the user has a subscriptionpreparation for being able to render the contactbut the contact does not have a subscription to the user (i.e.,in thesubscription is not yet mutual). 1. Ifuser's client interface and for theuser wantsserver tounsubscribe fromkeep track of thecontact's presence,subscription, theuser MUST senduser's client SHOULD perform apresence"roster set" for the new roster item. This request consists of an IQ stanza oftype "unsubscribe" totype='set' containing a <query/> element in theSaint-Andre & Miller Expires February 20, 2004 [Page 40] Internet-Draft XMPP Instant Messaging August 2003 contact: <presence to='contact@otherdomain' type='unsubscribe'/>'jabber:iq:roster' namespace, which in turn contains an <item/> element that defines the new roster item; the <item/> element MUST possess a 'jid' attribute, MAY possess a 'name' attribute, MUST NOT possess a 'subscription' attribute, and MAY contain one or more <group/> child elements: <iq type='set' id='int1'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> 2. As a result, the user's server (1) MUSTsendinitiate a "roster push" for the new roster item to allof the user'savailable resources associated with this user that have requested the roster,containing an updated roster item for the contact withsetting the 'subscription' attributesetto a value of "none"; and (2) MUSTroute the presencereply with an IQ stanza oftype "unsubscribe" to the contact, first stamping the 'from' address as the bare JID (<user@somedomain>) of the user:type='result': <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain' subscription='none' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq><presence from='user@somedomain' to='contact@otherdomain' type='unsubscribe'/><iq type='result' id='int1'/> 3.Upon receivingIf the user wants to request a subscription to the contact's presence, the user's client MUST send a presence stanza oftype "unsubscribe" addressedtype='subscribe' to thecontact,contact: <presence to='contact@otherdomain' type='subscribe'/> Saint-Andre & Miller Expires March 7, 2004 [Page 37] Internet-Draft XMPP Instant Messaging September 2003 4. As a result, thecontact'suser's server(1)MUST initiate a second "roster push" to all of the user's available resourcesassociated with the contactthat have requested the roster,containing an updated roster item for the user withsetting the'subscription' attribute setcontact toa valuethe pending sub-state of"none" (ifthecontact'none' subscription state; this pending sub-state isoffline, the contact's server MUST modify the roster item and send that modified item the next time the contact requestsdenoted by theroster); and (2) MUST deliverinclusion of the"unsubscribe" state change notification toask='subscribe' attribute in thecontact:roster item: <iq type='set'> <query xmlns='jabber:iq:roster'> <itemjid='user@somedomain'jid='contact@otherdomain' subscription='none'name='SomeUser'> <group>SomeGroup</group>ask='subscribe' name='MyContact'> <group>MyBuddies</group> </item> </query>Saint-Andre & Miller Expires February 20, 2004 [Page 41] Internet-Draft XMPP Instant Messaging August 2003</iq><presence from='user@somedomain' to='contact@otherdomain' type='unsubscribe'/> 4. Upon receiving the presence stanza of type "unsubscribe", the contact SHOULD acknowledge receipt of that subscription state notification through either "affirming" it by sending a presence stanza of type "unsubscribed" toNote: if the useror "denying" it by sending a presence stanza of type "subscribed" to the user; this step doesdid notnecessarily affectcreate a roster item before sending the subscriptionstate (see Section 8 for details), but instead letsrequest, thecontact'sserverknow that it must no longerMUST now create one and sendnotificationa "roster push" to all of thesubscription state change touser's available resources that have requested thecontact (see Section 8.6).roster, absent the 'name' attribute and the <group/ > child. 5. Thecontact'suser's serverthen (1)MUSTsend aalso stamp the presence stanza of type"unsubscribed" to"subscribe" with theuser; and (2) SHOULD send unavailable presence fromuser's bare JID (i.e., <user@somedomain>) as the 'from' address. If the contacttois served by a different host than theuser: <presence from='contact@otherdomain' to='user@somedomain' type='unsubscribed'/> <presence from='contact@otherdomain' to='user@somedomain' type='unavailable'/> 6. Whenuser, the user's serverreceives aMUST route the presence stanzaof type "unsubscribed" and/or unavailable presence, it MUST deliver themto theuser: <presence from='contact@otherdomain' to='user@somedomain' type='unsubscribed'/>contact's server for delivery to the contact (this case is assumed throughout; however, if the contact is served by the same host, then the server can simply deliver the presence stanza directly): <presencefrom='contact@otherdomain' to='user@somedomain' type='unavailable'/> 7.from='user@somedomain' to='contact@otherdomain' type='subscribe'/> 6. Upon receiving the presence stanza of type"unsubscribed","subscribe" addressed to the contact, the contact's server must determine if there is at least one active session in which the contact has sent available presence and has requested the roster. If so, it MUST deliver theuser SHOULD acknowledge receipt of thatsubscriptionstate notification through either "affirming"request to the contact (if not, the contact's server MUST store the subscription request offline for delivery when this condition is next met). No matter when the subscription request is delivered, the contact must decide whether or not to approve itby sending a presence(subject to configured preferences, Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page42]38] Internet-Draft XMPP Instant MessagingAugustSeptember 2003stanza of type "unsubscribe" tothecontactcontact's client MAY approve or"denying"refuse the subscription request without presenting itby sending a presence stanza of type "subscribe"to thecontact; this step does not necessarily affect the subscription state (see Section 8 for details), but instead letscontact). Here we assume theuser's server know"happy path" thatit must no longer send notification ofthe contact approves the subscriptionstate change torequest (the alternate flow of declining theuser (see Section 8.6). 7.4.2 Case #2: Unsubscribing When Subscriptionsubscription request isMutualdefined in Section 8.2.1). Inthe secondthis case, theuser hascontact's client (1) SHOULD perform asubscription toroster set specifying thecontactdesired nickname and group for thecontact also has a subscription to the user (i.e., the subscription is mutual). 1. If the user wants to unsubscribe from the contact's presence, the useruser; and (2) MUST send a presence stanza of type"unsubscribe""subscribed" to thecontact:user in order to approve the subscription request. <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@somedomain' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presenceto='contact@otherdomain' type='unsubscribe'/> 2.to='user@somedomain' type='subscribed'/> 7. As a result, theuser'scontact's server (1) MUSTsendinitiate a "roster push" to allof the user'savailable resources associated with the contact that have requested the roster, containingan updateda roster item for thecontactuser with the'subscription' attributesubscription state set toa value of "from"; and'from'; (2) MUST route the presence stanza of type"unsubscribe""subscribed" to thecontact, first stamping the 'from' address as the bare JID (<user@somedomain>)user; and (3) MUST send available presence from all of the contact's available resources to the user: <iq type='set'> <query xmlns='jabber:iq:roster'> <itemjid='contact@otherdomain'jid='user@somedomain' subscription='from'name='MyContact'> <group>MyBuddies</group>name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presencefrom='user@somedomain' to='contact@otherdomain' type='unsubscribe'/> 3.from='contact@otherdomain/resource' to='user@somedomain' type='subscribed'/> <presence from='contact@otherdomain/resource' Saint-Andre & Miller Expires March 7, 2004 [Page 39] Internet-Draft XMPP Instant Messaging September 2003 to='user@somedomain'/> 8. Upon receiving the presence stanza of type"unsubscribe""subscribed" addressed to thecontact,user, thecontact'suser's server(1)MUSTinitiate a "roster push" to all available resources associated withfirst verify that the contactthat have requestedis in theroster, containing an updated Saint-Andre & Miller Expires February 20, 2004 [Page 43] Internet-Draft XMPP Instant Messaging August 2003user's rosteritem forwith either of theuserfollowing states: (a) subscription='none', ask='subscribe' or (b) subscription='from', ask='subscribe'. If the contact is not in the user's roster with either of those states, the'subscription' attribute setuser's server MUST silently ignore the presence stanza of type "subscribed" (i.e., it MUST NOT route it to the user, modify the user's roster, or generate avalue of "to" (ifroster push to the user's available resources). If the contact isoffline,in thecontact'suser's roster with either of those states, the user's server (1) MUSTmodifydeliver theroster item and sendpresence stanza of type "subscribed" from the contact to the user; (2) MUST initiate a "roster push" to all of the user's available resources thatmodified itemhave requested thenext timeroster, containing an updated roster item for the contactrequestswith theroster);'subscription' attribute set to a value of "to"; and(2)(3) MUST deliver the"unsubscribe" state change notificationavailable presence stanza received from each of the contact's available resources to each of thecontact:user's available resources: <presence to='user@somedomain' from='contact@otherdomain' type='subscribed'/> <iq type='set'> <query xmlns='jabber:iq:roster'> <itemjid='user@somedomain'jid='contact@otherdomain' subscription='to'name='SomeUser'> <group>SomeGroup</group>name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> <presencefrom='user@somedomain' to='contact@otherdomain' type='unsubscribe'/> 4.from='contact@otherdomain/resource' to='user@somedomain/resource'/> 9. Upon receiving the presence stanza of type"unsubscribe","subscribed", thecontactuser SHOULD acknowledge receipt of that subscription state notification through either "affirming" it by sending a presence stanza of type"unsubscribed""subscribe" to theusercontact or "denying" it by sending a presence stanza of type"subscribed""unsubscribe" to theuser;contact; this step does not necessarily affect the subscription state (seeSection 8Subscription States (Section 9) for details), but instead lets Saint-Andre & Miller Expires March 7, 2004 [Page 40] Internet-Draft XMPP Instant Messaging September 2003 thecontact'suser's server know that it must no longer send notification of the subscription state change to thecontactuser (see Section8.6). 5. The contact's server then (1) MUST send a presence stanza9.6). From the perspective oftype "unsubscribed"the user, there now exists a subscription to theuser; and (2) SHOULD send unavailable presencecontact; from thecontact toperspective of theuser: <presence from='contact@otherdomain' to='user@somedomain'contact, there now exists a subscription from the user. (Note: If at this point the user sends another subscription request to the contact, the user's server MUST silently ignore that request.) 8.2.1 Alternate Flow: Contact Declines Subscription Request The above activity flow represents the "happy path" related to the user's subscription request to the contact. The main alternate flow occurs if the contact refuses the user's subscription request. 1. If the contact wants to refuse the request, the contact's client MUST send a presence stanza of type "unsubscribed" to the user (instead of the presence stanza of type "subscribed" sent in Step 6 of Section 8.2): <presence to='user@somedomain' type='unsubscribed'/> 2. As a result, the contact's server MUST route the presence stanza of type "unsubscribed" to the user, first stamping the 'from' address as the bare JID (<contact@otherdomain>) of the contact: <presence from='contact@otherdomain' to='user@somedomain'type='unavailable'/> 6. Whentype='unsubscribed'/> 3. Upon receiving theuser's server receives apresence stanza of type "unsubscribed"and/or unavailable presence, itaddressed to the user, the user's server (1) MUST deliverthemthat presence stanza to the user and (2) MUST initiate a "roster push" to all of the user's available resources that have requested the roster, containing an updated roster item for the contact with the 'subscription' attribute set to a value of "none" and with no 'ask' attribute: <presence from='contact@otherdomain' to='user@somedomain' type='unsubscribed'/> <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain' Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page44]41] Internet-Draft XMPP Instant MessagingAugustSeptember 2003to the user: <presence from='contact@otherdomain' to='user@somedomain' type='unsubscribed'/> <presence from='contact@otherdomain' to='user@somedomain' type='unavailable'/> 7.subscription='none' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> 4. Upon receiving the presence stanza of type "unsubscribed", the user SHOULD acknowledge receipt of that subscription state notification through either "affirming" it by sending a presence stanza of type "unsubscribe" to the contact or "denying" it by sending a presence stanza of type "subscribe" to the contact; this step does not necessarily affect the subscription state (seeSection 8Subscription States (Section 9) for details), but instead lets the user's server know that it must no longer send notification of the subscription state change to the user (see Section8.6). Note: Obviously this does not9.6). As a resultin removalofthe roster item from the user's roster, andthis activity, the contactstill has a subscription to the user's presence. In order to both completely cancel a mutual subscription and fully remove the roster item fromis now in the user'sroster, the user should update therosteritemwithsubscription='remove' as defined in Section 7.6. 7.5 Cancelling a Subscription At any time after approvinga subscriptionrequest from a user, a contact MAY cancel that subscription. While the XML thatstate of "none", whereas thecontact sends to make this happenuser isthe samenot inall instances, the subsequent subscription state is different depending on the subscription state obtaining whenthecancellation was sent. Both possible scenarios are defined below. 7.5.1 Case #1: Cancelling When Subscription is Notcontact's roster at all. 8.3 Creating a MutualIn the first case, theSubscription The userhas a subscription to theand contactbutcan build on thecontact does not haveforegoing to create a mutual subscriptionto the user(i.e.,thea subscription of type "both"). The process isnot yet mutual).defined below. 1. If the contact wants tocancel the user'screate a mutual subscription, the contact MUST send apresence stanza of type "unsubscribed"subscription request to theuser: Saint-Andre & Miller Expires February 20, 2004 [Page 45] Internet-Draft XMPP Instant Messaging August 2003user (subject to configured preferences, the contact's client MAY send this automatically): <presence to='user@somedomain'type='unsubscribed'/>type='subscribe'/> 2. As a result, the contact's server (1) MUSTsendinitiate a "roster push" to allof the contact'savailable resources associated with the contact that have requested the roster,containing an updated roster item forwith the userwithstill in the'subscription' attribute set to'from' subscription state but with avaluepending 'to' subscription denoted by the inclusion of"none";the ask='subscribe' attribute in the roster item; and (2) MUST route the presence stanza of type"unsubscribed""subscribe" to the user, first stamping the 'from' address as the bare JID (<contact@otherdomain>) of thecontact; and (3) SHOULD send unavailable presence from the contact to the user:contact: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@somedomain'subscription='none'subscription='from' Saint-Andre & Miller Expires March 7, 2004 [Page 42] Internet-Draft XMPP Instant Messaging September 2003 ask='subscribe' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence from='contact@otherdomain' to='user@somedomain'type='unsubscribed'/> <presence from='contact@otherdomain' to='user@somedomain' type='unavailable'/>type='subscribe'/> 3. Upon receiving the presence stanza of type"unsubscribed""subscribe" addressed to the user, the user's server must determine if there is at least one active session in which the user has sent available presence and has requested the roster. If so, the user's server MUST deliver the subscription request to the user (if not, it MUST store the subscription request offline for delivery when this condition is next met). No matter when the subscription request is delivered, the user must then decide whether or not to approve it (subject to configured preferences, the user's client MAY approve or refuse the subscription request without presenting it to the user). Here we assume the "happy path" that the user approves the subscription request (the alternate flow of declining the subscription request is defined in Section 8.3.1). In this case, the user's client MUST send a presence stanza of type "subscribed" to the contact in order to approve the subscription request. <presence to='contact@otherdomain' type='subscribed'/> 4. As a result, the user's server (1) MUST initiate a "roster push" to all of the user's available resources that have requested the roster, containingan updateda roster item for the contact with the 'subscription' attribute set to a value of"none" (if the user is offline, the user's server"both"; (2) MUSTmodify the roster item and send that modified itemroute thenext timepresence stanza of type "subscribed" to theuser requestscontact, first stamping theroster); (2) MUST deliver'from' address as the"unsubscribed" state change notification tobare JID (<user@somedomain>) of the user; and (3) MUSTdeliver the unavailablesend available presencetofrom each of theuser: <iquser's available resources to the contact: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain'subscription='none'subscription='both' name='MyContact'> <group>MyBuddies</group> </item> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page46]43] Internet-Draft XMPP Instant MessagingAugustSeptember 2003name='MyContact'> <group>MyBuddies</group> </item></query> </iq> <presencefrom='contact@otherdomain' to='user@somedomain' type='unsubscribed'/>from='user@somedomain' to='contact@otherdomain' type='subscribed'/> <presencefrom='contact@otherdomain' to='user@somedomain' type='unavailable'/> 4.from='user@somedomain/resource' to='contact@otherdomain'/> 5. Upon receiving the presence stanza of type"unsubscribed","subscribed" addressed to theuser SHOULD acknowledge receipt ofcontact, the contact's server MUST first verify thatsubscription state notification throughthe user is in the contact's roster with either"affirming" it by sending a presence stanzaoftype "unsubscribe" tothecontactfollowing states: (a) subscription='none', ask='subscribe' or"denying" it by sending a presence stanza of type "subscribe" to(b) subscription='from', ask='subscribe'. If thecontact; this step doesuser is notnecessarily affectin thesubscription state (see Section 8 for details), but instead letscontact's roster with either of those states, theuser'scontact's serverknow that it must no longer send notification ofMUST silently ignore thesubscription state changepresence stanza of type "subscribed" (i.e., it MUST NOT route it to theuser (see Section 8.6). 7.5.2 Case #2: Cancelling When Subscription is Mutual In the second case,contact, modify theuser hascontact's roster, or generate asubscriptionroster push to thecontact and the contact also has a subscription tocontact's available resources). If the user(i.e., the subscriptionismutual). 1. If the contact wants to cancelin theuser's subscription,contact's roster with either of those states, thecontactcontact's server (1) MUSTsend adeliver the presence stanza of type"unsubscribed" to"subscribed" from theuser: <presence to='user@somedomain' type='unsubscribed'/> 2. As a result,user to thecontact's server (1)contact; (2) MUSTsendinitiate a "roster push" to allof the contact'savailable resources associated with the contact that have requested the roster, containing an updated roster item for the user with the 'subscription' attribute set to a value of"to"; (2)"both"; and (3) MUSTroutedeliver the available presence stanzaof type "unsubscribed" to the user, first stamping the 'from' address as the bare JID (<contact@otherdomain>) of the contact; and (3) SHOULD send unavailable presence from the contact to the user: Saint-Andre & Miller Expires February 20, 2004 [Page 47] Internet-Draft XMPP Instant Messaging August 2003 <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@somedomain' subscription='to' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence from='contact@otherdomain' to='user@somedomain' type='unsubscribed'/> <presence from='contact@otherdomain' to='user@somedomain' type='unavailable'/> 3. Upon receiving the presence stanza of type "unsubscribed" addressed to the user, the user's server (1) MUST initiate a "roster push" to allreceived from each of the user's available resourcesthat have requested the roster, containing an updated roster item for the contact with the 'subscription' attribute settoa valueeach of"from" (if the user is offline, the user's server MUST modify the roster item and send that modified item the next time the user requests the roster); and (2) MUST deliver the "unsubscribed" state change notification to the user; and (3) MUST deliver the unavailable presence totheuser:contact's available resources: <presence from='user@somedomain' to='contact@otherdomain' type='subscribed'/> <iq type='set'> <query xmlns='jabber:iq:roster'> <itemjid='contact@otherdomain' subscription='from' name='MyContact'> <group>MyBuddies</group>jid='user@somedomain' subscription='both' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq><presence from='contact@otherdomain' to='user@somedomain' type='unsubscribed'/>Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page48]44] Internet-Draft XMPP Instant MessagingAugustSeptember 2003 <presencefrom='contact@otherdomain' to='user@somedomain' type='unavailable'/> 4.from='user@somedomain/resource' to='contact@otherdomain/resource'/> 6. Upon receiving the presence stanza of type"unsubscribed","subscribed", theusercontact SHOULD acknowledge receipt of that subscription state notification through either "affirming" it by sending a presence stanza of type"unsubscribe""subscribe" to thecontactuser or "denying" it by sending a presence stanza of type"subscribe""unsubscribe" to thecontact;user; this step does not necessarily affect the subscription state (seeSection 8Subscription States (Section 9) for details), but instead lets theuser'scontact's server know that it must no longer send notification of the subscription state change to theusercontact (see Section8.6). Note: Obviously this does not result in removal of the roster item from the contact's roster,9.6). The user and the contactstill hasnow have a mutual subscription to each other's presence -- i.e., theuser's presence. In order to both completely cancel a mutualsubscriptionand fully remove the roster item from the contact's roster, the contact should update the roster item with subscription='remove' as defined in Section 7.6. 7.6 Removing a Roster Item and Cancelling All Subscriptions Because there may be many steps involved in completely removing a roster item and cancelling subscriptions in both directions, XMPP IM includes a "shortcut" method for doing so.is of type "both". Theprocess may be initiated no matter whatuser's server MUST now send the user's currentsubscription state is by sending a roster set containing an item for the contact with the 'subscription' attribute setpresence information toa value of "remove": <iq type='set' id='remove1'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain' subscription='remove'/> </query> </iq> Whenthe contact. (Note: If at this point the userremovessends a subscription request to the contactfrom hisorher roster by settingthe'subscription' attribute tocontact sends avalue of "remove",subscription request to the user, the sending user's server(1)MUSTautomatically cancel any existing presencesilently ignore that request and not route it to the intended recipient.) 8.3.1 Alternate Flow: User Declines Subscription Request The above activity flow represents the "happy path" related to the contact's subscriptionbetweenrequest to the user. The main alternate flow occurs if the userandrefuses thecontact (both 'to' and 'from' as appropriate); (2) MUST removecontact's subscription request. 1. If theroster item fromuser wants to refuse theuser's roster and inform all ofrequest, the user'savailable resources of the roster item removal; (3)client MUSTinform the resource that initiated the removal of success; and (4) SHOULDsendunavailablea presence stanza of type "unsubscribed" to thecontact: Saint-Andre & Miller Expires February 20, 2004 [Page 49] Internet-Draft XMPP Instant Messaging August 2003 <presence from='user@somedomain' to='contact@otherdomain' type='unsubscribe'/> <presence from='user@somedomain' to='contact@otherdomain' type='unsubscribed'/> <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain' subscription='remove'/> </query> </iq> <iq type='result' id='remove1'/> <presence from='user@somedomain' to='contact@otherdomain' type='unavailable'/> Upon receivingcontact (instead of the presence stanza of type"unsubscribe","subscribed" sent in Step 3 of Section 8.3): <presence to='contact@otherdomain' type='unsubscribed'/> 2. As a result, thecontact'suser's server(1)MUSTinitiate a "roster push"route the presence stanza of type "unsubscribed" toall available resources associated withthecontact that have requestedcontact, first stamping theroster, containing an updated roster item for'from' address as theuser withbare JID (<user@somedomain>) of the'subscription' attribute set to a valueuser: <presence from='user@somedomain' to='contact@otherdomain' type='unsubscribed'/> 3. Upon receiving the presence stanza of"to" (iftype "unsubscribed" addressed to thecontact is offline,contact, the contact's server (1) MUSTmodify the roster item and senddeliver thatmodified item the next time the contact requestspresence stanza to theroster);contact; and (2) MUSTalso deliver the "unsubscribe" state change notification to the contact: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@somedomain' subscription='to' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence from='user@somedomain'initiate a Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page50]45] Internet-Draft XMPP Instant MessagingAugustSeptember 2003to='contact@otherdomain' type='unsubscribe'/> Upon receiving the presence stanza of type "unsubscribed", the contact's server (1) MUST initiate a"roster push" to all available resources associated with the contact that have requested the roster, containing an updated roster item for the user with the 'subscription' attribute set to a value of"none" (if the contact is offline, the contact's server MUST modify the roster item and send that modified item the next time the contact requests the roster);"from" and(2) MUST also deliver the "unsubscribe" state change notification to the contact:with no 'ask' attribute: <presence from='user@somedomain' to='contact@otherdomain' type='unsubscribed'/> <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@somedomain'subscription='none'subscription='from' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq><presence from='user@somedomain' to='contact@otherdomain' type='unsubscribed'/>4. Upon receiving the presence stanza of type"unavailable" addressed to the contact, the contact's server MUST deliver"unsubscribed", theunavailable presence to the user: <presence from='user@somedomain' to='contact@otherdomain' type='unavailable'/> Notecontact SHOULD acknowledge receipt of thatwhensubscription state notification through either "affirming" it by sending a presence stanza of type "unsubscribe" to the userremovesor "denying" it by sending a presence stanza of type "subscribe" to thecontact fromuser; this step does not necessarily affect theuser's roster,subscription state (see Subscription States (Section 9) for details), but instead lets theendcontact's server know that it must no longer send notification of the subscription state change to the contact (see Section 9.6). As a result of this activity, there has been no change in thecontact's rostersubscription state; i.e., the contact isthatin the user's roster with a subscription state of "to" and the user isstillin the contact's roster with a subscription state of"none"; in order"from". 8.4 Unsubscribing At any time after subscribing tocompletely remove the roster item fora contact's presence, a user MAY unsubscribe. While theuser,XML that thecontact needsuser sends toalso send a roster removal request.make this happen is the same in all instances, the subsequent subscription state is different depending on the subscription state obtaining when the unsubscribe "command" was sent. Both possible scenarios are defined below. 8.4.1 Case #1: Unsubscribing When Subscription is Not Mutual Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page51]46] Internet-Draft XMPP Instant MessagingAugustSeptember 20038. Subscription States This section summarizes information about subscription states. 8.1 Defined States There are nine possibleIn the first case, the user has a subscriptionstates: 1. "None" = you and I are not subscribedtoeach other, and neither of us has requestedthe contact but the contact does not have a subscriptionfromto the user (i.e., theother 2. "None + Pending Out" = you and I are not subscribed to each other, and I've sent you asubscriptionrequest but you haveis notrespondedyet3. "None + Pending In" = you and I are not subscribedmutual). 1. If the user wants toeach other, and you've sent meunsubscribe from the contact's presence, the user MUST send asubscription request but I have not responded yet 4. "None + Pending Out/In" = you and I are not subscribedpresence stanza of type "unsubscribe" toeach other, you've sent me a subscription request but I have not responded yet, and I've sent youthe contact: <presence to='contact@otherdomain' type='unsubscribe'/> 2. As asubscription request but you have not responded yet 5. "To" = I'm subscribed to you (one-way) 6. "To + Pending In" = I'm subscribed to you, and you'veresult, the user's server (1) MUST sendmeasubscription request but I have not responded yet 7. "From" = you're subscribed to me (one-way) 8. "From + Pending Out" = you're subscribed"roster push" tome, and I've sent you a subscription request but youall of the user's available resources that havenot responded yet 9. "Both" = we're subscribedrequested the roster, containing an updated roster item for the contact with the 'subscription' attribute set toeach other (two-way) 8.2 Server Handling of Outbound Presence, Categorized by Subscription State This section defines howaservervalue of "none"; and (2) MUSThandle an outboundroute the presence stanza of type"subscribe", "subscribed", "unsubscribe", and "unsubscribed" (i.e., route it"unsubscribe" to theintended recipient and/or make a changecontact, first stamping the 'from' address as the bare JID (<user@somedomain>) of the user: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain' subscription='none' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> <presence from='user@somedomain' to='contact@otherdomain' type='unsubscribe'/> 3. Upon receiving the presence stanza of type "unsubscribe" addressed to thesubscription state), categorized bycontact, thecurrent subscription state. The general rule iscontact's server (1) MUST initiate a "roster push" to all available resources associated with the contact that have requested the roster, containing an updated roster item for the user with the 'subscription' attribute set to a value of "none" (if the contact is offline, the contact's server MUSTroutemodify thestanza toroster item and send that modified item theintended recipient if it would changenext time thesubscription state,contact requests the roster); and (2) MUSTNOT routedeliver thestanza if it would not"unsubscribe" state change notification to thesubscription state. Detailed definitions are contained in thecontact: <iq type='set'> <query xmlns='jabber:iq:roster'> <item Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page52]47] Internet-Draft XMPP Instant MessagingAugustSeptember 2003following sections. Naturally, ifjid='user@somedomain' subscription='none' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence from='user@somedomain' to='contact@otherdomain' type='unsubscribe'/> 4. Upon receiving the presence stanzachangesof type "unsubscribe", the contact SHOULD acknowledge receipt of that subscriptionstate,state notification through either "affirming" it by sending a presence stanza of type "unsubscribed" to theserver MUST also changeuser or "denying" it by sending a presence stanza of type "subscribed" to the user; this step does not necessarily affect the subscriptionstate. 8.2.1state (see SubscriptionState = None +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | yes | "None + Pending Out" | | subscribed | no |States (Section 9) for details), but instead lets the contact's server know that it must no longer send notification of the subscription state change| | unsubscribe | no | noto the contact (see Section 9.6). 5. The contact's server then (1) MUST send a presence stanza of type "unsubscribed" to the user; and (2) SHOULD send unavailable presence from the contact to the user: <presence from='contact@otherdomain' to='user@somedomain' type='unsubscribed'/> <presence from='contact@otherdomain' to='user@somedomain' type='unavailable'/> 6. When the user's server receives a presence stanza of type "unsubscribed" and/or unavailable presence, it MUST deliver them to the user: <presence from='contact@otherdomain' to='user@somedomain' type='unsubscribed'/> <presence Saint-Andre & Miller Expires March 7, 2004 [Page 48] Internet-Draft XMPP Instant Messaging September 2003 from='contact@otherdomain' to='user@somedomain' type='unavailable'/> 7. Upon receiving the presence stanza of type "unsubscribed", the user SHOULD acknowledge receipt of that subscription statechange | | unsubscribed | no | nonotification through either "affirming" it by sending a presence stanza of type "unsubscribe" to the contact or "denying" it by sending a presence stanza of type "subscribe" to the contact; this step does not necessarily affect the subscription statechange | +-------------------------------------------------------+ 8.2.2(see SubscriptionState = None + Pending Out +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | no | no state change | | subscribed | no | no state change | | unsubscribe | yes | "None" | | unsubscribed | no |States (Section 9) for details), but instead lets the user's server know that it must no longer send notification of the subscription state change| +-------------------------------------------------------+ 8.2.3 Subscription State = None + Pending In +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | yes | "None + Pending Out/In" | | subscribed | yes | "From" | | unsubscribe | no | no state change | | unsubscribed | yes | "None" | +-------------------------------------------------------+ 8.2.4to the user (see Section 9.6). 8.4.2 Case #2: Unsubscribing When SubscriptionState = None + Pending Out/In +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | no | no state change | | subscribed | yes | "From + Pending Out" | |is Mutual In the second case, the user has a subscription to the contact and the contact also has a subscription to the user (i.e., the subscription is mutual). 1. If the user wants to unsubscribe| yes | "None + Pending In" | | unsubscribed | yes | "None + Pending Out" |from the contact's presence, the user MUST send a presence stanza of type "unsubscribe" to the contact: <presence to='contact@otherdomain' type='unsubscribe'/> 2. As a result, the user's server (1) MUST send a "roster push" to all of the user's available resources that have requested the roster, containing an updated roster item for the contact with the 'subscription' attribute set to a value of "from"; and (2) MUST route the presence stanza of type "unsubscribe" to the contact, first stamping the 'from' address as the bare JID (<user@somedomain>) of the user: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain' subscription='from' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> <presence from='user@somedomain' Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page53]49] Internet-Draft XMPP Instant MessagingAugustSeptember 2003+-------------------------------------------------------+ 8.2.5 Subscription State = To +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | no | noto='contact@otherdomain' type='unsubscribe'/> 3. Upon receiving the presence stanza of type "unsubscribe" addressed to the contact, the contact's server (1) MUST initiate a "roster push" to all available resources associated with the contact that have requested the roster, containing an updated roster item for the user with the 'subscription' attribute set to a value of "to" (if the contact is offline, the contact's server MUST modify the roster item and send that modified item the next time the contact requests the roster); and (2) MUST deliver the "unsubscribe" state change| | subscribed | no | nonotification to the contact: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@somedomain' subscription='to' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence from='user@somedomain' to='contact@otherdomain' type='unsubscribe'/> 4. Upon receiving the presence stanza of type "unsubscribe", the contact SHOULD acknowledge receipt of that subscription statechange | | unsubscribe | yes | "None" | | unsubscribed | no | nonotification through either "affirming" it by sending a presence stanza of type "unsubscribed" to the user or "denying" it by sending a presence stanza of type "subscribed" to the user; this step does not necessarily affect the subscription statechange | +-------------------------------------------------------+ 8.2.6(see SubscriptionState = To + Pending In +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | no |States (Section 9) for details), but instead lets the contact's server know that it must no longer send notification of the subscription state change| | subscribed | yes | "Both" | | unsubscribe | yes | "None + Pending In" | | unsubscribed | yes | "To" | +-------------------------------------------------------+ 8.2.7 Subscription State = From +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | yes | "From + Pending Out" | | subscribed | no | no state change | | unsubscribe | no | no state change | | unsubscribed | yes | "None" | +-------------------------------------------------------+ 8.2.8 Subscription State = From + Pending Out +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | no | no state change | | subscribed | no | no state change | | unsubscribe | yes | "From" | | unsubscribed | yes | "None + Pending Out" |to the contact (see Section 9.6). 5. The contact's server then (1) MUST send a presence stanza of type "unsubscribed" to the user; and (2) SHOULD send unavailable presence from the contact to the user: <presence from='contact@otherdomain' to='user@somedomain' type='unsubscribed'/> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page54]50] Internet-Draft XMPP Instant MessagingAugustSeptember 2003+-------------------------------------------------------+ 8.2.9 Subscription State = Both +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | no | no state change | | subscribed | no | no state change | | unsubscribe | yes | "From" | | unsubscribed | yes | "To" | +-------------------------------------------------------+ 8.3 Server Handling of Outbound Presence, Categorized by Presence Type This section defines how a<presence from='contact@otherdomain' to='user@somedomain' type='unavailable'/> 6. When the user's serverMUST handle an outboundreceives a presence stanza of type"subscribe", "subscribed", "unsubscribe", and"unsubscribed"(i.e., routeand/or unavailable presence, it MUST deliver them to theintended recipient and/or makeuser: <presence from='contact@otherdomain' to='user@somedomain' type='unsubscribed'/> <presence from='contact@otherdomain' to='user@somedomain' type='unavailable'/> 7. Upon receiving the presence stanza of type "unsubscribed", the user SHOULD acknowledge receipt of that subscription state notification through either "affirming" it by sending achangepresence stanza of type "unsubscribe" to thesubscription state), categorizedcontact or "denying" it by sending a presencetype. 8.3.1 Subscribe +----------------------------------------------------------------+ | EXISTING STATE | ROUTE? | NEW STATE | +----------------------------------------------------------------+ | "None" | yes | "None + Pending Out" | | "None + Pending Out" | no | no state change | | "None + Pending In" | yes | "None + Pending Out/In" | | "None + Pending Out/In" | no | no state change | | "To" | no | no state change | | "To + Pending In" | no | no state change | | "From" | yes | "From + Pending Out" | | "From + Pending Out" | no | no state change | | "Both" | no | no state change | +----------------------------------------------------------------+ 8.3.2 Subscribed +----------------------------------------------------------------+ | EXISTING STATE | ROUTE? | NEW STATE | +----------------------------------------------------------------+ | "None" | no | nostanza of type "subscribe" to the contact; this step does not necessarily affect the subscription statechange | | "None + Pending Out" | no |(see Subscription States (Section 9) for details), but instead lets the user's server know that it must no longer send notification of the subscription state change| | "None + Pending In" | yes | "From" | | "None + Pending Out/In" | yes | "From + Pending Out" |to the user (see Section 9.6). Note: Obviously this does not result in removal of the roster item from the user's roster, and the contact still has a subscription to the user's presence. In order to both completely cancel a mutual subscription and fully remove the roster item from the user's roster, the user should update the roster item with subscription='remove' as defined under Removing a Roster Item and Cancelling All Subscriptions (Section 8.6). 8.5 Cancelling a Subscription At any time after approving a subscription request from a user, a contact MAY cancel that subscription. While the XML that the contact sends to make this happen is the same in all instances, the subsequent subscription state is different depending on the subscription state obtaining when the cancellation was sent. Both possible scenarios are defined below. 8.5.1 Case #1: Cancelling When Subscription is Not Mutual Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page55]51] Internet-Draft XMPP Instant MessagingAugustSeptember 2003| "To" | no | no state change | | "To + Pending In" | yes | "Both" | | "From" | no | no state change | | "From + Pending Out" | no | no state change | | "Both" | no | no state change | +----------------------------------------------------------------+ 8.3.3 Unsubscribe +----------------------------------------------------------------+ | EXISTING STATE | ROUTE? | NEW STATE | +----------------------------------------------------------------+ | "None" | no | no state change | | "None + Pending Out" | no | no state change | | "None + Pending In" | no | no state change | | "None + Pending Out/In" | yes | "None + Pending In" | | "To" | yes | "None" | | "To + Pending In" | yes | "None + Pending In" | | "From" | no | no state change | | "From + Pending Out" | yes | "From" | | "Both" | yes | "From" | +----------------------------------------------------------------+ Note: WhenIn the first case, the user has a subscription to the contact but the contact does not have a subscription to the usersends an outbound(i.e., the subscription is not yet mutual). 1. If the contact wants to cancel the user's subscription, the contact MUST send a presence stanza of type"unsubscribe" that results in"unsubscribed" to the user: <presence to='user@somedomain' type='unsubscribed'/> 2. As asubscription state change,result, the contact's serverSHOULD auto-reply by sending(1) MUST send a "roster push" to all of the contact's available resources that have requested the roster, containing an updated roster item for the user with the 'subscription' attribute set to a value of "none"; (2) MUST route the presence stanza of type "unsubscribed" to theuser on behalfuser, first stamping the 'from' address as the bare JID (<contact@otherdomain>) of thecontactcontact; andMUST deliver that(3) SHOULD send unavailable presence from the contact to the user: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@somedomain' subscription='none' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence from='contact@otherdomain' to='user@somedomain' type='unsubscribed'/> <presence from='contact@otherdomain' to='user@somedomain' type='unavailable'/> 3. Upon receiving the presence stanza of type "unsubscribed" addressed to thecontact. 8.3.4 Unsubscribed +----------------------------------------------------------------+ | EXISTING STATE | ROUTE? | NEW STATE | +----------------------------------------------------------------+ | "None" | no | no state change | | "None + Pending Out" | no | no state change | | "None + Pending In" | yes | "None" | | "None + Pending Out/In" | yes | "None + Pending Out" | | "To" | no | nouser, the user's server (1) MUST initiate a "roster push" to all of the user's available resources that have requested the roster, containing an updated roster item for the contact with the 'subscription' attribute set to a value of "none" (if the user is offline, the user's server MUST modify the roster item and send that modified item the next time the user requests the roster); (2) MUST deliver the "unsubscribed" statechange | | "To + Pending In" | yes | "To" | | "From" | yes | "None" | | "From + Pending Out" | yes | "None + Pending Out" | | "Both" | yes | "To" | +----------------------------------------------------------------+Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page56]52] Internet-Draft XMPP Instant MessagingAugustSeptember 20038.4 Server Handling of Inbound Presence, Categorized by Subscription State This section defines how a serverchange notification to the user; and (3) MUSThandle an inbounddeliver the unavailable presence to the user: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain' subscription='none' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> <presence from='contact@otherdomain' to='user@somedomain' type='unsubscribed'/> <presence from='contact@otherdomain' to='user@somedomain' type='unavailable'/> 4. Upon receiving the presence stanza of type"subscribe", "subscribed", "unsubscribe", and "unsubscribed" (i.e., deliver it to the intended recipient and/or make a change to"unsubscribed", the user SHOULD acknowledge receipt of that subscriptionstate), categorizedstate notification through either "affirming" it bysubscription state. (Note: somesending a presence stanza of type "unsubscribe" to the contact or "denying" it by sending a presence stanza of typeshould never be received as inbound stanzas, since the sender's server MUST NOT route them"subscribe" to theintended recipient; however, these stanza types are included forcontact; this step does not necessarily affect thesake of completeness.) 8.4.1 Subscription State = None +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | yes | "None + Pending In" | | subscribed | no | no state change | | unsubscribe | no | no state change | | unsubscribed | no | nosubscription statechange | +--------------------------------------------------------+ 8.4.2(see SubscriptionState = None + Pending Out +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | yes | "None + Pending Out/In" | | subscribed | yes | "To" | | unsubscribe | no |States (Section 9) for details), but instead lets the user's server know that it must no longer send notification of the subscription state change| | unsubscribed | yes | "None" | +--------------------------------------------------------+ 8.4.3to the user (see Section 9.6). 8.5.2 Case #2: Cancelling When SubscriptionState = None + Pendingis Mutual In+--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | no | no state change | | subscribed | no | no state change | | unsubscribe | yes | "None" | | unsubscribed | no | no state change | +--------------------------------------------------------+ Saint-Andre & Miller Expires February 20, 2004 [Page 57] Internet-Draft XMPP Instant Messaging August 2003 8.4.4 Subscription State = None + Pending Out/In +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | no | no state change | | subscribed | yes | "To + Pending In" | | unsubscribe | yes | "None + Pending Out" | | unsubscribed | yes | "None + Pending In" | +--------------------------------------------------------+ 8.4.5 Subscription State = To +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | yes | "To + Pending In" | | subscribed | no | no state change | | unsubscribe | no | no state change | | unsubscribed | yes | "None" | +--------------------------------------------------------+ 8.4.6 Subscription State = To + Pending In +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | no | no state change | | subscribed | no | no state change | | unsubscribe | yes | "To" | | unsubscribed | yes | "None + Pending In" | +--------------------------------------------------------+ 8.4.7 Subscription State = From +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | no | no state change | | subscribed | no | no state change | | unsubscribe | yes | "None" | | unsubscribed | no | no state change | +--------------------------------------------------------+the second case, the user has a subscription to the contact and the contact also has a subscription to the user (i.e., the subscription is mutual). 1. If the contact wants to cancel the user's subscription, the contact MUST send a presence stanza of type "unsubscribed" to the user: <presence to='user@somedomain' type='unsubscribed'/> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page58]53] Internet-Draft XMPP Instant MessagingAugustSeptember 20038.4.8 Subscription State = From + Pending Out +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | no | no state change | | subscribed | yes | "Both" | | unsubscribe | yes | "None + Pending Out" | | unsubscribed | yes | "From" | +--------------------------------------------------------+ 8.4.9 Subscription State = Both +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | no | no state change | | subscribed | no | no state change | | unsubscribe | yes | "To" | | unsubscribed | yes | "From" | +--------------------------------------------------------+ 8.5 Server Handling of Inbound Presence, Categorized by Presence Type This section defines how2. As a result, the contact's server (1) MUSThandlesend a "roster push" to all of the contact's available resources that have requested the roster, containing aninboundupdated roster item for the user with the 'subscription' attribute set to a value of "to"; (2) MUST route the presence stanza of type"subscribe", "subscribed", "unsubscribe","unsubscribed" to the user, first stamping the 'from' address as the bare JID (<contact@otherdomain>) of the contact; and (3) SHOULD send unavailable presence from the contact to the user: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@somedomain' subscription='to' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence from='contact@otherdomain' to='user@somedomain' type='unsubscribed'/> <presence from='contact@otherdomain' to='user@somedomain' type='unavailable'/> 3. Upon receiving the presence stanza of type "unsubscribed"(i.e., deliver itaddressed to theintended recipient and/or makeuser, the user's server (1) MUST initiate achange"roster push" to all of thesubscription state), categorized by presence type. 8.5.1 Subscribe +------------------------------------------------------------------+ | EXISTING STATE | DELIVER? | NEW STATE | +------------------------------------------------------------------+ | "None" | yes | "None + Pending In" | | "None + Pending Out" | yes | "None + Pending Out/In" | | "None + Pending In" | no | no state change | | "None + Pending Out/In" | no | no state change | | "To" | yes | "To + Pending In" | | "To + Pending In" | no | no state change | | "From" | no | no state change | | "From + Pending Out" | no | no state change | | "Both" | no | nouser's available resources that have requested the roster, containing an updated roster item for the contact with the 'subscription' attribute set to a value of "from" (if the user is offline, the user's server MUST modify the roster item and send that modified item the next time the user requests the roster); and (2) MUST deliver the "unsubscribed" state change| +------------------------------------------------------------------+notification to the user; and (3) MUST deliver the unavailable presence to the user: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain' subscription='from' name='MyContact'> <group>MyBuddies</group> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page59]54] Internet-Draft XMPP Instant MessagingAugustSeptember 20038.5.2 Subscribed +------------------------------------------------------------------+ | EXISTING STATE | DELIVER? | NEW STATE | +------------------------------------------------------------------+ | "None" | no | no state change | | "None + Pending Out" | yes | "To" | | "None + Pending In" | no | no</item> </query> </iq> <presence from='contact@otherdomain' to='user@somedomain' type='unsubscribed'/> <presence from='contact@otherdomain' to='user@somedomain' type='unavailable'/> 4. Upon receiving the presence stanza of type "unsubscribed", the user SHOULD acknowledge receipt of that subscription statechange | | "None + Pending Out/In" | yes | "To + Pending In" | | "To" | no | no state change | | "To + Pending In" | no | no state change | | "From" | no | nonotification through either "affirming" it by sending a presence stanza of type "unsubscribe" to the contact or "denying" it by sending a presence stanza of type "subscribe" to the contact; this step does not necessarily affect the subscription statechange | | "From + Pending Out" | yes | "Both" | | "Both" | no |(see Subscription States (Section 9) for details), but instead lets the user's server know that it must no longer send notification of the subscription state change| +------------------------------------------------------------------+ 8.5.3 Unsubscribe +------------------------------------------------------------------+ | EXISTING STATE | DELIVER? | NEW STATE | +------------------------------------------------------------------+ | "None" | no |to the user (see Section 9.6). Note: Obviously this does not result in removal of the roster item from the contact's roster, and the contact still has a subscription to the user's presence. In order to both completely cancel a mutual subscription and fully remove the roster item from the contact's roster, the contact should update the roster item with subscription='remove' as defined under Removing a Roster Item and Cancelling All Subscriptions (Section 8.6). 8.6 Removing a Roster Item and Cancelling All Subscriptions Because there may be many steps involved in completely removing a roster item and cancelling subscriptions in both directions, XMPP IM includes a "shortcut" method for doing so. The process may be initiated no matter what the current subscription statechange | | "None + Pending Out" | no | no state change | | "None + Pending In" | yes | "None" | | "None + Pending Out/In" | yes | "None + Pending Out" | | "To" | no | no state change | | "To + Pending In" | yes | "To" | | "From" | yes | "None" | | "From + Pending Out" | yes | "None + Pending Out | | "Both" | yes | "To" | +------------------------------------------------------------------+ 8.5.4 Unsubscribed +------------------------------------------------------------------+ | EXISTING STATE | DELIVER? | NEW STATE | +------------------------------------------------------------------+ | "None" | no | no state change | | "None + Pending Out" | yes | "None" | | "None + Pending In" | no | no state change | | "None + Pending Out/In" | yes | "None + Pending In" | | "To" | yes | "None" | | "To + Pending In" | yes | "None + Pending In" | | "From" | no | no state change | | "From + Pending Out" | yes | "From" | | "Both" | yes | "From" |is by sending a roster set containing an item for the contact with the 'subscription' attribute set to a value of "remove": <iq type='set' id='remove1'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain' subscription='remove'/> </query> </iq> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page60]55] Internet-Draft XMPP Instant MessagingAugustSeptember 2003+------------------------------------------------------------------+ 8.6 Server Delivery and Client Acknowledgement of Subscription State Change NotificationsWhen the user removes aserver receives an inbound presencecontact from his or her roster by setting the 'subscription' attribute to a value oftype "subscribe", "subscribed", "unsubscribe", and "unsubscribed" that consists of a"remove", the user's server (1) MUST automatically cancel any existing presence subscriptionstate change notification, in addition to sendingbetween the user and the contact (both 'to' and 'from' as appropriate); (2) MUST remove theappropriate "roster push" (or updatedrosterwhenitem from the user's rosteris next requested), it MUST deliverand inform all of thenotification touser's available resources of theintended recipient at least once. A serverroster item removal; (3) MUSTrequireinform therecipientresource that initiated the removal of success; and (4) SHOULD send unavailable presence toapprove or refuse a subscription request (i.e., an inboundthe contact: <presence from='user@somedomain' to='contact@otherdomain' type='unsubscribe'/> <presence from='user@somedomain' to='contact@otherdomain' type='unsubscribed'/> <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@otherdomain' subscription='remove'/> </query> </iq> <iq type='result' id='remove1'/> <presence from='user@somedomain' to='contact@otherdomain' type='unavailable'/> Upon receiving the presence stanza of type"subscribe") and MAY require"unsubscribe", therecipientcontact's server (1) MUST initiate a "roster push" toacknowledge receipt ofall available resources associated with thestate change notification. In ordercontact that have requested the roster, containing an updated roster item for the user with the 'subscription' attribute set torequire acknowledgement,a value of "to" (if the contact is offline, the contact's serverSHOULD sendMUST modify thenotification toroster item and send that modified item therecipient eachnext time therecipient logs in, untilcontact requests therecipient acknowledges receipt ofroster); and (2) MUST also deliver the "unsubscribe" state change notificationby "affirming" or "denying" the notification, as shown into thefollowing table: +--------------------------------------------------+ | NOTIFICATION | ACCEPT | DENY | +--------------------------------------------------+ | subscribe | subscribed | unsubscribed | | subscribed | subscribe | unsubscribe | | unsubscribe | unsubscribed | subscribed | | unsubscribed | unsubscribe | subscribe | +--------------------------------------------------+ Obviously, given the foregoing subscription state charts, somecontact: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@somedomain' Saint-Andre & Miller Expires March 7, 2004 [Page 56] Internet-Draft XMPP Instant Messaging September 2003 subscription='to' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence from='user@somedomain' to='contact@otherdomain' type='unsubscribe'/> Upon receiving theacknowledgement and denial stanzas will be routed topresence stanza of type "unsubscribed", thecontact and result in subscription state changes, while others will not. However, any such stanzascontact's server (1) MUSTresult in the server's no longer sending the subscription state notificationinitiate a "roster push" to all available resources associated with theuser. Becausecontact that have requested thesender's server MUST automatically generate outbound presence stanzas of type "unsubscribe" and "unsubscribed" upon receiving aroster, containing an updated rostersetitem for the user with the 'subscription' attribute set to a value of"remove" (see Section 7.6),"none" (if the contact is offline, the contact's server MUSTtreat amodify the rosterremove request as equivalent to sending those presence stanzas for purposes of determining whether to continue sending subscriptionitem and send that modified item the next time the contact requests the roster); and (2) MUST also deliver the "unsubscribe" state changenotificationsnotification to the contact: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@somedomain' subscription='none' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence from='user@somedomain' to='contact@otherdomain' type='unsubscribed'/> Upon receiving the presence stanza of type"subscribe" or "subscribed""unavailable" addressed to theuser.contact, the contact's server MUST deliver the unavailable presence to the user: <presence from='user@somedomain' to='contact@otherdomain' type='unavailable'/> Note that when the user removes the contact from the user's roster, Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page61]57] Internet-Draft XMPP Instant MessagingAugustSeptember 20039. Blocking Communication Most instant messaging systems have found it necessary to implement some method for users to block communications from particular other users (this is also required by sections 5.1.5, 5.1.15, 5.3.2, and 5.4.10 of RFC 2779 [2]). In XMPP this is done usingthe'jabber:iq:privacy' namespace by managing one's privacy lists. Server-side privacy lists enable successful completionend state of thefollowing use cases: o Retrieving one's privacy lists. o Adding, removing, and editing one's privacy lists. o Setting, changing, or declining active lists. o Setting, changing, or declining the default list (i.e., the list thatcontact's roster isactive by default). o Allowing or blocking messages based on JID, group, or subscription type (or globally). o Allowing or blocking inbound presence notifications based on JID, group, or subscription type (or globally). o Allowing or blocking outbound presence notifications based on JID, group, or subscription type (or globally). o Allowing or blocking IQs based on JID, group, or subscription type (or globally). o Allowing or blocking all communications based on JID, group, or subscription type (or globally). Note: presence notifications do not include presence subscriptions, only presence informationthat the user isbroadcasted to entities that are subscribed to a user's presence information. Thus this includes presence stanzasstill in the contact's roster withno 'type' attribute ora subscription state oftype='unavailable' only. 9.1 Syntax A user MAY define one or more privacy lists, which are stored by the user's server. Each <list/> element contains one or more rules"none"; in order to completely remove theform of <item/> elements, and each <item/> element uses attributes to define a privacy rule type, a specific value to which the rules applies, the relevant action, and the place of theroster iteminfor the user, the contact needs to also send a roster removal request. Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page62]58] Internet-Draft XMPP Instant MessagingAugustSeptember 2003processing order. The syntax is as follows: <iq> <query xmlns='jabber:iq:privacy'> <list name='foo'> <item type='[jid|group|subscription]' value='bar' action='[accept|deny]' order='unsignedInt'/> </list> </query> </iq> If the type is "jid", then the 'value' attribute MUST contain a valid Jabber ID. JIDs9. Subscription States This section summarizes information about subscription states. 9.1 Defined States There arematched in the following order: <user@somedomain/ resource>, then <user@somedomain>, then <somedomain/resource>, then <somedomain>. If the value is <user@somedomain>, then any connected resource for that user@somedomain matches. If the value is <somedomain/resource>, then only that resource matches. If the value is <somedomain>, then any user@somedomain (or subdomain) matches. If the type is "group", then the 'value' attribute SHOULD contain the namenine possible subscription states: 1. "None" = you and I are not subscribed to each other, and neither of us has requested agroup insubscription from theuser's roster. (If a client attemptsother 2. "None + Pending Out" = you and I are not subscribed toupdate, create, or delete a list item witheach other, and I've sent you agroup that issubscription request but you have notin the user's roster, the server SHOULD returnresponded yet 3. "None + Pending In" = you and I are not subscribed tothe client an <item-not-found/> stanza error.) If the type is "subscription", then the 'value' attribute MUST be one of "both", "to", "from", or "none" as defined in XMPP Core [1]. If no 'type' attribute is included, the rule provides the "fall-through" case. The 'action' attribute MUST be includedeach other, andits value MUST be either "accept" or "deny". The 'order' attribute MUST be includedyou've sent me a subscription request but I have not responded yet 4. "None + Pending Out/In" = you andits value MUST beI are not subscribed to each other, you've sent me anon-negative integer that is unique among all items in the list. (Ifsubscription request but I have not responded yet, and I've sent you aclient attemptssubscription request but you have not responded yet 5. "To" = I'm subscribed tocreate or updateyou (one-way) 6. "To + Pending In" = I'm subscribed to you, and you've send me alist with non-unique order values, the server MUST returnsubscription request but I have not responded yet 7. "From" = you're subscribed tothe clientme (one-way) 8. "From + Pending Out" = you're subscribed to me, and I've sent you a<bad-request/> stanza error. Within the 'jabber:iq:privacy' namespace, the <query/> childsubscription request but you have not responded yet 9. "Both" = we're subscribed to each other (two-way) 9.2 Server Handling of Outbound Presence, Categorized by Subscription State This section defines how aclient-generated IQserver MUST handle an outbound presence stanza of type"set" MUST NOT include more than one child element"subscribe", "subscribed", "unsubscribe", and "unsubscribed" (i.e., route it to thestanza must contain only one <active/> Saint-Andre & Miller Expires February 20, 2004 [Page 63] Internet-Draft XMPP Instant Messaging August 2003 element, one <default/> element, or one <list/> element); ifintended recipient and/or make aclient violates this rule, the server MUST returnchange to theclient a <bad-request/> stanza error.) When a client adds or updates a privacy list,subscription state), categorized by the<list/> element SHOULD contain at least one <item/> child element; when a client removescurrent subscription state. The general rule is that aprivacy list,server MUST route the<list/> element SHOULD contain no <item/> child element. When a client updates a privacy list, it must include all ofstanza to thedesired items (i.e., not a "delta"). 9.2 Business Rules 1. If there is an active list set for a session,intended recipient if itaffects onlywould change thesession for which it is activated,subscription state, andonly for the duration of the session. OnlyMUST NOT route theactive list for that session is processed (i.e.,stanza if it would not change thedefault list is ignored). 2. The default list applies tosubscription state. Detailed definitions are contained in theuser as a whole, and is processedSaint-Andre & Miller Expires March 7, 2004 [Page 59] Internet-Draft XMPP Instant Messaging September 2003 following sections. Naturally, ifthere is no active list set forthetarget session/resource to which astanzais addressed, or if there are no current sessions forchanges theuser. 3. If there is no active list set for a session (or there are no current sessions for the user), and there is no default list, then all stanzas SHOULD BE accepted or appropriately processed by the server on behalf of the user. 4. Privacy lists SHOULD be the first routing and delivery rule applied by a server, trumping the other rules specified in Section 10. 5. The order in which privacy list items are processed by the server is important. List items MUST be processed in ascending order determined by the values of the 'order' attribute for each <item/ >. 6. As soon as a stanza is matched against a privacy list,subscription state, the serverSHOULD appropriately handle the stanza and cease processing. 7. If no fall-through item is provided in a list, the fall-through action is assumed to be "accept". 8. If a user updates the definition for an active list, subsequent processing based on that active listMUSTuse the updated definition (for all resources to which that active list currently applies). Saint-Andre & Miller Expires February 20, 2004 [Page 64] Internet-Draft XMPP Instant Messaging August 2003 9. If aalso changetothe subscription state. 9.2.1 Subscription State = None +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | yes | "None + Pending Out" | | subscribed | no | no stateor roster group of a roster item defined in an active list occurs during a user's session, subsequent processing based on that active list MUST take into account the changedchange | | unsubscribe | no | no stateor group (for all resources to which that active list currently applies). 9.3 Retrieving One's Privacy Lists Example: Client requests names ofchange | | unsubscribed | no | no state change | +-------------------------------------------------------+ 9.2.2 Subscription State = None + Pending Out +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | no | no state change | | subscribed | no | no state change | | unsubscribe | yes | "None" | | unsubscribed | no | no state change | +-------------------------------------------------------+ 9.2.3 Subscription State = None + Pending In +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | yes | "None + Pending Out/In" | | subscribed | yes | "From" | | unsubscribe | no | no state change | | unsubscribed | yes | "None" | +-------------------------------------------------------+ 9.2.4 Subscription State = None + Pending Out/In +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | no | no state change | | subscribed | yes | "From + Pending Out" | | unsubscribe | yes | "None + Pending In" | | unsubscribed | yes | "None + Pending Out" | Saint-Andre & Miller Expires March 7, 2004 [Page 60] Internet-Draft XMPP Instant Messaging September 2003 +-------------------------------------------------------+ 9.2.5 Subscription State = To +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | no | no state change | | subscribed | no | no state change | | unsubscribe | yes | "None" | | unsubscribed | no | no state change | +-------------------------------------------------------+ 9.2.6 Subscription State = To + Pending In +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | no | no state change | | subscribed | yes | "Both" | | unsubscribe | yes | "None + Pending In" | | unsubscribed | yes | "To" | +-------------------------------------------------------+ 9.2.7 Subscription State = From +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | yes | "From + Pending Out" | | subscribed | no | no state change | | unsubscribe | no | no state change | | unsubscribed | yes | "None" | +-------------------------------------------------------+ 9.2.8 Subscription State = From + Pending Out +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | no | no state change | | subscribed | no | no state change | | unsubscribe | yes | "From" | | unsubscribed | yes | "None + Pending Out" | Saint-Andre & Miller Expires March 7, 2004 [Page 61] Internet-Draft XMPP Instant Messaging September 2003 +-------------------------------------------------------+ 9.2.9 Subscription State = Both +-------------------------------------------------------+ | STANZA TYPE | ROUTE? | NEW STATE | +-------------------------------------------------------+ | subscribe | no | no state change | | subscribed | no | no state change | | unsubscribe | yes | "From" | | unsubscribed | yes | "To" | +-------------------------------------------------------+ 9.3 Server Handling of Outbound Presence, Categorized by Presence Type This section defines how a server MUST handle an outbound presence stanza of type "subscribe", "subscribed", "unsubscribe", and "unsubscribed" (i.e., route it to the intended recipient and/or make a change to the subscription state), categorized by presence type. 9.3.1 Subscribe +----------------------------------------------------------------+ | EXISTING STATE | ROUTE? | NEW STATE | +----------------------------------------------------------------+ | "None" | yes | "None + Pending Out" | | "None + Pending Out" | no | no state change | | "None + Pending In" | yes | "None + Pending Out/In" | | "None + Pending Out/In" | no | no state change | | "To" | no | no state change | | "To + Pending In" | no | no state change | | "From" | yes | "From + Pending Out" | | "From + Pending Out" | no | no state change | | "Both" | no | no state change | +----------------------------------------------------------------+ 9.3.2 Subscribed +----------------------------------------------------------------+ | EXISTING STATE | ROUTE? | NEW STATE | +----------------------------------------------------------------+ | "None" | no | no state change | | "None + Pending Out" | no | no state change | | "None + Pending In" | yes | "From" | | "None + Pending Out/In" | yes | "From + Pending Out" | Saint-Andre & Miller Expires March 7, 2004 [Page 62] Internet-Draft XMPP Instant Messaging September 2003 | "To" | no | no state change | | "To + Pending In" | yes | "Both" | | "From" | no | no state change | | "From + Pending Out" | no | no state change | | "Both" | no | no state change | +----------------------------------------------------------------+ 9.3.3 Unsubscribe +----------------------------------------------------------------+ | EXISTING STATE | ROUTE? | NEW STATE | +----------------------------------------------------------------+ | "None" | no | no state change | | "None + Pending Out" | no | no state change | | "None + Pending In" | no | no state change | | "None + Pending Out/In" | yes | "None + Pending In" | | "To" | yes | "None" | | "To + Pending In" | yes | "None + Pending In" | | "From" | no | no state change | | "From + Pending Out" | yes | "From" | | "Both" | yes | "From" | +----------------------------------------------------------------+ Note: When a user sends an outbound presence stanza of type "unsubscribe" that results in a subscription state change, the contact's server SHOULD auto-reply by sending a presence stanza of type "unsubscribed" to the user on behalf of the contact and MUST deliver that presence stanza to the contact. 9.3.4 Unsubscribed +----------------------------------------------------------------+ | EXISTING STATE | ROUTE? | NEW STATE | +----------------------------------------------------------------+ | "None" | no | no state change | | "None + Pending Out" | no | no state change | | "None + Pending In" | yes | "None" | | "None + Pending Out/In" | yes | "None + Pending Out" | | "To" | no | no state change | | "To + Pending In" | yes | "To" | | "From" | yes | "None" | | "From + Pending Out" | yes | "None + Pending Out" | | "Both" | yes | "To" | +----------------------------------------------------------------+ Saint-Andre & Miller Expires March 7, 2004 [Page 63] Internet-Draft XMPP Instant Messaging September 2003 9.4 Server Handling of Inbound Presence, Categorized by Subscription State This section defines how a server MUST handle an inbound presence stanza of type "subscribe", "subscribed", "unsubscribe", and "unsubscribed" (i.e., deliver it to the intended recipient and/or make a change to the subscription state), categorized by subscription state. (Note: some of the presence stanza types should never be received as inbound stanzas, since the sender's server MUST NOT route them to the intended recipient; however, these stanza types are included for the sake of completeness.) 9.4.1 Subscription State = None +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | yes | "None + Pending In" | | subscribed | no | no state change | | unsubscribe | no | no state change | | unsubscribed | no | no state change | +--------------------------------------------------------+ 9.4.2 Subscription State = None + Pending Out +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | yes | "None + Pending Out/In" | | subscribed | yes | "To" | | unsubscribe | no | no state change | | unsubscribed | yes | "None" | +--------------------------------------------------------+ 9.4.3 Subscription State = None + Pending In +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | no | no state change | | subscribed | no | no state change | | unsubscribe | yes | "None" | | unsubscribed | no | no state change | +--------------------------------------------------------+ Saint-Andre & Miller Expires March 7, 2004 [Page 64] Internet-Draft XMPP Instant Messaging September 2003 9.4.4 Subscription State = None + Pending Out/In +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | no | no state change | | subscribed | yes | "To + Pending In" | | unsubscribe | yes | "None + Pending Out" | | unsubscribed | yes | "None + Pending In" | +--------------------------------------------------------+ 9.4.5 Subscription State = To +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | yes | "To + Pending In" | | subscribed | no | no state change | | unsubscribe | no | no state change | | unsubscribed | yes | "None" | +--------------------------------------------------------+ 9.4.6 Subscription State = To + Pending In +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | no | no state change | | subscribed | no | no state change | | unsubscribe | yes | "To" | | unsubscribed | yes | "None + Pending In" | +--------------------------------------------------------+ 9.4.7 Subscription State = From +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | no | no state change | | subscribed | no | no state change | | unsubscribe | yes | "None" | | unsubscribed | no | no state change | +--------------------------------------------------------+ Saint-Andre & Miller Expires March 7, 2004 [Page 65] Internet-Draft XMPP Instant Messaging September 2003 9.4.8 Subscription State = From + Pending Out +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | no | no state change | | subscribed | yes | "Both" | | unsubscribe | yes | "None + Pending Out" | | unsubscribed | yes | "From" | +--------------------------------------------------------+ 9.4.9 Subscription State = Both +--------------------------------------------------------+ | STANZA TYPE | DELIVER? | NEW STATE | +--------------------------------------------------------+ | subscribe | no | no state change | | subscribed | no | no state change | | unsubscribe | yes | "To" | | unsubscribed | yes | "From" | +--------------------------------------------------------+ 9.5 Server Handling of Inbound Presence, Categorized by Presence Type This section defines how a server MUST handle an inbound presence stanza of type "subscribe", "subscribed", "unsubscribe", and "unsubscribed" (i.e., deliver it to the intended recipient and/or make a change to the subscription state), categorized by presence type. 9.5.1 Subscribe +------------------------------------------------------------------+ | EXISTING STATE | DELIVER? | NEW STATE | +------------------------------------------------------------------+ | "None" | yes | "None + Pending In" | | "None + Pending Out" | yes | "None + Pending Out/In" | | "None + Pending In" | no | no state change | | "None + Pending Out/In" | no | no state change | | "To" | yes | "To + Pending In" | | "To + Pending In" | no | no state change | | "From" | no | no state change | | "From + Pending Out" | no | no state change | | "Both" | no | no state change | +------------------------------------------------------------------+ Saint-Andre & Miller Expires March 7, 2004 [Page 66] Internet-Draft XMPP Instant Messaging September 2003 9.5.2 Subscribed +------------------------------------------------------------------+ | EXISTING STATE | DELIVER? | NEW STATE | +------------------------------------------------------------------+ | "None" | no | no state change | | "None + Pending Out" | yes | "To" | | "None + Pending In" | no | no state change | | "None + Pending Out/In" | yes | "To + Pending In" | | "To" | no | no state change | | "To + Pending In" | no | no state change | | "From" | no | no state change | | "From + Pending Out" | yes | "Both" | | "Both" | no | no state change | +------------------------------------------------------------------+ 9.5.3 Unsubscribe +------------------------------------------------------------------+ | EXISTING STATE | DELIVER? | NEW STATE | +------------------------------------------------------------------+ | "None" | no | no state change | | "None + Pending Out" | no | no state change | | "None + Pending In" | yes | "None" | | "None + Pending Out/In" | yes | "None + Pending Out" | | "To" | no | no state change | | "To + Pending In" | yes | "To" | | "From" | yes | "None" | | "From + Pending Out" | yes | "None + Pending Out | | "Both" | yes | "To" | +------------------------------------------------------------------+ 9.5.4 Unsubscribed +------------------------------------------------------------------+ | EXISTING STATE | DELIVER? | NEW STATE | +------------------------------------------------------------------+ | "None" | no | no state change | | "None + Pending Out" | yes | "None" | | "None + Pending In" | no | no state change | | "None + Pending Out/In" | yes | "None + Pending In" | | "To" | yes | "None" | | "To + Pending In" | yes | "None + Pending In" | | "From" | no | no state change | | "From + Pending Out" | yes | "From" | | "Both" | yes | "From" | Saint-Andre & Miller Expires March 7, 2004 [Page 67] Internet-Draft XMPP Instant Messaging September 2003 +------------------------------------------------------------------+ 9.6 Server Delivery and Client Acknowledgement of Subscription State Change Notifications When a server receives an inbound presence of type "subscribe", "subscribed", "unsubscribe", and "unsubscribed" that consists of a subscription state change notification, in addition to sending the appropriate "roster push" (or updated roster when the roster is next requested), it MUST deliver the notification to the intended recipient at least once. A server MUST require the recipient to approve or refuse a subscription request (i.e., an inbound presence stanza of type "subscribe") and MAY require the recipient to acknowledge receipt of the state change notification. In order to require acknowledgement, a server SHOULD send the notification to the recipient each time the recipient logs in, until the recipient acknowledges receipt of the notification by "affirming" or "denying" the notification, as shown in the following table: +--------------------------------------------------+ | NOTIFICATION | ACCEPT | DENY | +--------------------------------------------------+ | subscribe | subscribed | unsubscribed | | subscribed | subscribe | unsubscribe | | unsubscribe | unsubscribed | subscribed | | unsubscribed | unsubscribe | subscribe | +--------------------------------------------------+ Obviously, given the foregoing subscription state charts, some the acknowledgement and denial stanzas will be routed to the contact and result in subscription state changes, while others will not. However, any such stanzas MUST result in the server's no longer sending the subscription state notification to the user. Because the sender's server MUST automatically generate outbound presence stanzas of type "unsubscribe" and "unsubscribed" upon receiving a roster set with the 'subscription' attribute set to a value of "remove" (see Removing a Roster Item and Cancelling All Subscriptions (Section 8.6)) the server MUST treat a roster remove request as equivalent to sending those presence stanzas for purposes of determining whether to continue sending subscription state change notifications of type "subscribe" or "subscribed" to the user. Saint-Andre & Miller Expires March 7, 2004 [Page 68] Internet-Draft XMPP Instant Messaging September 2003 10. Blocking Communication Most instant messaging systems have found it necessary to implement some method for users to block communications from particular other users (this is also required by sections 5.1.5, 5.1.15, 5.3.2, and 5.4.10 of RFC 2779 [2]). In XMPP this is done using the 'jabber:iq:privacy' namespace by managing one's privacy lists. Server-side privacy lists enable successful completion of the following use cases: o Retrieving one's privacy lists. o Adding, removing, and editing one's privacy lists. o Setting, changing, or declining active lists. o Setting, changing, or declining the default list (i.e., the list that is active by default). o Allowing or blocking messages based on JID, group, or subscription type (or globally). o Allowing or blocking inbound presence notifications based on JID, group, or subscription type (or globally). o Allowing or blocking outbound presence notifications based on JID, group, or subscription type (or globally). o Allowing or blocking IQs based on JID, group, or subscription type (or globally). o Allowing or blocking all communications based on JID, group, or subscription type (or globally). Note: presence notifications do not include presence subscriptions, only presence information that is broadcasted to entities that are subscribed to a user's presence information. Thus this includes presence stanzas with no 'type' attribute or of type='unavailable' only. 10.1 Syntax and Semantics A user MAY define one or more privacy lists, which are stored by the user's server. Each <list/> element contains one or more rules in the form of <item/> elements, and each <item/> element uses attributes to define a privacy rule type, a specific value to which the rules applies, the relevant action, and the place of the item in the Saint-Andre & Miller Expires March 7, 2004 [Page 69] Internet-Draft XMPP Instant Messaging September 2003 processing order. The syntax is as follows: <iq> <query xmlns='jabber:iq:privacy'> <list name='foo'> <item type='[jid|group|subscription]' value='bar' action='[accept|deny]' order='unsignedInt'/> </list> </query> </iq> If the type is "jid", then the 'value' attribute MUST contain a valid Jabber ID. JIDs are matched in the following order: <user@somedomain/ resource>, then <user@somedomain>, then <somedomain/resource>, then <somedomain>. If the value is <user@somedomain>, then any connected resource for that user@somedomain matches. If the value is <somedomain/resource>, then only that resource matches. If the value is <somedomain>, then any user@somedomain (or subdomain) matches. If the type is "group", then the 'value' attribute SHOULD contain the name of a group in the user's roster. (If a client attempts to update, create, or delete a list item with a group that is not in the user's roster, the server SHOULD return to the client an <item-not-found/> stanza error.) If the type is "subscription", then the 'value' attribute MUST be one of "both", "to", "from", or "none" as defined in XMPP Core [1] and described under Managing One's Roster (Section 7). If no 'type' attribute is included, the rule provides the "fall-through" case. The 'action' attribute MUST be included and its value MUST be either "accept" or "deny". The 'order' attribute MUST be included and its value MUST be a non-negative integer that is unique among all items in the list. (If a client attempts to create or update a list with non-unique order values, the server MUST return to the client a <bad-request/> stanza error. Within the 'jabber:iq:privacy' namespace, the <query/> child of a client-generated IQ stanza of type "set" MUST NOT include more than Saint-Andre & Miller Expires March 7, 2004 [Page 70] Internet-Draft XMPP Instant Messaging September 2003 one child element (i.e., the stanza must contain only one <active/> element, one <default/> element, or one <list/> element); if a client violates this rule, the server MUST return to the client a <bad-request/> stanza error.) When a client adds or updates a privacy list, the <list/> element SHOULD contain at least one <item/> child element; when a client removes a privacy list, the <list/> element SHOULD contain no <item/> child element. When a client updates a privacy list, it must include all of the desired items (i.e., not a "delta"). 10.2 Business Rules 1. If there is an active list set for a session, it affects only the session for which it is activated, and only for the duration of the session. Only the active list for that session is processed (i.e., the default list is ignored). 2. The default list applies to the user as a whole, and is processed if there is no active list set for the target session/resource to which a stanza is addressed, or if there are no current sessions for the user. 3. If there is no active list set for a session (or there are no current sessions for the user), and there is no default list, then all stanzas SHOULD BE accepted or appropriately processed by the server on behalf of the user. 4. Privacy lists MUST be the first rule applied by a server, superseding (1) the routing and delivery rules specified in Server Rules for Handling XML Stanzas (Section 14), and (2) the handling of subscription-related presence stanzas (and corresponding generation of roster pushes) specified in Integration of Roster Items and Presence Subscriptions (Section 8). 5. The order in which privacy list items are processed by the server is important. List items MUST be processed in ascending order determined by the values of the 'order' attribute for each <item/ >. 6. As soon as a stanza is matched against a privacy list, the server SHOULD appropriately handle the stanza and cease processing. 7. If no fall-through item is provided in a list, the fall-through action is assumed to be "accept". Saint-Andre & Miller Expires March 7, 2004 [Page 71] Internet-Draft XMPP Instant Messaging September 2003 8. If a user updates the definition for an active list, subsequent processing based on that active list MUST use the updated definition (for all resources to which that active list currently applies). 9. If a change to the subscription state or roster group of a roster item defined in an active list occurs during a user's session, subsequent processing based on that active list MUST take into account the changed state or group (for all resources to which that active list currently applies). 10.3 Retrieving One's Privacy Lists Example: Client requests names of privacy lists from server: <iq type='get' id='getlist1'> <query xmlns='jabber:iq:privacy'/> </iq> Example: Server sends names of privacy lists to client, preceded by active list and default list: <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> Example: Client requests a privacy list from server: <iq type='get' id='getlist2'> <query xmlns='jabber:iq:privacy'> <list name='public'/> </query> </iq> Example: Server sends a privacy list to client: <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>Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page65]72] Internet-Draft XMPP Instant MessagingAugustSeptember 2003 action='deny' order='1'/> <item action='allow' order='2'/> </list> </query> </iq> Example: Client requests another privacy list from server: <iq type='get' id='getlist3'> <query xmlns='jabber:iq:privacy'> <list name='private'/> </query> </iq> Example: Server sends another privacy list to client: <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> Example: Client requests yet another privacy list from server: <iq type='get' id='getlist4'> <query xmlns='jabber:iq:privacy'> <list name='special'/> </query> </iq> Example: Server sends yet another privacy list to client: <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@shakespeare.lit' action='allow'Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page66]73] Internet-Draft XMPP Instant MessagingAugustSeptember 2003 action='allow' order='7'/> <item type='jid' value='mercutio@shakespeare.lit' action='allow' order='42'/> <item action='deny' order='666'/> </list> </query> </iq> In this example, the user has three lists: (1) 'public', which allows communications from everyone except one specific entity (this is the default list); (2) 'private', which allows communications only with contacts who have a bidirectional subscription with the user (this is the active list); and (3) 'special', which allows communications only with three specific entities. If the user attempts to retrieve a list but a list by that name does not exist, the server MUST return an <item-not-found> stanza error to the user: Example: Client attempts to retrieve non-existent list: <iq 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> The user is allowed to retrieve only one list at a time. If the user attempts to retrieve more than one list in the same request, the server MUST return a <bad request> stanza error to the user: Example: Client attempts to retrieve more than one list: <iq type='error' id='getlist6'> <query xmlns='jabber:iq:privacy'> <list name='public'/> <list name='private'/> <list name='special'/> </query> <error type='modify'> <bad-requestxmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq>Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page67]74] Internet-Draft XMPP Instant MessagingAugustSeptember 20039.4xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> 10.4 Managing Active Lists In order to set or change the active list currently being applied by the server, the user MUST send an IQ stanza of type "set" with a <query/> element qualified by the 'jabber:iq:privacy' namespace that contains an empty <active/> child element possessing a 'name' attribute whose value is set to the desired list name. Example: Client requests change of active list: <iq type='set' id='active1'> <query xmlns='jabber:iq:privacy'> <active name='special'/> </query> </iq> The server MUST activate and apply the requested list before sending the result back to the client. Example: Server acknowledges success of active list change: <iq type='result' id='active1' to='juliet@example.com/balcony'/> If the user attempts to set an active list but a list by that name does not exist, the server MUST return an <item-not-found> stanza error to the user: Example: Client attempts to set a non-existent list as active: <iq 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> In order to decline the use of any active list, a user MUST send an empty <active/> element with no name. Example: Client declines the use of active lists:<iq type='set' id='active2'> <query xmlns='jabber:iq:privacy'> <active/> </query>Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page68]75] Internet-Draft XMPP Instant MessagingAugustSeptember 2003 <iq type='set' id='active2'> <query xmlns='jabber:iq:privacy'> <active/> </query> </iq>9.510.5 Managing the Default List In order to change its default list, the user MUST send an IQ stanza of type "set" with a <query/> element qualified by the 'jabber:iq:privacy' namespace that contains an empty <default/> child element possessing a 'name' attribute whose value is set to the desired list name. Example: Client requests change of default list: <iq type='set' id='default1'> <query xmlns='jabber:iq:privacy'> <default name='special'/> </query> </iq> Example: Server acknowledges success of default list change: <iq type='result' id='default1' to='juliet@example.com/balcony'/> If the user attempts to set a default list but a list by that name does not exist, the server MUST return an <item-not-found> stanza error to the user: Example: Client attempts to set a non-existent list as default: <iq type='error' id='default2'> <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> In order to decline the use of a default list (i.e., to use the domain's stanza routing rules at all times), a user MUST send an empty <default/> element with no name. Example: Client declines the use of the default list:<iq type='set' id='default2'> <query xmlns='jabber:iq:privacy'> <default/>Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page69]76] Internet-Draft XMPP Instant MessagingAugustSeptember 2003 <iq type='set' id='default2'> <query xmlns='jabber:iq:privacy'> <default/> </query> </iq>9.610.6 Editing a Privacy List In order to edit a privacy list, the user MUST send an IQ stanza of type "set" with a <query/> element qualified by the 'jabber:iq:privacy' namespace that contains one <list/> child element possessing a 'name' attribute whose value is set to the list name the user would like to edit. The <list/> element MUST contain one or more <item/> elements, which specify the user's desired changes to the list by including all elements in the list (not the "delta"). Example: Client edits a privacy list: <iq 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> Note: The value of the 'order' attribute for any given item is not fixed. Thus in the foregoing example if the user would like to add 4 items between the "tybalt@example.com" item and the "paris@example.org" item, the user's client MUST renumber the relevant items before submitting the list to the server. Example: Server acknowledges success of list edit: <iq type='result' id='edit1' to='juliet@example.com/balcony'/>9.7Saint-Andre & Miller Expires March 7, 2004 [Page 77] Internet-Draft XMPP Instant Messaging September 2003 10.7 Adding a New Privacy List The same protocol used to edit an existing list is used to create a new list. If the list name matches that of an existing list, the request to add a new list will overwrite the old one.Saint-Andre & Miller Expires February 20, 2004 [Page 70] Internet-Draft XMPP Instant Messaging August 2003 9.810.8 Removing a Privacy List In order to remove a privacy list, the user MUST send an IQ stanza of type "set" with a <query/> element qualified by the 'jabber:iq:privacy' namespace that contains one empty <list/> child element possessing a 'name' attribute whose value is set to the list name the user would like to remove. Example: Client removes a privacy list: <iq type='set' id='remove1'> <query xmlns='jabber:iq:privacy'> <list name='private'/> </query> </iq> Example: Server acknowledges success of list removal: <iq type='result' id='remove1' to='juliet@example.com/balcony'/> If a user attempts to remove an active list or the default list, the server MUST return a <conflict/> stanza error to the user. The user MUST first set another list to active or default before removing it. If the user attempts to remove a list but a list by that name does not exist, the server MUST return an <item-not-found> stanza error to the user: If the user attempts to remove more than one list in the same request, the server MUST return a <bad request> stanza error to the user.9.910.9 Blocking Messages Server-side privacy lists enable a user to block incoming messages from other users based on the other user's JID, roster group, or subscription status (or globally). The following examples illustrate the protocol. Example: User blocks based on JID: <iq 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'>Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page71]78] Internet-Draft XMPP Instant MessagingAugustSeptember 2003 <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> As a result of creating and applying the foregoing list, the user will not receive messages from the user with the specified JID. Example: User blocks based on roster group: <iq 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> As a result of creating and applying the foregoing list, the user will not receive messages from any users in the specified roster group. Example: User blocks based on subscription type: <iq 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> Saint-Andre & Miller Expires March 7, 2004 [Page 79] Internet-Draft XMPP Instant Messaging September 2003 As a result of creating and applying the foregoing list, the user will not receive messages from any users with the specified subscription type. Example: User blocks globally:Saint-Andre & Miller Expires February 20, 2004 [Page 72] Internet-Draft XMPP Instant Messaging August 2003<iq type='set' id='msg4'> <query xmlns='jabber:iq:privacy'> <list name='message-global-example'> <item action='deny' order='6'> <message/> </item> </list> </query> </iq> As a result of creating and applying the foregoing list, the user will not receive messages from any other users.9.1010.10 Blocking Inbound Presence Notifications Server-side privacy lists enable a user to block incoming presence notifications from other users based on the other user's JID, roster group, or subscription status (or globally). The following examples illustrate the protocol. Note: presence notifications do not include presence subscriptions, only presence information that is broadcasted to the user because the user previously subscribed to a contact's presence information. Thus this includes presence stanzas with no 'type' attribute or of type='unavailable' only. Example: User blocks based on JID: <iq 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> As a result of creating and applying the foregoing list, the user Saint-Andre & Miller Expires March 7, 2004 [Page 80] Internet-Draft XMPP Instant Messaging September 2003 will not receive presence notifications from the user with the specified JID. Example: User blocks based on roster group: <iq type='set' id='presin2'>Saint-Andre & Miller Expires February 20, 2004 [Page 73] Internet-Draft XMPP Instant Messaging August 2003<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> As a result of creating and applying the foregoing list, the user will not receive presence notifications from any users in the specified roster group. Example: User blocks based on subscription type: <iq 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> As a result of creating and applying the foregoing list, the user will not receive presence notifications from any users with the specified subscription type. Example: User blocks globally: <iq type='set' id='presin4'> <query xmlns='jabber:iq:privacy'> <list name='presin-global-example'> <item action='deny' order='11'> <presence-in/> Saint-Andre & Miller Expires March 7, 2004 [Page 81] Internet-Draft XMPP Instant Messaging September 2003 </item> </list> </query> </iq> As a result of creating and applying the foregoing list, the userSaint-Andre & Miller Expires February 20, 2004 [Page 74] Internet-Draft XMPP Instant Messaging August 2003will not receive presence notifications from any other users.9.1110.11 Blocking Outbound Presence Notifications Server-side privacy lists enable a user to block outgoing presence notifications to other users based on the other user's JID, roster group, or subscription status (or globally). The following examples illustrate the protocol. Note: presence notifications do not include presence subscriptions, only presence informationthat is broadcasted to contacts because those contacts previously subscribed to the user's presence information. Thus this includes presence stanzas with no 'type' attribute or of type='unavailable' only. Note also that because information about last activity MAY be requested by a contact (as defined in Section 4.5), a user SHOULD block both outbound presence and IQs in relationthat is broadcasted toany given entity.contacts because those contacts previously subscribed to the user's presence information. Thus this includes presence stanzas with no 'type' attribute or of type='unavailable' only. Example: User blocks based on JID: <iq 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> As a result of creating and applying the foregoing list, the user will not send presence notifications to the user with the specified JID. Example: User blocks based on roster group: <iq 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>Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page75]82] Internet-Draft XMPP Instant MessagingAugustSeptember 2003 order='15'> <presence-out/> </item> </list> </query> </iq> As a result of creating and applying the foregoing list, the user will not send presence notifications to any users in the specified roster group. Example: User blocks based on subscription type: <iq 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> As a result of creating and applying the foregoing list, the user will not send presence notifications to any users with the specified subscription type. Example: User blocks globally: <iq 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> As a result of creating and applying the foregoing list, the user will not send presence notifications to any other users.9.1210.12 Blocking IQs Server-side privacy lists enable a user to block incoming IQ requests Saint-Andre & Miller Expires March 7, 2004 [Page 83] Internet-Draft XMPP Instant Messaging September 2003 of type "get" or "set" from other users based on the other user's JID, roster group, or subscription status (or globally). The following examples illustrate the protocol.Saint-Andre & Miller Expires February 20, 2004 [Page 76] Internet-Draft XMPP Instant Messaging August 2003Example: User blocks based on JID: <iq 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> As a result of creating and applying the foregoing list, the user will not receive IQ requests of type "get" or "set" from the user with the specified JID. Example: User blocks based on roster group: <iq 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> As a result of creating and applying the foregoing list, the user will not receive IQ requests of type "get" or "set" from any users in the specified roster group. Example: User blocks based on subscription type: <iq type='set' id='iq3'> <query xmlns='jabber:iq:privacy'> <list name='iq-sub-example'> <item type='subscription'value='none' action='deny' order='17'> <iq/>Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page77]84] Internet-Draft XMPP Instant MessagingAugustSeptember 2003 value='none' action='deny' order='17'> <iq/> </item> </list> </query> </iq> As a result of creating and applying the foregoing list, the user will not receive IQ requests of type "get" or "set" from any users with the specified subscription type. Example: User blocks globally: <iq type='set' id='iq4'> <query xmlns='jabber:iq:privacy'> <list name='iq-global-example'> <item action='deny' order='1'> <iq/> </item> </list> </query> </iq> As a result of creating and applying the foregoing list, the user will not receive IQ requests of type "get" or "set" from any other users.9.1310.13 Blocking All Communication Server-side privacy lists enable a user to block allcommunicationsstanzas from andpresenceto other users based on the other user's JID, roster group, or subscription status (or globally). Note that this includes subscription-related presence stanzas, which are excluded by Blocking Inbound Presence Notifications (Section 10.10). The following examples illustrate the protocol. Example: User blocks based on JID: <iq 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> Saint-Andre & Miller Expires March 7, 2004 [Page 85] Internet-Draft XMPP Instant Messaging September 2003 </query> </iq> As a result of creating and applying the foregoing list, the user will not receive any communications from, nor send any stanzas to, the user with the specified JID.Saint-Andre & Miller Expires February 20, 2004 [Page 78] Internet-Draft XMPP Instant Messaging August 2003Example: User blocks based on roster group: <iq 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> As a result of creating and applying the foregoing list, the user will not receive any communications from, nor send any stanzas to, any users in the specified roster group. Example: User blocks based on subscription type: <iq 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> As a result of creating and applying the foregoing list, the user will not receive any communications from, nor send any stanzas to, any users with the specified subscription type. Example: User blocks globally: <iq type='set' id='all4'> <query xmlns='jabber:iq:privacy'> <list name='all-global-example'> <item action='deny' order='7'/> </list> Saint-Andre & Miller Expires March 7, 2004 [Page 86] Internet-Draft XMPP Instant Messaging September 2003 </query> </iq> As a result of creating and applying the foregoing list, the user will not receive any communications from, nor send any stanzas to, any other users.Saint-Andre & Miller Expires February 20, 2004 [Page 79] Internet-Draft XMPP Instant Messaging August 2003 9.1410.14 Blocked Entity Attempts to Communicate with User If a blocked entity attempts to send messages or presence notifications to the user, the user's server SHOULD silently drop the stanza and MUST NOT return an error to the sending entity. If a blocked entity attempts to send an IQ stanza of type "get" or "set" to the user, the user's server MUST return to the sending entity a <feature-not-implemented/> stanza error, since this is the standard error code sent from a client that does not understand the namespace of an IQ get or set. IQ stanzas of other types SHOULD be silently dropped by the server. Example: Blocked entity attempts to send IQ get: <iq type='get' to='romeo@example.net' from='tybalt@example.com/pda' id='probing1'> <queryxmlns='jabber:iq:last'/>xmlns='jabber:iq:version'/> </iq> Example: Server returns error to blocked entity: <iq type='error' from='romeo@example.net' to='tybalt@example.com/pda' id='probing1'> <queryxmlns='jabber:iq:last'/>xmlns='jabber:iq:version'/> <error type='cancel'> <feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq>9.1510.15 Higher-Level Heuristics When building a representation of a higher-level privacy heuristic, a client SHOULD use the simplest possible representation. Saint-Andre & Miller Expires March 7, 2004 [Page 87] Internet-Draft XMPP Instant Messaging September 2003 For example, the heuristic "block all communications with any user not in my roster" could be constructed in any of the following ways: o allow communications from all JIDs in my roster (i.e., listing each JID as a separate list item), but block communications with everyone elseSaint-Andre & Miller Expires February 20, 2004 [Page 80] Internet-Draft XMPP Instant Messaging August 2003o allow communications from any user who is in one of the groups that make up my roster (i.e., listing each group as a separate list item), but block communications from everyone else o allow communications from any user with whom I have a subscription of 'both' or 'to' or 'from' (i.e., listing each subscription value separately), but block communications from everyone else o block communications from anyone whose subscription state is 'none' The final representation is the simplest and SHOULD be used; here is the XMLthat would be sentthat would be sent in this case: <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> Saint-Andre & Miller Expires March 7, 2004 [Page 88] Internet-Draft XMPP Instant Messaging September 2003 11. IANA Considerations For several related IANA considerations, refer to XMPP Core [1]. 11.1 XML Namespace Name for Session Data A URN sub-namespace for session-related data in the Extensible Messaging and Presence Protocol (XMPP) is defined as follows. URI: urn:ietf:params:xml:ns:xmpp-session Specification: [RFCXXXX] Description: This is the XML namespace name for session-related data inthis case: <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>the Extensible Messaging and Presence Protocol (XMPP) as defined by [RFCXXXX]. Registrant Contact: IETF, XMPP Working Group, <xmppwg@jabber.org> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page81]89] Internet-Draft XMPP Instant MessagingAugustSeptember 200310. Server Rules for Handling XML Stanzas Each server implementation will contain its own "delivery tree" for handling stanzas it receives. Such a tree determines whether a stanza needs to be routed to another domain, processed internally, or delivered to a connected resource associated with a registered user. The following rules apply: 10.1 No 'to' Address If the stanza possesses no 'to' attribute, the server SHOULD process it on behalf of the entity that sent it. Because all stanzas received from other servers MUST possess a 'to' attribute, this rule applies only to stanzas received from an entity that is connected to the server (usually an active client session). If the server receives a presence stanza with no 'to' attribute, the server SHOULD broadcast it to the entities that are subscribed12. Internationalization Considerations For internationalization considerations, refer to thesending entity's presence as defined under Section 4.1. If the server receives an IQ stanza of type "get" or "set" with no 'to' attribute and it understands the namespace that qualifies the content of the stanza, it MUST process the stanza on behalf of sending entity (where the meaning of "process" is determined by the semanticsrelevant section of XMPP Core [1]. Saint-Andre & Miller Expires March 7, 2004 [Page 90] Internet-Draft XMPP Instant Messaging September 2003 13. Security Considerations Core security considerations for XMPP are defined in thequalifying namespace). 10.2 Foreign Domain If the hostnamerelevant section ofthe domain identifier portionXMPP Core [1]. Additional considerations that apply only to instant messaging and presence applications ofthe JID containedXMPP are defined inthe 'to' attribute does not matchseveral places within this document; specifically: o When a server processes a stanza of any kind whose intended recipient is a user associated with one of theconfigured hostnames ofserver's hostnames, the serveritself orMUST first apply any privacy rules (Section 10) that are in force (see Server Rules for Handling XML Stanzas (Section 14)). o When asubdomain thereof, theserverSHOULD route theprocesses an inbound presence stanzato the foreign domain (subject to local service provisioning and security policies regarding inter-domain communication). If routing to the recipient's serverof type "probe" whose intended recipient isunsuccessful,a user associated with one of the server's hostnames, thesender'sserver MUSTreturn an error toNOT reveal thesender;user's presence information if therecipient's server can be contacted but delivery by the recipient's server to the recipientsender isunsuccessful, the recipient's server MUST return an errora user who is not authorized tothe senderreceive that information as determined byway of the sender's server. 10.3 Subdomain If the hostname of the domain identifier portion of the JID contained in the 'to' attribute matchespresence subscriptions (see Client and Server Presence Responsibilities (Section 5.1)). o When asubdomain of one of the configured hostnames of the server itself, theserverMAY process theprocesses an outbound presence stanzaitselfwith no type orMAY routeof type "unavailable", it MUST follow thestanzarules defined under Client and Server Presence Responsibilities (Section 5.1) in order toa specialized serviceensure that such presence information isresponsible fornot broadcasted to entities thatsubdomain (if any). 10.4 Bare Domain or Specific Resource If the hostname of the domain identifier portion of the JID containedare not authorized to know such information. Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page82]91] Internet-Draft XMPP Instant MessagingAugustSeptember 2003in the 'to' attribute matches the hostname of the server itself and the JID contained in the 'to' attribute is of the form <somedomain> or <somedomain/resource>, the server (or a14. Server Rules for Handling XML Stanzas Basic delivery rules for servers are definedresource thereof) SHOULD process the stanza as appropriatein XMPP Core [1]. This section defines additional rules forthe stanza type. If the stanza is an IQ stanza and the server understands the namespace that qualifies the content of the stanza, the server SHOULD process the request according to the semantics of the qualifying namespace,instant messaging andMUST reply with an IQ of type "result" or "error". 10.5 User in Same Domainpresence applications. If the hostname of the domain identifier portion of the JID contained in the 'to' attribute of a stanza matches the hostname of the server itself and the JID contained in the 'to' attribute is of the form <user@somedomain> or <user@somedomain/resource>, the serverSHOULDMUST first apply any privacy rules (Section9)10) that are in force. If privacy rules allow the stanza, it SHOULD be routed or delivered to the intended recipient of the stanza as represented by the JID contained in the 'to' attribute. The following additional rulesapply: 1. If the JID contains a resource identifier (i.e., is of the form <user@somedomain/resource>) and there is an available resource whose authzid matches the full JID, the recipient's server SHOULD deliver the stanzaapply tothe session that exactly matches the resource identifier. 2. If the JID contains a resource identifierinstant messaging andthere is no available resource whose authzid matches the full JID, the recipient's server SHOULD return to the sender a <recipient-unavailable/> stanza error. 3.presence applications, over and above those defined in XMPP Core [1]: 1. If the JID is of the form <user@somedomain> and there is at least one available resource available for the user, the recipient's server MUST follow these rules: 1. For message stanzas, the server SHOULD deliver the stanza to the available resource that provided the highest value for the <priority/> element (if the resource did not provide a priority, the server SHOULD consider it to have provided a value of zero). If two resources have the same priority, the server MAY use some other rule (e.g., most recent connect time or activity time) to choose between them. However, the server MUST NOT deliver the stanza to an available resource that provided a negative value for the <priority/> element. 2. For presence stanzas other than those of type "probe", the server MUST deliver the stanza to all available resources, except that the server MUST NOT deliver the stanza to anSaint-Andre & Miller Expires February 20, 2004 [Page 83] Internet-Draft XMPP Instant Messaging August 2003available resource that provided a negative value for the <priority/> element; for presence probes, the server SHOULD reply based on the rules defined inSection 4.1.Client and Server Presence Responsibilities (Section 5.1). 3. For IQ stanzas, the server itself MUST reply on behalf of the user with either an IQ result or an IQ error, and MUST NOT deliver the IQ stanza to any of the available resources. Specifically, if the semantics of the qualifying namespace define a reply that the server can provide, the server MUST reply to the stanza on behalf of theuser (e.g., this is the case with the 'jabber:iq:last' protocol defined above);user; if not, the server MUST reply with a <service-unavailable/> stanza error.4.Saint-Andre & Miller Expires March 7, 2004 [Page 92] Internet-Draft XMPP Instant Messaging September 2003 2. If the JID is of the form <user@somedomain> and there are no available resources associated with the user (e.g., an instant messaging user is offline), how the stanza is handled depends on the stanza type: 1. For presence stanzas of type "subscribe", the server MUST maintain a record of the stanza, as specified underSection 4.1.Client and Server Presence Responsibilities (Section 5.1). 2. For all other presence stanzas, the server SHOULD silently ignore the stanza by not storing it for later delivery or replying to it on behalf of the user. 3. For message stanzas, the server MAY choose to store the stanza on behalf of the user and deliver it when the user next becomes available. However, if offline message storage is not enabled, the server MUST return to the sender a <service-unavailable/> stanza error. (Note: offline message storage is not defined in XMPP since it strictly is a matter of implementation and service provisioning.) 4. For IQ stanzas, the server itself MUST reply on behalf of the user with either an IQ result or an IQ error. Specifically, if the semantics of the qualifying namespace define a reply that the server can provide, the server MUST reply to the stanza on behalf of theuser (e.g., this isuser; if not, thecaseserver MUST reply with a <service-unavailable/> stanza error. Saint-Andre & Miller Expires March 7, 2004 [Page 93] Internet-Draft XMPP Instant Messaging September 2003 15. Compliance Requirements This section summarizes the'jabber:iq:last' protocolspecific aspects of the Extensible Messaging and Presence Protocol that MUST be supported by instant messaging servers and client in order to be considered compliant implementations. All such applications MUST comply with the requirements specified in XMPP Core [1]. The text in this section specifies additional compliance requirements for instant messaging servers and clients; the requirements described here supplement but do not supersede the core requirements. 15.1 Servers In addition to core server compliance requirements, an instant messaging and presence application server MUST additionally support the following IM-related protocols: o All server-related instant messaging syntax and semantics defined in this document, including presence broadcast on behalf of clients, presence subscriptions, roster storage and manipulation, privacy rules, and IM-specific routing and delivery rules 15.2 Clients In addition to core client compliance requirements, an instant messaging client MUST additionally support the following IM-related protocols: o Generation and handling of the IM-specific semantics of XML stanzas as defined by the XML schemas, including the 'type' attribute of message and presence stanzas as well as their child elements o All client-related instant messaging syntax and semantics defined in this document, including presence subscriptions, roster management, and privacy rules o End-to-end object encryption as definedabove); if not, the server MUST reply with a <service-unavailable/> stanza error.in XMPP e2e [6] Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page84]94] Internet-Draft XMPP Instant MessagingAugustSeptember 200311. IANA Considerations For several related IANA considerations, refer to XMPP Core [1]. 11.1 XML Namespace Name for Session Data A URN sub-namespace for session-related dataNormative References [1] Saint-Andre, P. and J. Miller, "XMPP Core", draft-ietf-xmpp-core-18 (work inthe Extensible Messagingprogress), September 2003. [2] Day, M., Aggarwal, S. and J. Vincent, "Instant Messaging / Presence Protocol(XMPP) is defined as follows. URI: urn:ietf:params:xml:ns:xmpp-session Specification: [RFCXXXX] Description: This is the XML namespace nameRequirements", RFC 2779, February 2000. [3] World Wide Web Consortium, "Extensible Markup Language (XML) 1.0 (Second Edition)", W3C xml, October 2000, <http://www.w3.org/TR/ 2000/REC-xml-20001006>. [4] World Wide Web Consortium, "Namespaces in XML", W3C xml-names, January 1999, <http://www.w3.org/TR/1999/REC-xml-names-19990114/ >. [5] Bradner, S., "Key words forsession-related datause inthe Extensible Messaging and Presence Protocol (XMPP) as defined by [RFCXXXX]. Registrant Contact: IETF, XMPP Working Group, <xmppwg@jabber.org>RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997. [6] Saint-Andre, P., "End-to-End Object Encryption in XMPP", draft-ietf-xmpp-e2e-05 (work in progress), August 2003. Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page85]95] Internet-Draft XMPP Instant MessagingAugustSeptember 200312. Security Considerations For security considerations, refer to the relevant section of XMPP Core [1].Informative References [7] Jabber Software Foundation, "Jabber Software Foundation", <http://www.jabber.org/>. [8] Day, M., Rosenberg, J. and H. Sugano, "A Model for Presence and Instant Messaging", RFC 2778, February 2000, <http:// www.ietf.org/rfc/rfc2778.txt>. [9] Dawson, F. and T. Howes, "vCard MIME Directory Profile", RFC 2426, September 1998. Authors' Addresses Peter Saint-Andre Jabber Software Foundation EMail: stpeter@jabber.org Jeremie Miller Jabber Software Foundation EMail: jeremie@jabber.org Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page86] Internet-Draft XMPP Instant Messaging August 2003 13. Compliance Requirements This section summarizes the specific aspects of the Extensible96] Internet-Draft XMPP Instant Messaging September 2003 Appendix A. vCards Sections 3.1.3 andPresence Protocol4.1.4 of RFC 2779 [2] require thatMUSTit besupported by instant messaging servers and client in orderpossible tobe considered compliant implementations. All such applications MUST comply with the requirements specified in XMPP Core [1]. The text in this section specifies additional compliance requirementsretrieve out-of-band contact information forinstant messaging servers and clients; the requirements described here supplement but do not supersede the core requirements. 13.1 Servers In addition to core server compliance requirements, an instant messaging application server MUST additionally supportother users (e.g., telephone number or email address). An XML representation of thefollowing IM-related protocols: o All server-related instant messaging syntax and semanticsvCard specification defined inthis document, including presence broadcast on behalf of clients, presence subscriptions, roster storage and manipulation, privacy rules, and IM-specific routing and delivery rules 13.2 Clients In addition to core client compliance requirements, an instant messaging client MUST additionally support the following IM-related protocols: o Generation and handling ofRFC 2426 [9] is in common use within theIM-specific semanticsJabber community to provide such information but is out ofXML stanzas as defined by the XML schemas, including the 'type' attributescope for XMPP (documentation ofmessage and presence stanzas as well as their child elements o All client-related instant messaging syntax and semantics defined inthisdocument, including presence subscriptions, roster management, and privacy rules o End-to-end object encryption as definedprotocol is contained in "JEP-0054: vcard-temp", published by the Jabber Software Foundation [7]). Saint-Andre & Miller Expires March 7, 2004 [Page 97] Internet-Draft XMPP Instant Messaging September 2003 Appendix B. XML Schemas The following XML schemas are descriptive, not normative. For schemas defining the core features of XMPP, refer to XMPPe2e [4]Core [1]. B.1 jabber:client namespace <?xml version='1.0' encoding='UTF-8'?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:xml='http://www.w3.org/XML/1998/namespace' targetNamespace='jabber:client' xmlns='jabber:client' elementFormDefault='qualified'> <xs:import namespace='http://www.w3.org/XML/1998/namespace' schemaLocation='http://www.w3.org/2001/xml.xsd'/> <xs:element name='message'> <xs:complexType> <xs:sequence> <xs:element ref='subject' minOccurs='0' maxOccurs='unbounded'/> <xs:element ref='body' minOccurs='0' maxOccurs='unbounded'/> <xs:element ref='thread' minOccurs='0' maxOccurs='1'/> <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded'/> <xs:element ref='error' minOccurs='0' maxOccurs='1'/> </xs:sequence> <xs:attribute name='to' type='xs:string' use='optional'/> <xs:attribute name='from' type='xs:string' use='optional'/> <xs:attribute name='id' type='xs:NMTOKEN' use='optional'/> <xs:attribute ref='xml:lang' use='optional'/> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page87]98] Internet-Draft XMPP Instant Messaging September 2003 <xs:attribute name='type' use='optional'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='chat'/> <xs:enumeration value='error'/> <xs:enumeration value='groupchat'/> <xs:enumeration value='headline'/> <xs:enumeration value='normal'/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name='body' type='xs:string'> <xs:complexType> <xs:attribute ref='xml:lang' use='optional'/> </xs:complexType> </xs:element> <xs:element name='subject' type='xs:string'> <xs:complexType> <xs:attribute ref='xml:lang' use='optional'/> </xs:complexType> </xs:element> <xs:element name='thread' type='xs:NMTOKEN'/> <xs:element name='presence'> <xs:complexType> <xs:sequence> <xs:element ref='show' minOccurs='0' maxOccurs='1'/> <xs:element ref='status' minOccurs='0' maxOccurs='unbounded'/> <xs:element ref='priority' minOccurs='0' maxOccurs='1'/> <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded'/> <xs:element ref='error' minOccurs='0' maxOccurs='1'/> </xs:sequence> <xs:attribute name='to' Saint-Andre & Miller Expires March 7, 2004 [Page 99] Internet-Draft XMPP Instant Messaging September 2003 type='xs:string' use='optional'/> <xs:attribute name='from' type='xs:string' use='optional'/> <xs:attribute name='id' type='xs:NMTOKEN' use='optional'/> <xs:attribute ref='xml:lang' use='optional'/> <xs:attribute name='type' use='optional'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='subscribe'/> <xs:enumeration value='subscribed'/> <xs:enumeration value='unsubscribe'/> <xs:enumeration value='unsubscribed'/> <xs:enumeration value='unavailable'/> <xs:enumeration value='error'/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name='show'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='away'/> <xs:enumeration value='chat'/> <xs:enumeration value='dnd'/> <xs:enumeration value='xa'/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name='status' type='xs:string'> <xs:complexType> <xs:attribute ref='xml:lang' use='optional'/> </xs:complexType> </xs:element> <xs:element name='priority' type='xs:byte'/> <xs:element name='iq'> <xs:complexType> <xs:sequence> <xs:any namespace='##other' minOccurs='0' Saint-Andre & Miller Expires March 7, 2004 [Page 100] Internet-Draft XMPP Instant Messaging September 2003 maxOccurs='1'/> <xs:element ref='error' minOccurs='0' maxOccurs='1'/> </xs:sequence> <xs:attribute name='to' type='xs:string' use='optional'/> <xs:attribute name='from' type='xs:string' use='optional'/> <xs:attribute name='id' type='xs:NMTOKEN' use='required'/> <xs:attribute ref='xml:lang' use='optional'/> <xs:attribute name='type' use='required'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='get'/> <xs:enumeration value='set'/> <xs:enumeration value='result'/> <xs:enumeration value='error'/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name='error'> <xs:complexType> <xs:sequence> <xs:any namespace='urn:ietf:params:xml:ns:xmpp-stanzas' maxOccurs='1'/> <text namespace='urn:ietf:params:xml:ns:xmpp-stanzas' minOccurs='0' maxOccurs='1'/> <xs:any namespace='##other' minOccurs='0' maxOccurs='1'/> </xs:sequence> <xs:attribute name='type' use='required'/> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='cancel'/> <xs:enumeration value='continue'/> <xs:enumeration value='modify'/> <xs:enumeration value='auth'/> Saint-Andre & Miller Expires March 7, 2004 [Page 101] Internet-Draft XMPP Instant MessagingAugustSeptember 200314. Differences Between Jabber and XMPP This section is non-normative. XMPP has been adapted from the protocols originally developed in the Jabber open-source community, which can be thought of as "XMPP 0.9". Because there exists a large installed base of Jabber implementations and deployments, it may be helpful to specify the key differences between Jabber and XMPP in order to expedite and encourage upgrades of those implementations and deployments to XMPP. This section summarizes the differences that relate specifically to instant messaging applications, and the corresponding section of XMPP Core [1] summarizes the differences that relate to all XMPP applications. 14.1 Session Creation The client-to-server authentication protocol developed in Jabber community assumes that the client is an IM client and therefore initiates an IM session upon successful authentication (documention of this protocol is contained in "JEP-0078: Non-SASL Authentication", published by the Jabber Software Foundation [5]). XMPP maintains a stricter separation between core functionality and IM functionality; therefore, an IM session is not created until the client specifically requests one using the protocol defined in the Establishing a Session (Section 2) section of this document. 14.2 Privacy Rules The Jabber community began to define a protocol for communications blocking (privacy rules) in late 2001, but that effort was deprecated once the XMPP Working Group was formed. Therefore the protocol defined in the Blocking Communication (Section 9) section of this document is the only such protocol defined for use in the Jabber community.<xs:enumeration value='wait'/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> </xs:schema> B.2 jabber:server namespace <?xml version='1.0' encoding='UTF-8'?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:xml='http://www.w3.org/XML/1998/namespace' targetNamespace='jabber:server' xmlns='jabber:server' elementFormDefault='qualified'> <xs:import namespace='http://www.w3.org/XML/1998/namespace' schemaLocation='http://www.w3.org/2001/xml.xsd'/> <xs:element name='message'> <xs:complexType> <xs:sequence> <xs:element ref='subject' minOccurs='0' maxOccurs='unbounded'/> <xs:element ref='body' minOccurs='0' maxOccurs='unbounded'/> <xs:element ref='thread' minOccurs='0' maxOccurs='1'/> <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded'/> <xs:element ref='error' minOccurs='0' maxOccurs='1'/> </xs:sequence> <xs:attribute name='to' type='xs:string' use='required'/> <xs:attribute name='from' type='xs:string' Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page88]102] Internet-Draft XMPP Instant MessagingAugustSeptember 2003Normative References [1] Saint-Andre, P. and J. Miller, "XMPP Core", draft-ietf-xmpp-core-17 (work in progress), August 2003. [2] Day, M., Aggarwal, S. and J. Vincent, "Instant Messaging / Presence Protocol Requirements", RFC 2779, February 2000. [3] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997. [4] Saint-Andre, P., "End-to-End Object Encryption in XMPP", draft-ietf-xmpp-e2e-05 (work in progress), August 2003.use='required'/> <xs:attribute name='id' type='xs:NMTOKEN' use='optional'/> <xs:attribute ref='xml:lang' use='optional'/> <xs:attribute name='type' use='optional'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='chat'/> <xs:enumeration value='error'/> <xs:enumeration value='groupchat'/> <xs:enumeration value='headline'/> <xs:enumeration value='normal'/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name='body' type='xs:string'> <xs:complexType> <xs:attribute ref='xml:lang' use='optional'/> </xs:complexType> </xs:element> <xs:element name='subject' type='xs:string'> <xs:complexType> <xs:attribute ref='xml:lang' use='optional'/> </xs:complexType> </xs:element> <xs:element name='thread' type='xs:NMTOKEN'/> <xs:element name='presence'> <xs:complexType> <xs:sequence> <xs:element ref='show' minOccurs='0' maxOccurs='1'/> <xs:element ref='status' minOccurs='0' maxOccurs='unbounded'/> <xs:element ref='priority' minOccurs='0' maxOccurs='1'/> <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded'/> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page89]103] Internet-Draft XMPP Instant MessagingAugust 2003 Informative References [5] Jabber Software Foundation, "Jabber Software Foundation", <http://www.jabber.org/>. [6] Day, M., Rosenberg, J. and H. Sugano, "A Model for Presence and Instant Messaging", RFC 2778, February 2000, <http:// www.ietf.org/rfc/rfc2778.txt>. [7] Dawson, F. and T. Howes, "vCard MIME Directory Profile", RFC 2426,September1998. Authors' Addresses Peter Saint-Andre Jabber Software Foundation EMail: stpeter@jabber.org Jeremie Miller Jabber Software Foundation EMail: jeremie@jabber.org2003 <xs:element ref='error' minOccurs='0' maxOccurs='1'/> </xs:sequence> <xs:attribute name='to' type='xs:string' use='required'/> <xs:attribute name='from' type='xs:string' use='required'/> <xs:attribute name='id' type='xs:NMTOKEN' use='optional'/> <xs:attribute ref='xml:lang' use='optional'/> <xs:attribute name='type' use='optional'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='subscribe'/> <xs:enumeration value='subscribed'/> <xs:enumeration value='unsubscribe'/> <xs:enumeration value='unsubscribed'/> <xs:enumeration value='unavailable'/> <xs:enumeration value='error'/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name='show'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='away'/> <xs:enumeration value='chat'/> <xs:enumeration value='dnd'/> <xs:enumeration value='xa'/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name='status' type='xs:string'> <xs:complexType> <xs:attribute ref='xml:lang' use='optional'/> </xs:complexType> </xs:element> <xs:element name='priority' type='xs:byte'/> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page90]104] Internet-Draft XMPP Instant MessagingAugustSeptember 2003Appendix A. vCards Sections 3.1.3 and 4.1.4 of RFC 2779 [2] require that it be possible to retrieve contact information for other users (e.g., telephone number or email address). An XML representation of the vCard specification defined in RFC 2426 [7] is in common use within the Jabber community to provide such information but is out of scope for XMPP (documentation of this protocol is contained in "JEP-0054: vcard-temp", published by the Jabber Software Foundation [5]).<xs:element name='iq'> <xs:complexType> <xs:sequence> <xs:any namespace='##other' minOccurs='0' maxOccurs='1'/> <xs:element ref='error' minOccurs='0' maxOccurs='1'/> </xs:sequence> <xs:attribute name='to' type='xs:string' use='required'/> <xs:attribute name='from' type='xs:string' use='required'/> <xs:attribute name='id' type='xs:NMTOKEN' use='required'/> <xs:attribute ref='xml:lang' use='optional'/> <xs:attribute name='type' use='required'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='get'/> <xs:enumeration value='set'/> <xs:enumeration value='result'/> <xs:enumeration value='error'/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name='error'> <xs:complexType> <xs:sequence> <xs:any namespace='urn:ietf:params:xml:ns:xmpp-stanzas' maxOccurs='1'/> <text namespace='urn:ietf:params:xml:ns:xmpp-stanzas' minOccurs='0' maxOccurs='1'/> <xs:any namespace='##other' minOccurs='0' maxOccurs='1'/> </xs:sequence> <xs:attribute name='type' use='required'/> <xs:simpleType> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page91]105] Internet-Draft XMPP Instant MessagingAugustSeptember 2003Appendix B. XML Schemas The following XML schemas are descriptive, not normative. For schemas defining the core features of XMPP, refer to XMPP Core [1]. B.1<xs:restriction base='xs:NCName'> <xs:enumeration value='cancel'/> <xs:enumeration value='continue'/> <xs:enumeration value='modify'/> <xs:enumeration value='auth'/> <xs:enumeration value='wait'/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> </xs:schema> B.3 session <?xml version='1.0' encoding='UTF-8'?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='urn:ietf:params:xml:ns:xmpp-session' xmlns='urn:ietf:params:xml:ns:xmpp-session' elementFormDefault='qualified'> <xs:element name='session' type='empty'/> <xs:simpleType name='empty'> <xs:restriction base='xs:string'> <xs:enumeration value=''/> </xs:restriction> </xs:simpleType> </xs:schema>B.2 jabber:iq:lastB.4 jabber:iq:privacy <?xml version='1.0' encoding='UTF-8'?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'targetNamespace='jabber:iq:last' xmlns='jabber:iq:last'targetNamespace='jabber:iq:privacy' xmlns='jabber:iq:privacy' elementFormDefault='qualified'> <xs:element name='query'> <xs:complexType><xs:attribute name='seconds' type='xs:unsignedLong' use='optional'/> </xs:complexType> </xs:element> </xs:schema> B.3 jabber:iq:privacy <?xml version='1.0' encoding='UTF-8'?><xs:sequence> <xs:element ref='active' Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page92]106] Internet-Draft XMPP Instant MessagingAugustSeptember 2003<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='jabber:iq:privacy' xmlns='jabber:iq:privacy' elementFormDefault='qualified'> <xs:element name='query'> <xs:complexType> <xs:sequence> <xs:element ref='active'minOccurs='0' maxOccurs='1'/> <xs:element ref='default' minOccurs='0' maxOccurs='1'/> <xs:element ref='list' minOccurs='0' maxOccurs='unbounded'/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name='active'> <xs:complexType> <xs:attribute name='name' type='xs:string' use='optional'/> </xs:complexType> </xs:element> <xs:element name='default'> <xs:complexType> <xs:attribute name='name' type='xs:string' use='optional'/> </xs:complexType> </xs:element> <xs:element name='list'> <xs:complexType> <xs:sequence> <xs:element ref='item' minOccurs='0' maxOccurs='unbounded'/> </xs:sequence> <xs:attribute name='name' type='xs:string' use='required'/>Saint-Andre & Miller Expires February 20, 2004 [Page 93] Internet-Draft XMPP Instant Messaging August 2003</xs:complexType> </xs:element> <xs:element name='item'> <xs:complexType> <xs:sequence> <xs:element ref='iq' minOccurs='0' maxOccurs='1'/> <xs:element ref='message' Saint-Andre & Miller Expires March 7, 2004 [Page 107] Internet-Draft XMPP Instant Messaging September 2003 minOccurs='0' maxOccurs='1'/> <xs:element ref='presence-in' minOccurs='0' maxOccurs='1'/> <xs:element ref='presence-out' minOccurs='0' maxOccurs='1'/> </xs:sequence> <xs:attribute name='order' type='xs:unsignedInt' use='required'/> <xs:attribute name='value' type='xs:string' use='optional'/> <xs:attribute name='action' use='required'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='allow'/> <xs:enumeration value='deny'/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name='type' use='optional'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='group'/> <xs:enumeration value='jid'/> <xs:enumeration value='subscription'/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name='iq' type='empty'/> <xs:element name='message' type='empty'/> <xs:element name='presence-in' type='empty'/>Saint-Andre & Miller Expires February 20, 2004 [Page 94] Internet-Draft XMPP Instant Messaging August 2003<xs:element name='presence-out' type='empty'/> <xs:simpleType name='empty'> <xs:restriction base='xs:string'> <xs:enumeration value=''/> </xs:restriction> </xs:simpleType> </xs:schema>B.4Saint-Andre & Miller Expires March 7, 2004 [Page 108] Internet-Draft XMPP Instant Messaging September 2003 B.5 jabber:iq:roster <?xml version='1.0' encoding='UTF-8'?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='jabber:iq:roster' xmlns='jabber:iq:roster' elementFormDefault='qualified'> <xs:element name='query'> <xs:complexType> <xs:sequence> <xs:element ref='item' minOccurs='0' maxOccurs='unbounded'/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name='item'> <xs:complexType> <xs:sequence> <xs:element ref='group' minOccurs='0' maxOccurs='unbounded'/> </xs:sequence> <xs:attribute name='jid' type='xs:string' use='required'/> <xs:attribute name='name' type='xs:string' use='optional'/> <xs:attribute name='subscription' use='optional'> <xs:simpleType> <xs:restriction base='xs:NCNAME'> <xs:enumeration value='to'/> <xs:enumeration value='from'/> <xs:enumeration value='both'/> <xs:enumeration value='none'/> <xs:enumeration value='remove'/> </xs:restriction>Saint-Andre & Miller Expires February 20, 2004 [Page 95] Internet-Draft XMPP Instant Messaging August 2003</xs:simpleType> </xs:attribute> <xs:attribute name='ask' use='optional'> <xs:simpleType> <xs:restriction base='xs:NCNAME'> <xs:enumeration value='subscribe'/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> Saint-Andre & Miller Expires March 7, 2004 [Page 109] Internet-Draft XMPP Instant Messaging September 2003 <xs:element name='group' type='xs:string'/> </xs:schema> Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page 110] Internet-Draft XMPP Instant Messaging September 2003 Appendix C. Differences Between Jabber and XMPP This section is non-normative. XMPP has been adapted from the protocols originally developed in the Jabber open-source community, which can be thought of as "XMPP 0.9". Because there exists a large installed base of Jabber implementations and deployments, it may be helpful to specify the key differences between Jabber and XMPP in order to expedite and encourage upgrades of those implementations and deployments to XMPP. This section summarizes the differences that relate specifically to instant messaging and presence applications, and the corresponding section of XMPP Core [1] summarizes the differences that relate to all XMPP applications. C.1 Session Creation The client-to-server authentication protocol developed in the Jabber community assumes that every client is an IM client and therefore initiates an IM session upon successful authentication (documention of this protocol is contained in "JEP-0078: Non-SASL Authentication", published by the Jabber Software Foundation [7]). XMPP maintains a stricter separation between core functionality and IM functionality; therefore, an IM session is not created until the client specifically requests one using the protocol defined in the Establishing a Session (Section 3) section of this document. C.2 Privacy Rules The Jabber community began to define a protocol for communications blocking (privacy rules) in late 2001, but that effort was deprecated once the XMPP Working Group was formed. Therefore the protocol defined in the Blocking Communication (Section 10) section of this document is the only such protocol defined for use in the Jabber community. Saint-Andre & Miller Expires March 7, 2004 [Page96]111] Internet-Draft XMPP Instant MessagingAugustSeptember 2003 AppendixC.D. Revision History Note to RFC Editor: please remove this entire appendix, and the corresponding entries in the table of contents, prior to publication.C.1D.1 Changes from draft-ietf-xmpp-im-16 o Added sentence to make explicit that blocking all communication includes subscription-related presence stanzas. o Added clause to make explicit that privacy rules must be applied before handling of subscription-related presence stanzas and corresponding generation of roster pushes. o Added syntax and semantics section for the 'jabber:iq:roster' namespace. o Removed content about 'jabber:iq:last' namespace. o Added several internal references from the security considerations section to other sections of this document. o Moved most delivery handling rules from XMPP IM to XMPP Core. o Moved detailed stanza syntax descriptions from XMPP Core to XMPP IM. o Moved stanza schemas from XMPP Core to XMPP IM. D.2 Changes from draft-ietf-xmpp-im-15 o Specified stream error to be sent to active session if there is a conflict regarding session creation. o Fixed several more typographical errors in the privacy rules examples. o Corrected an error regarding server handling of IQ stanzas sent to bare JIDs. o Added section on compliance requirements for instant messaging server and client implementations. o Added non-normative section on differences between Jabber usage and XMPP specifications.C.2Saint-Andre & Miller Expires March 7, 2004 [Page 112] Internet-Draft XMPP Instant Messaging September 2003 D.3 Changes from draft-ietf-xmpp-im-14 o Added subscription state charts. o Fixed several typographical errors in the privacy rules examples. o Changed datatype of 'order' attribute in privacy rules from nonNegativeInteger to unsignedInt.C.3D.4 Changes from draft-ietf-xmpp-im-13 o Made one small change to privacy list syntax rules.C.4D.5 Changes from draft-ietf-xmpp-im-12 o Clarified meaning of the default message type as well as handling of unknown or unsupported types. o Made several small editorial changes.Saint-Andre & Miller Expires February 20, 2004 [Page 97] Internet-Draft XMPP Instant Messaging August 2003 C.5D.6 Changes from draft-ietf-xmpp-im-11 o Further clarified subscription syntax and semantics. o Further clarified presence responsibilities for clients and servers. o Added 'xml:lang' example to presence status. o Added subsection on presence priority. o Defined server handling of unsolicited presence stanzas of type "subscribed". o Specified default resource priority if not provided. o Corrected several errors in the schemas. o Added privacy list business rule regarding roster changes. o Removed the 'jabber:iq:privacy:error' namespace (not necessary). o Documented message type='normal'. o Made numerous small editorial changes throughout.C.6Saint-Andre & Miller Expires March 7, 2004 [Page 113] Internet-Draft XMPP Instant Messaging September 2003 D.7 Changes from draft-ietf-xmpp-im-10 o Clarified presence responsibilities for servers and clients. o Clarified the routing and delivery rules for servers. o Made the 'xml:lang' examples more complete. o Corrected several errors in the unsubscribe workflow. o Made small editorial changes in several sections.C.7D.8 Changes from draft-ietf-xmpp-im-09 o Clarified rules regarding allowable JID types in rosters. o Further clarified the semantics and routing implications of presence priorities. o Removed several obsolete subsections.Saint-Andre & Miller Expires February 20, 2004 [Page 98] Internet-Draft XMPP Instant Messaging August 2003 C.8D.9 Changes from draft-ietf-xmpp-im-08 o Removed authorization content (now addressed in XMPP Core). o Added protocol for initiating an IM session, including schema and IANA registration template. o Corrected <*-condition/> elements to be <condition/>. o Made small editorial changes to address RFC Editor requirements.C.9D.10 Changes from draft-ietf-xmpp-im-07 o Added several error cases for resource authorization and updated relevant schema.C.10D.11 Changes from draft-ietf-xmpp-im-06 o Specified that IQ result stanzas are required in response to roster pushes. o Changed stanza error namespace names to conform to the format defined in "The IETF XML Registry" as specified in XMPP Core. Saint-Andre & Miller Expires March 7, 2004 [Page 114] Internet-Draft XMPP Instant Messaging September 2003 o Removed note to RFC Editor regarding provisional namespace names.C.11D.12 Changes from draft-ietf-xmpp-im-05 o Removed use of ask='unsubscribe' per list discussion. o Clarified handling of resource conflict during authorization. o Added schemas for jabber:iq:auth, jabber:iq:auth:error, and jabber:iq:privacy:error. o Corrected several small protocol errors in the examples. o Clarified semantics of message types.C.12D.13 Changes from draft-ietf-xmpp-im-04 o Specified sending of unavailable presence after unsubscribe and subscription-cancellation actions.Saint-Andre & Miller Expires February 20, 2004 [Page 99] Internet-Draft XMPP Instant Messaging August 2003o Further specified syntax and business rules for privacy lists. o Brought error codes into line with definitions in draft-ietf-xmpp-core. o Added note to RFC Editor regarding provisional namespace names. o Removed vCard content and DTD, instead pointing to JSF documentation.C.13D.14 Changes from draft-ietf-xmpp-im-03 o Fixed order processing on privacy rules per list discussion. o Made numerous small editorial changes.C.14D.15 Changes from draft-ietf-xmpp-im-02 o Added a great deal more detail to the narrative regarding server-side privacy rules as well as the interaction between rosters and subscriptions. o Removed DTDs in favor of schemas (with the exception of vCard XML). Saint-Andre & Miller Expires March 7, 2004 [Page 115] Internet-Draft XMPP Instant Messaging September 2003 o Removed non-normative documentation of authentication using jabber:iq:auth and of in-band registration using jabber:iq:register, since these are maintained by the Jabber Software Foundation and are not part of the XMPP specification.C.15D.16 Changes from draft-ietf-xmpp-im-01 o Made numerous small editorial changes.C.16D.17 Changes from draft-ietf-xmpp-im-00 o Moved registration and authentication via jabber:iq:auth to non-normative appendices. o Changed initial presence stanza from MUST be empty to SHOULD be empty. o Specified that user or clients should not send presence stanzas of type='probe'.Saint-Andre & Miller Expires February 20, 2004 [Page 100] Internet-Draft XMPP Instant Messaging August 2003o Specified the algorithm for digest passwords.C.17D.18 Changes from draft-miller-xmpp-im-02 o Added information about the 'jabber:iq:last' protocol to meet the requirement defined in section 3.2.4 of RFC 2779. o Added information about the 'jabber:iq:privacy' protocol to meet the requirement defined in section 2.3.5 of RFC 2779. o Added information about the vCard XML protocol to meet the requirement defined in sections 3.1.3 and 4.1.4 of RFC 2779. o Changed the material describing authentication (but not resource authorization) with 'jabber:iq:auth' to non-normative. o Noted that the only watchers are subscribers. o Nomenclature changes: (1) from "chunks" to "stanzas"; (2) from "host" to "server"; (3) from "node" to "client" or "user" (as appropriate). Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page101]116] Internet-Draft XMPP Instant MessagingAugustSeptember 2003 Intellectual Property Statement The IETF takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on the IETF's procedures with respect to rights in standards-track and standards-related documentation can be found in BCP-11. Copies of claims of rights made available for publication and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementors or users of this specification can be obtained from the IETF Secretariat. The IETF invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights which may cover technology that may be required to practice this standard. Please address the information to the IETF Executive Director. Full Copyright Statement Copyright (C) The Internet Society (2003). All Rights Reserved. This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself may not be modified in any way, such as by removing the copyright notice or references to the Internet Society or other Internet organizations, except as needed for the purpose of developing Internet standards in which case the procedures for copyrights defined in the Internet Standards process must be followed, or as required to translate it into languages other than English. The limited permissions granted above are perpetual and will not be revoked by the Internet Society or its successors or assignees. This document and the information contained herein is provided on an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page102]117] Internet-Draft XMPP Instant MessagingAugustSeptember 2003 HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Acknowledgment Funding for the RFC Editor function is currently provided by the Internet Society. Saint-Andre & Miller ExpiresFebruary 20,March 7, 2004 [Page103]118] ----