view Side-By-Side changes
XMPPNetwork Working Group P.Saint-AndreSaint-Andre, Ed. Internet-DraftXSFXMPP Standards Foundation Obsoletes: 3921 (if approved) July 17, 2007 Intended status: Standards TrackApril 17, 2007Expires:October 19, 2007January 18, 2008 Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presencedraft-saintandre-rfc3921bis-02draft-saintandre-rfc3921bis-03 Status of this Memo By submitting this Internet-Draft, each author represents that any applicable patent or other IPR claims of which he or she is aware have been or will be disclosed, and any of which he or she becomes aware will be disclosed, in accordance with Section 6 of BCP 79. 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 onOctober 19, 2007.January 18, 2008. Copyright Notice Copyright (C) The IETF Trust (2007). Abstract This document describes extensions to the core features of the Extensible Messaging and Presence Protocol (XMPP) that provide basic instant messaging (IM) and presence functionality in conformance with RFC 2779. This documentobseletesobsoletes RFC 3921. Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page 1] Internet-Draft XMPP IMAprilJuly 2007 Table of Contents 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2. Requirements . . . . . . . . . . . . . . . . . . . . . . . 4 1.3. Typical Session Flow . . . . . . . . . . . . . . . . . . . 5 1.4.TerminologyConventions . . . . . . . . . . . . . . . . . . . . . . . 6 2. Managing the Roster . . . . . . . . . . . . . . . . . . . . . 6 2.1. Syntax and Semantics . . . . . . . . . . . . . . . . . . . 6 2.2.Business Rules . . . . . . . . . . . . . . . . . . . . . . 7 2.3.RetrievingOne'sthe Roster on Login . . . . . . . . . . . . .7 2.4.. 9 2.3. Adding a Roster Item . . . . . . . . . . . . . . . . . . .8 2.5.10 2.4. Updating a Roster Item . . . . . . . . . . . . . . . . . .10 2.6.15 2.5. Deleting a Roster Item . . . . . . . . . . . . . . . . . .1117 3. Managing Presence Subscriptions . . . . . . . . . . . . . . .1218 3.1. Requesting a Subscription . . . . . . . . . . . . . . . .1218 3.2.HandlingCancelling a SubscriptionRequest. . . . . . . . . . . . .13. . . 24 3.3.Cancelling a Subscription from Another EntityUnsubscribing . . . . . . .14 3.4. Unsubscribing from Another Entity's Presence. . . . . . .14. . . . . . . . 26 4. Exchanging Presence Information . . . . . . . . . . . . . . .1427 4.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . .1428 4.2. Initial Presence . . . . . . . . . . . . . . . . . . . . .1628 4.3. Presence Probes . . . . . . . . . . . . . . . . . . . . .1730 4.4. Subsequent Presence Broadcast . . . . . . . . . . . . . .1832 4.5. Unavailable Presence . . . . . . . . . . . . . . . . . . .1834 4.6. Directed Presence . . . . . . . . . . . . . . . . . . . .1936 4.7. Presence Syntax . . . . . . . . . . . . . . . . . . . . .2037 5. Exchanging Messages . . . . . . . . . . . . . . . . . . . . .2341 5.1.OverviewAttributes . . . . . . . . . . . . . . . . . . . . . . . .. 2341 5.2.Specifying a Message Body . . . . . . . . .Child Elements . . . . . . .25 5.3. Specifying a Message Subject. . . . . . . . . . . . . . .26 5.4. Specifying a Conversation Thread .43 5.3. Extended Content . . . . . . . . . . . .26 5.5. Message Errors. . . . . . . . . 45 6. Exchanging IQ Stanzas . . . . . . . . . . . . .27 5.6. Extended Namespaces. . . . . . . 46 7. A Sample Session . . . . . . . . . . . .27 6. Exchanging IQ Stanzas. . . . . . . . . . . 46 8. Server Rules for Processing XML Stanzas . . . . . . . . .27 7. Examples. . 52 8.1. No Such User . . . . . . . . . . . . . . . . . . . . . . . 53 8.2. Full JID at Local Domain . .27 8. Server Rules for Handling XML Stanzas. . . . . . . . . . . .34 8.1. Inbound Stanzas. . . 53 8.3. Bare JID at Local Domain . . . . . . . . . . . . . . . . . 53 8.4. Foreign Domain .34 8.2. Outbound Stanzas. . . . . . . . . . . . . . . . . . . . .3656 9. IM and Presence Compliance Requirements . . . . . . . . . . .3657 9.1. Servers . . . . . . . . . . . . . . . . . . . . . . . . .3757 9.2. Clients . . . . . . . . . . . . . . . . . . . . . . . . .3757 10. Internationalization Considerations . . . . . . . . . . . . .3758 11. Security Considerations . . . . . . . . . . . . . . . . . . .3758 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . .3859 12.1. Instant Messaging SRV Protocol Label Registration . . . .3859 12.2. Presence SRV Protocol Label Registration . . . . . . . . .3959 13. References . . . . . . . . . . . . . . . . . . . . . . . . . .39 Saint-Andre Expires October 19, 2007 [Page 2] Internet-Draft XMPP IM April 200760 13.1. Normative References . . . . . . . . . . . . . . . . . . .3960 13.2. Informative References . . . . . . . . . . . . . . . . . .4060 Appendix A.Integration of Roster Management and Presence SubscriptionsSubscription States . . . . . . . . . . . . . . . . . 61 Saint-Andre Expires January 18, 2008 [Page 2] Internet-Draft XMPP IM July 2007 A.1. Defined States . . .40 A.1. Overview. . . . . . . . . . . . . . . . . . . 62 A.2. Server Processing of Outbound Presence Subscription Stanzas . . . . . .41 A.2. User Subscribes to Contact. . . . . . . . . . . . . . . .41. . . 63 A.3.Creating a MutualServer Processing of Inbound Presence Subscription Stanzas . . . . . . . . . . . . . .47 A.4. Unsubscribing. . . . . . . . . . . 65 Appendix B. Blocking Communication . . . . . . . . . . .51 A.5. Cancelling a Subscription. . . . 68 Appendix C. vCards . . . . . . . . . . . .56 A.6. Removing a Roster Item and Cancelling All Subscriptions . 60 Appendix B. Subscription States . . . . . . . . . . . . . . . . . 63 B.1. Defined States . . . . . . .. . . . . . . . . . .. . . . 63 B.2. Server Handling of Outbound Presence Subscription Stanzas . .68 Appendix D. XML Schemas . . . . . . . . . . . . . . . . . . . . . 68 D.1. jabber:client . .64 B.3. Server Handling of Inbound Presence Subscription Stanzas. . . . . . . . . . . . . . . . . . . . 69 D.2. jabber:server . . . . .66 Appendix C. Blocking Communication. . . . . . . . . . . . . . .69 Appendix D. vCards. . 73 D.3. jabber:iq:roster . . . . . . . . . . . . . . . . . . . . .6977 Appendix E.XML Schemas . . . . . . . . . . . . . . . . . . . . . 70 E.1. jabber:client . . . . . . . . . . . . . . . . . .Differences From RFC 3921 . . . .70 E.2. jabber:server. . . . . . . . . . 78 Appendix F. Copying Conditions . . . . . . . . . . . .74 E.3. jabber:iq:roster. . . . . 78 Index . . . . . . . . . . . . . . . .78 Appendix F. Differences From RFC 3921. . . . . . . . . . . . . . 79 Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 80 Intellectual Property and Copyright Statements . . . . . . . . . . 81 Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page 3] Internet-Draft XMPP IMAprilJuly 2007 1. Introduction 1.1. Overview The Extensible Messaging and Presence Protocol (XMPP) is aprotocoltechnology for streaming Extensible Markup Language [XML] elements in order to exchange messages, presence(availability)information, and other structured data in close to real time. The core features of XMPP are defined in [XMPP-CORE]. These features -- mainly XML streams, use ofTLSTransport Layer Security ([TLS]) andSASL,Simple Authentication and Security Layer ([SASL]), and the <message/>, <presence/>, and <iq/> children of the stream root -- provide the building blocks for many types ofnear-real-timenear- real-time applications, which may be layered on top of the core by sending application-specific data qualified by particular XML namespaces (see [XML-NAMES]). This document describes extensions to the core features of XMPP that provide the basic functionality expected of an instant messaging (IM) and presence application as defined in [IMP-REQS]. This document obsoletes RFC 3921. 1.2. Requirements Traditionally, instant messaging applications have combined the following factors: 1. The central point of focus is a list of one's contacts or "buddies" (in XMPP this list is called a ROSTER). 2. The purpose of using such an application is to exchange relatively brief text messages with each of one's contacts in close to real time -- often relatively large numbers of such messages in rapid succession, in the form of one-to-one "chat sessions". 3. The catalyst for exchanging messages is PRESENCE -- i.e., knowledge about the network availability of each of one's contacts (thus knowing who is online and available for a chat session). 4. Presence information is provided only to contacts that a user has authorized via a presence subscription. Thus at a high level this document assumes that a user must be able to complete the following use cases: o Manage items in a contact list o Exchange messages with one's contacts o Exchange presence information with one's contacts Saint-Andre Expires January 18, 2008 [Page 4] Internet-Draft XMPP IM July 2007 o Manage presence subscriptions to and from one's contacts Detailed definitions of these functionality areas are contained inSaint-Andre Expires October 19, 2007 [Page 4] Internet-Draft XMPP IM April 2007[IMP-REQS], and the interested reader should refer to that document regarding the requirements addressed herein. While the XMPP instant messaging and presence extensions specified herein meet the requirements of [IMP-REQS], they were not designed explicitly with that specification 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 althoughAlthough XMPP protocol extensions addressing many other functionality areas have been defined in theJabber SoftwareXMPP Standards Foundation's XEPseries,series (e.g., multi-user text chat as specified in [XEP-0045]), such extensions are not included in this document because they are not required by [IMP-REQS]. Note: [IMP-REQS] stipulates that presence services must be separable from instant messaging services and vice-versa; i.e., it must be possible to use the protocol to provide a presence service, an instant messaging service, or both. Although the text of this document assumes that implementations and deployments will want to offer a unified instant messaging and presence service, there is no requirement that a service must offer both a presence service and an instant messaging service, and the protocol makes it possible to offer separate and distinct services for presence and for instant messaging. (For example, a presence-only service could return <service-unavailable/> errorsin response to attemptsif clients attempt toroutesend <message/> stanzas.) 1.3. Typical Session Flow [XMPP-CORE] specifies how an XMPP client connects to an XMPP server. In particular, it specifies the preconditions (including XML stream establishment, authentication, and binding of a resource to the stream) that must be fulfilled before a client is allowed to send XML stanzas (the basic unit of meaning in XMPP) to other entities on an XMPP network. The reader is referred to [XMPP-CORE] for details, and knowledge of [XMPP-CORE] is assumed herein. Upon fulfillment of the preconditions specified in [XMPP-CORE], an XMPP client has asessionlong-lived XML stream with an XMPPserver and mayserver, which enables the user to send and receive a potentially unlimited number of XML stanzas over theunderlying XMLstream. Such a stream can be used as the basis for the exchange of instant messaging, presence, and other information in close to real time. The typical flow for an instant messaging and presence session is as follows: Saint-Andre Expires January 18, 2008 [Page 5] Internet-Draft XMPP IM July 2007 1. Negotiate an XML stream with one's server. (See [XMPP-CORE].) 2. Retrieve one's roster. (See Section2.3.) 2.2.2.) 3. Send initial presence to the server for broadcasting to all subscribed contacts, thus "going online" from the perspective of XMPP communications. (See Section 4.2.)3.4. Exchange messages, manage presence subscriptions, perform roster updates, and in general process and generate other XML stanzas with particular semantics throughout the life of the session.Saint-Andre Expires October 19, 2007 [Page 5] Internet-Draft XMPP IM April 2007 4. Terminate the session(See Section 5 and Section 6.) 5. Terminate the session when desired by sending unavailable presence and closing the underlying XML stream. (See Section 4.5.) 1.4.TerminologyConventions This document inherits the terminology defined in [XMPP-CORE]. The following keywords are to be interpreted as described in [TERMS]: "MUST", "SHALL", "REQUIRED"; "MUST NOT", "SHALL NOT"; "SHOULD", "RECOMMENDED"; "SHOULD NOT", "NOT RECOMMENDED"; "MAY", "OPTIONAL". For convenience, this document employs the term "user" to refer to the owner of an XMPP account; however, account owners need not be human persons and may be bots, devices, or other non-human applications. In examples, lines have been wrapped for improved readability, "[...]" means elision, and the following prepended strings are used: o C: = client o CC: = contact's client o CS: = contact's server o S: = server o UC: = user's client o US: = user's server 2. Managing the Roster In XMPP, one's roster contains any number of specific contacts. A user's roster is stored by the user's server on the user's behalf so that the user may access roster information from any resource.Note: There are important interactions between rosters and subscriptions; these are defined under Integration of Managing the Roster and Presence Subscriptions (Appendix A), and the reader must refer to that section for a complete understanding of roster management (however, such an understanding is necessary only for developers of XMPP servers, since most of the complexity is shielded from clients).2.1. Syntax and Semantics Rosters are managed using IQ stanzas, specifically by means of a <query/> child element qualified by the 'jabber:iq:roster' namespace. The detailed syntax and semantics are defined in the following Saint-Andre Expires January 18, 2008 [Page 6] Internet-Draft XMPP IM July 2007 sections. 2.1.1. Items The <query/> element MAY contain one or more <item/> children, each describing a unique roster item or "contact". The"key" orsyntax of the <item/> is as follows: 1. The 'jid' attribute is REQUIRED; the value of this attribute is a unique identifier or "key" for each roster item is a Jabber Identifier orJID, encapsulated in the 'jid' attribute of the <item/> element (which is REQUIRED). Note:JID. (Note: When the item added represents another IM user, the value of the 'jid' attribute MUST beof the forma bare JID <contact@domain> rather<contact@domain/resource>. The state of the presence subscription in relation toaroster itemfull JID <contact@domain/resource>, since the desired result iscapturedfor the user to receive presence from all of the contact's resources, not merely the particular resource specified in the'subscription''to' attribute.) 2. The 'name' attributeofis OPTIONAL; the<item/> element. Allowable values forvalue of this attributeare: Saint-Andre Expires October 19, 2007 [Page 6] Internet-Draft XMPP IM April 2007 o "none" --specifies theuser does not have a subscription"handle" to be associated with thecontact's presence information, andJID, as determined by thecontact does not have a subscription touser (not theuser's presence information o "to" --contact). The value of theuser has a subscription'name' attribute is opaque to thecontact's presence information,server butthe contact does notmay havea subscriptionmeaning tothe user's presence information o "from" -- the contact hasasubscriptionhuman user. 3. The 'subscription' attribute is OPTIONAL; see Section 2.1.3. 4. The 'ask' attribute is OPTIONAL and is used tothe user's presence information, but the user does not have aspecify certain subscriptionto the contact's presence information o "both" -- both the user andsub-states; for details, see Section 3.1.2. 5. The <group/> element is OPTIONAL; thecontact have subscriptions to each other's presence information (also called a "mutual subscription") Each <item/>XML character of this elementMAY possessspecifies a'name' attribute,category into whichsetsthe"handle" toroster item should beassociated with the JID, as determinedgrouped bythe user (not the contact).a client. Thevalue of the 'name' attribute is opaque. Each<item/>elementMAYcontain one ormore than one <group/>child elements, for use in collecting roster items into various categories.element. The XML character data of the <group/> elementis opaque. 2.2. Business Rules A server MUST ignore any 'to' address on a roster "set", and MUST treat any roster "set" as applyinghas no meaning to thesender. For added safety,server but may have meaning to a human user. 2.1.2. Actions 2.1.2.1. Roster Get A ROSTER GET is an IQ stanza of type "get" sent from clientSHOULD checkto server and containing a <query/> element qualified by the"from" address of'jabber:iq:roster' namespace. The <query/> element in a roster get MUST NOT contain any <item/> child elements. 2.1.2.2. Roster Set A ROSTERPUSH (i.e.,SET is anincomingIQ stanza of type "set" sent from client to server and containing aroster item) to ensure that it is from a trusted source; specifically,<query/> element qualified by the 'jabber:iq:roster' namespace. Saint-Andre Expires January 18, 2008 [Page 7] Internet-Draft XMPP IM July 2007 The following rules apply to roster sets: 1. The <query/> element MUST contain one and only one <item/> element. 2. A receiving server MUST ignore any value of the 'subscription' attribute other than "remove" (see Section 2.1.3). 3. A receiving server MUST ignore any 'to' address specified on the IQ stanza and MUSTeither havehandle the IQ stanza as if it included no 'to' attribute. 2.1.2.3. Roster Push A ROSTER PUSH is an IQ stanza of type "set" sent from server to client and containing a <query/> element qualified by the 'jabber:iq: roster' namespace. The following rules apply to roster pushes: 1. The <query/> element in a roster get MUST contain one and only one <item/> element. 2. A receiving client MUST ignore the stanza unless it has no 'from' attribute (i.e., implicitly from the server) orhaveit has a 'from' attribute whose value matches the user's bare JID(of the form <user@domain>) or full JID (of the form <user@domain/resource>); otherwise, the client SHOULD ignore the "roster push". 2.3. Retrieving One's<user@domain>. 2.1.2.4. Rosteron Login Upon authenticating with aResult A ROSTER RESULT is an IQ stanza of type "result" sent from server to client andbinding a resource (thus becoming a CONNECTED RESOURCE),containing aclient SHOULD request the roster before sending initial presence (however, because receiving<query/> element qualified by theroster may not be desirable for all resources, e.g.,'jabber:iq: roster' namespace. The <query/> element in aconnection with limited bandwidth, the client's requestroster result contains one <item/> element fortheeach rosteris recommendeditem andnot required). If an available resource does not requesttherefore MAY contain more than one <item/> element. 2.1.3. Subscription Attribute The state of theroster duringpresence subscription in relation to asession, the server MUST NOT send it presence subscriptions and associatedrosterupdates. Foritem is captured in thesake'subscription' attribute ofbrevity,theterm INTERESTED RESOURCE is used herein<item/> element. Allowable subscription-related values for this attribute are: o "none" -- the user does not have a subscription toreferthe contact's presence information, and the contact does not have a subscription to theconcept of "an available resource thatuser's presence information o "to" -- the user hasrequesteda subscription to theroster".contact's presence information, but the contact does not have a subscription to the user's presence information Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page7]8] Internet-Draft XMPP IMAprilJuly 2007Example: Client requests current roster from server: <iq from='juliet@example.com/balcony' type='get' id='roster_1'> <query xmlns='jabber:iq:roster'/> </iq> Example: Client receives roster from server: <iq to='juliet@example.com/balcony' type='result' id='roster_1'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' name='Romeo' subscription='both'> <group>Friends</group> </item> <item jid='mercutio@example.org' name='Mercutio' subscription='from'/> <item jid='benvolio@example.org' name='Benvolio' subscription='both'/> </query> </iq> 2.4. Addingo "from" -- the contact has aRoster Item At any time,subscription to the user's presence information, but the user does not have a subscription to the contact's presence information o "both" -- both the userMAY add an itemand the contact have subscriptions tohis or hereach other's presence information (also called a "mutual subscription") In a rosterby sending an IQ stanzapush or result, a receiving client MUST ignore values oftype "set" containingthe 'subscription' attribute other than "none", "to", "from", or "both". In a<query/> elementroster set, the value of the 'subscription' attribute MAY be "remove", which indicates thatin turn contains one <item/> element. Example: Client addsthe item is to be removed from the roster; anew item: <iq from='juliet@example.com/balcony' type='set' id='roster_2'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' name='Nurse'> <group>Servants</group> </item> </query> </iq> Note: The <query/> elementreceiving server MUSTNOT contain moreignore all values of the 'subscription' attribute other thanone <item/> child element when"remove". 2.2. Retrieving the Roster on Login Upon authenticating with a server and binding a resource (thus becoming a connected resource), a clientsends an IQ set to the server. In addition,SHOULD request the<item/> element MAY contain more than one <group/> element butroster before sending initial presence (however, because receiving theXML character data of each <group/> element MUST specify distinct groups (where duplicates are toroster may not bedetermined usingdesirable for all resources, e.g., a connection with limited bandwidth, theResourceprep profile of stringprep as defined in [XMPP-CORE]). If either of these rules is violated,client's request for theserver MUST returnroster is recommended and not required). After a<bad- Saint-Andre Expires October 19, 2007 [Page 8] Internet-Draft XMPP IM April 2007 format/> errorconnected resource sends initial presence (see Section 4.2), it is referred to as an available resource. If a connected resource requests theclient. Note: A client MUSTroster but does not send initial presence, the server SHOULD NOTadd itself to its own roster; i.e.,send it presence subscriptions and SHOULD NOT send it associated roster pushes. If an available resource does not request thevalue ofroster during a session, the<item/> element's 'jid' attributeserver SHOULD NOT send it presence subscriptions and MUST NOTmatchassociated roster pushes. For thebare JID (node@domain) portionsake of brevity, the<iq/> element's 'from' attribute. If this ruleterm INTERESTED RESOURCE isviolated, the server MUST return a <not-allowed/> errorused herein to refer to theclient.concept of "an available resource that has requested the roster". A client requests the roster by sending a roster get over its stream to the server. C: <iq from='juliet@example.com/balcony' type='get' id='roster_1'> <query xmlns='jabber:iq:roster'/> </iq> Saint-Andre Expires January 18, 2008 [Page 9] Internet-Draft XMPP IM July 2007 S: <iq to='juliet@example.com/balcony' type='result' id='roster_1'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' name='Romeo' subscription='both'> <group>Friends</group> </item> <item jid='mercutio@example.org' name='Mercutio' subscription='from'/> <item jid='nurse@example.com' name='Nurse' subscription='to'/> <item jid='benvolio@example.org' name='Benvolio' subscription='both'/> </query> </iq> If the server cannot process the roster get, it MUST return an appropriate stanza error as described in [XMPP-CORE] (such as <service-unavailable/> if the roster namespace is not supported or <internal-server-error/> if the server experiences trouble returning the roster). 2.3. Adding a Roster Item 2.3.1. Success Case At any time, a client may add an item to the roster by sending a roster set to the server. C: <iq from='juliet@example.com/balcony' type='set' id='roster_2'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' name='Nurse'> <group>Servants</group> </item> </query> </iq> If the server can successfully process the rosteraddition,set (i.e., if none of the error cases occurs), it MUSTupdatecreate the rosterinformationitem in persistent storage and send a roster pushthe change outto all of the user's interestedresources. This "roster push" consists of an IQ stanza of type "set" from the server to the client and enables all interestedresourcesto remain in sync with the server-based roster information. Example: Server (1) pushescontaining theupdatednew rosterinformation to all interested resources and (2) replies with an IQ result to the sending resource:item. Saint-Andre Expires January 18, 2008 [Page 10] Internet-Draft XMPP IM July 2007 S: <iq to='juliet@example.com/balcony' type='set' id='a78b4q6ha463'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' name='Nurse' subscription='none'> <group>Servants</group> </item> </query> </iq> S: <iq to='juliet@example.com/chamber' type='set' id='a78b4q6ha464'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' name='Nurse' subscription='none'> <group>Servants</group> </item> </query> </iq> The server MUST also return an IQ stanza of type "result" to the connected resource that sent the roster set. S: <iq to='juliet@example.com/balcony' type='result' id='roster_2'/> As required by the semantics of the IQ stanza kind as defined in [XMPP-CORE], each resource that received the roster push MUST reply with an IQ stanza of type "result" (or "error").Saint-Andre Expires October 19, 2007 [Page 9] Internet-Draft XMPP IM April 2007 Example: Resources reply with an IQ result to the server:C: <iq from='juliet@example.com/balcony'to='example.com'type='result' id='a78b4q6ha463'/> C: <iq from='juliet@example.com/chamber'to='example.com'type='result' id='a78b4q6ha464'/>2.5. Updating a Roster Item Updating an existing roster item (e.g., changing the group)Note: There isdone in the same way as adding a newno error case for client replies to rosteritem, i.e., by sendingpushes, and if theroster item inserver receives an IQsetof type "error" in response tothe server. Example: User updatesa rosteritem (add group): <iq from='juliet@example.com/chamber' type='set' id='roster_3'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' name='Romeo'> <group>Friends</group> <group>Lovers</group> </item> </query> </iq> Example: User updatespush it SHOULD ignore the error. 2.3.2. Error Cases If the server cannot successfully process the rosteritem (remove group): <iq from='juliet@example.com/chamber' type='set' id='roster_4'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' name='Romeo'> <group>Lovers</group> </item> </query> </iq>set, it MUST return an error. The following error cases are defined (naturally, Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page10]11] Internet-Draft XMPP IMAprilJuly 2007Example: User updates roster item (change handle): <iq from='juliet@example.com/chamber' type='set' id='roster_5'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' name='MyRomeo'> <group>Lovers</group> </item> </query> </iq> Example: User updates roster item (remove handle): <iq from='juliet@example.com/chamber' type='set' id='roster_6'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' name=''> <group>Lovers</group> </item> </query> </iq> As with adding a roster item, when updating a roster item theother stanza errors may occur, e.g., <internal-server-error/>). The serverMUST update the roster information in persistent storage, initiateSHOULD return aroster push<bad-request/> error toall oftheuser's interested resources, and send an IQ result toclient if theinitiating resource. 2.6. Deleting a Roster Item At any time, a user MAY delete an item from his or herrosterby sending an IQsettoviolates any of theserver and settingfollowing conditions: 1. The <query/> element contains more than one <item/> child element. 2. The <item/> element contains more than one <group/> element, but there are duplicates among thevalueXML character data of each <group/> element (where duplicates are determined using the'subscription' attribute to "remove" (a compliant server MUST ignore any other valuesResourceprep profile ofthe 'subscription' attribute when received from a client). Example: Client removes an item: <iq from='juliet@example.com/balcony' type='set' id='roster_7'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' subscription='remove'/> </query> </iq> As with adding a roster item, when deletingstringprep as defined in [XMPP-CORE]). The server SHOULD return aroster item<not-allowed/> error to theserver MUST updateclient if the rosterinformation in persistent storage, initiate a roster push to allset violates any of theuser's interested resources (withfollowing conditions: 1. The value of the'subscription''name' attributeset tois greater than avalueserver- configured limit. 2. The XML character data of"remove"), and send an IQ result totheinitiating resource. Saint-Andre Expires October 19, 2007 [Page 11] Internet-Draft XMPP IM April 2007 This command will result in cancellation<group/> element is ofexisting presence subscriptions; for details, see Removing a Roster Item and Cancelling All Subscriptions (Appendix A.6).zero length. 3.Managing Presence Subscriptions In order to protect the privacyThe XML character data ofinstant messaging users and any other entities, presence and availability information is disclosed only to other entities that the user has approved. When a user has agreed that another entity may view its presence,theentity<group/> element issaid to havegreater than asubscription toserver-configured limit. Alternatively, theuser's presence information. A subscription lasts across sessions; indeed, it lasts untilserver MAY ignore thesubscriber unsubscribes orforegoing violations and process thesubscribee cancelsroster set as best as possible (e.g., process only thepreviously- granted subscription. Subscriptions are managed within XMPP by sending presence stanzas containing specially-defined attributes. In particular,first <item/> element, ignore duplicate <group/> elements, place the roster item in no group or aSUBSCRIPTION REQUESTdefault group if the <group/> element isa presence stanza whose 'type' attribute has a value of "subscribe". If the subscription request is being sent to an instant messaging contact, the JID supplied in the 'to' attribute SHOULD be of the form <contact@domain> rather than <contact@domain/resource>, since the desired result is normally for the user to receive presence from all of the contact's resources, not merely the particular resource specified in the 'to' attribute. Note: There are important interactions between subscriptions and rosters; these are defined under Integration of Managing the Rosterempty, andPresence Subscriptions (Appendix A),truncate 'name' attributes andthe reader must refer to<group/> elements thatsection for a complete understanding of presence subscriptions. 3.1. Requesting a Subscription A request to subscribe to another entity's presence is made by sending a presence stanza of type "subscribe". Example: Sending a subscription request: <presence from='romeo@example.net' to='juliet@example.com' type='subscribe'/> If the user does not exist, the user's server SHOULD automatically return a presence stanza of type "unsubscribed" to the requesting entity.are too long). Error: Roster set contains more than one item C: <iq from='juliet@example.com/balcony' type='set' id='roster_3'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' name='Nurse'> <group>Servants</group> </item> <item jid='mother@example.com' name='Mom'> <group>Family</group> </item> </query> </iq> S: <iq to='juliet@example.com/balcony' type='error' id='roster_3'> <error type='modify'> <bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page 12] Internet-Draft XMPP IMAprilJuly 2007Example: User does not exist <presence from='juliet@example.com' to='romeo@example.net' type='unsubscribed'/> A user's server MUST NOT automatically approve subscription requests on the user's behalf. All subscription requests MUST be delivered to the user's client, specifically to one or more of the user's interested resources. If the user has no interested resources when the subscription request is received by the user's server, the user's server MUST keep a record of the complete subscription request (including any extended namespacescontained therein) and deliver the request when the user next has an interested resource, until the user either approves or denies the request. If there is more than one interested resource associatedError: Roster set contains item withthe user when the subscription request is received by the user's server, the user'soversized handle C: <iq from='juliet@example.com/balcony' type='set' id='roster_4'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' name='__some-very-long-handle__'> <group>Servants</group> </item> </query> </iq> S: <iq to='juliet@example.com/balcony' type='error' id='roster_4'> <error type='modify'> <not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> Error: Roster set contains duplicate groups C: <iq from='juliet@example.com/balcony' type='set' id='roster_5'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' name='Nurse'> <group>Servants</group> <group>Servants</group> </item> </query> </iq> S: <iq to='juliet@example.com/balcony' type='error' id='roster_5'> <error type='modify'> <bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> Saint-Andre Expires January 18, 2008 [Page 13] Internet-Draft XMPP IM July 2007 Error: Roster set contains empty group C: <iq from='juliet@example.com/balcony' type='set' id='roster_6'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' name='Nurse'> <group></group> </item> </query> </iq> S: <iq to='juliet@example.com/balcony' type='error' id='roster_6'> <error type='modify'> <not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> Error: Roster set contains oversized group C: <iq from='juliet@example.com/balcony' type='set' id='roster_7'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' name='Nurse'> <group>__some-very-long-group-name__</group> </item> </query> </iq> S: <iq to='juliet@example.com/balcony' type='error' id='roster_7'> <error type='modify'> <not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> The server MUSTbroadcast that subscription request to all interested resources in accordance with Server Rules for Handling XML Stanzas (Section 8). However, if the user receives a presence stanza of type "subscribe" fromreturn acontact to whom the user has already granted permission<not-allowed/> error tosee the user's presence information (e.g., in cases whenthecontact is seeking to resynchronize subscription states),client if theuser's server SHOULD auto-reply on behalfvalue of theuser. In addition,<item/> element's 'jid' attribute matches theuser's server MAY choose to re-send an unapproved pending subscription request tobare JID <node@domain> portion of thecontact based on an implementation-specific algorithm (e.g., whenever a new resource becomes available for the user, or after<iq/> element's 'from' attribute. Saint-Andre Expires January 18, 2008 [Page 14] Internet-Draft XMPP IM July 2007 Error: Roster set contains sender's JID C: <iq from='juliet@example.com/balcony' type='set' id='roster_8'> <query xmlns='jabber:iq:roster'> <item jid='juliet@example.com'/> </query> </iq> S: <iq to='juliet@example.com/balcony' type='error' id='roster_8'> <error type='cancel'> <not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> 2.4. Updating acertain amount of time has elapsed); this helps to recover from transient, silent errors that may have occurredRoster Item 2.4.1. Success Case Updating an existing roster item is done inrelation totheoriginal subscription request. Note: Whensame way as adding acontact generatesnew roster item, i.e., by sending asubscription requestroster set toa user, the contact's server MUST stamp the outgoing presence stanza withthebare JID (<contact@domain>) ofserver. Because a roster item is atomic, thecontact, notitem shall be updated exactly as provided in thefull JID (<contact@domain/resource>). The same is true for presence stanzas of type "subscribed", "unsubscribe", and "unsubscribed". Note: Ifroster set. There are several reasons why auser sendsclient might update apresence subscription request toroster item: 1. Adding acontact but has not already added the contact togroup 2. Deleting a group 3. Changing theuser's roster,handle 4. Deleting theuser's server MUST sendhandle Consider a rosterpush to all of the user's interested resources. Thus a client MAY simply wait for theitem that is defined as follows: <item jid='romeo@example.net' name='Romeo'> <group>Friends</group> </item> The user who has this item in her rosterpush rather than proactively addingmay want to add thecontactitem tothe user's roster. 3.2. Handling a Subscription Request When a client receives a subscription request fromanotherentity, it SHOULD either approve the request by sending a presence stanza of type "subscribed" or refuse the request by sending a presence stanzagroup. C: <iq from='juliet@example.com/chamber' type='set' id='update_1'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' name='Romeo'> <group>Friends</group> <group>Lovers</group> </item> </query> Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page13]15] Internet-Draft XMPP IMAprilJuly 2007of type "unsubscribed". Example: Approving a subscription request: <presence from='juliet@example.com' to='romeo@example.net' type='subscribed'/> Example: Refusing a presence subscription request: <presence from='juliet@example.com' to='romeo@example.net' type='unsubscribed'/> 3.3. Cancelling a Subscription from Another Entity If a</iq> The userwould likemay then want tocancel a previously-granted subscription request, it sends a presence stanza of type "unsubscribed". Example: Cancelling a previously granted subscription request: <presence from='juliet@example.com' to='romeo@example.net' type='unsubscribed'/> 3.4. Unsubscribingremove the item fromAnother Entity's Presence If athe original group. C: <iq from='juliet@example.com/chamber' type='set' id='update_2'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' name='Romeo'> <group>Lovers</group> </item> </query> </iq> The userwould likemay then want tounsubscribe fromchange thepresence of another entity, it sends a presence stanza of type "unsubscribe". Example: Unsubscribing from an entity's presence: <presence from='romeo@example.net' to='juliet@example.com' type='unsubscribe'/> 4. Exchanging Presence Information 4.1. Overviewhandle for the item. C: <iq from='juliet@example.com/chamber' type='set' id='update_3'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' name='MyRomeo'> <group>Lovers</group> </item> </query> </iq> Theconcept of presence refersuser may then want toan entity's availability for communication over a network. Atremove themost basic level, presence is a boolean "on/off" variable that signals whetherhandle altogether (note: including anentityempty 'name' attribute isavailable or unavailable for communication;equivalent to including no 'name' attribute). C: <iq from='juliet@example.com/chamber' type='set' id='update_4'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' name=''> <group>Lovers</group> </item> </query> </iq> The user may then want to remove theterms "online" and "offline" are also used. In XMPP,item from all groups. C: <iq from='juliet@example.com/chamber' type='set' id='update_5'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net'/> </query> </iq> As with adding aprincipal's availability is signalledroster item, when updating aclient controlled byroster item theprincipal generatesserver MUST update the roster information in persistent storage, send a<presence/> stanza with no 'type' attribute,roster push to all of the user's interested resources, and send anentity's lack of availability isIQ Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page14]16] Internet-Draft XMPP IMAprilJuly 2007signalled whenresult to the initiating resource; for details, see Section 2.3. 2.4.2. Error Cases The error cases described under Section 2.3 also apply to updating aclient or entity generatesroster item. 2.5. Deleting a<presence/> stanza whose 'type' attribute hasRoster Item 2.5.1. Success Case At any time, avalue of "unavailable". In XMPP-based applications that combine messagingclient may delete an item from his or her roster by sending roster set andpresence functionality,setting thedefault typevalue ofcommunication for which presence signals availability is messaging; however, XMPP-based applications are not required to combine messaging and presence functionality, and can provide standalone presence features without messaging (in addition, XMPP servers do not require presence information in orderthe 'subscription' attribute tosuccessfully route message and IQ stanzas). XMPP presence typically follows"remove". C: <iq from='juliet@example.com/balcony' type='set' id='delete_1'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' subscription='remove'/> </query> </iq> As with adding a"publish-subscribe" or "observer" pattern, wherein an entity sends presence information to its server, and itsroster item, if the server can successfully process the roster set thenbroadcasts or multiplexes thatit MUST update the roster information in persistent storage, send a roster push to all of theentity's contacts who haveuser's interested resources (with the 'subscription' attribute set to asubscriptionvalue of "remove"), and send an IQ result to theentity'sinitiating resource; for details, see Section 2.3. The server MUST also generate a presence(in the terminologystanza of[IMP-MODEL], an entity that generates presence information is a "presentity"type "unsubscribe" andthe entities that receive presence information are "subscribers"). A client generates presence for broadcasting to all subscribed entities by sendinga presence stanza of type "unsubscribed" from the user toits server with no 'to' address, wherethepresence stanza has either no 'type' attribute or a 'type' attribute whosecontact. S: <presence from='juliet@example.com' to='nurse@example.com' type='unsubscribe'/> S: <presence from='juliet@example.com' to='nurse@example.com' type='unsubscribed'/> 2.5.2. Error Cases If the value of the 'jid' attribute specifies an item that is"unavailable". A user'snot in the roster, the server MUSTNOT leak the user's network availability to entities who arereturn an <item-not-found/> error. Saint-Andre Expires January 18, 2008 [Page 17] Internet-Draft XMPP IM July 2007 Error: Roster item notauthorizedfound C: <iq from='juliet@example.com/balcony' type='set' id='delete_2'> <query xmlns='jabber:iq:roster'> <item jid='__no-such-user__@example.com' subscription='remove'/> </query> </iq> S: <iq to='juliet@example.com/balcony' type='error' id='delete_2'> <error type='modify'> <item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> 3. Managing Presence Subscriptions In order toknowprotect theuser's presence, either via an explicit subscription as described herein or via an existing trust relationship (such as presence-enabled user directories within organizations). However, a client MAY also send directedprivacy of instant messaging users, presence(Section 4.6)information is disclosed only to other entities thatare not subscribed totheprincipal's presence (this does not constituteuser has approved. When apresence leak, since it is initiated byuser has agreed that another entity may view its presence, theclient); thisentity isdone by specifyingsaid to have a'to' address onSUBSCRIPTION to therelevant presence stanza. (Note: Whileuser's presenceinformation MAY be provided oninformation. An entity that has a subscription to a user'sbehalf by an automated service, normally itpresence (or to which a user has a presence subscription) isprovided by the user's client.) Aftercalled aclient completes the preconditions specified in [XMPP-CORE],CONTACT. A subscription lasts across sessions; indeed, itcan establish a "presence session" at its server by sending "initial presence" as described under Section 4.2, that is by sending a presence stanza with to 'type'lasts until the contact unsubscribes or'to' attribute. The XMPP presence stanza is also used to negotiate and manage subscriptions tothepresence of other entities. These tasksuser cancels the previously- granted subscription. Subscriptions arecompleted viamanaged within XMPP by sending presence stanzasof type "subscribe",containing specially-defined attributes ("subscribe", "unsubscribe", "subscribed", and"unsubscribed" as described under Section 3. If"unsubscribed"). Note: When a userandor contactare associated with different XMPP servers, those servers also usegenerates aspecialpresence stanza of type"probe" in order to determine"subscribe", "subscribed", "unsubscribe", and "unsubscribed" or a server processes or generates such a stanza on behalf of a user or contact, theavailabilityserver MUST stamp the outgoing presence stanza with the bare JID <node@domain> of theentity onuser or contact, not thepeer server. Clients SHOULD NOT sendfull JID <node@domain/resource>. This rule helps to prevent presencestanzasleaks; for details, see the security considerations oftype "probe". Naturally,[XMPP-CORE].) 3.1. Requesting a Subscription A SUBSCRIPTION REQUEST is a presence stanzamay also bewhose 'type' attribute has a value oftype "error"."subscribe". A subscription request is generated by a user's client, processed by the (potential) contact's server, and acted on by the contact via the contact's client. The workflow is described in the following sections. Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page15]18] Internet-Draft XMPP IMAprilJuly 2007The values3.1.1. Client Generation ofthe 'type' attribute are summarized in the following list (the reader is reminded thatOutbound Subscription Request A user's client generates a subscription request by sending a presence stanzawith no 'type' attribute signals thatof type "subscribe" and specifying a 'to' address of therelevant entity is availablepotential contact's bare JID <contact@domain>. UC: <presence to='juliet@example.com' type='subscribe'/> Typically the user's client prompts the user forcommunication): o unavailable -- Signalsinformation about the potential contact ("handle" and desired roster group) and generates a roster set with that information before sending theentitysubscription request, but that behavior isno longer available for communication. o subscribe -- The sender wishes to subscribe torecommended rather than required. 3.1.2. Server Processing of Outbound Subscription Request As mentioned, therecipient's presence. o subscribed -- The sender has alloweduser's server MUST stamp therecipient to receive their presence. o unsubscribe -- The sender is unsubscribing from another entity's presence. o unsubscribed -- The subscription request has been denied or a previously-grantedoutbound subscriptionhas been cancelled. o probe -- Arequestfor an entity's current presence; SHOULD be generated only by a server on behalfwith the bare JID <user@domain> ofathe user.o error -- An error has occurred regarding processing or delivery of a previously-sent presence stanza. 4.2. Initial Presence After completingUS: <presence from='romeo@example.net' to='juliet@example.com' type='subscribe'/> If thepreconditions described in [XMPP-CORE] (REQUIRED) and requestingpotential contact is hosted on the same server, theroster (RECOMMENDED), a client SHOULD send INITIAL PRESENCE to itsserverin orderMUST adhere tosignal its availability for communications. As defined herein,theinitial presence stanza (1) MUST possess no 'to' address (signalling thatrules specified in the next section in processing the subscription request and delivering itis meanttobe broadcasted bytheserver(local) contact. If the potential contact is hosted onbehalf of the client) and (2) MUST possess no 'type' attribute (signallinga different server, the user'savailability). After sending initial presence, a connected resource (inserver then routes theterminology of [XMPP-CORE]) is saidstanza tobe an AVAILABLE RESOURCE. Upon receiving initial presence from a client, thethat foreign domain in accordance with core XMPP stanza processing rules. The user's server MUSTdo the following if there is not already one or more available resources for the user (if there is already one or more available resources for the user, the server obviously does not need tothen sendthe presence probes, since it already possesses the requisite information): 1. SendaPRESENCE PROBE (i.e., presence stanza whose 'type' attribute is setroster push toa valueall of"probe") fromthefull JID (e.g., <juliet@example.com/balcony>) ofuser's interested resources, containing theuser to eachpotential contactto which the user is subscribed in order to determine if they are available; such contacts are those for whichwith aJID is present in the user's rostersubscription state of "none" and with notation that the'subscription'subscription is pending (via an 'ask' attributeset to awhose valueof "to" or "both".is "subscribe"). Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page16]19] Internet-Draft XMPP IMAprilJuly 20072. Broadcast initial presence from the full JID (e.g., <juliet@example.com/balcony>) of the user to all contacts that are subscribed toUS: <iq to='romeo@example.net/foo' type='set' id='b89c5r7ib574'> <query xmlns='jabber:iq:roster'> <item jid='juliet@example.com' subscription='none' ask='subscribe'/> </query> </iq> US: <iq to='romeo@example.net/bar' type='set' id='b89c5r7ib575'> <query xmlns='jabber:iq:roster'> <item jid='juliet@example.com' subscription='none' ask='subscribe'/> </item> </query> </iq> Note: Because theuser's presence information; such contacts are those for whichserver must send this roster push, aJID is present inclient MAY simply wait for theuser'srosterwithpush rather than proactively adding the'subscription' attribute setcontact toa value of "from" or "both". In addition,the user'sserver MUST broadcast initial presence from the user's newly available resource to the user's existing available resources (if any). Upon receiving initial presence from the user, if the contact address does not exist or the user is not in the contact'srosterwith abefore sending the subscriptionstaterequest. 3.1.3. Server Processing of"to" or "both", then theInbound Subscription Request The contact's server MUSTreturn a presence stanza of type "unsubscribe"adhere to theuser. Otherwise, iffollowing rules when processing theuser is ininbound subscription request: 1. Above all, the contact'sroster withserver MUST NOT automatically approve subscription requests on the contact's behalf; instead, if a subscriptionstate of "to" or "both",request requires approval then the contact's server MUST deliverthe user's presence stanzathat request to thefull JIDs (e.g., <romeo@example.net/orchard>) associated with all of thecontact'savailable resources.interested resource(s) for approval or denial by the contact. 2. If theuser'scontact does not exist, the contact's serverreceivesMUST automatically return a presence stanza of type"error" in response"unsubscribed" to theinitial presence that it sent to a contact on behalf ofuser. CS: <presence from='juliet@example.com' to='romeo@example.net' type='unsubscribed'/> 3. If theuser, it SHOULD NOT send further presence updates to thatcontact(untilexists andunless it receives a presence stanza fromthecontact). 4.3. Presence Probes Upon receivinguser already has apresence probe fromsubscription to the user's presence, the contact's server SHOULD auto-reply on behalf of theuser,user by sending a presence stanza of type "subscribed" from the contact'sserver SHOULD reply as follows: 1.bare JID to the user's bare JID. Saint-Andre Expires January 18, 2008 [Page 20] Internet-Draft XMPP IM July 2007 4. If the contactaccount does not exist orexists, the useris in the contact's roster withdoes not already have a subscriptionstate other than "From", "From + Pending Out", or "Both" (as defined under Subscription States (Appendix B)),to the contact'sserver MUST return a presence stanza of type "unsubscribed" in response topresence, and there is at least one interested resource associated with thepresence probe (however, if acontact when the subscription request is received by the contact's server, the contact's serverreceives a presence probe from a subdomain ofMUST broadcast that subscription request to all interested resources in accordance with Server Rules for Processing XML Stanzas (Section 8). 5. If theserver's hostname or another such trusted service, it MAY provide presence information aboutcontact exists, the user does not already have a subscription tothat entity). 2. Else, ifthe contact's presence, and the contact has noavailable resources, the server MUST either (1) reply tointerested resources when thepresence probesubscription request is received bysending totheusercontact's server, thefull XMLcontact's server MUST keep a record of thelastcomplete presence stanzaof type "unavailable" received bycomprising theserver fromsubscription request, including any extended content contained therein, and deliver thecontact, or (2) not reply at all. 3. Else, ifrequest when the contact next hasat least one availablean interested resource, until the contact either approves or denies the request. (Note: The contact's server MUSTreply toNOT deliver more than one subscription request from any given user when thepresence probe by sending tocontact next has an interested resource; e.g., if the user sends multiple subscription requests to thefull XML ofcontact while thelast presence stanza with no 'to' attribute received bycontact is offline, the contact's serverfrom eachSHOULD store only one of those requests, such as thecontact's available resources. Saint-Andre Expires October 19, 2007 [Page 17] Internet-Draft XMPP IM April 2007 4.4. Subsequent Presence Broadcast After sending initial presence, the user MAY update its availability for broadcasting at any time during its session by sending a presence stanza with no 'to' address and no 'type' attribute. (Note: A user's client SHOULD NOT send a presence update to broadcast information that changes independently of the user's presencefirst request or last request, andavailability.) Upon receiving such a presence stanza expressing updated availability, the user's serverMUSTbroadcast the full XMLdeliver only one ofthat presence stanza to all contacts (1) that are intheuser's roster with a subscription type of "from" or "both" and (2) from whomrequests when theservercontact next hasnot received unavailable presence, presence of type "unsubscribe", or a presence error during the user's session, as well asan interested resource; this helps to prevent "subscription request spam".) Note: If theuser's other available resources. (Note: Regarding rule 2 above, ifcontact does not approve or deny the subscriptionstate is "both" thenrequest within some configurable amount of time, the user's server MAYbroadcast subsequent presence only ifchoose to re-send theserver has received available presence fromsubscription request to the contactat some point during the user's session; i.e., if the server never receivedbased on an implementation-specific algorithm (e.g., whenever a new resource becomes availablepresencefor the user, or after a certain amount of time has elapsed); this helps to recover from transient, silent errors that may have occurred in relation to thecontact andoriginal subscription request. 3.1.4. Client Processing of Inbound Subscription Request When theuser hascontact's client receives amutual presencesubscriptionwithrequest from thecontact,user, itMAY decline to send subsequent presence toMUST present thecontact.) Upon receiving subsequent presence fromrequest to theuser, ifcontact for approval (unless the contactaddress does not exist or the user is not inhas explicitly configured thecontact's roster with a subscription state of "to"client to automatically approve or"both", then the contact's server MUST returndeny some or all subscription requests). A subscription request is approved by sending a presence stanza of type"unsubscribe" to the user. Otherwise, if the user"subscribed". CC: <presence to='romeo@example.net' type='subscribed'/> Note: Server processing of presence stanzas of type 'subscribed' is described in thecontact's roster with a subscription state of "to" or "both", thenfollowing sections for both the contact's serverMUST deliverand Saint-Andre Expires January 18, 2008 [Page 21] Internet-Draft XMPP IM July 2007 the user'spresence stanza to the full JIDs (e.g., <romeo@example.net/orchard>) associated with all of the contact's available resources. 4.5. Unavailable Presence Before ending its session with a server, a client SHOULD gracefully become unavailableserver. A subscription request is denied by sendingUNAVAILABLE PRESENCE, i.e.,a presence stanzathat possesses no 'to' attribute and that possesses a 'type' attribute whose valueof type "unsubscribed". CC: <presence to='romeo@example.net' type='unsubscribed'/> Note: Server processing of presence stanzas of type 'unsubscribed' is"unavailable" (optionally,described under Section 3.2 for both thefinal presence stanza MAY contain one or more <status/> elements specifyingcontact's server and thereason whyuser's server. 3.1.5. Server Processing of Outbound Subscription Approval When theuser is no longer available). However,contact's client sends theuser'ssubscription approval, the contact's server MUSTNOT depend on receiving final presence from an available resource, sincestamp theresource may become unavailable unexpectedly or may be timed out byoutbound stanza with theserver. If onebare JID <contact@domain> of theuser's resources becomes unavailable for any reason (either gracefullycontact and route orungracefully),deliver theuser'sstanza to the user. CS: <presence from='juliet@example.com' to='romeo@example.net' type='subscribed'/> The contact's server then MUSTbroadcast unavailable presencesend a roster push to allcontacts (1) that are in the user's roster with a subscription typeof"from" or "both" and (2) from whomthe contact's interested resources. CS: <iq to='juliet@example.com/balcony' type='set' id='a78b4q6ha463'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' subscription='from'/> </query> </iq> CS: <iq to='juliet@example.com/chamber' type='set' id='a78b4q6ha464'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' subscription='from'/> </query> </iq> The contact's serverhas not received unavailable presence,MUST then also send current presence information to the user from each oftype "unsubscribe", or athe contact's available resources. Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page18]22] Internet-Draft XMPP IMAprilJuly 2007presence error duringCS: <presence from='juliet@example.com/balcony' to='romeo@example.net'/> CS: <presence from='juliet@example.com/chamber' to='romeo@example.net'/> From theuser's session;perspective of theuser's server MUST also send that unavailable presence stanzacontact, there now exists a subscription from the user. In order to subscribe to the user'sother available resources. (Note: Regarding rule 2 above, ifpresence, thesubscription state is "both"contact would then send a subscription request to theserver MAY broadcast unavailable presence only ifuser. (XMPP clients will often automatically send theserver has received available presence fromsubscription request instead of requiring the contactat some point duringto initiate theuser's session; i.e., ifsubscription request, since it is assumed that theserver never received available presence fromdesired end state is a mutual subscription.) Naturally, when the contactand the user hassends amutual presencesubscriptionwith the contact, it MAY decline to send unavailable presencerequest to thecontact). Ifuser, theunavailable presence stanza was receivedAppendix A (as well as the roles of the two JIDs) will be different from those shown in theclient,foregoing examples. 3.1.6. Server Processing of Inbound Subscription Approval When the user's serverMUST broadcastreceives thefull XML of that presence stanza to all entities that fitsubscription approval, it MUST first check if theabove description. Any presence stanza with no 'type' attribute and no 'to' attribute thatcontact issent after sending broadcasted unavailable presence MUST be broadcasted by the server to all subscribers (i.e., MUST be treated as equivalent to "initial presence" for a new presence session). 4.6. Directed Presence This section supplements andinsome respects modifies the rules defined above, but only forthespecial case of "directed presence". BROADCASTED PRESENCE is generated when a client sends a presence stanza with no type (oruser's roster withtype "unavailable")a subscription='none' or subscription='from' andno 'to' address overtheXML to its server. However, a user MAY also send DIRECTED PRESENCE'ask' flag set toanother entity -- i.e., a presence stanza with"subscribe" (i.e., a'to' attribute whose value is the JIDAppendix A ofthe other entity and with either no 'type' attribute"None + Pending Out" ora 'type' attribute whose value is "unavailable". There are three possible cases: 1."From + Pending Out"). If theuser sends directed available or unavailable presence to acontactthatis not in the user's roster witha subscription typeeither of"from" or "both" after having sent initial presence and before sending broadcasted unavailable presence,those states, the user's server MUSTroute or deliversilently ignore thefull XML of thatpresence stanzabut SHOULD NOT otherwise modify the contact's status regarding broadcasted presenceof type "subscribed" (i.e., itSHOULD includeMUST NOT route it to thecontact's JID in any subsequent presence broadcasts initiated byuser, modify theuser). 2.user's roster, or generate a roster push to the user's available resources). If theuser sends directed presence to an entity thatforegoing check isnot insuccessful, the user'sroster withserver MUST initiate asubscription type of "from" or "both" after having sent initial presence and before sending broadcasted unavailable presence,roster push to all of the user'sserver MUST route or deliverinterested resources, containing an updated roster item for thefull XML of that presence stanzacontact with the 'subscription' attribute set to a value of "to". Saint-Andre Expires January 18, 2008 [Page 23] Internet-Draft XMPP IM July 2007 US: <iq to='romeo@example.net/foo' type='set' id='b89c5r7ib576'> <query xmlns='jabber:iq:roster'> <item jid='juliet@example.com' subscription='to'/> </query> </iq> US: <iq to='romeo@example.net/bar' type='set' id='b89c5r7ib577'> <query xmlns='jabber:iq:roster'> <item jid='juliet@example.com' subscription='to'/> </item> </query> </iq> From theentity but MUST NOT modifyperspective of the user, there now exists a subscription to the contact'sstatus regarding availablepresencebroadcast (i.e., itinformation. The user's server MUSTNOT includealso deliver theentity's JID in any subsequent broadcasts ofavailable presenceinitiated by the user); however, ifstanza received from each of the contact's availableresource from whichresources to each of theuseruser's available resources. US: <presence from='juliet@example.com/balcony' to='romeo@example.net'/> US: <presence from='juliet@example.com/balcony' to='romeo@example.net'/> US: <presence from='juliet@example.com/chamber' to='romeo@example.net'/> US: <presence from='juliet@example.com/chamber' to='romeo@example.net'/> 3.2. Cancelling a Subscription 3.2.1. Client Generation of Subscription Cancellation If a contact would like to cancel a subscription that it has previously granted to a user, it sends a presence stanza of type "unsubscribed". CC: <presence to='romeo@example.net' type='unsubscribed'/> Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page19]24] Internet-Draft XMPP IMAprilJuly 2007sent the directed presence become unavailable,3.2.2. Server Processing of Outbound Subscription Cancellation As mentioned, theuser'scontact's server MUSTroute that unavailable presence tostamp theentity (ifoutbound subscription cancellation with the bare JID <user@domain> of the contact. CS: <presence from='juliet@example.com' to='romeo@example.net' type='unsubscribed'/> If the userhas not yet sent directed unavailable presenceis hosted on the same server, the server MUST adhere tothat entity). 3.the rules specified in the next section when processing the subscription cancellation. If the usersends directed presence without first sending initial presence or after having sent unavailable presence broadcast (i.e., the resourceisconnected but not available),hosted on a different server, theuser'scontact's server then routes the stanza to that foreign domain in accordance with core XMPP stanza processing rules. The contact's server then MUSTtreatsend a roster push with theentitiesupdated roster item towhichall of theuser sends directed presence incontact's interested resources. CS: <iq to='juliet@example.com/balcony' type='set' id='a78b4q6ha465'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' subscription='none'/> </query> </iq> CS: <iq to='juliet@example.com/chamber' type='set' id='a78b4q6ha466'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' subscription='none'/> </query> </iq> 3.2.3. Server Processing of Inbound Subscription Cancellation When thesame way thatuser's server receives the inbound subscription cancellation, ittreatsMUST modify theentities listed in case #2 above. A server SHOULD respond to presence probes from entities to whichsubscription state and send auser has sent directed presence (before sending directed or broadcasted unavailable presence), even if such entities are not inroster push to the user'sroster with a subscription typeinterested resource(s). Saint-Andre Expires January 18, 2008 [Page 25] Internet-Draft XMPP IM July 2007 US: <iq to='romeo@example.net/foo' type='set' id='h37h3u1bv400'> <query xmlns='jabber:iq:roster'> <item jid='juliet@example.com' subscription='none'/> </query> </iq> US: <iq to='romeo@example.net/bar' type='set' id='h37h3u1bv401'> <query xmlns='jabber:iq:roster'> <item jid='juliet@example.com' subscription='none'/> </item> </query> </iq> 3.3. Unsubscribing 3.3.1. Client Generation of"from" or "both". For instance,Unsubscribe If a usermay joinwould like to unsubscribe from a contact's presence, it sends amulti-user chat room (see [XEP-0045]) by sending directedpresenceto the room:stanza of type "unsubscribe". UC: <presencefrom='romeo@example.net/orchard' to='shakespeare@chat.example.com/RM'/> In order to discover ifto='juliet@example.com' type='unsubscribe'/> 3.3.2. Server Processing of Outbound Unsubscribe As mentioned, theuser remains online,user's server MUST stamp thechat service SHOULD send a presence probe tooutbound unsubscribe with theuser on behalfbare JID <user@domain> of theroom:user. US: <presencefrom='shakespeare@chat.example.com' to='romeo@example.net'/>from='romeo@example.net' to='juliet@example.com' type='unsubscribe'/> If theusercontact isstill online,hosted on the same server, theuser'sserverSHOULD send an empty available presenceMUST adhere to therequesting entity: <presence from='romeo@example.net/orchard' to='shakespeare@chat.example.com'/>rules specified in the next section when processing the unsubscribe. If theusercontact isnow offline,hosted on a different server, the user's serverSHOULD send an empty unavailable presence tothen routes therequesting entity: <presence from='romeo@example.net/orchard' to='shakespeare@chat.example.com' type='unavailable'/> 4.7. Presence Syntax Instanza to that foreign domain in accordance withthe default namespace declaration, a presencecore XMPP stanzais qualified byprocessing rules. The user's server then MUST send a roster push with the'jabber:client' or 'jabber:server' namespace, which defines certain allowable childrenupdated roster item to all ofpresence stanzas, in particularthe<show/>, <status/>,user's interested resources. Saint-Andre Expires January 18, 2008 [Page 26] Internet-Draft XMPP IM July 2007 US: <iq to='romeo@example.net/foo' type='set' id='h37h3u1bv402'> <query xmlns='jabber:iq:roster'> <item jid='juliet@example.com' subscription='none'/> </query> </iq> US: <iq to='romeo@example.net/bar' type='set' id='h37h3u1bv403'> <query xmlns='jabber:iq:roster'> <item jid='juliet@example.com' subscription='none'/> </item> </query> </iq> 3.3.3. Server Processing of Inbound Unsubscribe When the contact's server receives the inbound unsubscribe, it MUST modify the subscription state and<priority/> elements. These child elements are usedsend a roster push toprovide more detailed information about an entity's availability. Typically these child elements are provided only ifthepresence stanza possesses no 'type'contact's interested resource(s). CS: <iq to='juliet@example.com/balcony' type='set' id='a78b4q6ha467'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' subscription='none'/> </query> </iq> CS: <iq to='juliet@example.com/chamber' type='set' id='a78b4q6ha468'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' subscription='none'/> </query> </iq> 4. Exchanging Presence Information Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page20]27] Internet-Draft XMPP IMAprilJuly 2007attribute, although exceptions are noted in the text that follows. 4.7.1. Availability States4.1. Overview TheOPTIONAL <show/> element contains non-human-readable XML character data that specifies the particular availability sub-stateconcept of presence refers to anentity orentity's availability for communication over aspecific resource thereof. Anetwork. At the most basic level, presencestanza MUST NOT contain more than one <show/> element. The <show/> element MUST NOT possess any attributes. If provided, the XML character data value MUST be one of the following (additional availability types could be defined through a properly-namespaced child element of the presence stanza): o away -- The entity or resource is temporarily away. o chat -- The entity or resourceisactively interested in chatting. o dnd -- Thea boolean "on/off" variable that signals whether an entityor resourceisbusy (dnd = "Do Not Disturb"). o xa -- The entityavailable orresource is awayunavailable foran extended period (xa = "eXtended Away"). If no <show/> element is provided, the entity is assumed to be onlinecommunication (the terms "online" andavailable. Example: Availability status: <presence> <show>dnd</show> </presence> 4.7.2. Availability Description The OPTIONAL <status/> element contains XML character data specifying"offline" are also used). In XMPP, anatural-language description of an entity's availability. Itprincipal's availability isnormally used in conjunction withsignalled when a client controlled by theshow element to provideprincipal generates adetailed description of<presence/> stanza with no 'type' attribute, and an entity's lack of availabilitystate (e.g., "In a meeting")is signalled whenthe presencea client generates a <presence/> stanzahas nowhose 'type'attribute. The <status/> element MUST NOT possess any attributes, with the exception of the 'xml:lang' attribute. Multiple instances of the <status/> element MAY be included, but only if each instance possesses an 'xml:lang'attributewithhas adistinct languagevalue(either explicitly or by inheritanceof "unavailable". In XMPP-based applications that combine messaging and presence functionality, the'xml:lang' valuedefault type ofan element farther up in the XML hierarchy,communication for whichmay include the XML stream header as described in Section 4.4 of [XMPP-CORE]). Saint-Andre Expires October 19, 2007 [Page 21] Internet-Draft XMPP IM April 2007 Example: Availability description: <presence from='romeo@example.net/orchard' xml:lang='en'> <show>dnd</show> <status>Wooing Juliet</status> <status xml:lang='cs'>Dvořím se Julii</status> </presence> Apresencestanza of type "unavailable" MAY also include a <status/> elementsignals availability is messaging; however, XMPP-based applications are not required to combine messaging and presence functionality, and can providedetailedstandalone presence features without messaging (in addition, XMPP servers do not require presence informationabout why the entity is going offline. Example: Unavailability description: <presence from='romeo@example.net/orchard' type='unavailable'> <status>Busy IRL</status> </presence> The <status/> child MAY also be sentina subscription-relatedorder to successfully route message and IQ stanzas). XMPP presencestanza (i.e., type "subscribe", "subscribed", "unsubscribe",typically follows a "publish-subscribe" or"unsubscribed")"observer" pattern, wherein an entity sends presence information toprovide a descriptionits server, and its server then broadcasts that information to all of theaction: Example: Description ofentity's contacts who have a subscriptionrequest: <presence from='romeo@example.net' to='nurse@example.com' type='subscribe'> <status>Hi, Juliet said I should add youtomy buddy list.</status> </presence> 4.7.3. Resource Priority The OPTIONAL <priority/> element contains non-human-readable XML character data that specifiesthepriority level ofentity's presence (in theresource. The value MUST beterminology of [IMP-MODEL], aninteger between -128entity that generates presence information is a "presentity" and+127.the entities that receive presence information are "subscribers"). A client generates presencestanza MUST NOT contain more than one <priority/> element. The <priority/> element MUST NOT possess any attributes. If no priority is provided,for broadcasting to all subscribed entities by sending a presence stanza to its serverSHOULD consider the priority to be zero. Saint-Andre Expires October 19, 2007 [Page 22] Internet-Draft XMPP IM April 2007 Example: Presence priority: <presence xml:lang='en'> <show>dnd</show> <status>Wooing Juliet</status> <status xml:lang='cs'>Dvořím se Julii</status> <priority>1</priority> </presence> For information regarding the semantics of priority values in stanza routing within instant messaging and presence applications, refer to Server Rules for Handling XML Stanzas (Section 8). 4.7.4. Presence Errors Ifwith no 'to' address, where the presence stanza has either no 'type' attribute or a 'type' attribute whose value isof"unavailable". This type"error", it MUST include an <error/> child element; for details, see [XMPP-CORE]. 4.7.5. Extended Namespaces As described in [XMPP-CORE], an XML stanzaof presence is called BROADCASTED PRESENCE. (A client MAYcontain any properly- namespaced child element; this applies to thealso send DIRECTED PRESENCE, i.e., a presence stanzaas well. 5. Exchanging Messages 5.1. Overview Once a client has authenticatedwith aserver and bound a resource'to' address; this is less common but is sometimes used toan XML stream as describedsend presence to entities that are not subscribed to the principal's presence.) After a client completes the preconditions specified in [XMPP-CORE],an XMPPit can establish a PRESENCE SESSION at its serverwill route XML stanzas to and from that client. One type of stanza that may be exchanged is <message/>. Exchanging messages isby sending initial presence (Section 4.2). Such abasic use of XMPP andpresence session isbrought about when aterminated by sending unavailable presence (Section 4.5). Note: A usergeneratesSHOULD NOT send amessage stanza that is addressedpresence update toanother entity. As defined under Server Rules for Handling XML Stanzas (Section 8),broadcast information that changes independently of thesender's server is responsibleuser's presence and availability fordelivering the message to the intended recipient (if the recipient is on the same server) or for routing the message tocommunication. 4.2. Initial Presence Saint-Andre Expires January 18, 2008 [Page 28] Internet-Draft XMPP IM July 2007 4.2.1. Client Generation After completing therecipient's server (ifpreconditions described in [XMPP-CORE] (REQUIRED) and requesting therecipient is onroster (RECOMMENDED), adifferent server). Thus the message stanza is used to "push" information to another entity. An instant messagingclient SHOULDspecify an intended recipientsignal its availability for communication by sending INITIAL PRESENCE to its server, i.e., amessagepresence stanza with no 'to' address (signalling that it is meant to be broadcasted byprovidingtheJIDserver on behalf ofan entity other than the sender inthe'to'client) and no 'type' attributeof(signalling the<message/> stanza. Ifuser's availability). After sending initial presence, a connected resource (in themessageterminology of [XMPP-CORE]) isbeing sent in replysaid toa message previously received frombe anaddress of the form <user@domain/resource> (e.g., within the contextAVAILABLE RESOURCE. UC: <presence/> 4.2.2. Server Processing of Outbound Presence Upon receiving initial presence from achat session),client, thevalue ofuser's server MUST send the'to' address SHOULD be ofinitial presence stanza from theformfull JID <user@domain/resource>rather thanof theform <user@domain> unless Saint-Andre Expires October 19, 2007 [Page 23] Internet-Draft XMPP IM April 2007 the sender has knowledge (via presence)user to all contacts that are subscribed to theintended recipient's resourceuser's presence information; such contacts are those for which a JID isno longer available. Ifpresent in themessage is being sent outsideuser's roster with thecontext'subscription' attribute set to a value ofany existing chat session"from" orreceived message,"both". Note: In thevalue offollowing examples, the'to' address SHOULD be of"user" is juliet@example.com and theform <user@domain> rather thanuser has three contacts in her roster with a subscription state of from or both: romeo@example.net, mercutio@example.com, and benvolio@example.com. US: <presence from='juliet@example.com/balcony' to='romeo@example.net'/> US: <presence from='juliet@example.com/balcony' to='mercutio@example.com'/> US: <presence from='juliet@example.com/balcony' to='benvolio@example.com'/> The user's server MUST also broadcast initial presence from theform <user@domain/resource>. Common usesuser's newly available resource to all of themessage stanza in instant messaging applications include single messages, messages sent inuser's available resources. US: <presence from='juliet@example.com/balcony' to='juliet@example.com/balcony'/> US: <presence from='juliet@example.com/balcony' to='juliet@example.com/chamber'/> In thecontextabsence ofa chat conversation, messages sent inpresence information about thecontextuser's contacts, the Saint-Andre Expires January 18, 2008 [Page 29] Internet-Draft XMPP IM July 2007 user's server SHOULD also send presence probes to the user's contacts on behalf ofa multi-user chat room, headlines and other alerts, and errors. These uses are differentiated via 'type' attribute. Inclusionthe user as specified under Section 4.3. 4.2.3. Server Processing of Inbound Presence Upon receiving presence from the'type' attribute is RECOMMENDED. If included,user, the'type' attributecontact's server MUSThave onedeliver the user's presence stanza to the full JIDs <contact@domain/resource> associated with all of thefollowing values: o chat -- The messagecontact's available resources. CC: <presence from='juliet@example.com/balcony' to='romeo@example.net'/> CC: <presence from='juliet@example.com/balcony' to='romeo@example.net'/> 4.2.4. Client Processing of Inbound Presence When the contact's client receives presence from the user and the user issentin thecontext of a one-to-one chat conversation. A compliant clientcontact's roster, it SHOULDpresentdisplay themessagepresence information in an appropriate roster interface. If the user is not in the contact's roster but the contact and the user are actively exchanging message or IQ stanzas, the contact's client SHOULD display the presence information in the user interfaceenabling one-to-onefor that chatbetweensession. Otherwise, thetwo parties, including an appropriate conversation history. o error -- An error has occurred related to a previous message sent byclient SHOULD ignore thesender (for details regarding stanza error syntax, referpresence information and not display it to[XMPP-CORE]).the contact. 4.3. Presence Probes Acompliant clientPRESENCE PROBE is a presence stanza whose 'type' attribute has a value of "probe". The value of the 'from' address SHOULDpresent an appropriate interface informingbe thesenderfull JID <user@domain/resource> of thenatureprobing user and the value of theerror. o groupchat -- The message is sent in'to' address SHOULD be thecontextbare JID <contact@domain> ofa multi-user chat environment (similarthe contact whose availability the user wants tothat of [IRC]).discover. US: <presence from='juliet@example.com/balcony' to='romeo@example.net' type='probe'/> Acompliant clientpresence probe SHOULDpresentNOT be sent by a client. Instead, it is designed to be sent by a user's server on themessageuser's behalf inan interface enabling many-to-many chat betweenorder to discover theparties, including a rosteravailability ofparties inthechatroom and an appropriate conversation history. Full definition of XMPP-based groupchat protocols is outuser's contacts. Saint-Andre Expires January 18, 2008 [Page 30] Internet-Draft XMPP IM July 2007 4.3.1. Server Generation ofscope for this document (for details see [XEP-0045]). o headline -- The message is probably generated by an automated service that delivers or broadcasts content (news, sports, market information, syndicated content, etc.). No replyOutbound Presence Probe When a server needs to discover themessage is expected, andavailability of acompliant clientuser's contact, it SHOULDpresentsend a presence probe from themessage in an interface that appropriately differentiatesfull JID <user@domain/resource> of themessage from standalone messages, chat sessions, or groupchat sessions (e.g., by not providing the recipient with the abilityuser toreply). o normal -- The message is a single message that is sent outsidethecontextbare JID <contact@domain> ofa one-to-one conversation or groupchat, and to which it is expected thattherecipient will reply. A compliant clientcontact. The server SHOULDpresent the message in an interface enabling the recipientsend a probe toreply, but withoutaconversation history. This is the default value of the 'type' attribute. An IM application SHOULD support all of the foregoing message types;contact only ifan application receives a message with no 'type' attribute ortheapplication does not understandcontact is in thevalue ofuser's roster with the'type''subscription' attributeprovided, it MUST consider the messageset tobea value oftype "normal""to" or "both" (i.e.,"normal" is the default). The "error" type MUST be generated only in Saint-Andre Expires October 19, 2007 [Page 24] Internet-Draft XMPP IM April 2007 response to an error related to a message received from another entity. Althoughif the'type' attribute is OPTIONAL, ituser isconsidered politesubscribed tomirrorthetype in any replies tocontact's presence). The user's server SHOULD send amessage; furthermore, some specialized applications (e.g.,presence probe whenever the user starts amulti-user chat service)new presence session by sending initial presence; however, the server MAY choose not to send the probe attheir discretion enforcethat point if it has what it deems to be reliable and up-to-date presence information about theuse of a particular message typeuser's contacts (e.g.,type='groupchat'). In addition tobecause the'type' attribute (which differentiatesuser has another available resource or because theconversational contextuser briefly logged off and on before the new presence session began). US: <presence from='juliet@example.com/balcony' to='romeo@example.net' type='probe'/> US: <presence from='juliet@example.com/balcony' to='benvolio@example.com' type='probe'/> US: <presence from='juliet@example.com/balcony' to='nurse@example.com' type='probe'/> 4.3.2. Server Processing of Inbound Presence Probe Upon receiving a presence probe from themessage), an XMPP message stanza MAY contain any allowable child elements qualified byuser's server on behalf of the'jabber:client' (or 'jabber:server') namespace, as well as any other properly- namespaced child element. These payloads are described inuser, thetext that follows. 5.2. Specifying a Message Body The <body/> element contains human-readable XML character data that specifiescontact's server SHOULD reply as follows: 1. If thetextual contents ofcontact account does not exist or themessage; this child element is normally included butuser isOPTIONAL. The <body/> element MUST NOT possess any attributes,in the contact's roster with a subscription state other than "From", "From + Pending Out", or "Both" (as defined under Appendix A), theexceptioncontact's server MUST return a presence stanza of type "unsubscribed" in response to the'xml:lang' attribute. Multiple instancespresence probe (however, if a server receives a presence probe from a configured hostname of the<body/> elementserver itself or another such trusted service, it MAYbe included, but onlyprovide presence information about the user to that entity). CS: <presence from='mercutio@example.com' to='juliet@example.com' type='unsubscribed'/> Saint-Andre Expires January 18, 2008 [Page 31] Internet-Draft XMPP IM July 2007 2. Else, ifeach instance possesses an 'xml:lang' attribute with a distinct language value (either explicitly orthe contact has no available resources, the server MUST either (1) reply to the presence probe byinheritance ofsending to the'xml:lang' value of an element farther up inuser the full XMLhierarchy, which may includeof theXML stream header as described in Section 4.4last presence stanza of[XMPP-CORE]). The <body/> elementtype "unavailable" received by the server from the contact, or (2) not reply at all. 3. Else, if the contact has at least one available resource, the server MUSTNOT contain mixed content (as defined in Section 3.2.2 of [XML]). A message stanza often will contain a child <body/> element whose XML character data specifiesreply to theprimary meaning ofpresence probe by sending to themessage. Example: A message with a body: <message to='romeo@example.net' from='juliet@example.com/balcony' type='chat' xml:lang='en'> <body>Wherefore art thou, Romeo?</body> <body xml:lang='cs'>PročeŽ jsi ty, Romeo?</body> </message> Saint-Andre Expires October 19, 2007 [Page 25] Internet-Draft XMPP IM April 2007 5.3. Specifying a Message Subject The <subject/> element contains human-readable XML character data that specifiesuser thetopicfull XML of themessage. The <subject/> element MUST NOT possess any attributes,last presence stanza with no 'to' attribute received by theexceptionserver from each of the'xml:lang'contact's available resources. CS: <presence from='romeo@example.net/foo' to='juliet@example.com'/> CS: <presence from='romeo@example.net/bar' to='juliet@example.com'> <show>away</show> </presence> 4.4. Subsequent Presence Broadcast 4.4.1. Client Generation After sending initial presence, the user's client may update its availability for broadcasting at any time during its session by sending a presence stanza with no 'to' address and no 'type' attribute.Multiple instancesUC: <presence> <show>away</show> </presence> 4.4.2. Server Processing of Outbound Presence Upon receiving a presence stanza expressing updated availability, the<subject/> element MAY be included foruser's server MUST broadcast thepurposefull XML ofproviding alternate versionsthat presence stanza to all contacts who meet both of thesame subject, but only if each instance possesses an 'xml:lang' attributefollowing criteria: 1. The contact is in the user's roster with adistinct language value (either explicitly or by inheritancesubscription type of "from" or "both". 2. The last presence stanza received from the'xml:lang' valuecontact during the user's presence session was not of type "error", "unavailable", or "unsubscribe". Saint-Andre Expires January 18, 2008 [Page 32] Internet-Draft XMPP IM July 2007 US: <presence from='juliet@example.com/balcony' to='romeo@example.net'> <show>away</show> </presence> US: <presence from='juliet@example.com/balcony' to='benvolio@example.com'> <show>away</show> </presence> US: <presence from='juliet@example.com/balcony' to='mercutio@example.com'> <show>away</show> </presence> Note: As anelement farther up inoptimization, if theXML hierarchy, which may includesubscription state is "both" then theXML stream header as described in Section 4.4 of [XMPP-CORE]).user's server MAY choose to broadcast subsequent presence only if the server has received available presence from the contact at some point during the user's session; i.e., if the server never received available presence from the contact and the user has a mutual presence subscription with the contact, it MAY decline to send subsequent presence to the contact. The<subject/> elementuser's server MUSTNOT contain mixed content (as defined in Section 3.2.2also send the presence stanza to all of[XML]). Example: A message with a subject: <message to='romeo@example.net'the user's available resources. US: <presence from='juliet@example.com/balcony'type='chat' xml:lang='en'> <subject>I implore you!</subject> <subject xml:lang='cs'> Úpěnlivě prosím! </subject> <body>Wherefore art thou, Romeo?</body> <body xml:lang='cs'>Pročež jsi ty, Romeo?</body> </message> 5.4. Specifying a Conversation Thread The primary useto='juliet@example.com/chamber'> <show>away</show> </presence> US: <presence from='juliet@example.com/balcony' to='juliet@example.com/balcony'> <show>away</show> </presence> 4.4.3. Server Processing of Inbound Presence Upon receiving presence from theXMPP <thread/> element isuser, the contact's server MUST deliver the user's presence stanza touniquely identify a conversation thread or "chat session" between two entities instantiated by <message/> stanzasthe full JIDs <contact@domain/resource> associated with all oftype 'chat'. However,the contact's available resources. Saint-Andre Expires January 18, 2008 [Page 33] Internet-Draft XMPP<thread/> element may also be used to uniquely identify an analogous thread between two entities instantiated by <message/> stanzasIM July 2007 CS: <presence from='juliet@example.com/balcony' to='romeo@example.net'> <show>away</show> </presence> CS: <presence from='juliet@example.com/balcony' to='romeo@example.net'> <show>away</show> </presence> 4.4.4. Client Processing oftype 'headline' or 'normal',Inbound Presence When the contact's client receives presence from the user and the user is in the contact's roster, it SHOULD display the presence information in an appropriate roster interface. If the user is not in the contact's roster but the contact and the user are actively exchanging message oramong multiple entitiesIQ stanzas, the contact's client SHOULD display the presence information in thecontext of a multi-user chat room instantiated by <message/> stanzas of type 'groupchat'. It may also be useduser interface for<message/> stanzasthat chat session. Otherwise, the client SHOULD ignore the presence information and notrelateddisplay it toa conversation, such as a game session or between plugins. The value ofthe<thread/> element MUST becontact. 4.5. Unavailable Presence 4.5.1. Client Generation Before ending its presence session with auniversally unique identifier (UUID) as described in [UUID]. The use ofserver, the<thread/> element is OPTIONALuser's client SHOULD gracefully become unavailable by sending UNAVAILABLE PRESENCE, i.e., a presence stanza that possesses no 'to' attribute and that possesses a 'type' attribute whose value isnot used to identify individual messages, only conversations. A message"unavailable". UC: <presence type='unavailable'/> Optionally, the final presence stanzaMUST NOTMAY containmore thanone<thread/> element.or more <status/> elements specifying the reason why the user is no longer available. US: <presence type='unavailable'> <status>going on vacation</status> </presence> 4.5.2. Server Processing of Outbound Unavailable Presence The<thread/> elementuser's server MUST NOTpossess any attributes. The value of the <thread/>depend on receiving unavailable presence from an available resource, since the resource may become unavailable ungracefully (e.g., the resource may be timed out by the server Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page26]34] Internet-Draft XMPP IMAprilJuly 2007element MUST be treated as opaque by entities; 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.2because of[XML]). 5.5. Message Errorsinactivity). Ifthe message stanza is of type "error", it MUST includean<error/> child;available resource becomes unavailable fordetails, see [XMPP-CORE]. 5.6. Extended Namespaces As described in [XMPP-CORE], an XML stanza MAY containanyproperly- namespaced child element; this applies toreason (either gracefully or ungracefully), themessage stanza as well. 6. Exchanging IQ Stanzas As described in [XMPP-CORE], IQ stanzas provide a structured request- response mechanism. The basic semantics of that mechanism (e.g.,user's server MUST broadcast unavailable presence to all contacts that meet both of the'id' attributefollowing criteria: 1. The contact isrequired) are definedin[XMPP-CORE], whereasthespecific semantics required to complete particular use cases are defined in all cases by an extended namespace. Note thatuser's roster with a subscription type of "from" or "both". 2. The last presence stanza received from the'jabber:client' and 'jabber:server' namespaces docontact during the user's presence session was notdefine any childrenofIQ stanzas other than the common <error/>. This document defines such an extended namespace, for Managingtype "error", "unavailable", or "unsubscribe". If theRoster (Section 2). However, an IQunavailable presence stanzaMAY contain structured information qualified by any extended namespace. 7. Examples The examples in this section illustrate a possible instant messaging andwas gracefully received from the client, the server MUST broadcast the full XML of the presencesession.stanza. US: <presence from='juliet@example.com/balcony' to='romeo@example.net' type='unavailable'/> US: <presence from='juliet@example.com/balcony' to='benvolio@example.com' type='unavailable'/> US: <presence from='juliet@example.com/balcony' to='mercutio@example.com' type='unavailable'/> Theuser is romeo@example.net, he has an available resource whose resource identifier is "orchard", and he hasuser's server MUST also send thefollowing individuals in his roster: o juliet@example.com (subscription="both" and she has twounavailable presence stanza to all of the user's remaining availableresources, one whose resource is "chamber"resources. US: <presence from='juliet@example.com/balcony' to='juliet@example.com/chamber' type='unavailable'/> Note: Any presence stanza with no 'type' attribute andanother whose resourceno 'to' attribute that is"balcony") o benvolio@example.org (subscription="to") o mercutio@example.org (subscription="from") First,sent after sending broadcasted unavailable presence MUST be broadcasted by theuser completesserver to all subscribers (i.e., MUST be treated as equivalent to "initial presence" for a new presence session). 4.5.3. Server Processing of Inbound Unavailable Presence Upon receiving unavailable presence from thepreconditions (stream establishment, TLS and SASL negotiation, and resource binding) described in [XMPP-CORE]; those packet flows are not reproduced here. Next,user, theuser requests his roster:contact's server MUST deliver the user's presence stanza to the full JIDs <contact@domain/resource> associated with all of the contact's available resources. Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page27]35] Internet-Draft XMPP IMAprilJuly 2007Example 1: Client requests current roster from server: <iq from='romeo@example.net/balcony' type='get' id='ex1'> <query xmlns='jabber:iq:roster'/> </iq> Example 2:CS: <presence from='juliet@example.com/balcony' to='romeo@example.net' type='unavailable'/> CS: <presence from='juliet@example.com/balcony' to='romeo@example.net' type='unavailable'/> 4.5.4. Client Processing of Inbound Unavailable Presence When the contact's client receivesrosterunavailable presence fromserver: <iq to='romeo@example.com/balcony' type='result' id='ex1'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net' name='Juliet' subscription='both'> <group>Friends</group> </item> <item jid='benvolio@example.org' name='Benvolio' subscription='to'/> <item jid='mercutio@example.org' name='Mercutio' subscription='from'/> </query> </iq> Nowthe usersends initial presence. Example 3: User sends initial presence: <presence from='romeo@example.net/orchard'/> Example 4: User's server sendsand the user is in the contact's roster, it SHOULD display the unavailable presenceprobesinformation in an appropriate roster interface. If the user is not in the contact's roster but the contact and the user are actively exchanging message or IQ stanzas, the contact's client SHOULD display the unavailable presence information in the user interface for that chat session. Otherwise, the client SHOULD ignore the unavailable presence information and not display it tocontactsthe contact. 4.6. Directed Presence This section supplements and in some respects modifies the rules defined above, but only for the special case of directed presence. 4.6.1. Client Generation As noted, directed presence is a presence stanza withsubscription="to"a 'to' attribute whose value is the bare JID or full JID of the other entity andsubscription="both" on behalfwith either no 'type' attribute or a 'type' attribute whose value is "unavailable". 4.6.2. Server Processing of Outbound Directed Presence When the user'savailable 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'/> Saint-Andre Expires October 19, 2007 [Page 28] Internet-Draft XMPP IM April 2007 Example 5: User'sserver receives the directed presence stanza, it SHOULD process it according to the following rules. 1. If the user sendsinitialdirected available or unavailable presence tocontactsa contact that is in the user's roster withsubscription="from" and subscription="both" on behalfa subscription type of "from" or "both" after having sent initial presence and before sending broadcasted unavailable presence, the user'savailable resource: <presence from='romeo@example.net/orchard' to='juliet@example.com'/> <presence from='romeo@example.net/orchard' to='mercutio@example.org'/> Example 6: Contacts' servers reply to presence probe on behalfserver MUST route or deliver the full XML ofall 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>that presence stanza but SHOULD NOT otherwise modify the contact's status regarding broadcasted presence (i.e., it SHOULD include the contact's JID in any subsequent presence broadcasts initiated by the user). Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page29]36] Internet-Draft XMPP IMAprilJuly 2007Example 7: Contacts' servers deliver user's initial presence to all available resources or return error to user: <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@example.org' to='romeo@example.net/orchard'> <error type='cancel'> <gone xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </presence> Example 8: User2. If the user sends directed presence toanother useran entity that is not inhis 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> Nowtheuser has a threaded conversation (chat session)user's roster withone of his contacts. Saint-Andre Expires October 19, 2007 [Page 30] Internet-Draft XMPP IM April 2007 Example 9: A threaded conversation <message to='romeo@example.net/orchard' from='juliet@example.com/balcony' type='chat' xml:lang='en'> <body>Art thou not Romeo, andaMontague?</body> <thread>e0ffe42b28561960c6b12b944a092794b9683a38</thread> </message> <message to='juliet@example.com/balcony' from='romeo@example.net/orchard' type='chat' xml:lang='en'> <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' xml:lang='en'> <body>How cam'st thou hither, tell me,subscription type of "from" or "both" after having sent initial presence andwherefore?</body> <thread>e0ffe42b28561960c6b12b944a092794b9683a38</thread> </message> And so on. The user can also send subsequentbefore sending broadcasted unavailable presence, the user's server MUST route or deliver the full XML of that presencebroadcast. Example 10: User sends updatedstanza to the entity but MUST NOT modify the contact's status regarding available presenceinformation for broadcasting: <presence xml:lang='en'> <show>away</show> <status>I shall return!</status> <priority>1</priority> </presence> Saint-Andre Expires October 19, 2007 [Page 31] Internet-Draft XMPP IM April 2007 Example 11: User's serverbroadcast (i.e., it MUST NOT include the entity's JID in any subsequent broadcastsupdatedof available presenceinformation only to one contact (not thoseinitiated by the user); however, if the available resource fromwhom an error was received or to whomwhich the user sent the directedpresence): <presence from='romeo@example.net/orchard' to='juliet@example.com' xml:lang='en'> <show>away</show> <status>I shall return!</status> <priority>1</priority> </presence> Example 12: Contact'spresence become unavailable, the user's serverdelivers updatedMUST route that unavailable presenceinformationtoall ofthecontact's available resources: [to "balcony" resource...] <presence from='romeo@example.net/orchard' to='juliet@example.com' xml:lang='en'> <show>away</show> <status>I shall return!</status> <priority>1</priority> </presence> [to "chamber" resource...] <presence from='romeo@example.net/orchard' to='juliet@example.com' xml:lang='en'> <show>away</show> <status>I shall return!</status> <priority>1</priority> </presence> Example 13: One ofentity (if thecontact's resources broadcasts final presence: <presence from='juliet@example.com/balcony' type='unavailable'/> Saint-Andre Expires October 19, 2007 [Page 32] Internet-Draft XMPP IM April 2007 Example 14: Contact's server sendsuser has not yet sent directed unavailable presenceinformationtouser: <presence type='unavailable' from='juliet@example.com/balcony' to='romeo@example.net/orchard'/> Example 15: Userthat entity). 3. If the user sendsunavailable presence: <presence from='romeo@example.net/orchard' type='unavailable' xml:lang='en'> <status>gone home</status> </presence> Example 16: User's server broadcastsdirected presence without first sending initial presence or after having sent unavailable presenceinformation to contact as well as tobroadcast (i.e., thepersonresource is connected but not available), the user's server MUST treat the entities towhomwhich the usersentsends directedpresence: <presence type='unavailable' from='romeo@example.net/orchard' to='juliet@example.com' xml:lang='en'> <status>gone home</status> </presence> <presence type='unavailable' from='romeo@example.net/orchard' to='nurse@example.com' xml:lang='en'> <status>gone home</status> </presence> Nowpresence in theuser closes his stream: </stream:stream> Andsame way that it treats theuser's server closes its stream as well: </stream:stream> THE END Saint-Andre Expires October 19, 2007 [Page 33] Internet-Draft XMPP IM April 2007 8. Server Rules for Handling XML Stanzas Basic routing and delivery rules for servers are definedentities listed in[XMPP-CORE]. This section defines additional rules for XMPP- compliant instant messaging and presence servers. 8.1.case #2 above. 4.6.3. Server Processing of InboundStanzas IfDirected Presence From thehostnameperspective of thedomain identifier portion ofcontact's server, there is no difference between broadcasted presence and directed presence, so theJID contained incontact's server follows the'to' attributeexisting rules for processing ofaninboundstanza matches a hostnamepresence. 4.6.4. Client Processing of Inbound Directed Presence When theserver itself andcontact's client receives presence from theJID contained inuser and the'to' attributeuser isof the form <user@example.com> or <user@example.com/resource>,in theserver MUST followcontact's roster, it SHOULD display therules definedpresence information inthe following list: 1.an appropriate roster interface. If theJIDuser isof the form <user@domain/resource> and an available resource exactly matches the full JID, the recipient's server MUST deliver the stanza to that resource. 2. Else ifnot in theJID is ofcontact's roster but theform <user@domain> or <user@domain/resource>contact and theassociateduseraccount does not exist,are actively exchanging message or IQ stanzas, therecipient's server (a)contact's client SHOULDsilently ignoredisplay thestanza (i.e., neither deliver it nor return an error) if it is apresencestanza, (b) MUST return a <service-unavailable/> stanza error to the sender if it isinformation in anIQ stanza, and (c)appropriate user interface. Otherwise, the client SHOULDreturn a <service-unavailable/> stanza error toignore thesender ifpresence information and not display itis a message stanza. 3. Else ifto theJID iscontact. 4.7. Presence Syntax 4.7.1. Values of theform <user@domain/resource> and no connected or available resource exactly matches the full JID, the recipient's server (a) SHOULD silently ignore the stanza (i.e., neither deliver it nor return an error) if it is a presence stanza, (b) MUST returnType Attribute The absence of a<service-unavailable/> stanza error to'type' attribute signals that thesender if itrelevant entity isan IQ stanza,available for communication (see Section 4.2 and(c) SHOULD treat the stanza as if it were addressed to <user@domain> if it isSection 4.4). A 'type' attribute with amessage stanza. 4. Else if the JID isvalue of "unavailable" signals that theform <user@domain> and thererelevant entity isat least one available resourcenot available forthe user, the recipient's server MUST follow these rules: 1. For message stanzas, the server SHOULD deliver thecommunication (see Section 4.5). Saint-Andre Expires January 18, 2008 [Page 37] Internet-Draft XMPP IM July 2007 The XMPP presence stanza is also used to negotiate and manage subscriptions to thehighest-priority available resource (if the resource did not providepresence of other entities. These tasks are completed via presence stanzas of type "subscribe", "unsubscribe", "subscribed", and "unsubscribed" as described under Section 3. If avalue for the <priority/> element, the server SHOULD consider it to have provideduser and contact are associated with different XMPP servers, those servers also use avaluespecial presence stanza ofzero). If two or more available resources have the same priority,type "probe" in order to determine theserver MAY use some other rule (e.g., most recent connect time, most recent activity time, or highestavailabilityas determined by some hierarchyof<show/> values) to choose between them or MAY deliverthemessage to all such resources. However,entity on theserver MUST NOT deliver the stanza to an available resource with a negative priority; if the only available resource has a negative priority, the server Saint-Andre Expires October 19, 2007 [Page 34] Internet-Draft XMPP IM April 2007peer server; for details, see Section 4.3. Clients SHOULDhandle the message as if there were no available resources (defined in the text that follows). In addition, the server MUSTNOTrewrite the 'to' attribute (i.e., it MUST leave it as <user@domain> rather than change it to <user@domain/resource>). 2. Forsend presence stanzasother than thoseof type"probe", the server MUST deliver the stanza to all available resources; for presence probes, the server SHOULD reply based on the rules defined in Presence Probes (Section 4.3). In addition, the server MUST NOT rewrite"probe". The values of the'to''type' attribute(i.e., it MUST leave itcan be summarized as<user@domain> rather than change it to <user@domain/resource>). 3. For IQ stanzas, the server itself MUST reply on behalffollows: o error -- An error has occurred regarding processing ofthe user with either an IQ result or an IQ error, and MUST NOT deliver the IQ stanza to the available resources. Specifically,a previously-sent presence stanza; if thesemanticspresence stanza is ofthe qualifying namespace definetype "error", it MUST include an <error/> child element (see see [XMPP-CORE]). o probe -- A request for an entity's current presence; SHOULD be generated only by areply that the server can provide, theserverMUST reply to the stanzaon behalf ofthe user; if not, the server MUST reply witha<service-unavailable/> stanza error. 5. Else ifuser. o subscribe -- The sender wishes to subscribe to theJID is ofrecipient's presence. o subscribed -- The sender has allowed theform <user@domain> and there arerecipient to receive their presence. o unsubscribe -- The sender is unsubscribing from another entity's presence. o unsubscribed -- The subscription request has been denied or a previously-granted subscription has been cancelled. o unavailable -- Signals that the entity is no longer availableresources associatedfor communication. 4.7.2. Child Elements In accordance with theuser, how the stanza shall be handled depends on the stanza type: 1. Fordefault namespace declaration, a presencestanzas of type "subscribe", "subscribed", "unsubscribe", and "unsubscribed",stanza is qualified by theserver MUST maintain a record'jabber:client' or 'jabber:server' namespace, which defines certain allowable children of presence stanzas, in particular thestanza<show/>, <status/>, anddeliver<priority/> elements. These child elements are used to provide more detailed information about an entity's availability. Typically these child elements are provided only if the presence stanzaat least once (i.e., whenpossesses no 'type' attribute, although exceptions are noted in theuser next createstext that follows. 4.7.2.1. Show The OPTIONAL <show/> element specifies the particular availability sub-state of anavailableentity or a specific resourceand requests the roster); in addition,thereof. A presence stanza MUST NOT contain more than one <show/> element. The <show/> element MUST NOT possess any attributes. The XML character data of theserver<show/> element is not human-readable. The data MUSTcontinue to deliver presence stanzasbe one oftype "subscribe" untilSaint-Andre Expires January 18, 2008 [Page 38] Internet-Draft XMPP IM July 2007 theuser either approves or deniesfollowing (additional availability types could be defined through a properly-namespaced child element of thesubscription request (see also Managing Presence Subscriptions (Section 3)). 2. For all otherpresencestanzas, 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, or forward the message to the user via some other means (e.g., to the user's email account). However, if offline message storagestanza): o away -- The entity ormessage forwardingresource isnot enabled, the server MUST return to the sender a <service- unavailable/> stanza error. (Note: Offline message storage and message forwarding are not defined in XMPP, since they are strictly 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 resulttemporarily away. o chat -- The entity oran 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 the user; if not, the server MUST reply Saint-Andre Expires October 19, 2007 [Page 35] Internet-Draft XMPP IM April 2007 with a <service-unavailable/> stanza error. 8.2. Outbound Stanzas If the hostname of the domain identifier portion of the address containedresource is actively interested inthe 'to' attribute of an outbound stanza matches a hostname of the server itself, the server MUST deliver the stanza to a localchatting. o dnd -- The entityaccording the rules for Inbound Stanzas (Section 8.1). If the hostname of the domain identifier portion of the address contained in the 'to' attribute of an outbound stanza does not match a hostname of the server itself, the server MUST attempt to route the stanza to the foreign domain. The recommended order of actions is as follows: 1. First attempt to resolve the foreign hostname using an [SRV] Service of "xmpp-server" and Proto of "tcp", resulting in resource records such as "_xmpp-server._tcp.example.com.", as specified in [XMPP-CORE]. 2. If the "xmpp-server" address record resolution fails, attempt to resolve the "_im"or"_pres" [SRV] Service as specified in [IMP-SRV], using the "_im" Service for <message/> stanzas and the "_pres" Service for <presence/> stanzas (itresource isup to the implementation how to handle <iq/> stanzas). This will result in one or more resolutions of the form "_im.<proto>.example.com." or "_pres.<proto>.example.com.", where "<proto>" would be a label registered in the Instant Messaging SRV Protocol Label registry or the Presence SRV Protocol Label registry: either "_xmpp" for an XMPP-aware domain or some other IANA-registered label (e.g., "_simple") for a non-XMPP-aware domain. 3. If both SRV address record resolutions fail, attempt to perform a normal IPv4/IPv6 address record resolution to determine the IP address using the "xmpp-server" port of 5269 registered with the IANA, as specified in [XMPP-CORE]. Administrators of server deployments are strongly encouraged to keep the _im._xmpp, _pres._xmpp, and _xmpp._tcp SRV records properly synchronized, since different implementations might perform the "_im" and "_pres" lookups before the "xmpp-server" lookup. 9. IM and Presence Compliance Requirements This section summarizes the specific aspects of the Extensible Messaging and Presence Protocol that MUST be supported by instant messaging and presence servers and clients in order to be considered compliant implementations. All such applications MUST comply with the requirements specified in [XMPP-CORE]. The text in this section Saint-Andre Expires October 19, 2007 [Page 36] Internet-Draft XMPP IM April 2007 specifies additional compliance requirements for instant messaging and presence servers and clients; note well that the requirements described here supplement but do not supersede the core requirements. Note also that a server or client MAY support only presence or instant messaging, and is not required to support both if only a presence service or an instant messaging service is desired. 9.1. Servers In addition to core server compliance requirements, an instant messaging and presence server MUST additionally support the following protocols: o All server-related instant messaging and presence syntax and semantics defined in this document, including presence broadcast on behalf of clients, presence subscriptions, roster storage and manipulation, and IM-specific routing and delivery rules 9.2. Clients In addition to core client compliance requirements, an instant messaging and presence client MUST additionally support the following 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 and roster managementbusy (dnd = "Do Not Disturb"). oEnd-to-end object encryption as defined in [XMPP-E2E] A client MUST also handle addresses that are encoded as "im:" URIs as specified in [CPIM], and MAY do so by removing the "im:" scheme and entrusting address resolution to the server as specified under Outbound Stanzas (Section 8.2). 10. Internationalization Considerations For internationalization considerations, refer to the relevant section of [XMPP-CORE]. 11. Security Considerations Core security considerations for XMPP are defined in the relevant Saint-Andre Expires October 19, 2007 [Page 37] Internet-Draft XMPP IM April 2007 section of [XMPP-CORE]. Additional considerations that apply only to instant messaging and presence applications of XMPP are defined in several places within this document; specifically: o When a server processes an inbound presence stanza of type "probe" whose intended recipient is a user associated with one of the server's hostnames, the server MUST NOT reveal the user's presence information if the sender is an entity that is not authorized to receive that information as determined by presence subscriptions (see Exchanging Presence Information (Section 4)). o When a server processes an outbound presence stanza with no type or of type "unavailable", it MUST follow the rules defined under Exchanging Presence Information (Section 4) in order to ensure that such presence information is not broadcasted to entities that are not authorized to know such information. o When a server generates an error stanza in response to receiving a stanza for a user who does not exist, the use of the <service- unavailable/> error condition helps protect against well-known dictionary attacks, since this is the same error condition that is returned if, for instance, the namespace of an IQ child element is not understood, or if offline message storage or message forwarding is not enabled for a domain. 12. IANA Considerations For a number of related IANA considerations, refer to the relevant section of [XMPP-CORE]. 12.1. Instant Messaging SRV Protocol Label Registration Address Resolution for Instant Messaging and Presence [IMP-SRV] defines an Instant Messaging SRV Protocol Label registry for protocols that can provide services that conform to the "_im" SRV Service label. Because XMPP is one such protocol, the IANA registers the "_xmpp" protocol label in the appropriate registry, as follows: Protocol label: _xmpp Specification: RFC 3921 Description: Instant messaging protocol label for the Extensible Messaging and Presence Protocol (XMPP) as defined by RFC 3921. Registrant Contact: IETF, XMPP Working Group, <xmppwg@jabber.org> Saint-Andre Expires October 19, 2007 [Page 38] Internet-Draft XMPP IM April 2007 12.2. Presence SRV Protocol Label Registration Address Resolution for Instant Messaging and Presence [IMP-SRV] defines a Presence SRV Protocol Label registry for protocols that can provide services that conform to the "_pres" SRV Service label. Because XMPP is one such protocol, the IANA registers the "_xmpp" protocol label in the appropriate registry, as follows: Protocol label: _xmpp Specification: RFC 3921 Description: Presence protocol label for the Extensible Messaging and Presence Protocol (XMPP) as defined by RFC 3921. Registrant Contact: IETF, XMPP Working Group, <xmppwg@jabber.org> 13. References 13.1. Normative References [CPIM] Peterson, J., "Common Profile for Instant Messaging (CPIM)", RFC 3860, August 2004. [IMP-REQS] Day, M., Aggarwal, S., and J. Vincent, "Instant Messaging / Presence Protocol Requirements", RFC 2779, February 2000. [IMP-SRV] Peterson, J., "Address Resolution for Instant Messaging and Presence", RFC 3861, August 2004. [SRV] Gulbrandsen, A., Vixie, P., and L. Esibov, "A DNS RR for specifying the location of services (DNS SRV)", RFC 2782, February 2000. [TERMS] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997. [UUID] Leach, P., Mealling, M., and R. Salz, "A Universally Unique IDentifier (UUID) URN Namespace", RFC 4122, July 2005. [XML] Bray, T., Paoli, J., Sperberg-McQueen, C., and E. Maler, "Extensible Markup Language (XML) 1.0 (2nd ed)", W3C REC- xml, October 2000, <http://www.w3.org/TR/REC-xml>. [XML-NAMES] Bray, T., Hollander, D., and A. Layman, "Namespaces in XML", W3C REC-xml-names, January 1999, Saint-Andre Expires October 19, 2007 [Page 39] Internet-Draft XMPP IM April 2007 <http://www.w3.org/TR/REC-xml-names>. [XMPP-CORE] Saint-Andre, P., "Extensible Messaging and Presence Protocol (XMPP): Core", draft-saintandre-rfc3920bis-02 (work in progress), April 2007. [XMPP-E2E] Saint-Andre, P., "End-to-End Signing and Object Encryption for the Extensible Messaging and Presence Protocol (XMPP)", RFC 3923, October 2004. 13.2. Informative References [IMP-MODEL] Day, M., Rosenberg, J., and H. Sugano, "A Modelxa -- The entity or resource is away forPresence and Instant Messaging", RFC 2778, February 2000. [IRC] Kalt, C., "Internet Relay Chat: Architecture", RFC 2810, April 2000. [XEP-0016] Millard, P. and P. Saint-Andre, "Privacy Lists", XSF XEP 0016, February 2007. [XEP-0045] Saint-Andre, P., "Multi-User Chat", XSF XEP 0045, April 2007. [XEP-0054] Saint-Andre, P., "vcard-temp", XSF XEP 0054, March 2003. [XEP-0191] Saint-Andre, P., "Simple Communications Blocking", XSF XEP 0191, February 2007. [VCARD] Dawson, F.an extended period (xa = "eXtended Away"). If no <show/> element is provided, the entity is assumed to be online andT. Howes, "vCard MIME Directory Profile", RFC 2426, September 1998. Appendix A. Integrationavailable. <presence> <show>dnd</show> </presence> 4.7.2.2. Status The OPTIONAL <status/> element contains XML character data specifying a natural-language description ofRoster Management and Presence Subscriptions This Appendix providesan entity's availability. It is normally used in conjunction with the show element to provide a detailed description ofhow roster management and presence subscriptions are integrated in XMPP-based instant messaging andan availability state (e.g., "In a meeting") when the presenceapplications, mainly forstanza has no 'type' attribute. <presence from='romeo@example.net/orchard' xml:lang='en'> <show>dnd</show> <status>Wooing Juliet</status> </presence> The <status/> element MUST NOT possess any attributes, with thebenefitexception ofserver developers (mostthe 'xml:lang' attribute. Multiple instances of the <status/> element MAY be included, but only if each instance possesses an 'xml:lang' attribute with a distinct language value (either explicitly or by inheritance from the 'xml:lang' value of an element farther up in the XML hierarchy, which may include the XML stream header as described in [XMPP-CORE]). <presence from='romeo@example.net/orchard' xml:lang='en'> <show>dnd</show> <status>Wooing Juliet</status> <status xml:lang='cs'>Dvořím se Julii</status> </presence> A presence stanza of type "unavailable" MAY also include a <status/> element to provide detailed information about why thecomplexity specified here can be safely ignored by client developers).entity is going offline. Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page40]39] Internet-Draft XMPP IMAprilJuly 2007A.1. Overview Some level of integration between roster items and presence subscriptions is normally expected by an instant messaging user regarding the user's subscriptions to and from other contacts. This section describes the level of integration that MUST<presence from='romeo@example.net/orchard' type='unavailable'> <status>Busy IRL</status> </presence> The <status/> child MAY also besupported within XMPP instant messaging applications. There are four primary subscription states: o None -- the user does not havesent in asubscription to the contact'ssubscription-related presenceinformation, and the contact does not have a subscriptionstanza (i.e., type "subscribe", "subscribed", "unsubscribe", or "unsubscribed") tothe user's presence information o To -- the user hasprovide asubscription to the contact's presence information, butdescription of thecontact does not have a subscriptionaction. The receiving client MAY present this <status/> tothe user's presence information o From -- the contact hasasubscription to the user's presence information, but thehuman userdoes not have a subscription(see Section 11). <presence from='romeo@example.net' to='nurse@example.com' type='subscribe'> <status>Hi, Juliet said I should add you to my buddy list.</status> </presence> 4.7.2.3. Priority The OPTIONAL <priority/> element contains non-human-readable XML character data that specifies thecontact'spriority level of the resource. The value MUST be an integer between -128 and +127. A presenceinformation o Both -- bothstanza MUST NOT contain more than one <priority/> element. The <priority/> element MUST NOT possess any attributes. <presence xml:lang='en'> <show>dnd</show> <status>Wooing Juliet</status> <status xml:lang='cs'>Dvořím se Julii</status> <priority>1</priority> </presence> If no priority is provided, theuser andprocessing server or client SHOULD consider thecontact have subscriptionspriority toeach other's presencebe zero. For information(i.e., the union of 'from' and 'to') Each of these states is reflected in the roster of both the user andregarding thecontact, thus resulting in durable subscription states. Narrative explanationssemantics ofhow these subscription states interact with roster items in order to complete certain defined use cases are providedpriority values inthe following sub-sections. Full details regarding serverstanza processing within instant messaging andclient handling of all subscription states (including pending states between the primary states listed above) is provided in Subscription States (Appendix B). The server MUST NOT sendpresencesubscription requests or roster pushesapplications, refer tounavailable resources, norServer Rules for Processing XML Stanzas (Section 8). 4.7.2.4. Extended Content As described in [XMPP-CORE], an XML stanza MAY contain any properly- namespaced child element; this applies toavailable resources that have not requestedtheroster. The 'from' and 'to' addresses are OPTIONALpresence stanza as well. Saint-Andre Expires January 18, 2008 [Page 40] Internet-Draft XMPP IM July 2007 <presence from='romeo@example.net'> <c xmlns='http://jabber.org/protocol/caps' node='http://psi-im.org/caps' ver='0.11'/> </presence> Any extended content included inroster pushes; if included, their valuesa presence stanza SHOULDbe the full JIDrepresent aspects ofthe resourcean entity's availability forthat session. Acommunication or provide information about communication-related capabilities. 5. Exchanging Messages Once a clientMUST acknowledge each roster pushhas authenticated with a server and bound a resource to anIQ stanza of type "result" (for the sake of brevity, these stanzas are not shown in the following examples but are required by the IQ semantics definedXML stream as described in[XMPP-CORE]). A.2. User Subscribes[XMPP-CORE], an XMPP server will route XML stanzas toContact The process by whichand from that client. One type of stanza that may be exchanged is <message/>. Exchanging messages is a basic use of XMPP and is brought about when a usersubscribes togenerates acontact, includingmessage stanza that is addressed to another entity. As defined under Server Rules for Processing XML Stanzas (Section 8), theinteraction between roster items and subscription states,sender's server isas follows. Saint-Andre Expires October 19, 2007 [Page 41] Internet-Draft XMPP IM April 2007 1. In preparationresponsible forbeing abledelivering the message torenderthecontact inintended recipient (if theuser's client interface andrecipient is on the same server) or for routing theservermessage tokeep track ofthesubscription,recipient's server (if theuser'srecipient is on a different server). Thus a message stanza is used to "push" information to another entity. 5.1. Attributes 5.1.1. To Attribute An instant messaging client SHOULDperform a "roster set" for the new roster item. This request consists of sendingspecify anIQ stanza of type='set' containingintended recipient for a<query/> element qualifiedmessage by providing the'jabber:iq:roster' namespace, which in turn containsJID of an<item/> element that definesentity other than thenew roster item;sender in 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='set1'> <query xmlns='jabber:iq:roster'> <item jid='contact@example.org' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> 2. As a result,'to' attribute of theuser's server (1) MUST initiate a roster push for<message/> stanza. If thenew roster item to all available resources associated with this user that have requestedmessage is being sent outside theroster, settingcontext of any existing chat session or received message, the'subscription' attribute to avalue of"none"; and (2) MUST reply tothesending resource with an IQ result indicating'to' address SHOULD be of thesuccessform <user@domain> rather than of theroster set: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@example.org' subscription='none' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> <iq type='result' id='set1'/> 3.form <user@domain/resource>. <message from='juliet@example.com/balcony' to='romeo@example.net' type='chat' xml:lang='en'> <body>Art thou not Romeo, and a Montague?</body> </message> If theuser wants to request a subscriptionmessage is being sent in reply tothe contact's presence information, the user's client MUST sendapresence stanza of type='subscribe' to the contact: <presence to='contact@example.org' type='subscribe'/>message previously Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page42]41] Internet-Draft XMPP IMAprilJuly 20074. As a result, the user's server MUST initiate a second roster push to allreceived from an address of theuser's interested resources, settingform <user@domain/resource> (e.g., within thecontact tocontext of a chat session), thepending sub-statevalue of the'none' subscription state; this pending sub-state is denoted by'to' address SHOULD be of theinclusionform <user@domain/resource> rather than of theask='subscribe' attribute inform <user@domain> unless theroster item: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@example.org' subscription='none' ask='subscribe' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> Note: Ifsender has knowledge (via presence) that theuser did not create a roster item before sendingintended recipient's resource is no longer available. <message from='romeo@example.net/orchard' to='juliet@example.com/balcony' type='chat' xml:lang='en'> <body>Neither, fair saint, if either thee dislike.</body> </message> 5.1.2. Type Attribute Common uses of thesubscription request,message stanza in instant messaging applications include single messages, messages sent in theserver MUST now create one on behalfcontext ofthe user, then sendaroster push to allchat conversation, messages sent in the context of a multi-user chat room, headlines and other alerts, and errors. These uses are differentiated via theuser's interested resources, absent'type' attribute. Inclusion of the'name''type' attributeandis RECOMMENDED. If included, the<group/> child shown above. 5. The user's server'type' attribute MUSTalso stamp the presence stanzahave one oftype "subscribe" with the user's bare JID (i.e., <user@example.com>) asthe'from' address (iffollowing values: o chat -- The message is sent in theuser providedcontext of a'from' address set to the user's full JID, the serverone-to-one chat conversation. A receiving client SHOULDremovepresent theresource identifier). Ifmessage in an interface enabling one-to-one chat between thecontacttwo parties, including an appropriate conversation history. o error -- The message isservedgenerated by by an entity that experiences an error in processing adifferent host thanmessage received from another entity (for details regarding stanza error syntax, see [XMPP-CORE]). A client that receives a message of type "error" SHOULD present an appropriate interface informing theuser,sender of theuser's server MUST routenature of thepresence stanza toerror. o groupchat -- The message is sent in thecontact's server for deliverycontext of a multi-user chat environment (similar to that of [IRC]). A receiving client SHOULD present thecontact (this case is assumed throughout; however, ifmessage in an interface enabling many-to-many chat between thecontactparties, including a roster of parties in the chatroom and an appropriate conversation history. Full definition of XMPP-based groupchat protocols is out of scope for this document (for details, see [XEP-0045]). o headline -- The message isservedprobably generated by an automated service that delivers or broadcasts content (news, sports, market information, syndicated content, alerts, etc.) or thesame host, then the server can simply deliver the presence stanza directly): <presence from='user@example.com' to='contact@example.org' type='subscribe'/> Note: If the user's server receives a presence stanza of type "error" fromsender wishes thecontact's server,message to be delivered as if itMUST deliver the error stanzawere. No reply to theuser, whosemessage is expected, and a receiving clientMAY determine thatSHOULD present theerror ismessage inresponse to the outgoing presence stanza of type "subscribe" it sent previously (e.g., by trackingan'id' attribute) and then choose to resendinterface that appropriately differentiates the"subscribe" requestmessage from standalone messages, chat sessions, orrevert the roster to its previous state by sending a presence stanza of type "unsubscribe" to the contact.groupchat Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page43]42] Internet-Draft XMPP IMAprilJuly 20076. Upon receiving the presence stanza of type "subscribe" addressed to the contact, the contact's server MUST determine if there is at least one available resource from which the contact 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 offline for delivery when this condition is next met; normally this is donesessions (e.g., byadding a roster item for the contact tonot providing theuser's roster,recipient witha state of "None + Pending In" as defined under Subscription States (Appendix B), however athe ability to reply). The receiving server SHOULDNOT push ordeliverroster items in that state to the contact). No matter when the subscription request is delivered, the contact must decide whether or not to approve it (subject to the contact's configured preferences, the contact's client MAY approve or refusethesubscription request without presenting itmessage to all of thecontact). Here we assume the "happy path"recipient's available resources. o normal -- The message is a single message that is sent outside thecontact approves the subscription request (the alternate flowcontext ofdeclining the subscription requesta one-to-one conversation or groupchat, and to which it isdefined in Appendix A.2.1). In this case,expected that thecontact'srecipient will reply. A receiving client(1)SHOULDperform a roster set specifyingpresent thedesired handle and group formessage in an interface enabling theuser (if any); and (2) MUST send a presence stanza of type "subscribed"recipient to reply, but without a conversation history. This is theuser in order to approvedefault value of thesubscription request. <iq type='set' id='set2'> <query xmlns='jabber:iq:roster'> <item jid='user@example.com' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence to='user@example.com' type='subscribed'/> 7. As a result,'type' attribute. An IM application SHOULD support all of thecontact's server (1) MUST initiateforegoing message types. If an application receives aroster push to all available resources associatedmessage with no 'type' attribute or thecontact that have requested the roster, containing a roster item forapplication does not understand theuser withvalue of thesubscription state set to 'from' (the server'type' attribute provided, it MUSTsend this even ifconsider thecontact did not perform a roster set); (2) MUST return an IQ resultmessage to be of type "normal" (i.e., "normal" is thesending resource indicatingdefault). Although thesuccess of'type' attribute is OPTIONAL, it is considered polite to mirror theroster set; (3) MUST routetype in any replies to a message; furthermore, some specialized applications (e.g., a multi-user chat service) MAY at their discretion enforce thepresenceuse of a particular message type (e.g., type='groupchat'). 5.2. Child Elements An XMPP message stanza MAY contain any allowable child elements qualified by the 'jabber:client' (or 'jabber:server') namespace, as well as any other properly-namespaced child element that consists oftype "subscribed" toextended content. The defined payloads are described in theuser, first stampingfollowing sections and extended content payloads are described in the'from' address asappropriate XMPP extension specifications (not herein). 5.2.1. Body The <body/> element contains human-readable XML character data that specifies thebare JID (<contact@example.org>)textual contents of thecontact; and (4)message; this child element is normally included but is OPTIONAL. <message to='romeo@example.net' from='juliet@example.com/balcony' type='chat' xml:lang='en'> <body>Wherefore art thou, Romeo?</body> </message> The <body/> element MUSTsend available presence from allNOT possess any attributes, with the exception of thecontact's available resources to'xml:lang' attribute. Multiple instances of theuser:<body/> element MAY be included in a message stanza, but only if each Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page44]43] Internet-Draft XMPP IMAprilJuly 2007<iq type='set' to='contact@example.org/resource'> <query xmlns='jabber:iq:roster'> <item jid='user@example.com' subscription='from' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <iq type='result' to='contact@example.org/resource' id='set2'/> <presence from='contact@example.org' to='user@example.com' type='subscribed'/> <presence from='contact@example.org/resource' to='user@example.com'/> Note: If the contact's server receivesinstance possesses an 'xml:lang' attribute with apresence stanza of type "error"distinct language value (either explicitly or by inheritance from theuser's server, it MUST deliver the error stanza to the contact, whose client MAY determine that the error is in response to the outgoing presence stanza'xml:lang' value oftype "subscribed" it sent previously (e.g., by trackingan'id' attribute) and then choose to resendelement farther up in the"subscribed" notification or revertXML hierarchy, which may include theroster to its previous state by sending a presence stanzaXML stream header as described in [XMPP-CORE]). <message to='romeo@example.net' from='juliet@example.com/balcony' type='chat' xml:lang='en'> <body>Wherefore art thou, Romeo?</body> <body xml:lang='cs'>PročeŽ jsi ty, Romeo?</body> </message> The <body/> element MUST NOT contain mixed content (as defined in Section 3.2.2 of [XML]). 5.2.2. Subject The <subject/> element contains human-readable XML character data that specifies the topic oftype "unsubscribed" totheuser. 8. Upon receivingmessage. <message to='romeo@example.net' from='juliet@example.com/balcony' type='chat' xml:lang='en'> <subject>I implore you!</subject> <body>Wherefore art thou, Romeo?</body> </message> The <subject/> element MUST NOT possess any attributes, with thepresence stanzaexception oftype "subscribed" addressed to the user,theuser's server MUST first verify that'xml:lang' attribute. Multiple instances of thecontact is in<subject/> element MAY be included for theuser's roster with eitherpurpose of providing alternate versions of thefollowing states: (a) subscription='none' and ask='subscribe'same subject, but only if each instance possesses an 'xml:lang' attribute with a distinct language value (either explicitly or(b) subscription='from' and ask='subscribe'. Ifby inheritance from thecontact is not'xml:lang' value of an element farther up in theuser's roster with either of those states,XML hierarchy, which may include theuser's serverXML stream header as described in [XMPP-CORE]). Saint-Andre Expires January 18, 2008 [Page 44] Internet-Draft XMPP IM July 2007 <message to='romeo@example.net' from='juliet@example.com/balcony' type='chat' xml:lang='en'> <subject>I implore you!</subject> <subject xml:lang='cs'> Úpěnlivě prosím! </subject> <body>Wherefore art thou, Romeo?</body> <body xml:lang='cs'>Pročež jsi ty, Romeo?</body> </message> The <subject/> element MUSTsilently ignoreNOT contain mixed content (as defined in Section 3.2.2 of [XML]). 5.2.3. Thread The primary use of thepresence stanzaXMPP <thread/> element is to uniquely identify a conversation thread or "chat session" between two entities instantiated by <message/> stanzas of type"subscribed" (i.e., it MUST NOT route it to the user, modify'chat'. However, theuser's roster, or generate a roster pushXMPP <thread/> element may also be used tothe user's available resources). If the contact isuniquely identify an analogous thread between two entities instantiated by <message/> stanzas of type 'headline' or 'normal', or among multiple entities in theuser's roster with eithercontext ofthose states, the user's server (1) MUST deliver the presence stanzaa multi-user chat room instantiated by <message/> stanzas of type"subscribed" from the contact'groupchat'. It may also be used for <message/> stanzas not related to a conversation, such as a game session or between plugins. The value of theuser; (2)<thread/> element MUSTinitiatebe aroster push to alluniversally unique identifier (UUID) as described in [UUID]. The use of theuser's interested resources, containing an updated roster item for the contact with the 'subscription' attribute set<thread/> element is OPTIONAL. The <thread/> element is not used toaidentify individual messages, only conversations. A message stanza MUST NOT contain more than one <thread/> element. The <thread/> element MUST NOT possess any attributes. The value of"to"; and (3) MUST delivertheavailable presence stanza received<thread/> element MUST be treated as opaque by entities; no semantic meaning may be derived fromeachit, and only exact comparisons may be made against it. The <thread/> element MUST NOT contain mixed content (as defined in Section 3.2.2 ofthe contact's available resources[XML]). 5.3. Extended Content As described in [XMPP-CORE], an XML stanza MAY contain any properly- namespaced child element; this applies toeach oftheuser's available resources:message stanza as well. Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page 45] Internet-Draft XMPP IMAprilJuly 2007<presence to='user@example.com' from='contact@example.org' type='subscribed'/> <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@example.org' subscription='to' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> <presence from='contact@example.org/resource' to='user@example.com/resource'/> From the perspective of the user, there now exists a subscription to the contact's presence information; from the perspective of the contact, there now exists<message to='romeo@example.net' from='juliet@example.com/balcony' type='chat' xml:lang='en'> <body>Wherefore art thou, Romeo?</body> <html xmlns='http://jabber.org/protocol/xhtml-im'> <body xmlns='http://www.w3.org/1999/xhtml'> Wherefore <span style='font-style: italic'>art</span> thou, <span style='color:red'>Romeo</span>? </body> </html> </message> 6. Exchanging IQ Stanzas As described in [XMPP-CORE], IQ stanzas provide asubscription from the user. A.2.1. Alternate Flow: Contact Declines Subscription Request The above activity flow represents the "happy path" regarding the user's subscription request to the contact.structured request- response mechanism. Themain alternate flow occurs if the contact refusesbasic semantics of that mechanism (e.g., that theuser's subscription request, as follows: 1. If'id' attribute is required) are defined in [XMPP-CORE], whereas thecontact wantsspecific semantics required torefusecomplete particular use cases are defined in all cases by therequest,extended namespace that qualifies thecontact's client MUST send a presencedirect child element of an IQ stanza of type"unsubscribed" to the user (instead"get" or "set". The 'jabber:client' and 'jabber:server' namespaces do not define any children of IQ stanzas other than thepresence<error/> common to all stanzaof type "subscribed" senttypes. This document defines one such extended namespace, for Managing the Roster (Section 2). However, an IQ stanza MAY contain structured information qualified by any extended namespace. 7. A Sample Session The examples inStep 6 of Appendix A.2): <presence to='user@example.com' type='unsubscribed'/> 2. Asthis section illustrate aresult, the contact's server MUST route thepossible instant messaging and presencestanza of type "unsubscribed" to the user, first stamping the 'from' address as the bare JID (<contact@example.org>) of the contact: <presence from='contact@example.org' to='user@example.com' type='unsubscribed'/> Note: Ifsession. The user is romeo@example.net, he has an available resource whose resource identifier is "orchard", and he has thecontact's server previously addedfollowing individuals in his roster: o juliet@example.com (subscription="both" and she has two available resources, one whose resource identifier is "chamber" and another whose resource identifier is "balcony") o benvolio@example.org (subscription="to") o mercutio@example.org (subscription="from") First, the usertocompletes the preconditions (stream establishment, TLS and SASL negotiation, and resource binding) described in [XMPP-CORE]; those packet flows are not reproduced here. Next, the user requests his roster: Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page 46] Internet-Draft XMPP IMAprilJuly 2007contact's roster for tracking purposes, it MUST remove the relevant item at this time. 3. Upon receiving the presence 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 aExample 1: User requests current rosterpush to all of the user's interested resources, containing an updatedfrom server: UC: <iq from='romeo@example.net/balcony' type='get' id='ex1'> <query xmlns='jabber:iq:roster'/> </iq> Example 2: User receives rosteritem for the contact with the 'subscription' attribute set to a value of "none" and with no 'ask' attribute: <presence from='contact@example.org' to='user@example.com' type='unsubscribed'/>from server: US: <iqtype='set'>to='romeo@example.net/balcony' type='result' id='ex1'> <query xmlns='jabber:iq:roster'> <itemjid='contact@example.org' subscription='none' name='MyContact'> <group>MyBuddies</group>jid='romeo@example.com' name='Juliet' subscription='both'> <group>Friends</group> </item> <item jid='benvolio@example.org' name='Benvolio' subscription='to'/> <item jid='mercutio@example.org' name='Mercutio' subscription='from'/> </query> </iq>As a result of this activity, the contact is now in the user's roster with a subscription state of "none", whereasNow the useris not in the contact's roster at all. A.3. Creatingbegins aMutual Subscription The userpresence session. Example 3: User sends initial presence: UC: <presence from='romeo@example.net/orchard'/> Example 4: User's server sends presence probes to contacts with subscription="to" andcontact can buildsubscription="both" onthe "happy path" described above to create a mutual subscription (i.e., a subscriptionbehalf oftype "both"). The process is as follows: 1. If the contact wants to create a mutual subscription,thecontact MUST send a subscription requestuser's available resource: US: <presence type='probe' from='romeo@example.net/orchard' to='juliet@example.com'/> US: <presence type='probe' from='romeo@example.net/orchard' to='benvolio@example.org'/> Saint-Andre Expires January 18, 2008 [Page 47] Internet-Draft XMPP IM July 2007 Example 5: User's server sends initial presence to contacts with subscription="from" and subscription="both" on behalf of theuser (subjectuser's available resource: US: <presence from='romeo@example.net/orchard' to='juliet@example.com'/> US: <presence from='romeo@example.net/orchard' to='mercutio@example.org'/> Example 6: Contacts' servers reply tothe contact's configured preferences, the contact's client MAY send this automatically):presence probe on behalf of all available resources: CS: <presenceto='user@example.com' type='subscribe'/> 2. As a result, the contact's server (1) MUST initiate a roster pushfrom='juliet@example.com/balcony' to='romeo@example.net/orchard' xml:lang='en'> <show>away</show> <status>be right back</status> <priority>0</priority> </presence> CS: <presence from='juliet@example.com/chamber' to='romeo@example.net/orchard'> <priority>1</priority> </presence> CS: <presence from='benvolio@example.org/pda' to='romeo@example.net/orchard' xml:lang='en'> <show>dnd</show> <status>gallivanting</status> </presence> Saint-Andre Expires January 18, 2008 [Page 48] Internet-Draft XMPP IM July 2007 Example 7: Contacts' servers deliver user's initial presence to all available resourcesassociated with the contact that have requested the roster, with theor return unsubscribed to user: CS: <presence from='romeo@example.net/orchard' to='juliet@example.com'/> CS: <presence from='romeo@example.net/orchard' to='juliet@example.com'/> CS: <presence from='mercutio@example.org' to='romeo@example.net' type='unsubscribed'/> Example 8: User sends directed presence to another userstillnot in his roster: UC: <presence from='romeo@example.net/orchard' to='nurse@example.com' xml:lang='en'> <show>dnd</show> <status>courting Juliet</status> <priority>0</priority> </presence> Now the'from' subscription state but withuser has apending 'to' subscription denoted by the inclusionthreaded conversation (chat session) with one ofthe ask='subscribe' attribute in the roster item;his contacts. Saint-Andre Expires January 18, 2008 [Page 49] Internet-Draft XMPP IM July 2007 Example 9: A threaded conversation CC: <message from='juliet@example.com/balcony' to='romeo@example.net' type='chat' xml:lang='en'> <body>Art thou not Romeo, and(2) MUST route thea Montague?</body> <thread>e0ffe42b28561960c6b12b944a092794b9683a38</thread> </message> UC: <message from='romeo@example.net/orchard' to='juliet@example.com/balcony' type='chat' xml:lang='en'> <body>Neither, fair saint, if either thee dislike.</body> <thread>e0ffe42b28561960c6b12b944a092794b9683a38</thread> </message> CC: <message from='juliet@example.com/balcony' to='romeo@example.net/orchard' type='chat' xml:lang='en'> <body>How cam'st thou hither, tell me, and wherefore?</body> <thread>e0ffe42b28561960c6b12b944a092794b9683a38</thread> </message> And so on. The user can also send subsequent broadcasted presence. Example 10: User sends updated available presencestanza of type "subscribe"information for broadcasting: UC: <presence xml:lang='en'> <show>away</show> <status>I shall return!</status> <priority>1</priority> </presence> Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page47]50] Internet-Draft XMPP IMAprilJuly 2007 Example 11: User's server broadcasts updated presence information only tothe user, first stamping the 'from' address as the bare JID (<contact@example.org>) of theone contact:<iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@example.com' subscription='from' ask='subscribe' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq>US: <presencefrom='contact@example.org' to='user@example.com' type='subscribe'/> Note: If the contact'sfrom='romeo@example.net/orchard' to='juliet@example.com' xml:lang='en'> <show>away</show> <status>I shall return!</status> <priority>1</priority> </presence> Example 12: Contact's serverreceives a presence stanza of type "error" from the user's server, it MUST deliver the error stanza to the contact, whose client MAY determine that the error is in response to the outgoing presence stanza of type "subscribe" it sent previously (e.g., by tracking an 'id' attribute) and then choose to resend the "subscribe" request or revert the roster to its previous state by sending adelivers updated presencestanza of type "unsubscribe"information tothe user. 3. Upon receiving the presence stanzaall oftype "subscribe" addressed to the user,theuser's server must determine if there is at least onecontact's availableresource for which the user 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 the user's 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 flowresources ("balcony" and "chamber"): CS: <presence from='romeo@example.net/orchard' to='juliet@example.com' xml:lang='en'> <show>away</show> <status>I shall return!</status> <priority>1</priority> </presence> CS: <presence from='romeo@example.net/orchard' to='juliet@example.com' xml:lang='en'> <show>away</show> <status>I shall return!</status> <priority>1</priority> </presence> Example 13: One ofdeclining the subscription request is defined in Appendix A.3.1). In this case,theuser's client MUST send acontact's resources broadcasts final presence: CC: <presence from='juliet@example.com/chamber' type='unavailable'/> Example 14: Contact's server sends unavailable presencestanza of type "subscribed" to the contact in orderinformation toapprove the subscription request.user: CS: <presenceto='contact@example.org' type='subscribed'/>type='unavailable' from='juliet@example.com/chamber' to='romeo@example.net'/> Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page48]51] Internet-Draft XMPP IMAprilJuly 20074. As a result, the user'sExample 15: User sends unavailable presence: UC: <presence from='romeo@example.net/orchard' type='unavailable' xml:lang='en'> <status>gone home</status> </presence> Example 16: User's server(1) MUST initiate a roster pushbroadcasts unavailable presence information toall of the user's interested resources, containing a roster item for thecontactwith the 'subscription' attribute setas well as toa value of "both"; (2) MUST routethepresence stanza of type "subscribed"person to whom thecontact, first stamping the 'from' address as the bare JID (<user@example.com>) of the user; and (3) MUST send touser sent directed presence: US: <presence type='unavailable' from='romeo@example.net/orchard' to='juliet@example.com' xml:lang='en'> <status>gone home</status> </presence> US: <presence type='unavailable' from='romeo@example.net/orchard' to='nurse@example.com' xml:lang='en'> <status>gone home</status> </presence> Now thecontactuser closes his stream: UC: </stream:stream> And thefulluser's server closes its stream as well: US: </stream:stream> THE END 8. Server Rules for Processing XMLof the lastStanzas Basic routing and delivery rules for servers are defined in [XMPP-CORE]. This section defines supplementary rules for XMPP instant messaging and presencestanza with no 'to' attribute received byservers; in theserver from eachabsence of a supplementary rule defined below (e.g., for stanzas without a 'to' address), theuser's available resources: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@example.org' subscription='both' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> <presence from='user@example.com' to='contact@example.org' type='subscribed'/> <presence from='user@example.com/resource' to='contact@example.org'/> Note:rule defined in [XMPP-CORE] shall apply. Saint-Andre Expires January 18, 2008 [Page 52] Internet-Draft XMPP IM July 2007 8.1. No Such User If theuser's server receives a presence stanza of type "error" from the contact's server, it MUST deliveruser account does not exist, how theerrorstanzatoshall be processed depends on theuser, whose client MAY determine thatstanza type. o For a message stanza, the server SHOULD return a <service- unavailable/> stanza erroris in responseto theoutgoingsender. o For a presence stanza with no 'type' attribute or a 'type' attribute oftype "subscribed" it sent previously (e.g., by tracking an 'id' attribute) and then choose to resend"unavailable", thesubscription request or revertserver SHOULD silently ignore theroster to its previous state by sendingstanza (i.e., not return an error or a presence stanza of type"unsubscribed" to the contact. 5. Upon receiving the"unsubscribed". o For a presence stanza with of type"subscribed" addressed to the contact,"subscribe", "subscribed", "unsubscribe", or "unsubscribed", thecontact'sserver MUSTfirst verify that the user is in the contact's roster with either of the following states: (a) subscription='none' and ask='subscribe' or (b) subscription='from' and ask='subscribe'. If the user is not infollow thecontact's roster with either of those states,guidelines provided under Section 3. o For an IQ stanza, thecontact'sserver MUSTsilently ignore the presencereturn a <service-unavailable/> stanzaof type "subscribed" (i.e., it MUST NOT route iterror to thecontact, modifysender. 8.2. Full JID at Local Domain If thecontact's roster, or generate a roster push tohostname of thecontact's available resources). Ifdomain identifier portion of theuser isJID contained in thecontact's roster Saint-Andre Expires October 19, 2007 [Page 49] Internet-Draft XMPP IM April 2007 with either'to' attribute of an inbound stanza matches one of the configured hostnames ofthose states,thecontact'sserver(1) MUST deliveritself and the JID contained in thepresence stanza'to' attribute is oftype "subscribed" fromtheuser toform <user@domain/resource>, thecontact; (2)server MUSTinitiate a roster pushadhere toall available resources associated with the contact that have requestedtheroster, containingfollowing rules. 8.2.1. Available Resource Matches If anupdated roster item foravailable resource exactly matches theuser withfull JID, the'subscription' attribute set to a value of "both"; and (3)recipient's server MUST deliver theavailable presencestanzareceived from each of the user's available resourcestoeach of the contact'sthat resource. 8.2.2. No Available Resource Matches If no connected or availableresources: <presence from='user@example.com' to='contact@example.org' type='subscribed'/> <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@example.com' subscription='both' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence from='user@example.com/resource' to='contact@example.org/resource'/> The user andresource exactly matches thecontact now have a mutual subscription to each other's presence -- i.e.,full JID, how thesubscription is of type "both". A.3.1. Alternate Flow: User Declines Subscription Request The above activity flow representsstanza shall be processed depends on the"happy path" regardingstanza type. o For a message, thecontact's subscription request toserver SHOULD treat theuser. The main alternate flow occursstanza as ifthe user refuses the contact's subscription request,it were addressed to <user@domain> asfollows: 1. Ifdescribed in theuser wants to refusenext section. o For a presence stanza, therequest,server SHOULD silently ignore theuser's client MUST sendstanza (i.e., neither deliver it nor return an error or a presence stanza of type"unsubscribed""unsubscribe" or "unsubscribed"). o For an IQ stanza, the server MUST return a <service-unavailable/> stanza error to thecontact (insteadsender. 8.3. Bare JID at Local Domain If the hostname of thepresence stanzadomain identifier portion oftype "subscribed" sentthe JID contained inStep 3the 'to' attribute ofAppendix A.3): <presence to='contact@example.org' type='unsubscribed'/>an inbound stanza matches one of the configured hostnames of the server itself and the JID contained in Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page50]53] Internet-Draft XMPP IMAprilJuly 20072. As a result, the user's server MUST routethepresence stanza'to' attribute is oftype "unsubscribed" tothecontact, first stampingform <user@domain>, the'from' address asserver MUST adhere to thebare JID (<user@example.com>) offollowing rules. 8.3.1. Available Resources If there is at least one available resource, how theuser: <presence from='user@example.com' to='contact@example.org' type='unsubscribed'/> 3. Upon receivingstanza shall be processed depends on thepresencestanza type. 8.3.1.1. Message For a message stanza of type"unsubscribed" addressed to"headline", thecontact, the contact'sserver(1) MUSTSHOULD deliverthat presence stanza tothecontact; and (2) MUST initiate a roster pushstanza to all availableresources 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 "from" and with no 'ask' attribute: <presence from='user@example.com' to='contact@example.org' type='unsubscribed'/> <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@example.com' subscription='from' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> Asresources. For aresultmessage stanza ofthis activity, there has been no change intype "chat", "error", "groupchat", or "normal", thesubscription state; i.e.,server SHOULD deliver thecontact is instanza to theuser's roster with a subscription state of "to" andhighest- priority available resource. If two or more available resources have theuser is insame priority, thecontact's roster with a subscription stateserver MAY use some other rule (e.g., most recent connect time, most recent activity time, or highest availability as determined by some hierarchy of"from". A.4. Unsubscribing At any time after subscribing<show/> values) toa contact's presence information, a userchoose between them or MAYunsubscribe. While the XML thatdeliver theuser sendsmessage tomake this happen is the same inallinstances, the subsequent subscription state is different depending on the subscription state obtaining when the unsubscribe "command" is sent. Both possible scenarios are described insuch resources. However, for any message type thetext that follows. Saint-Andre Expires October 19, 2007 [Page 51] Internet-Draft XMPP IM April 2007 A.4.1. Case #1: Unsubscribing When Subscription is Not Mutual Inserver MUST NOT deliver thefirst case,stanza to any available resource with a negative priority; if theuseronly available resource has asubscription to the contact's presence information butnegative priority, thecontact does not have a subscription toserver SHOULD handle theuser's presence information (i.e.,message as if there were no available resources as described under Section 8.3.2. In all cases, thesubscription is not yet mutual). 1. Ifserver MUST NOT rewrite theuser wants'to' attribute (i.e., it MUST leave it as <user@domain> rather than change it tounsubscribe from the contact's<user@domain/resource>). 8.3.1.2. Presence For a presenceinformation,stanza of type "probe", theuserserver MUSTsendhandle it directly as described under Section 4.3. For a presence stanza with no type or of type"unsubscribe" to"unavailable", thecontact: <presence to='contact@example.org' type='unsubscribe'/> 2. Asserver MUST deliver the stanza to all available resources. For aresult,presence stanza of type "subscribe", "subscribed", "unsubscribe", or "unsubscribed", theuser'sserver(1)MUSTsend a roster pushadhere to the rules defined under Section 3 and summarized under Appendix A. In allofcases, theuser's interested resources, containingserver MUST NOT rewrite the 'to' attribute (i.e., it MUST leave it as <user@domain> rather than change it to <user@domain/resource>). Saint-Andre Expires January 18, 2008 [Page 54] Internet-Draft XMPP IM July 2007 8.3.1.3. IQ For anupdated roster item forIQ stanza, thecontactserver itself MUST reply on behalf of the user with either an IQ result or an IQ error, and MUST NOT deliver the'subscription' attribute setIQ stanza toa valueany of the user's available resources. Specifically, if the semantics of"none"; and (2) MUST routethepresence stanzaqualifying namespace define a reply that the server can provide on behalf oftype "unsubscribe" tothecontact, first stampinguser, the'from' address asserver MUST reply to thebare JID (<user@example.com>)stanza on behalf of theuser: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@example.org' subscription='none' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> <presence from='user@example.com' to='contact@example.org' type='unsubscribe'/> 3. Upon receiving the presenceuser by returning either an IQ stanza of type"unsubscribe" addressed"result" or an IQ stanza of type "error" that is appropriate to thecontact,original payload; if not, thecontact'sserver(1)MUSTinitiatereply with aroster push to all<service- unavailable/> stanza error. 8.3.2. No Available Resources If there are no available resources associated with thecontact that have requested the roster, containing an updated roster item foruser, how theuser withstanza shall be processed depends on the'subscription' attribute set tostanza type. 8.3.2.1. Message For avalue of "none" (if the contact is unavailable or has not requested the roster,message stanza, thecontact'sserverMUST modifyMAY choose to store theroster itemstanza on behalf of the user andsend that modified itemdeliver it when the user nexttime the contact requestsbecomes available, or forward theroster); and (2) MUST delivermessage to the"unsubscribe" state change notificationuser via some other means (e.g., to thecontact: Saint-Andre Expires October 19, 2007 [Page 52] Internet-Draft XMPP IM April 2007 <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@example.com' subscription='none' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence from='user@example.com' to='contact@example.org' type='unsubscribe'/> 4. The contact'suser's email account). However, if offline message storage or message forwarding is not enabled, the serverthen (1)MUSTsendreturn to the sender a <service-unavailable/> stanza error. (Note: Offline message storage and message forwarding are not defined in XMPP, since they are strictly a matter of implementation and service provisioning.) 8.3.2.2. Presence For a presence stanza with no type or of type"unsubscribed" to"unavailable" or "probe", theuser; and (2)server SHOULDsend unavailable presence from all ofsilently ignore thecontact's available resourcesstanza by not storing it for later delivery or replying to it on behalf of theuser: <presence from='contact@example.org' to='user@example.com' type='unsubscribed'/> <presence from='contact@example.org/resource' to='user@example.com' type='unavailable'/> 5. When the user's server receives theuser. For a presencestanzasstanza of type"unsubscribed" and "unavailable", it"subscribe", "subscribed", "unsubscribe", or "unsubscribed", the server MUSTdeliver themadhere to theuser: <presence from='contact@example.org' to='user@example.com' type='unsubscribed'/> <presence from='contact@example.org/resource' to='user@example.com' type='unavailable'/> Saint-Andre Expires October 19, 2007 [Page 53] Internet-Draft XMPP IM April 2007 A.4.2. Case #2: Unsubscribing When Subscription is Mutual Inrules defined under Section 3 and summarized under Appendix A. 8.3.2.3. IQ For an IQ stanza, thesecond case,server itself MUST reply on behalf of the userhas a subscription to the contact's presence informationwith either an IQ result or an IQ error, and MUST NOT deliver thecontact also has a subscriptionIQ stanza to theuser's presence information (i.e., the subscription is mutual). 1. If the user wants to unsubscribe fromavailable resources. Specifically, if thecontact's presence information,semantics of theuser MUST sendqualifying namespace define apresence stanzareply that the server can provide on behalf oftype "unsubscribe" tothecontact: <presence to='contact@example.org' type='unsubscribe'/> 2. As a result,user, theuser'sserver(1)MUSTsend a roster pushreply toallthe stanza on behalf of theuser's interested resources, containinguser by returning either anupdated roster item for the contact with the 'subscription' attribute set to a valueIQ stanza of"from"; and (2) MUST routetype "result" or an IQ stanza of type "error" that is appropriate to the original Saint-Andre Expires January 18, 2008 [Page 55] Internet-Draft XMPP IM July 2007 payload; if not, thepresenceserver MUST reply with a <service-unavailable/> stanza error. 8.4. Foreign Domain If the hostname oftype "unsubscribe" tothecontact, first stampingdomain identifier portion of the'from'addressascontained in thebare JID (<user@example.com>)'to' attribute ofthe user: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@example.org' subscription='from' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> <presence from='user@example.com' to='contact@example.org' type='unsubscribe'/> 3. Upon receiving the presencean outbound stanza does not match a configured hostname oftype "unsubscribe" addressed tothecontact,server itself, thecontact'sserver(1)MUSTinitiate a roster pushattempt toall available resources associated withroute thecontact that have requestedstanza to theroster, containingforeign domain. If there exists anupdated roster item foractive stream between theuser withtwo peers, the'subscription' attribute set to a value of "to" (ifserver shall route thecontact is unavailable or has not requestedstanza over that stream for processing by theroster,peer server. If not, thecontact'sserver MUSTmodify the roster item and send that modified itemdo thenext timefollowing. First, resolve thecontact requestshostname of theroster); and (2) MUST deliverforeign domain (or used a cached resolution of the"unsubscribe" state change notificationforeign domain tothe contact: Saint-Andre Expires October 19, 2007 [Page 54] Internet-Draft XMPP IM April 2007 <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@example.com' subscription='to' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence from='user@example.com' to='contact@example.org' type='unsubscribe'/> 4.an IP address). Thecontact's server then (1) MUST send a presence stanzarecommended order oftype "unsubscribed"attempted resolutions is as follows: 1. Attempt to resolve theuser;foreign hostname using a DNS [SRV] Service of "xmpp-server" and(2) SHOULD send unavailable presence from allProto of "tcp", resulting in resource records such as "_xmpp-server._tcp.example.com.", as specified in [XMPP-CORE]. 2. If thecontact's available resources to the user: <presence from='contact@example.org' to='user@example.com' type='unsubscribed'/> <presence from='contact@example.org/resource' to='user@example.com' type='unavailable'/> 5. When"xmpp-server" address record resolution fails, attempt to resolve theuser's server receives"_im" or "_pres" [SRV] Service as specified in [IMP-SRV], using thepresence"_im" Service for <message/> stanzasof type "unsubscribed"and"unavailable", it MUST deliver themthe "_pres" Service for <presence/> stanzas (it is up to theuser: <presence from='contact@example.org' to='user@example.com' type='unsubscribed'/> <presence from='contact@example.org/resource' to='user@example.com' type='unavailable'/> Note: Obviously this does notimplementation how to handle <iq/> stanzas). This will result inremovalone or more resolutions of theroster item fromform "_im.<proto>.example.com." or "_pres.<proto>.example.com.", where "<proto>" would be a label registered in theuser's roster, andInstant Messaging SRV Protocol Label registry or thecontact still hasPresence SRV Protocol Label registry: either "_xmpp" for an XMPP-aware domain or some other IANA-registered label (e.g., "_simple") for asubscription to the user's presence information. In order tonon-XMPP-aware domain. 3. If bothcompletely cancel Saint-Andre Expires October 19, 2007 [Page 55] Internet-Draft XMPP IM April 2007SRV address record resolutions fail, attempt to perform amutual subscription and fully remove the roster item from the user's roster,normal IPv4/IPv6 address record resolution to determine theuser SHOULD updateIP address using theroster item"xmpp-server" port of 5269 registered withsubscription='remove'the IANA, asdefined under Removing a Roster Itemspecified in [XMPP-CORE]. Note: Administrators of server deployments are strongly encouraged to keep the _im._xmpp, _pres._xmpp, andCancelling All Subscriptions (Appendix A.6). A.5. Cancelling a Subscription At any time after approving a subscription request from a user, a contact MAY cancel that subscription. While_xmpp._tcp SRV records properly synchronized, since different implementations might perform theXML that"_im" and "_pres" lookups before thecontact sends to make this happen is"xmpp-server" lookup. If the foreign domain cannot be resolved, the server SHOULD return a <remote-server- not-found/> stanza error. Second, negotiate XML streams with thesameforeign domain by following the process defined inall instances,[XMPP-CORE]. If thesubsequent subscription state is different depending onserver cannot establish streams with thesubscription state obtaining whenforeign domain, it SHOULD return a <remote-server- timeout/> stanza error. Saint-Andre Expires January 18, 2008 [Page 56] Internet-Draft XMPP IM July 2007 Third, route thecancellation was sent. Both possible scenarios are described instanza to thetext that follows. A.5.1. Case #1: Cancelling When Subscription is Not Mutual Inforeign domain for processing by thefirst case,peer server. 9. IM and Presence Compliance Requirements This section summarizes theuser has a subscriptionspecific aspects of the Extensible Messaging and Presence Protocol that MUST be supported by instant messaging and presence servers and clients in order to be considered compliant implementations. All such applications MUST comply with thecontact'srequirements specified in [XMPP-CORE]. The text in this section specifies additional compliance requirements for instant messaging and presenceinformationservers and clients (the requirements described here supplement butthe contact doesdo nothave a subscription tosupersede theuser'score requirements). Note: A server or client MAY support only presenceinformation (i.e., the subscriptionor instant messaging, and is notyet mutual). 1. If the contact wantsrequired to support both if only a presence service or an instant messaging service is desired. 9.1. Servers In addition to core server compliance requirements, an instant messaging and presence server MUST additionally support all server- related instant messaging and presence syntax and semantics defined in this document, including: o Presence broadcast on behalf of clients as specified under Section 4 o Presence subscriptions as specified under Section 3 o Roster storage and management as specified under Section 2 o IM-specific routing and delivery rules as specified under Section 8 9.2. Clients In addition tocancel the user's subscription, the contact MUST send acore client compliance requirements, an instant messaging and presencestanza of type "unsubscribed" to the user: <presence to='user@example.com' type='unsubscribed'/> 2. As a result, the contact's server (1)client MUSTsend a roster push to alladditionally support the following protocols: o Generation and processing of thecontact's interested resources, containing an updated roster item forIM-specific semantics of XML stanzas as defined by theuser withXML schemas, including the'subscription''type' attributeset to a valueof"none"; (2) MUST route themessage and presencestanza of type "unsubscribed" to the user, first stamping the 'from' addressstanzas asthe bare JID (<contact@example.org>) of the contact;well as their child elements (see Section 5 and(3) SHOULD send unavailableSection 4) o All client-related instant messaging syntax and semantics defined in this document, including presencefrom all of the contact's available resources to the user:subscriptions and roster management (see Section 3 and Section 2) Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page56]57] Internet-Draft XMPP IMAprilJuly 2007<iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@example.com' subscription='none' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence from='contact@example.org' to='user@example.com' type='unsubscribed'/> <presence from='contact@example.org/resource' to='user@example.com' 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 all of the user's interested resources, containing an updated roster item for the contact with the 'subscription' attribute set to a value of "none" (if the user is unavailable or has not requested the roster, the user's server MUST modify the roster itemo End-to-end object signing andsendencryption as defined in [XMPP-E2E] A client MUST also handle addresses thatmodified item the next time the user requestsare encoded as "im:" URIs as specified in [CPIM], and MAY do so by removing theroster); (2) MUST deliver"im:" scheme and entrusting address resolution to the"unsubscribed" state change notificationserver as specified under Section 8.4. 10. Internationalization Considerations For internationalization considerations, refer toallthe relevant section of [XMPP-CORE]. 11. Security Considerations Core security considerations for XMPP are defined in theuser's available resources;relevant section of [XMPP-CORE]. Additional considerations that apply only to instant messaging and(3) MUST deliver the unavailablepresenceto allapplications ofthe user's available resources: Saint-Andre Expires October 19, 2007 [Page 57] Internet-DraftXMPPIM April 2007 <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@example.org' subscription='none' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> <presence from='contact@example.org' to='user@example.com' type='unsubscribed'/> <presence from='contact@example.org/resource' to='user@example.com' type='unavailable'/> A.5.2. Case #2: Cancellingare defined in several places within this document; specifically: o WhenSubscriptiona server processes an inbound presence stanza of type "probe" whose intended recipient isMutual In the second case, the user hasasubscription touser associated with one of thecontact's presence information andserver's hostnames, thecontact also has a subscription toserver MUST NOT reveal the user's presence information(i.e.,if thesubscriptionsender ismutual). 1. If the contact wantsan entity that is not authorized tocancel the user's subscription, the contact MUST send areceive that information as determined by presencestanza of type "unsubscribed" to the user: <presence to='user@example.com' type='unsubscribed'/> 2. As a result, the contact'ssubscriptions (see Exchanging Presence Information (Section 4)). o A user's server(1)MUSTsend a roster pushNOT leak the user's network availability toall ofentities who are not authorized to know thecontact's interested resources, containinguser's presence, either via an explicit subscription as described herein or via anupdated roster item for theexisting trust relationship (such as presence-enabled userwith the 'subscription' attribute set todirectories within organizations). o When avalueserver processes an outbound presence stanza with no type or of"to"; (2)type "unavailable", it MUSTroutefollow the rules defined under Exchanging Presence Information (Section 4) in order to ensure that such presence information is not broadcasted to entities that are not authorized to know such information. o When a server generates an error stanzaof type "unsubscribed"in response to receiving a stanza for a user who does not exist, theuser, first stamping the 'from' address as the bare JID (<contact@example.org>)use of thecontact; and (3) SHOULD send unavailable presence from all of<service- unavailable/> error condition helps protect against well-known dictionary attacks, since this is thecontact's available resources to all ofsame error condition that is returned if, for instance, theuser's available resources:namespace of an IQ child element is not understood, or if offline message storage or message forwarding is not enabled for a domain. Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page 58] Internet-Draft XMPP IMAprilJuly 2007<iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@example.com' subscription='to' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence from='contact@example.org' to='user@example.com' type='unsubscribed'/> <presence from='contact@example.org/resource' to='user@example.com' type='unavailable'/> 3. Upon receivingo A client MAY ignore the <status/> element when contained in a presence stanza of type "subscribe", "unsubscribe", "subscribed", or "unsubscribed"addressedin order to help prevent "presence subscription spam". 12. IANA Considerations The following sections update theuser, the user's server (1) MUST initiateregistrations provided in [RFC3921]. For aroster push to allnumber of related IANA considerations, refer to theuser's interested resources, containing an updated roster itemrelevant section of [XMPP-CORE]. 12.1. Instant Messaging SRV Protocol Label Registration Address Resolution for Instant Messaging and Presence [IMP-SRV] defines an Instant Messaging SRV Protocol Label registry forthe contact with the 'subscription' attribute setprotocols that can provide services that conform toa value of "from" (iftheuser"_im" SRV Service label. Because XMPP isunavailable or has not requestedone such protocol, theroster,IANA registers theuser's server MUST modify"_xmpp" protocol label in theroster itemappropriate registry, as follows: Protocol label: _xmpp Specification: XXXX Description: Instant messaging protocol label for the Extensible Messaging andsendPresence Protocol (XMPP) as defined by XXXX. Registrant Contact: IETF, XMPP Working Group, <xmppwg@jabber.org> 12.2. Presence SRV Protocol Label Registration Address Resolution for Instant Messaging and Presence [IMP-SRV] defines a Presence SRV Protocol Label registry for protocols thatmodified itemcan provide services that conform to thenext time"_pres" SRV Service label. Because XMPP is one such protocol, theuser requestsIANA registers theroster); and (2) MUST deliver"_xmpp" protocol label in the"unsubscribed" state change notification to all ofappropriate registry, as follows: Protocol label: _xmpp Specification: XXXX Description: Presence protocol label for theuser's available resources;Extensible Messaging and(3) MUST deliver the unavailable presence to all of the user's available resources:Presence Protocol (XMPP) as defined by XXXX. Registrant Contact: IETF, XMPP Working Group, <xmppwg@jabber.org> 13. References Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page 59] Internet-Draft XMPP IMAprilJuly 2007<iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@example.org' subscription='from' name='MyContact'> <group>MyBuddies</group> </item> </query> </iq> <presence from='contact@example.org' to='user@example.com' type='unsubscribed'/> <presence from='contact@example.org/resource' to='user@example.com' type='unavailable'/> Note: Obviously this does not result in removal of the roster item from the contact's roster,13.1. Normative References [IMP-REQS] Day, M., Aggarwal, S., and J. Vincent, "Instant Messaging / Presence Protocol Requirements", RFC 2779, February 2000. [IMP-SRV] Peterson, J., "Address Resolution for Instant Messaging and Presence", RFC 3861, August 2004. [SRV] Gulbrandsen, A., Vixie, P., and L. Esibov, "A DNS RR for specifying thecontact still has a subscription to the user's presence information. In orderlocation of services (DNS SRV)", RFC 2782, February 2000. [TERMS] Bradner, S., "Key words for use in RFCs toboth completely cancel a mutual subscriptionIndicate Requirement Levels", BCP 14, RFC 2119, March 1997. [UUID] Leach, P., Mealling, M., andfully 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 ItemR. Salz, "A Universally Unique IDentifier (UUID) URN Namespace", RFC 4122, July 2005. [XML] Paoli, J., Maler, E., Sperberg-McQueen, C., Yergeau, F., andCancelling All Subscriptions (Appendix A.6). A.6. Removing a Roster ItemT. Bray, "Extensible Markup Language (XML) 1.0 (Fourth Edition)", World Wide Web Consortium Recommendation REC- xml-20060816, August 2006, <http://www.w3.org/TR/2006/REC-xml-20060816>. [XML-NAMES] Bray, T., Hollander, D., andCancelling All Subscriptions Because there may be many steps involvedA. Layman, "Namespaces incompletely removing a roster itemXML", W3C REC-xml-names, January 1999, <http://www.w3.org/TR/REC-xml-names>. [XMPP-CORE] Saint-Andre, P., "Extensible Messaging andcancelling subscriptionsPresence Protocol (XMPP): Core", draft-saintandre-rfc3920bis-03 (work inboth directions, the roster management protocol includes a "shortcut" methodprogress), July 2007. [XMPP-E2E] Saint-Andre, P., "End-to-End Signing and Object Encryption fordoing so. The process may be initiated no matter whatthecurrent subscription state is by sending a roster set containing an itemExtensible Messaging and Presence Protocol (XMPP)", RFC 3923, October 2004. 13.2. Informative References [CPIM] Peterson, J., "Common Profile forthe contact with the 'subscription' attribute set to a value of "remove": <iq type='set' id='remove1'> <query xmlns='jabber:iq:roster'> <item jid='contact@example.org' subscription='remove'/> </query> </iq> When the user removes a contact from his or her roster by setting the 'subscription' attribute to a value of "remove", the user's serverInstant Messaging (CPIM)", RFC 3860, August 2004. [IMP-MODEL] Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page 60] Internet-Draft XMPP IMAprilJuly 2007(1) MUST automatically cancel any existing presence subscription between the userDay, M., Rosenberg, J., andthe contact (both 'to'H. Sugano, "A Model for Presence and'from' as appropriate); (2) MUST remove the roster item from the user's rosterInstant Messaging", RFC 2778, February 2000. [IRC] Kalt, C., "Internet Relay Chat: Architecture", RFC 2810, April 2000. [RFC3921] Saint-Andre, P., "Extensible Messaging andinform all of the user's interested resources of the roster item removal; (3) MUST inform the resource that initiated the removal of success;Presence Protocol (XMPP): Instant Messaging and(4) SHOULD send unavailable presence from all of the user's available resources to the contact: <presence from='user@example.com' to='contact@example.org' type='unsubscribe'/> <presence from='user@example.com' to='contact@example.org' type='unsubscribed'/> <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='contact@example.org' subscription='remove'/> </query> </iq> <iq type='result' id='remove1'/> <presence from='user@example.com/resource' to='contact@example.org' type='unavailable'/> Upon receiving the presence stanza of type "unsubscribe", 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 unavailable or has not requested the roster, the contact's server MUST modify the roster itemPresence", RFC 3921, October 2004. [SASL] Melnikov, A. andsend that modified item the next time the contact requests the roster);K. Zeilenga, "Simple Authentication and Security Layer (SASL)", RFC 4422, June 2006. [TLS] Dierks, T. and E. Rescorla, "The Transport Layer Security (TLS) Protocol Version 1.1", RFC 4346, April 2006. [XEP-0016] Millard, P. and P. Saint-Andre, "Privacy Lists", XSF XEP 0016, February 2007. [XEP-0045] Saint-Andre, P., "Multi-User Chat", XSF XEP 0045, April 2007. [XEP-0054] Saint-Andre, P., "vcard-temp", XSF XEP 0054, March 2003. [XML-SCHEMA] Thompson, H., Maloney, M., Mendelsohn, N., and D. Beech, "XML Schema Part 1: Structures Second Edition", World Wide Web Consortium Recommendation REC-xmlschema-1-20041028, October 2004, <http://www.w3.org/TR/2004/REC-xmlschema-1-20041028>. [VCARD] Dawson, F. and T. Howes, "vCard MIME Directory Profile", RFC 2426, September 1998. Appendix A. Subscription States This section provides detailed information about subscription states and(2) MUST also deliver the "unsubscribe" state change notification to allserver processing ofthe contact's available resources:subscription-related presence stanzas (i.e., presence stanzas of type "subscribe", "subscribed", "unsubscribe", and "unsubscribed"). Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page 61] Internet-Draft XMPP IMAprilJuly 2007<iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@example.com' subscription='to' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence from='user@example.com' to='contact@example.org' 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 forA.1. Defined States There are four primary subscription states: o None -- the userwith the 'subscription' attribute set to a value of "none" (if the contact is unavailable or hasdoes notrequested the roster,have a subscription to the contact'sserver MUST modify the roster itempresence information, andsend that modified item the next timethe contactrequests the roster); and (2) MUST also deliver the "unsubscribe" state change notificationdoes not have a subscription toall of the contact's available resources: <iq type='set'> <query xmlns='jabber:iq:roster'> <item jid='user@example.com' subscription='none' name='SomeUser'> <group>SomeGroup</group> </item> </query> </iq> <presence from='user@example.com' to='contact@example.org' type='unsubscribed'/> Upon receivingthe user's presencestanza of type "unavailable" addressed toinformation o To -- thecontact,user has a subscription to the contact'sserver MUST deliver the unavailablepresenceto all of the user's available resources: Saint-Andre Expires October 19, 2007 [Page 62] Internet-Draft XMPP IM April 2007 <presence from='user@example.com/resource' to='contact@example.org' type='unavailable'/> Note: When the user removesinformation, but the contactfromdoes not have a subscription to the user'sroster,presence information o From -- theend state ofcontact has a subscription to thecontact's roster is thatuser's presence information, but the useris still in the contact's roster withdoes not have a subscriptionstate of "none"; in ordertocompletely removetheroster item forcontact's presence information o Both -- both theuser,user and the contactneedshave subscriptions toalso send a roster removal request. Appendix B. Subscription States This section provides detailed information about subscription states and server handling of subscription-relatedeach other's presencestanzasinformation (i.e.,presence stanzasthe union oftype "subscribe", "subscribed", "unsubscribe",'from' and"unsubscribed"). B.1. Defined States There'to') These states are supplemented by various pending sub-states to yield nine possible subscriptionstates, which are described here from the user's (not contact's) perspective:states: 1. "None" = contact and user are not subscribed to each other, and neither has requested a subscription from the other; this is reflected in the roster by subscription='none' 2. "None + Pending Out" = contact and user are not subscribed to each other, and user has sent contact a subscription request but contact has not replied yet; this is reflected in the roster by subscription='none' and ask='subscribe' 3. "None + Pending In" = contact and user are not subscribed to each other, and contact has sent user a subscription request but user has not replied yet (note: contact's server SHOULD NOT push or deliver roster items in this state, but instead SHOULD wait until user has approved subscription request from contact); this is reflected in the roster by subscription='none' 4. "None + Pending Out+In" = contact and user are not subscribed to each other, contact has sent user a subscription request but user has not replied yet, and user has sent contact a subscription request but contact has not replied yet; this is reflected in the roster by subscription='none' and ask='subscribe' 5. "To" = user is subscribed to contact (one-way); this is reflected in the roster by subscription='to' 6. "To + Pending In" = user is subscribed to contact, and contact has sent user a subscription request but user has not replied yet; this is reflected in the roster by subscription='to'Saint-Andre Expires October 19, 2007 [Page 63] Internet-Draft XMPP IM April 20077. "From" = contact is subscribed to user (one-way); this is reflected in the roster by subscription='from' 8. "From + Pending Out" = contact is subscribed to user, and user has sent contact a subscription request but contact has not replied yet; this is reflected in the roster by subscription='none' and ask='subscribe' Saint-Andre Expires January 18, 2008 [Page 62] Internet-Draft XMPP IM July 2007 9. "Both" = user and contact are subscribed to each other (two-way); this is reflected in the roster by subscription='both'B.2.A.2. ServerHandlingProcessing of Outbound PresenceSubscription Stanzas Outbound presence subscription stanzas enable the user to manage his or her subscription to the contact's presence information (via the "subscribe" and "unsubscribe" types), and to manage the contact's access to the user's presence information (via the "subscribed" and "unsubscribed" types). The following rules apply: 1. Regarding outbound presence stanzas of type "subscribe", the user's server MUST without exception route the stanza to the contact. 2. Regarding outbound presence stanzas of type "unsubscribe", the user's server MUST without exception route the stanza to the contact. 3. Regarding outbound presence stanzas of type "subscribed", if the stanza does not result in a subscription state change from the user's perspective then the user's server SHOULD NOT route the stanza to the contact; however, if the stanza results in a subscription state change, the user's server MUST route the stanza to the contact. 4. Regarding outboundSubscription Stanzas Outbound presence subscription stanzasof type "unsubscribed", ifenable thestanza does not result in auser to manage his or her subscriptionstate change from the user's perspective thento theuser's server SHOULD NOT routecontact's presence information (via thestanza"subscribe" and "unsubscribe" types), and to manage thecontact; however, if the stanza results in a subscription state change,contact's access to the user'sserver MUST routepresence information (via thestanza"subscribed" and "unsubscribed" types). The following rules apply to outbound routing of thecontact. The tables shown that follow summarizestanza as well as changes to thestate transitions associated withuser's roster. Note: In thehandling of outbound presence subscription stanzas. Saint-Andre Expires October 19, 2007 [Page 64] Internet-Draft XMPP IM April 2007following tables, "S.N." stand for SHOULD NOT. A.2.1. Subscribe Table 1:Recommended handlingProcessing of outbound "subscribe" stanzas +----------------------------------------------------------------+ | EXISTING STATE | ROUTE? | NEW STATE | +----------------------------------------------------------------+ | "None" |yesMUST | "None + Pending Out" | | "None + Pending Out" |yesMUST | no state change | | "None + Pending In" |yesMUST | "None + Pending Out+In" | | "None + Pending Out+In" |yesMUST | no state change | | "To" |yesMUST | no state change | | "To + Pending In" |yesMUST | no state change | | "From" |yesMUST | "From + Pending Out" | | "From + Pending Out" |yesMUST | no state change | | "Both" |yesMUST | no state change | +----------------------------------------------------------------+ Saint-Andre Expires January 18, 2008 [Page 63] Internet-Draft XMPP IM July 2007 A.2.2. Unsubscribe Table 2:Recommended handlingProcessing of outbound "unsubscribe" stanzas +----------------------------------------------------------------+ | EXISTING STATE | ROUTE? | NEW STATE | +----------------------------------------------------------------+ | "None" |yesMUST | no state change | | "None + Pending Out" |yesMUST | "None" | | "None + Pending In" |yesMUST | no state change | | "None + Pending Out+In" |yesMUST | "None + Pending In" | | "To" |yesMUST | "None" | | "To + Pending In" |yesMUST | "Pending In" | | "From" |yes | no state change | | "From + Pending Out" | yes | "From" | | "Both" | yes | "From" | +----------------------------------------------------------------+ Table 3: Recommended handling of outbound "subscribed" stanzas +----------------------------------------------------------------+ | EXISTING STATE | ROUTE? | NEW STATE | +----------------------------------------------------------------+ | "None" | no | no state change | | "None + Pending Out" | noMUST | no state change | |"None + Pending In" | yes | "From" | | "None + Pending Out+In" | yes |"From + Pending Out" || "To" | no | no state change | | "To + Pending In" | yes | "Both" |MUST | "From" |no | no state change | | "From + Pending Out" | no | no state change || "Both" |no | no state changeMUST | "From" | +----------------------------------------------------------------+Saint-Andre Expires October 19, 2007 [Page 65] Internet-Draft XMPP IM April 2007A.2.3. Subscribed Table4: Recommended handling3: Processing of outbound"unsubscribed""subscribed" stanzas +----------------------------------------------------------------+ | EXISTING STATE | ROUTE? | NEW STATE | +----------------------------------------------------------------+ | "None" |noS.N. | no state change | | "None + Pending Out" |noS.N. | no state change | | "None + Pending In" |yesMUST |"None""From" | | "None + Pending Out+In" |yesMUST |"None"From + Pending Out" | | "To" |noS.N. | no state change | | "To + Pending In" |yes | "To" | | "From" | yes | "None" | | "From + Pending Out" | yes | "None + Pending Out" |MUST | "Both" |yes | "To"|+----------------------------------------------------------------+ B.3. Server Handling of Inbound Presence Subscription Stanzas Inbound presence subscription stanzas request a subscription-related action from the user (via the "subscribe" type), inform the user of subscription-related actions taken by the contact (via the "unsubscribe" type), or enable the contact to manage the user's access to the contact's presence information (via the "subscribed" and "unsubscribed" types). The following rules apply: 1. Regarding inbound presence stanzas of type "subscribe", if the user has not already granted the contact access to the user's presence information and if there is no pending inbound subscription request then the user's server MUST route the stanza to the user; however, if there is a pending inbound subscription request then the user's server SHOULD NOT deliver the new request. If the user has already granted the contact access to the user's presence information, the user's server SHOULD auto- reply by sending a presence stanza of type "subscribed" to the contact on behalf of the user; this rule enables the contact to resynchronize the subscription state if needed. 2. Regarding inbound presence stanzas of type "unsubscribe", if the stanza does not result in a subscription state change from the user's perspective then the user's server SHOULD NOT route the stanza to the contact; however, if the stanza results in a subscription"From" | S.N. | no statechange, the user's server MUST route the stanza to the contact. 3. Regarding inbound presence stanzas of type "subscribed", if the stanza does not result in a subscriptionchange | | "From + Pending Out" | S.N. | no state changefrom the user's perspective then the user's server SHOULD NOT route the stanza to the contact; however, if the stanza results in a| | "Both" | S.N. | no state change | +----------------------------------------------------------------+ Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page66]64] Internet-Draft XMPP IMAprilJuly 2007subscriptionA.2.4. Unsubscribed Table 4: Processing of outbound "unsubscribed" stanzas +----------------------------------------------------------------+ | EXISTING STATE | ROUTE? | NEW STATE | +----------------------------------------------------------------+ | "None" | S.N. | no statechange, the user's serverchange | | "None + Pending Out" | S.N. | no state change | | "None + Pending In" | MUSTroute the stanza to the contact. 4. Regarding inbound| "None" | | "None + Pending Out+In" | MUST | "None + Pending Out" | | "To" | S.N. | no state change | | "To + Pending In" | MUST | "To" | | "From" | MUST | "None" | | "From + Pending Out" | MUST | "None + Pending Out" | | "Both" | MUST | "To" | +----------------------------------------------------------------+ A.3. Server Processing of Inbound Presence Subscription Stanzas Inbound presence subscription stanzasof type "unsubscribed", if the stanza does not result inrequest asubscription state changesubscription-related action from theuser's perspective then the user's server SHOULD NOT route the stanza touser (via thecontact; however, if"subscribe" type), inform thestanza results in a subscription state change,user of subscription-related actions taken by theuser's server MUST routecontact (via thestanza"unsubscribe" type), or enable the contact to manage thecontact. The tables shown that follow summarizeuser's access to thestate transitions associated withcontact's presence information (via thehandling"subscribed" and "unsubscribed" types). The following rules apply to delivery of the inboundpresence subscription stanzas.stanza as well as changes to the contact's roster. Note: In the following tables, "S.N." stand for SHOULD NOT. Saint-Andre Expires January 18, 2008 [Page 65] Internet-Draft XMPP IM July 2007 A.3.1. Subscribe Table 5:Recommended handlingProcessing of inbound "subscribe" stanzas +------------------------------------------------------------------+ | EXISTING STATE | DELIVER? | NEW STATE | +------------------------------------------------------------------+ | "None" |yesMUST | "None + Pending In" | | "None + Pending Out" |yesMUST | "None + Pending Out+In" | | "None + Pending In" |noS.N. | no state change | | "None + Pending Out+In" |noS.N. | no state change | | "To" |yesMUST | "To + Pending In" | | "To + Pending In" |noS.N. | no state change | | "From" |noS.N. * | no state change | | "From + Pending Out" |noS.N. * | no state change | | "Both" |noS.N. * | no state change | +------------------------------------------------------------------+ * Server SHOULD auto-reply with "subscribed" stanza A.3.2. Unsubscribe When the user's server receives a presence stanza of type "unsubscribe" for the user from the contact, if the stanza results in a subscription state change from the user's perspective then the user's server MUST change the state and SHOULD auto-reply by sending a presence stanza of type "unsubscribed" to the contact on behalf of theuser, MUST deliver the "unsubscribe" stanza touser. Otherwise theuser, anduser's server MUST NOT change thestate. If no subscriptionstatechange results, the user's serverand SHOULD NOT deliver thestanza and MUST NOT change the state.stanza. These rules are summarized in the following table.Saint-Andre Expires October 19, 2007 [Page 67] Internet-Draft XMPP IM April 2007Table 6:Recommended handlingProcessing of inbound "unsubscribe" stanzas +------------------------------------------------------------------+ | EXISTING STATE | DELIVER? | NEW STATE | +------------------------------------------------------------------+ | "None" |noS.N. | no state change | | "None + Pending Out" |noS.N. | no state change | | "None + Pending In" |yesS.N. * | "None" | | "None + Pending Out+In" |yesS.N. * | "None + Pending Out" | | "To" |noS.N. | no state change | | "To + Pending In" |yesS.N. * | "To" | | "From" |yesS.N. * | "None" | | "From + Pending Out" |yesS.N. * | "None + Pending Out | | "Both" |yesS.N. * | "To" | +------------------------------------------------------------------+ * Server SHOULD auto-reply with "unsubscribed" stanza Saint-Andre Expires January 18, 2008 [Page 66] Internet-Draft XMPP IM July 2007 A.3.3. Subscribed When the user's server receives a presence stanza of type "subscribed" for the user from the contact,it MUST NOT deliver the stanza to the user and MUST NOT change the subscription stateif there is no pending outbound request for access to the contact's presenceinformation.information, then it MUST NOT change the subscription state and SHOULD NOT deliver the stanza to the user. If there is a pending outbound request for access to the contact's presence information and the inbound presence stanza of type "subscribed" results in a subscription state change, then the user's server MUST change the subscription state but SHOULD NOT deliver the stanza to theuser and MUST change the subscription state.user. If the user already has access to the contact's presence information, the inbound presence stanza of type "subscribed" does not result in a subscription state change; therefore the user's server MUST NOT change the subscription state and SHOULD NOT deliver the stanza to theuser and MUST NOT change the subscription state.user. These rules are summarized in the following table. Table 7:Recommended handlingProcessing of inbound "subscribed" stanzas +------------------------------------------------------------------+ | EXISTING STATE | DELIVER? | NEW STATE | +------------------------------------------------------------------+ | "None" |noS.N. | no state change | | "None + Pending Out" |yesS.N. | "To" | | "None + Pending In" |noS.N. | no state change | | "None + Pending Out+In" |yesS.N. | "To + Pending In" | | "To" |noS.N. | no state change | | "To + Pending In" |noS.N. | no state change | | "From" |noS.N. | no state change | | "From + Pending Out" |yesS.N. | "Both" | | "Both" |noS.N. | no state change | +------------------------------------------------------------------+Saint-Andre Expires October 19, 2007 [Page 68] Internet-Draft XMPP IM April 2007A.3.4. Unsubscribed When the user's server receives a presence stanza of type "unsubscribed" for the user from the contact,it MUST deliver the stanza to the user and MUST change the subscription stateif there is a pending outbound request for access to the contact's presence information or if the user currently has access to the contact's presenceinformation. Otherwise,information, then the user's server MUST change the subscription state but SHOULD NOT deliver the stanzaandto the user. Otherwise, the user's server MUST NOT change thesubscription state.subscription state and SHOULD NOT deliver the stanza. These rules are summarized in the following table. Saint-Andre Expires January 18, 2008 [Page 67] Internet-Draft XMPP IM July 2007 Table 8:Recommended handlingProcessing of inbound "unsubscribed" stanzas +------------------------------------------------------------------+ | EXISTING STATE | DELIVER? | NEW STATE | +------------------------------------------------------------------+ | "None" |noS.N. | no state change | | "None + Pending Out" |yesS.N. | "None" | | "None + Pending In" |noS.N. | no state change | | "None + Pending Out+In" |yesS.N. | "None + Pending In" | | "To" |yesS.N. | "None" | | "To + Pending In" |yesS.N. | "None + Pending In" | | "From" |noS.N. | no state change | | "From + Pending Out" |yesS.N. | "From" | | "Both" |yesS.N. | "From" | +------------------------------------------------------------------+ AppendixC.B. Blocking Communication Sections 2.3.5 and 5.4.10 of [IMP-REQS]requiresrequire that a compliant instant messaging and presence technology must enable a user to block communications from selected users. A protocol for doing so is specified in[XEP-0016] and a simplified "front-end" to that protocol is specified in [XEP-0191].[XEP-0016]. AppendixD.C. vCards Sections 3.1.3 and 4.1.4 of [IMP-REQS] require that it be possible to retrieve out-of-band contact information for other users (e.g., telephone number or email address). An XML representation of the vCard specification defined in RFC 2426 [VCARD] 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 [XEP-0054]).Saint-Andre Expires October 19, 2007 [Page 69] Internet-Draft XMPP IM April 2007AppendixE.D. XML SchemasTheBecause validation of XML streams and stanzas is optional, the following XML schemas aredescriptive,provided for descriptive purposes only. These schemas are not normative. The following schemas formally define various XML namespaces used in the core XMPP protocols, in conformance with [XML-SCHEMA]. For schemas definingstream-related featuresnamespaces for XML streams and other core aspects of XMPP, refer to [XMPP-CORE].E.1.D.1. jabber:client Saint-Andre Expires January 18, 2008 [Page 68] Internet-Draft XMPP IM July 2007 <?xml version='1.0' encoding='UTF-8'?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='jabber:client' xmlns='jabber:client' elementFormDefault='qualified'> <xs:import namespace='urn:ietf:params:xml:ns:xmpp-stanzas'/> <xs:element name='message'> <xs:complexType> <xs:sequence> <xs:choice minOccurs='0' maxOccurs='unbounded'> <xs:element ref='subject'/> <xs:element ref='body'/> <xs:element ref='thread'/> </xs:choice> <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded'/> <xs:element ref='error' minOccurs='0'/> </xs:sequence> <xs:attribute name='from' type='xs:string' use='optional'/> <xs:attribute name='id' type='xs:NMTOKEN' use='optional'/> <xs:attribute name='to' type='xs:string' use='optional'/> <xs:attribute name='type' use='optional' default='normal'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='chat'/> <xs:enumeration value='error'/> <xs:enumeration value='groupchat'/> <xs:enumeration value='headline'/>Saint-Andre Expires October 19, 2007 [Page 70] Internet-Draft XMPP IM April 2007<xs:enumeration value='normal'/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute ref='xml:lang' use='optional'/> </xs:complexType> </xs:element> Saint-Andre Expires January 18, 2008 [Page 69] Internet-Draft XMPP IM July 2007 <xs:element name='body'> <xs:complexType> <xs:simpleContent> <xs:extension base='xs:string'> <xs:attribute ref='xml:lang' use='optional'/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name='subject'> <xs:complexType> <xs:simpleContent> <xs:extension base='xs:string'> <xs:attribute ref='xml:lang' use='optional'/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name='thread' type='xs:NMTOKEN'/> <xs:element name='presence'> <xs:complexType> <xs:sequence> <xs:choice minOccurs='0' maxOccurs='unbounded'> <xs:element ref='show'/> <xs:element ref='status'/> <xs:element ref='priority'/> </xs:choice> <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded'/> <xs:element ref='error' minOccurs='0'/> </xs:sequence> <xs:attribute name='from' type='xs:string' use='optional'/> <xs:attribute name='id'Saint-Andre Expires October 19, 2007 [Page 71] Internet-Draft XMPP IM April 2007type='xs:NMTOKEN' use='optional'/> <xs:attribute name='to' type='xs:string' use='optional'/> <xs:attribute name='type' use='optional'> <xs:simpleType> <xs:restriction base='xs:NCName'> Saint-Andre Expires January 18, 2008 [Page 70] Internet-Draft XMPP IM July 2007 <xs:enumeration value='error'/> <xs:enumeration value='probe'/> <xs:enumeration value='subscribe'/> <xs:enumeration value='subscribed'/> <xs:enumeration value='unavailable'/> <xs:enumeration value='unsubscribe'/> <xs:enumeration value='unsubscribed'/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute ref='xml:lang' use='optional'/> </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'> <xs:complexType> <xs:simpleContent> <xs:extension base='string1024'> <xs:attribute ref='xml:lang' use='optional'/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:simpleType name='string1024'> <xs:restriction base='xs:string'> <xs:minLength value='1'/> <xs:maxLength value='1024'/> </xs:restriction>Saint-Andre Expires October 19, 2007 [Page 72] Internet-Draft XMPP IM April 2007</xs:simpleType> <xs:element name='priority' type='xs:byte'/> <xs:element name='iq'> <xs:complexType> <xs:sequence> <xs:any namespace='##other' Saint-Andre Expires January 18, 2008 [Page 71] Internet-Draft XMPP IM July 2007 minOccurs='0'/> <xs:element ref='error' minOccurs='0'/> </xs:sequence> <xs:attribute name='from' type='xs:string' use='optional'/> <xs:attribute name='id' type='xs:NMTOKEN' use='required'/> <xs:attribute name='to' type='xs:string' use='optional'/> <xs:attribute name='type' use='required'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='error'/> <xs:enumeration value='get'/> <xs:enumeration value='result'/> <xs:enumeration value='set'/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute ref='xml:lang' use='optional'/> </xs:complexType> </xs:element> <xs:element name='error'> <xs:complexType> <xs:sequence xmlns:err='urn:ietf:params:xml:ns:xmpp-stanzas'> <xs:group ref='err:stanzaErrorGroup'/> <xs:element ref='err:text' minOccurs='0'/> </xs:sequence> <xs:attribute name='code' type='xs:unsignedShort' use='optional'/> <xs:attribute name='type' use='required'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='auth'/> <xs:enumeration value='cancel'/>Saint-Andre Expires October 19, 2007 [Page 73] Internet-Draft XMPP IM April 2007<xs:enumeration value='continue'/> <xs:enumeration value='modify'/> <xs:enumeration value='wait'/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> Saint-Andre Expires January 18, 2008 [Page 72] Internet-Draft XMPP IM July 2007 </xs:schema>E.2.D.2. jabber:server <?xml version='1.0' encoding='UTF-8'?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='jabber:server' xmlns='jabber:server' elementFormDefault='qualified'> <xs:import namespace='urn:ietf:params:xml:ns:xmpp-stanzas'/> <xs:element name='message'> <xs:complexType> <xs:sequence> <xs:choice minOccurs='0' maxOccurs='unbounded'> <xs:element ref='subject'/> <xs:element ref='body'/> <xs:element ref='thread'/> </xs:choice> <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded'/> <xs:element ref='error' minOccurs='0'/> </xs:sequence> <xs:attribute name='from' type='xs:string' use='required'/> <xs:attribute name='id' type='xs:NMTOKEN' use='optional'/> <xs:attribute name='to' type='xs:string' use='required'/> <xs:attribute name='type' use='optional' default='normal'> <xs:simpleType>Saint-Andre Expires October 19, 2007 [Page 74] Internet-Draft XMPP IM April 2007<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> Saint-Andre Expires January 18, 2008 [Page 73] Internet-Draft XMPP IM July 2007 <xs:attribute ref='xml:lang' use='optional'/> </xs:complexType> </xs:element> <xs:element name='body'> <xs:complexType> <xs:simpleContent> <xs:extension base='xs:string'> <xs:attribute ref='xml:lang' use='optional'/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name='subject'> <xs:complexType> <xs:simpleContent> <xs:extension base='xs:string'> <xs:attribute ref='xml:lang' use='optional'/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name='thread' type='xs:NMTOKEN'/> <xs:element name='presence'> <xs:complexType> <xs:sequence> <xs:choice minOccurs='0' maxOccurs='unbounded'> <xs:element ref='show'/> <xs:element ref='status'/> <xs:element ref='priority'/> </xs:choice> <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded'/> <xs:element ref='error' minOccurs='0'/>Saint-Andre Expires October 19, 2007 [Page 75] Internet-Draft XMPP IM April 2007</xs:sequence> <xs:attribute name='from' type='xs:string' use='required'/> <xs:attribute name='id' type='xs:NMTOKEN' use='optional'/> <xs:attribute name='to' type='xs:string' Saint-Andre Expires January 18, 2008 [Page 74] Internet-Draft XMPP IM July 2007 use='required'/> <xs:attribute name='type' use='optional'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='error'/> <xs:enumeration value='probe'/> <xs:enumeration value='subscribe'/> <xs:enumeration value='subscribed'/> <xs:enumeration value='unavailable'/> <xs:enumeration value='unsubscribe'/> <xs:enumeration value='unsubscribed'/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute ref='xml:lang' use='optional'/> </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'> <xs:complexType> <xs:simpleContent> <xs:extension base='string1024'> <xs:attribute ref='xml:lang' use='optional'/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element>Saint-Andre Expires October 19, 2007 [Page 76] Internet-Draft XMPP IM April 2007<xs:simpleType name='string1024'> <xs:restriction base='xs:string'> <xs:minLength value='1'/> <xs:maxLength value='1024'/> </xs:restriction> </xs:simpleType> <xs:element name='priority' type='xs:byte'/> Saint-Andre Expires January 18, 2008 [Page 75] Internet-Draft XMPP IM July 2007 <xs:element name='iq'> <xs:complexType> <xs:sequence> <xs:any namespace='##other' minOccurs='0'/> <xs:element ref='error' minOccurs='0'/> </xs:sequence> <xs:attribute name='from' type='xs:string' use='required'/> <xs:attribute name='id' type='xs:NMTOKEN' use='required'/> <xs:attribute name='to' type='xs:string' use='required'/> <xs:attribute name='type' use='required'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='error'/> <xs:enumeration value='get'/> <xs:enumeration value='result'/> <xs:enumeration value='set'/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute ref='xml:lang' use='optional'/> </xs:complexType> </xs:element> <xs:element name='error'> <xs:complexType> <xs:sequence xmlns:err='urn:ietf:params:xml:ns:xmpp-stanzas'> <xs:group ref='err:stanzaErrorGroup'/> <xs:element ref='err:text' minOccurs='0'/> </xs:sequence> <xs:attribute name='code' type='xs:unsignedShort' use='optional'/>Saint-Andre Expires October 19, 2007 [Page 77] Internet-Draft XMPP IM April 2007<xs:attribute name='type' use='required'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='auth'/> <xs:enumeration value='cancel'/> <xs:enumeration value='continue'/> <xs:enumeration value='modify'/> <xs:enumeration value='wait'/> </xs:restriction> Saint-Andre Expires January 18, 2008 [Page 76] Internet-Draft XMPP IM July 2007 </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> </xs:schema>E.3.D.3. 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='ask' use='optional'> <xs:simpleType> <xs:restriction base='xs:NCName'> <xs:enumeration value='subscribe'/> </xs:restriction>Saint-Andre Expires October 19, 2007 [Page 78] Internet-Draft XMPP IM April 2007</xs:simpleType> </xs:attribute> <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='both'/> <xs:enumeration value='from'/> Saint-Andre Expires January 18, 2008 [Page 77] Internet-Draft XMPP IM July 2007 <xs:enumeration value='none'/> <xs:enumeration value='remove'/> <xs:enumeration value='to'/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name='group' type='xs:string'/> </xs:schema> AppendixF.E. Differences From RFC 3921This section is informative.Based on consensus derived frominteroperability testing andimplementationexperience,and deployment experience as well as formal interoperability testing, the following substantive modifications were made from RFC 3921.In addition, several smaller changes were made to more clearly specify and explain the protocols.o The protocol for session establishment was determined to be unnecessary and therefore the content previously defined in Section 3 of RFC 3921 was removed. However, server implementations may still want to advertise support for the feature in order to ensurebackwards-compatibility,backward-compatibility, even thoughitsession establishment is a "no-op". o The protocol for communications blocking specified in Section 10 of RFC 3921 has been moved to[XEP-0016] and a simplified "front- end" to that functionality has been defined in [XEP-0191] to ease the task of implementing communications blocking in servers and clients.[XEP-0016]. o In order to more seamlessly repair lack of synchronization in subscription states between rosters located at different servers, error handling related to presence probes and presence notifications was modified to return presence stanzas of type"unbsubscribe""unsubscribe" or "unsubscribed" rather than error stanzas. In addition, numerous changes of an editorial nature were made in order to more fully specify and clearly explain the protocols. Appendix F. Copying Conditions The Contributor grants third parties the irrevocable right to copy, use and distribute the Contribution, with or without modification, in any medium, without royalty, provided that, unless separate permission is granted, redistributed modified works: 1. do not contain misleading author, version, name of work, or endorsement information, and Saint-Andre ExpiresOctober 19,January 18, 2008 [Page 78] Internet-Draft XMPP IM July 2007 2. do not claim endorsement of the modified work by the Contributor, or any organization the Contributor belongs to, the Internet Engineering Task Force (IETF), Internet Research Task Force (IRTF), Internet Engineering Steering Group (IESG), Internet Architecture Board (IAB), Internet Assigned Numbers Authority (IANA), Internet Society (ISOC), Request For Comments (RFC) Editor, or any combination or variation of such terms (including without limitation the IETF "4 diamonds" logo), or any terms that are confusingly similar thereto, and 3. remove any claims of status as an Internet Standard, including without limitation removing the RFC boilerplate. The IETF suggests that any citation or excerpt of unmodified text reference the RFC or other document from which the text is derived. Index A Available Resource 29 B Broadcasted Presence 28 C Contact 18 D Directed Presence 28 I Initial Presence 29 Interested Resource 9 P Presence Probe 30 Presence Session 28 Presence Subscription 18 Presence 4 R Roster Get 7 Roster Push 8 Roster Result 8 Roster Set 7 Roster 4 S Saint-Andre Expires January 18, 2008 [Page 79] Internet-Draft XMPP IMAprilJuly 2007 Subscription Request 18 U Unavailable Presence 34 Author's Address Peter Saint-Andre (editor) XMPP Standards Foundation P.O. Box 1641 Denver, CO 80201 US Email: stpeter@jabber.org URI: xmpp:stpeter@jabber.org Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page 80] Internet-Draft XMPP IMAprilJuly 2007 Full Copyright Statement Copyright (C) The IETF Trust (2007). This document is subject to the rights, licenses and restrictions contained in BCP 78, and except as set forth therein, the authors retain all their rights. This document and the information contained herein are provided on an "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Intellectual Property The IETF takes no position regarding the validity or scope of any Intellectual Property Rights 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; nor does it represent that it has made any independent effort to identify any such rights. Information on the procedures with respect to rights in RFC documents can be found in BCP 78 and BCP 79. Copies of IPR disclosures made to the IETF Secretariat 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 implementers or users of this specification can be obtained from the IETF on-line IPR repository at http://www.ietf.org/ipr. The IETF invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights that may cover technology that may be required to implement this standard. Please address the information to the IETF at ietf-ipr@ietf.org. Acknowledgment Funding for the RFC Editor function is provided by the IETF Administrative Support Activity (IASA). Saint-Andre ExpiresOctober 19, 2007January 18, 2008 [Page 81] ----