summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc6121.txt
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-11-27 20:54:24 +0100
committerThomas Voss <mail@thomasvoss.com> 2024-11-27 20:54:24 +0100
commit4bfd864f10b68b71482b35c818559068ef8d5797 (patch)
treee3989f47a7994642eb325063d46e8f08ffa681dc /doc/rfc/rfc6121.txt
parentea76e11061bda059ae9f9ad130a9895cc85607db (diff)
doc: Add RFC documents
Diffstat (limited to 'doc/rfc/rfc6121.txt')
-rw-r--r--doc/rfc/rfc6121.txt6387
1 files changed, 6387 insertions, 0 deletions
diff --git a/doc/rfc/rfc6121.txt b/doc/rfc/rfc6121.txt
new file mode 100644
index 0000000..0f3ec4a
--- /dev/null
+++ b/doc/rfc/rfc6121.txt
@@ -0,0 +1,6387 @@
+
+
+
+
+
+
+Internet Engineering Task Force (IETF) P. Saint-Andre
+Request for Comments: 6121 Cisco
+Obsoletes: 3921 March 2011
+Category: Standards Track
+ISSN: 2070-1721
+
+
+ Extensible Messaging and Presence Protocol (XMPP):
+ Instant Messaging and Presence
+
+Abstract
+
+ This document defines extensions to core features of the Extensible
+ Messaging and Presence Protocol (XMPP) that provide basic instant
+ messaging (IM) and presence functionality in conformance with the
+ requirements in RFC 2779. This document obsoletes RFC 3921.
+
+Status of this Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc6121.
+
+Copyright Notice
+
+ Copyright (c) 2011 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 1]
+
+RFC 6121 XMPP IM March 2011
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.2. History . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.3. Requirements . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.4. Functional Summary . . . . . . . . . . . . . . . . . . . 7
+ 1.5. Terminology . . . . . . . . . . . . . . . . . . . . . . . 8
+ 2. Managing the Roster . . . . . . . . . . . . . . . . . . . . . 9
+ 2.1. Syntax and Semantics . . . . . . . . . . . . . . . . . . 9
+ 2.1.1. Ver Attribute . . . . . . . . . . . . . . . . . . . . 10
+ 2.1.2. Roster Items . . . . . . . . . . . . . . . . . . . . 10
+ 2.1.2.1. Approved Attribute . . . . . . . . . . . . . . . 10
+ 2.1.2.2. Ask Attribute . . . . . . . . . . . . . . . . . . 10
+ 2.1.2.3. JID Attribute . . . . . . . . . . . . . . . . . . 11
+ 2.1.2.4. Name Attribute . . . . . . . . . . . . . . . . . 11
+ 2.1.2.5. Subscription Attribute . . . . . . . . . . . . . 11
+ 2.1.2.6. Group Element . . . . . . . . . . . . . . . . . . 12
+ 2.1.3. Roster Get . . . . . . . . . . . . . . . . . . . . . 12
+ 2.1.4. Roster Result . . . . . . . . . . . . . . . . . . . . 13
+ 2.1.5. Roster Set . . . . . . . . . . . . . . . . . . . . . 14
+ 2.1.6. Roster Push . . . . . . . . . . . . . . . . . . . . . 14
+ 2.2. Retrieving the Roster on Login . . . . . . . . . . . . . 16
+ 2.3. Adding a Roster Item . . . . . . . . . . . . . . . . . . 17
+ 2.3.1. Request . . . . . . . . . . . . . . . . . . . . . . . 17
+ 2.3.2. Success Case . . . . . . . . . . . . . . . . . . . . 17
+ 2.3.3. Error Cases . . . . . . . . . . . . . . . . . . . . . 18
+ 2.4. Updating a Roster Item . . . . . . . . . . . . . . . . . 22
+ 2.4.1. Request . . . . . . . . . . . . . . . . . . . . . . . 22
+ 2.4.2. Success Case . . . . . . . . . . . . . . . . . . . . 24
+ 2.4.3. Error Cases . . . . . . . . . . . . . . . . . . . . . 24
+ 2.5. Deleting a Roster Item . . . . . . . . . . . . . . . . . 24
+ 2.5.1. Request . . . . . . . . . . . . . . . . . . . . . . . 24
+ 2.5.2. Success Case . . . . . . . . . . . . . . . . . . . . 25
+ 2.5.3. Error Cases . . . . . . . . . . . . . . . . . . . . . 26
+ 2.6. Roster Versioning . . . . . . . . . . . . . . . . . . . . 26
+ 2.6.1. Stream Feature . . . . . . . . . . . . . . . . . . . 26
+ 2.6.2. Request . . . . . . . . . . . . . . . . . . . . . . . 26
+ 2.6.3. Success Case . . . . . . . . . . . . . . . . . . . . 27
+ 3. Managing Presence Subscriptions . . . . . . . . . . . . . . . 30
+ 3.1. Requesting a Subscription . . . . . . . . . . . . . . . . 30
+ 3.1.1. Client Generation of Outbound Subscription Request . 31
+ 3.1.2. Server Processing of Outbound Subscription Request . 32
+ 3.1.3. Server Processing of Inbound Subscription Request . . 34
+ 3.1.4. Client Processing of Inbound Subscription Request . . 35
+ 3.1.5. Server Processing of Outbound Subscription Approval . 36
+ 3.1.6. Server Processing of Inbound Subscription Approval . 38
+
+
+
+
+Saint-Andre Standards Track [Page 2]
+
+RFC 6121 XMPP IM March 2011
+
+
+ 3.2. Canceling a Subscription . . . . . . . . . . . . . . . . 40
+ 3.2.1. Client Generation of Subscription Cancellation . . . 40
+ 3.2.2. Server Processing of Outbound Subscription
+ Cancellation . . . . . . . . . . . . . . . . . . . . 40
+ 3.2.3. Server Processing of Inbound Subscription
+ Cancellation . . . . . . . . . . . . . . . . . . . . 41
+ 3.3. Unsubscribing . . . . . . . . . . . . . . . . . . . . . . 43
+ 3.3.1. Client Generation of Unsubscribe . . . . . . . . . . 43
+ 3.3.2. Server Processing of Outbound Unsubscribe . . . . . . 43
+ 3.3.3. Server Processing of Inbound Unsubscribe . . . . . . 44
+ 3.4. Pre-Approving a Subscription Request . . . . . . . . . . 46
+ 3.4.1. Client Generation of Subscription Pre-Approval . . . 46
+ 3.4.2. Server Processing of Subscription Pre-Approval . . . 47
+ 4. Exchanging Presence Information . . . . . . . . . . . . . . . 48
+ 4.1. Presence Fundamentals . . . . . . . . . . . . . . . . . . 48
+ 4.2. Initial Presence . . . . . . . . . . . . . . . . . . . . 49
+ 4.2.1. Client Generation of Initial Presence . . . . . . . . 49
+ 4.2.2. Server Processing of Outbound Initial Presence . . . 50
+ 4.2.3. Server Processing of Inbound Initial Presence . . . . 50
+ 4.2.4. Client Processing of Initial Presence . . . . . . . . 51
+ 4.3. Presence Probes . . . . . . . . . . . . . . . . . . . . . 51
+ 4.3.1. Server Generation of Outbound Presence Probe . . . . 52
+ 4.3.2. Server Processing of Inbound Presence Probe . . . . . 53
+ 4.3.2.1. Handling of the 'id' Attribute . . . . . . . . . 55
+ 4.4. Subsequent Presence Broadcast . . . . . . . . . . . . . . 57
+ 4.4.1. Client Generation of Subsequent Presence Broadcast . 57
+ 4.4.2. Server Processing of Subsequent Outbound Presence . . 57
+ 4.4.3. Server Processing of Subsequent Inbound Presence . . 58
+ 4.4.4. Client Processing of Subsequent Presence . . . . . . 59
+ 4.5. Unavailable Presence . . . . . . . . . . . . . . . . . . 59
+ 4.5.1. Client Generation of Unavailable Presence . . . . . . 59
+ 4.5.2. Server Processing of Outbound Unavailable Presence . 59
+ 4.5.3. Server Processing of Inbound Unavailable Presence . . 61
+ 4.5.4. Client Processing of Unavailable Presence . . . . . . 62
+ 4.6. Directed Presence . . . . . . . . . . . . . . . . . . . . 62
+ 4.6.1. General Considerations . . . . . . . . . . . . . . . 62
+ 4.6.2. Client Generation of Directed Presence . . . . . . . 63
+ 4.6.3. Server Processing of Outbound Directed Presence . . . 63
+ 4.6.4. Server Processing of Inbound Directed Presence . . . 64
+ 4.6.5. Client Processing of Inbound Directed Presence . . . 64
+ 4.6.6. Server Processing of Presence Probes . . . . . . . . 64
+ 4.7. Presence Syntax . . . . . . . . . . . . . . . . . . . . . 65
+ 4.7.1. Type Attribute . . . . . . . . . . . . . . . . . . . 65
+ 4.7.2. Child Elements . . . . . . . . . . . . . . . . . . . 66
+ 4.7.2.1. Show Element . . . . . . . . . . . . . . . . . . 66
+ 4.7.2.2. Status Element . . . . . . . . . . . . . . . . . 67
+ 4.7.2.3. Priority Element . . . . . . . . . . . . . . . . 68
+ 4.7.3. Extended Content . . . . . . . . . . . . . . . . . . 69
+
+
+
+Saint-Andre Standards Track [Page 3]
+
+RFC 6121 XMPP IM March 2011
+
+
+ 5. Exchanging Messages . . . . . . . . . . . . . . . . . . . . . 69
+ 5.1. One-to-One Chat Sessions . . . . . . . . . . . . . . . . 69
+ 5.2. Message Syntax . . . . . . . . . . . . . . . . . . . . . 70
+ 5.2.1. To Attribute . . . . . . . . . . . . . . . . . . . . 70
+ 5.2.2. Type Attribute . . . . . . . . . . . . . . . . . . . 71
+ 5.2.3. Body Element . . . . . . . . . . . . . . . . . . . . 73
+ 5.2.4. Subject Element . . . . . . . . . . . . . . . . . . . 74
+ 5.2.5. Thread Element . . . . . . . . . . . . . . . . . . . 75
+ 5.3. Extended Content . . . . . . . . . . . . . . . . . . . . 77
+ 6. Exchanging IQ Stanzas . . . . . . . . . . . . . . . . . . . . 77
+ 7. A Sample Session . . . . . . . . . . . . . . . . . . . . . . 78
+ 8. Server Rules for Processing XML Stanzas . . . . . . . . . . . 84
+ 8.1. General Considerations . . . . . . . . . . . . . . . . . 85
+ 8.2. No 'to' Address . . . . . . . . . . . . . . . . . . . . . 85
+ 8.3. Remote Domain . . . . . . . . . . . . . . . . . . . . . . 85
+ 8.4. Local Domain . . . . . . . . . . . . . . . . . . . . . . 86
+ 8.5. Local User . . . . . . . . . . . . . . . . . . . . . . . 86
+ 8.5.1. No Such User . . . . . . . . . . . . . . . . . . . . 86
+ 8.5.2. localpart@domainpart . . . . . . . . . . . . . . . . 86
+ 8.5.2.1. Available or Connected Resources . . . . . . . . 87
+ 8.5.2.2. No Available or Connected Resources . . . . . . . 89
+ 8.5.3. localpart@domainpart/resourcepart . . . . . . . . . . 90
+ 8.5.3.1. Resource Matches . . . . . . . . . . . . . . . . 90
+ 8.5.3.2. No Resource Matches . . . . . . . . . . . . . . . 90
+ 8.5.4. Summary of Message Delivery Rules . . . . . . . . . . 92
+ 9. Handling of URIs . . . . . . . . . . . . . . . . . . . . . . 93
+ 10. Internationalization Considerations . . . . . . . . . . . . . 94
+ 11. Security Considerations . . . . . . . . . . . . . . . . . . . 94
+ 12. Conformance Requirements . . . . . . . . . . . . . . . . . . 95
+ 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 99
+ 13.1. Normative References . . . . . . . . . . . . . . . . . . 99
+ 13.2. Informative References . . . . . . . . . . . . . . . . . 99
+ Appendix A. Subscription States . . . . . . . . . . . . . . . . 103
+ A.1. Defined States . . . . . . . . . . . . . . . . . . . . . 103
+ A.2. Server Processing of Outbound Presence Subscription
+ Stanzas . . . . . . . . . . . . . . . . . . . . . . . . . 104
+ A.2.1. Subscribe . . . . . . . . . . . . . . . . . . . . . . 105
+ A.2.2. Unsubscribe . . . . . . . . . . . . . . . . . . . . . 105
+ A.2.3. Subscribed . . . . . . . . . . . . . . . . . . . . . 106
+ A.2.4. Unsubscribed . . . . . . . . . . . . . . . . . . . . 106
+ A.3. Server Processing of Inbound Presence Subscription
+ Stanzas . . . . . . . . . . . . . . . . . . . . . . . . . 106
+ A.3.1. Subscribe . . . . . . . . . . . . . . . . . . . . . . 107
+ A.3.2. Unsubscribe . . . . . . . . . . . . . . . . . . . . . 107
+ A.3.3. Subscribed . . . . . . . . . . . . . . . . . . . . . 108
+ A.3.4. Unsubscribed . . . . . . . . . . . . . . . . . . . . 109
+ Appendix B. Blocking Communication . . . . . . . . . . . . . . . 110
+ Appendix C. vCards . . . . . . . . . . . . . . . . . . . . . . . 110
+
+
+
+Saint-Andre Standards Track [Page 4]
+
+RFC 6121 XMPP IM March 2011
+
+
+ Appendix D. XML Schema for jabber:iq:roster . . . . . . . . . . 110
+ Appendix E. Differences From RFC 3921 . . . . . . . . . . . . . 112
+ Appendix F. Acknowledgements . . . . . . . . . . . . . . . . . . 113
+
+1. Introduction
+
+1.1. Overview
+
+ The Extensible Messaging and Presence Protocol (XMPP) is an
+ application profile of the Extensible Markup Language [XML] that
+ enables the near-real-time exchange of structured yet extensible data
+ between any two or more network entities. The core features of XMPP
+ defined in [XMPP-CORE] provide the building blocks for many types of
+ near-real-time applications, which can be layered on top of the core
+ by sending application-specific data qualified by particular XML
+ namespaces (refer to [XML-NAMES]). This document defines XMPP
+ extensions that provide the basic functionality expected of an
+ instant messaging (IM) and presence application as described in
+ [IMP-REQS].
+
+1.2. History
+
+ The basic syntax and semantics of XMPP were developed originally
+ within the Jabber open-source community, mainly in 1999. In late
+ 2002, the XMPP Working Group was chartered with developing an
+ adaptation of the core Jabber protocol that would be suitable as an
+ IETF IM and presence technology in accordance with [IMP-REQS]. In
+ October 2004, [RFC3920] and [RFC3921] were published, representing
+ the most complete definition of XMPP at that time.
+
+ Since 2004 the Internet community has gained extensive implementation
+ and deployment experience with XMPP, including formal
+ interoperability testing carried out under the auspices of the XMPP
+ Standards Foundation (XSF). This document incorporates comprehensive
+ feedback from software developers and service providers, including a
+ number of backward-compatible modifications summarized under
+ Appendix E. As a result, this document reflects the rough consensus
+ of the Internet community regarding the IM and presence features of
+ XMPP 1.0, thus obsoleting RFC 3921.
+
+1.3. Requirements
+
+ Traditionally, IM 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").
+
+
+
+
+
+Saint-Andre Standards Track [Page 5]
+
+RFC 6121 XMPP IM March 2011
+
+
+ 2. The purpose of using such an application is to exchange
+ relatively brief text messages with particular contacts in close
+ to real time -- often relatively large numbers of such messages
+ in rapid succession, in the form of a one-to-one "chat session"
+ as described under Section 5.1.
+
+ 3. The catalyst for exchanging messages is "presence" -- i.e.,
+ information about the network availability of particular contacts
+ (thus knowing who is online and available for a one-to-one chat
+ session).
+
+ 4. Presence information is provided only to contacts that one has
+ authorized by means of an explicit agreement called a "presence
+ subscription".
+
+ Thus at a high level this document assumes that a user needs to be
+ able to complete the following use cases:
+
+ o Manage items in one's contact list
+
+ o Exchange messages with one's contacts
+
+ o Exchange presence information with one's contacts
+
+ o Manage presence subscriptions to and from one's contacts
+
+ Detailed definitions of these functionality areas are contained in
+ RFC 2779 [IMP-REQS], and the interested reader is referred to that
+ document regarding in-depth requirements. Although the XMPP IM and
+ presence extensions specified herein meet the requirements of RFC
+ 2779, 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. Although XMPP protocol extensions addressing many other
+ functionality areas have been defined in the XMPP Standards
+ Foundation's XEP series (e.g., multi-user text chat as specified in
+ [XEP-0045]), such extensions are not specified in this document
+ because they are not mandated by RFC 2779.
+
+ Implementation Note: RFC 2779 stipulates that presence services
+ must be separable from IM services and vice-versa; i.e., it must
+ be possible to use the protocol to provide a presence service, a
+ messaging service, or both. Although the text of this document
+ assumes that implementations and deployments will want to offer a
+ unified IM and presence service, it is not mandatory for an XMPP
+ service to offer both a presence service and a messaging service,
+ and the protocol makes it possible to offer separate and distinct
+
+
+
+
+Saint-Andre Standards Track [Page 6]
+
+RFC 6121 XMPP IM March 2011
+
+
+ services for presence and for messaging. (For example, a
+ presence-only service could return a <service-unavailable/> stanza
+ error if a client attempts to send a <message/> stanza.)
+
+1.4. Functional Summary
+
+ This non-normative section provides a developer-friendly, functional
+ summary of XMPP-based IM and presence features; consult the sections
+ that follow for a normative definition of these features.
+
+ [XMPP-CORE] specifies how an XMPP client connects to an XMPP server.
+ In particular, it specifies the preconditions that need to 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. These
+ preconditions comprise negotiation of the XML stream and include
+ exchange of XML stream headers, optional channel encryption via
+ Transport Layer Security [TLS], mandatory authentication via Simple
+ Authentication and Security Layer [SASL], and binding of a resource
+ to the stream for client addressing. The reader is referred to
+ [XMPP-CORE] for details regarding these preconditions, and knowledge
+ of [XMPP-CORE] is assumed herein.
+
+ Interoperability Note: [RFC3921] specified one additional
+ precondition: formal establishment of an instant messaging and
+ presence session. Implementation and deployment experience has
+ shown that this additional step is unnecessary. However, for
+ backward compatibility an implementation MAY still offer that
+ feature. This enables older software to connect while letting
+ newer software save a round trip.
+
+ Upon fulfillment of the preconditions specified in [XMPP-CORE], an
+ XMPP client has a long-lived XML stream with an XMPP server, which
+ enables the user controlling that client to send and receive a
+ potentially unlimited number of XML stanzas over the stream. Such a
+ stream can be used to exchange messages, share presence information,
+ and engage in structured request-response interactions in close to
+ real time. After negotiation of the XML stream, the typical flow for
+ an instant messaging and presence session is as follows:
+
+ 1. Retrieve one's roster. (See Section 2.2.)
+
+ 2. Send initial presence to the server for broadcast to all
+ subscribed contacts, thus "going online" from the perspective of
+ XMPP communication. (See Section 4.2.)
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 7]
+
+RFC 6121 XMPP IM March 2011
+
+
+ 3. 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.
+ (See Sections 5, 3, 2, and 6.)
+
+ 4. Terminate the session when desired by sending unavailable
+ presence and closing the underlying XML stream. (See
+ Section 4.5.)
+
+1.5. Terminology
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in RFC
+ 2119 [KEYWORDS].
+
+ This document inherits the terminology defined in [XMPP-CORE].
+
+ The terms "automated client" and "interactive client" are to be
+ understood in the sense defined in [TLS-CERTS].
+
+ For convenience, this document employs the term "user" to refer to
+ the owner of an XMPP account; however, account owners need not be
+ humans and can be bots, devices, or other automated applications.
+
+ Several other terms, such as "interested resource", are defined
+ within the body of this document.
+
+ Following the "XML Notation" used in [IRI] to represent characters
+ that cannot be rendered in ASCII-only documents, some examples in
+ this document use the form "&#x...." as a notational device to
+ represent [UNICODE] characters (e.g., the string "&#x0159;" stands
+ for the Unicode character LATIN SMALL LETTER R WITH CARON); this form
+ is definitely not to be sent over the wire in XMPP systems.
+
+ In examples, lines have been wrapped for improved readability,
+ "[...]" means elision, and the following prepended strings are used
+ (these prepended strings are not to be sent over the wire):
+
+ o C: = client
+
+ o CC: = contact's client
+
+ o CS: = contact's server
+
+ o S: = server
+
+ o UC: = user's client
+
+
+
+Saint-Andre Standards Track [Page 8]
+
+RFC 6121 XMPP IM March 2011
+
+
+ o US: = user's server
+
+ Readers need to be aware that the examples are not exhaustive and
+ that, in examples for some protocol flows, the alternate steps shown
+ would not necessarily be triggered by the exact data sent in the
+ previous step; in all cases, the protocol definitions specified in
+ this document or in normatively referenced documents rule over any
+ examples provided here. All examples are fictional and the
+ information exchanged (e.g., usernames and passwords) does not
+ represent any existing users or servers.
+
+2. Managing the Roster
+
+ In XMPP, a user'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 can access roster information from any device. When
+ the user adds items to the roster or modifies existing items, if an
+ error does not occur then the server SHOULD store that data
+ unmodified if at all possible and MUST return the data it has stored
+ when an authorized client requests the roster.
+
+ Security Warning: Because the user's roster can contain
+ confidential data, the server MUST restrict access to this data so
+ that only authorized entities (typically limited to the account
+ owner) are able to retrieve, modify, or delete it.
+
+ RFC 3921 assumed that the only place where a user stores their roster
+ is the server where the user's account is registered and at which the
+ user authenticates for access to the XMPP network. This
+ specification removes that strict coupling of roster storage to
+ account registration and network authentication, with the result that
+ a user could store their roster at another location, or could have
+ multiple rosters that are stored in multiple locations. However, in
+ the absence of implementation and deployment experience with a more
+ flexible roster storage model, this specification retains the
+ terminology of RFC 3921 by using the terms "client" and "server" (and
+ "the roster" instead of "a roster"), rather than coining a new term
+ for "a place where a user stores a roster". Future documents might
+ provide normative rules for non-server roster storage or for the
+ management of multiple rosters, but such rules are out of scope for
+ this document.
+
+2.1. Syntax and Semantics
+
+ Rosters are managed using <iq/> stanzas (see Section 8.2.3 of
+ [XMPP-CORE]), 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 sections.
+
+
+
+Saint-Andre Standards Track [Page 9]
+
+RFC 6121 XMPP IM March 2011
+
+
+2.1.1. Ver Attribute
+
+ The 'ver' attribute is a string that identifies a particular version
+ of the roster information. The value MUST be generated only by the
+ server and MUST be treated by the client as opaque. The server can
+ use any appropriate method for generating the version ID, such as a
+ hash of the roster data or a strictly increasing sequence number.
+
+ Inclusion of the 'ver' attribute is RECOMMENDED.
+
+ Use of the 'ver' attribute is described more fully under Section 2.6.
+
+ Interoperability Note: The 'ver' attribute of the <query/> element
+ was not defined in RFC 3921 and is newly defined in this
+ specification.
+
+2.1.2. Roster Items
+
+ The <query/> element inside a roster set (Section 2.1.5) contains one
+ <item/> child, and a roster result (Section 2.1.4) typically contains
+ multiple <item/> children. Each <item/> element describes a unique
+ "roster item" (sometimes also called a "contact").
+
+ The syntax of the <item/> element is described in the following
+ sections.
+
+2.1.2.1. Approved Attribute
+
+ The boolean 'approved' attribute with a value of "true" is used to
+ signal subscription pre-approval as described under Section 3.4 (the
+ default is "false", in accordance with [XML-DATATYPES]).
+
+ A server SHOULD include the 'approved' attribute to inform the client
+ of subscription pre-approvals. A client MUST NOT include the
+ 'approved' attribute in the roster sets it sends to the server, but
+ instead MUST use presence stanzas of type "subscribed" and
+ "unsubscribed" to manage pre-approvals as described under
+ Section 3.4.
+
+ Interoperability Note: The 'approved' attribute of the <item/>
+ element was not defined in RFC 3921 and is newly defined in this
+ specification.
+
+2.1.2.2. Ask Attribute
+
+ The 'ask' attribute of the <item/> element with a value of
+ "subscribe" is used to signal various subscription sub-states that
+ include a "Pending Out" aspect as described under Section 3.1.2.
+
+
+
+Saint-Andre Standards Track [Page 10]
+
+RFC 6121 XMPP IM March 2011
+
+
+ A server SHOULD include the 'ask' attribute to inform the client of
+ "Pending Out" sub-states. A client MUST NOT include the 'ask'
+ attribute in the roster sets it sends to the server, but instead MUST
+ use presence stanzas of type "subscribe" and "unsubscribe" to manage
+ such sub-states as described under Section 3.1.2.
+
+2.1.2.3. JID Attribute
+
+ The 'jid' attribute of the <item/> element specifies the Jabber
+ Identifier (JID) that uniquely identifies the roster item.
+
+ The 'jid' attribute is REQUIRED whenever a client or server adds,
+ updates, deletes, or returns a roster item.
+
+2.1.2.4. Name Attribute
+
+ The 'name' attribute of the <item/> element specifies the "handle" to
+ be associated with the JID, as determined by the user (not the
+ contact). Although the value of the 'name' attribute MAY have
+ meaning to a human user, it is opaque to the server. However, the
+ 'name' attribute MAY be used by the server for matching purposes
+ within the context of various XMPP extensions (one possible
+ comparison method is that described for XMPP resourceparts in
+ [XMPP-ADDR]).
+
+ It is OPTIONAL for a client to include the 'name' attribute when
+ adding or updating a roster item.
+
+2.1.2.5. Subscription Attribute
+
+ The state of the presence subscription is captured in the
+ 'subscription' attribute of the <item/> element. The defined
+ subscription-related values are:
+
+ none: the user does not have a subscription to the contact's
+ presence, and the contact does not have a subscription to the
+ user's presence; this is the default value, so if the subscription
+ attribute is not included then the state is to be understood as
+ "none"
+
+ to: the user has a subscription to the contact's presence, but the
+ contact does not have a subscription to the user's presence
+
+ from: the contact has a subscription to the user's presence, but the
+ user does not have a subscription to the contact's presence
+
+ both: the user and the contact have subscriptions to each other's
+ presence (also called a "mutual subscription")
+
+
+
+Saint-Andre Standards Track [Page 11]
+
+RFC 6121 XMPP IM March 2011
+
+
+ In a roster result (Section 2.1.4), the client MUST ignore values of
+ the 'subscription' attribute other than "none", "to", "from", or
+ "both".
+
+ In a roster push (Section 2.1.6), the client MUST ignore values of
+ the 'subscription' attribute other than "none", "to", "from", "both",
+ or "remove".
+
+ In a roster set (Section 2.1.5), the 'subscription' attribute MAY be
+ included with a value of "remove", which indicates that the item is
+ to be removed from the roster; in a roster set the server MUST ignore
+ all values of the 'subscription' attribute other than "remove".
+
+ Inclusion of the 'subscription' attribute is OPTIONAL.
+
+2.1.2.6. Group Element
+
+ The <group/> child element specifies a category or "bucket" into
+ which the roster item is to be grouped by a client. An <item/>
+ element MAY contain more than one <group/> element, which means that
+ roster groups are not exclusive. Although the XML character data of
+ the <group/> element MAY have meaning to a human user, it is opaque
+ to the server. However, the <group/> element MAY be used by the
+ server for matching purposes within the context of various XMPP
+ extensions (one possible comparison method is that described for XMPP
+ resourceparts in [XMPP-ADDR]).
+
+ It is OPTIONAL for a client to include the <group/> element when
+ adding or updating a roster item. If a roster set (Section 2.1.5)
+ includes no <group/> element, then the item is to be interpreted as
+ being affiliated with no group.
+
+2.1.3. Roster Get
+
+ A "roster get" is a client's request for the server to return the
+ roster; syntactically it is an IQ stanza of type "get" sent from
+ client to server and containing a <query/> element qualified by the
+ 'jabber:iq:roster' namespace, where the <query/> element MUST NOT
+ contain any <item/> child elements.
+
+ C: <iq from='juliet@example.com/balcony'
+ id='bv1bs71f'
+ type='get'>
+ <query xmlns='jabber:iq:roster'/>
+ </iq>
+
+ The expected outcome of sending a roster get is for the server to
+ return a roster result.
+
+
+
+Saint-Andre Standards Track [Page 12]
+
+RFC 6121 XMPP IM March 2011
+
+
+2.1.4. Roster Result
+
+ A "roster result" is the server's response to a roster get;
+ syntactically it is an IQ stanza of type "result" sent from server to
+ client and containing a <query/> element qualified by the 'jabber:iq:
+ roster' namespace.
+
+ The <query/> element in a roster result contains one <item/> element
+ for each contact and therefore can contain more than one <item/>
+ element.
+
+ S: <iq id='bv1bs71f'
+ to='juliet@example.com/chamber'
+ type='result'>
+ <query xmlns='jabber:iq:roster' ver='ver7'>
+ <item jid='nurse@example.com'/>
+ <item jid='romeo@example.net'/>
+ </query>
+ </iq>
+
+ If the roster exists but there are no contacts in the roster, then
+ the server MUST return an IQ-result containing a child <query/>
+ element that in turn contains no <item/> children (i.e., the server
+ MUST NOT return an empty <iq/> stanza of type "error").
+
+ S: <iq id='bv1bs71f'
+ to='juliet@example.com/chamber'
+ type='result'>
+ <query xmlns='jabber:iq:roster' ver='ver9'/>
+ </iq>
+
+ If the roster does not exist, then the server MUST return a stanza
+ error with a condition of <item-not-found/>.
+
+ S: <iq id='bv1bs71f'
+ to='juliet@example.com/chamber'
+ type='error'>
+ <error type='cancel'>
+ <item-not-found
+ xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
+ </error>
+ </iq>
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 13]
+
+RFC 6121 XMPP IM March 2011
+
+
+2.1.5. Roster Set
+
+ A "roster set" is a client's request for the server to modify (i.e.,
+ create, update, or delete) a roster item; syntactically it is an IQ
+ stanza of type "set" sent from client to server and containing a
+ <query/> element qualified by the 'jabber:iq:roster' namespace.
+
+ The following rules apply to roster sets:
+
+ 1. The <query/> element MUST contain one and only one <item/>
+ element.
+
+ 2. The server MUST ignore any value of the 'subscription' attribute
+ other than "remove" (see Section 2.1.2.5).
+
+ Security Warning: Traditionally, the IQ stanza of the roster set
+ included no 'to' address, with the result that all roster sets
+ were sent from an authenticated resource (full JID) of the account
+ whose roster was being updated. Furthermore, RFC 3921 required a
+ server to perform special-case checking of roster sets to ignore
+ the 'to' address; however, this specification has removed that
+ special-casing, which means that a roster set might include a 'to'
+ address other than that of the sender. Therefore, the entity that
+ processes a roster set MUST verify that the sender of the roster
+ set is authorized to update the roster, and if not return a
+ <forbidden/> error.
+
+ C: <iq from='juliet@example.com/balcony'
+ id='rs1'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='nurse@example.com'/>
+ </query>
+ </iq>
+
+2.1.6. Roster Push
+
+ A "roster push" is a newly created, updated, or deleted roster item
+ that is sent from the server to the client; syntactically it 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 push MUST contain one and only
+ one <item/> element.
+
+
+
+
+
+Saint-Andre Standards Track [Page 14]
+
+RFC 6121 XMPP IM March 2011
+
+
+ 2. A receiving client MUST ignore the stanza unless it has no 'from'
+ attribute (i.e., implicitly from the bare JID of the user's
+ account) or it has a 'from' attribute whose value matches the
+ user's bare JID <user@domainpart>.
+
+ S: <iq id='a78b4q6ha463'
+ to='juliet@example.com/chamber'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='nurse@example.com'/>
+ </query>
+ </iq>
+
+ As mandated by the semantics of the IQ stanza as defined in
+ [XMPP-CORE], each resource that receives a roster push from the
+ server is supposed to reply with an IQ stanza of type "result" or
+ "error" (however, it is known that many existing clients do not reply
+ to roster pushes).
+
+ C: <iq from='juliet@example.com/balcony'
+ id='a78b4q6ha463'
+ type='result'/>
+
+ C: <iq from='juliet@example.com/chamber'
+ id='a78b4q6ha463'
+ type='result'/>
+
+ Security Warning: Traditionally, a roster push included no 'from'
+ address, with the result that all roster pushes were sent
+ implicitly from the bare JID of the account itself. However, this
+ specification allows entities other than the user's server to
+ maintain roster information, which means that a roster push might
+ include a 'from' address other than the bare JID of the user's
+ account. Therefore, the client MUST check the 'from' address to
+ verify that the sender of the roster push is authorized to update
+ the roster. If the client receives a roster push from an
+ unauthorized entity, it MUST NOT process the pushed data; in
+ addition, the client can either return a stanza error of <service-
+ unavailable/> error or refuse to return a stanza error at all (the
+ latter behavior overrides a MUST-level requirement from
+ [XMPP-CORE] for the purpose of preventing a presence leak).
+
+ Implementation Note: There is no error case for client processing
+ of roster pushes; if the server receives an IQ of type "error" in
+ response to a roster push then it SHOULD ignore the error.
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 15]
+
+RFC 6121 XMPP IM March 2011
+
+
+2.2. Retrieving the Roster on Login
+
+ Upon authenticating with a server and binding a resource (thus
+ becoming a connected resource as defined in [XMPP-CORE]), a client
+ SHOULD request the roster before sending initial presence (however,
+ because receiving the roster is not necessarily desirable for all
+ resources, e.g., a connection with limited bandwidth, the client's
+ request for the roster is not mandatory). After a connected resource
+ sends initial presence (see Section 4.2), it is referred to as an
+ "available resource". If a connected resource or available resource
+ requests the roster, it is referred to as an "interested resource".
+ The server MUST send roster pushes to all interested resources.
+
+ Implementation Note: Presence subscription requests are sent to
+ available resources, whereas the roster pushes associated with
+ subscription state changes are sent to interested resources.
+ Therefore, if a resource wishes to receive both subscription
+ requests and roster pushes, it MUST both send initial presence and
+ request the roster.
+
+ A client requests the roster by sending a roster get over its stream
+ with the server.
+
+ C: <iq from='juliet@example.com/balcony'
+ id='hu2bac18'
+ type='get'>
+ <query xmlns='jabber:iq:roster'/>
+ </iq>
+
+
+ S: <iq id='hu2bac18'
+ to='juliet@example.com/balcony'
+ type='result'>
+ <query xmlns='jabber:iq:roster' ver='ver11'>
+ <item jid='romeo@example.net'
+ name='Romeo'
+ subscription='both'>
+ <group>Friends</group>
+ </item>
+ <item jid='mercutio@example.com'
+ name='Mercutio'
+ subscription='from'/>
+ <item jid='benvolio@example.net'
+ name='Benvolio'
+ subscription='both'/>
+ </query>
+ </iq>
+
+
+
+
+Saint-Andre Standards Track [Page 16]
+
+RFC 6121 XMPP IM March 2011
+
+
+ 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 processing
+ or returning the roster).
+
+2.3. Adding a Roster Item
+
+2.3.1. Request
+
+ At any time, a client can add an item to the roster. This is done by
+ sending a roster set containing a new item.
+
+ C: <iq from='juliet@example.com/balcony'
+ id='ph1xaz53'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='nurse@example.com'
+ name='Nurse'>
+ <group>Servants</group>
+ </item>
+ </query>
+ </iq>
+
+2.3.2. Success Case
+
+ If the server can successfully process the roster set for the new
+ item (i.e., if no error occurs), it MUST create the item in the
+ user's roster and proceed as follows.
+
+ The server MUST return an IQ stanza of type "result" to the connected
+ resource that sent the roster set.
+
+ S: <iq id='ph1xaz53'
+ to='juliet@example.com/balcony'
+ type='result'/>
+
+ The server MUST also send a roster push containing the new roster
+ item to all of the user's interested resources, including the
+ resource that generated the roster set.
+
+
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 17]
+
+RFC 6121 XMPP IM March 2011
+
+
+ S: <iq to='juliet@example.com/balcony'
+ id='a78b4q6ha463'
+ type='set'>
+ <query xmlns='jabber:iq:roster' ver='ver13'>
+ <item jid='nurse@example.com'
+ name='Nurse'
+ subscription='none'>
+ <group>Servants</group>
+ </item>
+ </query>
+ </iq>
+
+ S: <iq to='juliet@example.com/chamber'
+ id='x81g3bdy4n19'
+ type='set'>
+ <query xmlns='jabber:iq:roster' ver='ver13'>
+ <item jid='nurse@example.com'
+ name='Nurse'
+ subscription='none'>
+ <group>Servants</group>
+ </item>
+ </query>
+ </iq>
+
+ As mandated by the semantics of the IQ stanza as defined in
+ [XMPP-CORE], each resource that receives a roster push from the
+ server is supposed to reply with an IQ stanza of type "result" or
+ "error" (however, it is known that many existing clients do not reply
+ to roster pushes).
+
+ C: <iq from='juliet@example.com/balcony'
+ id='a78b4q6ha463'
+ type='result'/>
+
+ C: <iq from='juliet@example.com/chamber'
+ id='x81g3bdy4n19'
+ type='result'/>
+
+2.3.3. Error Cases
+
+ If the server cannot successfully process the roster set, it MUST
+ return a stanza error. The following error cases are defined.
+ Naturally, other stanza errors can occur, such as <internal-server-
+ error/> if the server experiences an internal problem with processing
+ the roster get, or even <not-allowed/> if the server only allows
+ roster modifications by means of a non-XMPP method such as a web
+ interface.
+
+
+
+
+Saint-Andre Standards Track [Page 18]
+
+RFC 6121 XMPP IM March 2011
+
+
+ The server MUST return a <forbidden/> stanza error to the client if
+ the sender of the roster set is not authorized to update the roster
+ (where typically only an authenticated resource of the account itself
+ is authorized).
+
+ The server MUST return a <bad-request/> stanza error to the client if
+ the roster set contains any of the following violations:
+
+ 1. The <query/> element contains more than one <item/> child
+ element.
+
+ 2. The <item/> element contains more than one <group/> element, but
+ there are duplicate groups (one possible comparison method for
+ determining duplicates is that described for XMPP resourceparts
+ in [XMPP-ADDR]).
+
+ The server MUST return a <not-acceptable/> stanza error to the client
+ if the roster set contains any of the following violations:
+
+ 1. The length of the 'name' attribute is greater than a server-
+ configured limit.
+
+ 2. The XML character data of the <group/> element is of zero length
+ (to remove an item from all groups, the client instead needs to
+ exclude any <group/> element from the roster set).
+
+ 3. The XML character data of the <group/> element is larger than a
+ server-configured limit.
+
+ Error: Roster set initiated by unauthorized entity
+
+ C: <iq from='juliet@example.com/balcony'
+ id='ix7s53v2'
+ to='romeo@example.net'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='nurse@example.com'/>
+ </query>
+ </iq>
+
+ S: <iq id='ix7s53v2'
+ to='juliet@example.com/balcony'
+ type='error'>
+ <error type='auth'>
+ <forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
+ </error>
+ </iq>
+
+
+
+
+Saint-Andre Standards Track [Page 19]
+
+RFC 6121 XMPP IM March 2011
+
+
+ Error: Roster set contains more than one item
+
+ C: <iq from='juliet@example.com/balcony'
+ id='nw83vcj4'
+ type='set'>
+ <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 id='nw83vcj4'
+ to='juliet@example.com/balcony'
+ type='error'>
+ <error type='modify'>
+ <bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
+ </error>
+ </iq>
+
+ Error: Roster set contains item with oversized handle
+
+ C: <iq from='juliet@example.com/balcony'
+ id='yl491b3d'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='nurse@example.com'
+ name='[ ... some-very-long-handle ... ]'>
+ <group>Servants</group>
+ </item>
+ </query>
+ </iq>
+
+ S: <iq id='yl491b3d'
+ to='juliet@example.com/balcony'
+ type='error'>
+ <error type='modify'>
+ <not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
+ </error>
+ </iq>
+
+ Error: Roster set contains duplicate groups
+
+
+
+
+Saint-Andre Standards Track [Page 20]
+
+RFC 6121 XMPP IM March 2011
+
+
+ C: <iq from='juliet@example.com/balcony'
+ id='tk3va749'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='nurse@example.com'
+ name='Nurse'>
+ <group>Servants</group>
+ <group>Servants</group>
+ </item>
+ </query>
+ </iq>
+
+ S: <iq id='tk3va749'
+ to='juliet@example.com/balcony'
+ type='error'>
+ <error type='modify'>
+ <bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
+ </error>
+ </iq>
+
+ Error: Roster set contains empty group
+
+ C: <iq from='juliet@example.com/balcony'
+ id='fl3b486u'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='nurse@example.com'
+ name='Nurse'>
+ <group></group>
+ </item>
+ </query>
+ </iq>
+
+ S: <iq id='fl3b486u'
+ to='juliet@example.com/balcony'
+ type='error'>
+ <error type='modify'>
+ <not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
+ </error>
+ </iq>
+
+ Error: Roster set contains oversized group name
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 21]
+
+RFC 6121 XMPP IM March 2011
+
+
+ C: <iq from='juliet@example.com/balcony'
+ id='qh3b4v19'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='nurse@example.com'
+ name='Nurse'>
+ <group>[ ... some-very-long-group-name ... ]</group>
+ </item>
+ </query>
+ </iq>
+
+ S: <iq id='qh3b4v19'
+ to='juliet@example.com/balcony'
+ type='error'>
+ <error type='modify'>
+ <not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
+ </error>
+ </iq>
+
+ Interoperability Note: Some servers return a <not-allowed/> stanza
+ error to the client if the value of the <item/> element's 'jid'
+ attribute matches the bare JID <localpart@domainpart> of the
+ user's account.
+
+2.4. Updating a Roster Item
+
+2.4.1. Request
+
+ Updating an existing roster item is done in the same way as adding a
+ new roster item, i.e., by sending a roster set to the server.
+ Because a roster item is atomic, the item MUST be updated exactly as
+ provided in the roster set.
+
+ There are several reasons why a client might update a roster item:
+
+ 1. Adding a group
+
+ 2. Deleting a group
+
+ 3. Changing the handle
+
+ 4. Deleting the handle
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 22]
+
+RFC 6121 XMPP IM March 2011
+
+
+ Consider a roster item that is defined as follows:
+
+ <item jid='romeo@example.net'
+ name='Romeo'>
+ <group>Friends</group>
+ </item>
+
+ The user who has this item in her roster might want to add the item
+ to another group.
+
+ C: <iq from='juliet@example.com/balcony'
+ id='di43b2x9'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='romeo@example.net'
+ name='Romeo'>
+ <group>Friends</group>
+ <group>Lovers</group>
+ </item>
+ </query>
+ </iq>
+
+ Sometime later, the user might want to remove the item from the
+ original group.
+
+ C: <iq from='juliet@example.com/balcony'
+ id='lf72v157'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='romeo@example.net'
+ name='Romeo'>
+ <group>Lovers</group>
+ </item>
+ </query>
+ </iq>
+
+ The user might want to remove the item from all groups.
+
+ C: <iq from='juliet@example.com/balcony'
+ id='ju4b62a5'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='romeo@example.net'/>
+ </query>
+ </iq>
+
+ The user might also want to change the handle for the item.
+
+
+
+
+Saint-Andre Standards Track [Page 23]
+
+RFC 6121 XMPP IM March 2011
+
+
+ C: <iq from='juliet@example.com/balcony'
+ id='gb3sv487'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='romeo@example.net'
+ name='MyRomeo'/>
+ </query>
+ </iq>
+
+ The user might then want to remove the handle altogether.
+
+ C: <iq from='juliet@example.com/balcony'
+ id='o3bx66s5'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='romeo@example.net'
+ name=''/>
+ </query>
+ </iq>
+
+ Implementation Note: Including an empty 'name' attribute is
+ equivalent to including no 'name' attribute; both actions set the
+ name to the empty string.
+
+2.4.2. Success Case
+
+ As with adding a roster item, if the roster item can be successfully
+ processed then the server MUST update the item in the user's roster,
+ send a roster push to all of the user's interested resources, and
+ send an IQ result to the initiating resource; details are provided
+ under Section 2.3.
+
+2.4.3. Error Cases
+
+ The error cases described under Section 2.3.3 also apply to updating
+ a roster item.
+
+2.5. Deleting a Roster Item
+
+2.5.1. Request
+
+ At any time, a client can delete an item from his or her roster by
+ sending a roster set and specifying a value of "remove" for the
+ 'subscription' attribute.
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 24]
+
+RFC 6121 XMPP IM March 2011
+
+
+ C: <iq from='juliet@example.com/balcony'
+ id='hm4hs97y'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='nurse@example.com'
+ subscription='remove'/>
+ </query>
+ </iq>
+
+2.5.2. Success Case
+
+ As with adding a roster item, if the server can successfully process
+ the roster set then it MUST update the item in the user's roster,
+ send a roster push to all of the user's interested resources (with
+ the 'subscription' attribute set to a value of "remove"), and send an
+ IQ result to the initiating resource; details are provided under
+ Section 2.3.
+
+ In addition, the user's server might need to generate one or more
+ subscription-related presence stanzas, as follows:
+
+ 1. If the user has a presence subscription to the contact, then the
+ user's server MUST send a presence stanza of type "unsubscribe"
+ to the contact (in order to unsubscribe from the contact's
+ presence).
+
+ 2. If the contact has a presence subscription to the user, then the
+ user's server MUST send a presence stanza of type "unsubscribed"
+ to the contact (in order to cancel the contact's subscription to
+ the user).
+
+ 3. If the presence subscription is mutual, then the user's server
+ MUST send both a presence stanza of type "unsubscribe" and a
+ presence stanza of type "unsubscribed" to the contact.
+
+
+ S: <presence from='juliet@example.com'
+ id='lm3ba81g'
+ to='nurse@example.com'
+ type='unsubscribe'/>
+
+ S: <presence from='juliet@example.com'
+ id='xb2c1v4k'
+ to='nurse@example.com'
+ type='unsubscribed'/>
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 25]
+
+RFC 6121 XMPP IM March 2011
+
+
+2.5.3. Error Cases
+
+ If the value of the 'jid' attribute specifies an item that is not in
+ the roster, then the server MUST return an <item-not-found/> stanza
+ error.
+
+ Error: Roster item not found
+
+ C: <iq from='juliet@example.com/balcony'
+ id='uj4b1ca8'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='[ ... non-existent-jid ... ]'
+ subscription='remove'/>
+ </query>
+ </iq>
+
+ S: <iq id='uj4b1ca8'
+ to='juliet@example.com/balcony'
+ type='error'>
+ <error type='modify'>
+ <item-not-found
+ xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
+ </error>
+ </iq>
+
+2.6. Roster Versioning
+
+2.6.1. Stream Feature
+
+ If a server supports roster versioning, then it MUST advertise the
+ following stream feature during stream negotiation.
+
+ <ver xmlns='urn:xmpp:features:rosterver'/>
+
+ The roster versioning stream feature is merely informative and
+ therefore is never mandatory-to-negotiate.
+
+2.6.2. Request
+
+ If a client supports roster versioning and the server to which it has
+ connected advertises support for roster versioning as described in
+ the foregoing section, then the client SHOULD include the 'ver'
+ element in its request for the roster. If the server does not
+ advertise support for roster versioning, the client MUST NOT include
+ the 'ver' attribute. If the client includes the 'ver' attribute in
+ its roster get, it sets the attribute's value to the version ID
+ associated with its last cache of the roster.
+
+
+
+Saint-Andre Standards Track [Page 26]
+
+RFC 6121 XMPP IM March 2011
+
+
+ C: <iq from='romeo@example.net/home'
+ id='r1h3vzp7'
+ to='romeo@example.net'
+ type='get'>
+ <query xmlns='jabber:iq:roster' ver='ver14'/>
+ </iq>
+
+ If the client has not yet cached the roster or the cache is lost or
+ corrupted, but the client wishes to bootstrap the use of roster
+ versioning, it MUST set the 'ver' attribute to the empty string
+ (i.e., ver="").
+
+ Naturally, if the client does not support roster versioning or does
+ not wish to bootstrap the use of roster versioning, it will not
+ include the 'ver' attribute.
+
+2.6.3. Success Case
+
+ Whether or not the roster has been modified since the version ID
+ enumerated by the client, the server MUST either return the complete
+ roster as described under Section 2.1.4 (including a 'ver' attribute
+ that signals the latest version) or return an empty IQ-result (thus
+ indicating that any roster modifications will be sent via roster
+ pushes, as described below). In general, unless returning the
+ complete roster would (1) use less bandwidth than sending individual
+ roster pushes to the client (e.g., if the roster contains only a few
+ items) or (2) the server cannot associate the version ID with any
+ previous version it has on file, the server SHOULD send an empty IQ-
+ result and then send the modifications (if any) via roster pushes.
+
+ S: <iq from='romeo@example.net'
+ id='r1h3vzp7'
+ to='romeo@example.net/home'
+ type='result'/>
+
+ Implementation Note: This empty IQ-result is different from an
+ empty <query/> element, thus disambiguating this usage from an
+ empty roster.
+
+ If roster versioning is enabled and the roster has not been modified
+ since the version ID enumerated by the client, the server will simply
+ not send any roster pushes to the client (until and unless some
+ relevant event triggers a roster push during the lifetime of the
+ client's session).
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 27]
+
+RFC 6121 XMPP IM March 2011
+
+
+ If the roster has been modified since the version ID enumerated by
+ the client, the server MUST then send one roster push to the client
+ for each roster item that has been modified since the version ID
+ enumerated by the client. (We call a roster push that is sent for
+ purposes of roster version synchronization an "interim roster push".)
+
+ Definition: A "roster modification" is any change to the roster
+ data that would result in a roster push to a connected client.
+ Therefore, internal states related to roster processing within the
+ server that would not result in a roster push to a connected
+ client do not necessitate a change to the version.
+
+ S: <iq from='romeo@example.net'
+ id='ah382g67'
+ to='romeo@example.net/home'
+ type='set'>
+ <query xmlns='jabber:iq:roster' ver='ver34'>
+ <item jid='tybalt@example.org' subscription='remove'/>
+ </query>
+ </iq>
+
+ S: <iq from='romeo@example.net'
+ id='b2gs90j5'
+ to='romeo@example.net/home'
+ type='set'>
+ <query xmlns='jabber:iq:roster' ver='ver42'>
+ <item jid='bill@example.org' subscription='both'/>
+ </query>
+ </iq>
+
+ S: <iq from='romeo@example.net'
+ id='c73gs419'
+ to='romeo@example.net/home'
+ type='set'>
+ <query xmlns='jabber:iq:roster' ver='ver72'>
+ <item jid='nurse@example.org'
+ name='Nurse'
+ subscription='to'>
+ <group>Servants</group>
+ </item>
+ </query>
+ </iq>
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 28]
+
+RFC 6121 XMPP IM March 2011
+
+
+ S: <iq from='romeo@example.net'
+ id='dh361f35'
+ to='romeo@example.net/home'
+ type='set'>
+ <query xmlns='jabber:iq:roster' ver='ver96'>
+ <item jid='juliet@example.org'
+ name='Juliet'
+ subscription='both'>
+ <group>VIPs</group>
+ </item>
+ </query>
+ </iq>
+
+ These "interim roster pushes" can be understood as follows:
+
+ 1. Imagine that the client had an active presence session for the
+ entire time between its cached roster version (say, "ver14") and
+ the new roster version (say, "ver96").
+
+ 2. During that time, the client might have received roster pushes
+ related to various roster versions (which might have been, say,
+ "ver51" and "ver79"). However, some of those roster pushes might
+ have contained intermediate updates to the same roster item
+ (e.g., modifications to the subscription state for
+ bill@example.org from "none" to "to" and from "to" to "both").
+
+ 3. The interim roster pushes would not include all of the
+ intermediate steps, only the final result of all modifications
+ applied to each item while the client was in fact offline (which
+ might have been, say, "ver34", "ver42", "ver72", and "ver96").
+
+ The client MUST handle an "interim roster push" in the same way it
+ handles any roster push (indeed, from the client's perspective it
+ cannot tell the difference between an "interim" roster push and a
+ "live" roster push and therefore it has no way of knowing when it has
+ received all of the interim roster pushes). When requesting the
+ roster after reconnection, the client SHOULD request the version
+ associated with the last roster push it received during its previous
+ session, not the version associated with the roster result it
+ received at the start of its previous session.
+
+ When roster versioning is enabled, the server MUST include the
+ updated roster version with each roster push. Roster pushes MUST
+ occur in order of modification and the version contained in a roster
+ push MUST be unique. Even if the client has not included the 'ver'
+ attribute in its roster gets or sets, the server SHOULD include the
+ 'ver' attribute on all roster pushes and results that it sends to the
+ client.
+
+
+
+Saint-Andre Standards Track [Page 29]
+
+RFC 6121 XMPP IM March 2011
+
+
+ Implementation Note: Guidelines and more detailed examples for
+ roster versioning are provided in [XEP-0237].
+
+3. Managing Presence Subscriptions
+
+ In order to protect the privacy of XMPP users, presence information
+ is disclosed only to other entities that a user has approved. When a
+ user has agreed that another entity is allowed to view its presence,
+ the entity is said to have a "subscription" to the user's presence.
+ An entity that has a subscription to a user's presence or to which a
+ user has a presence subscription is called a "contact" (in this
+ document the term "contact" is also used in a less strict sense to
+ refer to a potential contact or any item in a user's roster).
+
+ In XMPP, a subscription lasts across presence sessions; indeed, it
+ lasts until the contact unsubscribes or the user cancels the
+ previously granted subscription. (This model is different from that
+ used for presence subscriptions in the Session Initiation Protocol
+ (SIP), as defined in [SIP-PRES].)
+
+ Subscriptions are managed within XMPP by sending presence stanzas
+ containing specially defined attributes ("subscribe", "unsubscribe",
+ "subscribed", and "unsubscribed").
+
+ Implementation Note: When a server processes or generates an
+ outbound presence stanza of type "subscribe", "subscribed",
+ "unsubscribe", or "unsubscribed", the server MUST stamp the
+ outgoing presence stanza with the bare JID <localpart@domainpart>
+ of the sending entity, not the full JID
+ <localpart@domainpart/resourcepart>. Enforcement of this rule
+ simplifies the presence subscription model and helps to prevent
+ presence leaks; for information about presence leaks, refer to the
+ security considerations of [XMPP-CORE].
+
+ Subscription states are reflected in the rosters of both the user and
+ the contact. This section does not cover every possible case related
+ to presence subscriptions, and mainly narrates the protocol flows for
+ bootstrapping a mutual subscription between a user and a contact.
+ Complete details regarding subscription states can be found under
+ Appendix A.
+
+3.1. Requesting a Subscription
+
+ A "subscription request" is a request from a user for authorization
+ to permanently subscribe to a contact's presence information;
+ syntactically it is a presence stanza whose 'type' attribute has a
+ value of "subscribe". A subscription request is generated by a
+
+
+
+
+Saint-Andre Standards Track [Page 30]
+
+RFC 6121 XMPP IM March 2011
+
+
+ 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.
+
+ Implementation Note: Presence subscription requests are sent to
+ available resources, whereas the roster pushes associated with
+ subscription state changes are sent to interested resources.
+ Therefore, if a resource wishes to receive both subscription
+ requests and roster pushes, it MUST both send initial presence and
+ request the roster.
+
+3.1.1. Client Generation of Outbound Subscription Request
+
+ A user's client generates a subscription request by sending a
+ presence stanza of type "subscribe" and specifying a 'to' address of
+ the potential contact's bare JID <contact@domainpart>.
+
+ UC: <presence id='xk3h1v69'
+ to='juliet@example.com'
+ type='subscribe'/>
+
+ When a user sends a presence subscription request to a potential
+ instant messaging and presence contact, the value of the 'to'
+ attribute MUST be a bare JID <contact@domainpart> rather than a full
+ JID <contact@domainpart/resourcepart>, since the desired result is
+ for the user to receive presence from all of the contact's resources,
+ not merely the particular resource specified in the 'to' attribute.
+ Use of bare JIDs also simplifies subscription processing, presence
+ probes, and presence notifications by the user's server and the
+ contact's server.
+
+ For tracking purposes, a client SHOULD include an 'id' attribute in a
+ presence subscription request.
+
+ Implementation Note: Many XMPP clients prompt the user for
+ information about the potential contact (e.g., "handle" and
+ desired roster group) when generating an outbound presence
+ subscription request and therefore send a roster set before
+ sending the outbound presence subscription request. This behavior
+ is OPTIONAL, because a client MAY instead wait until receiving the
+ initial roster push from the server before uploading user-provided
+ information about the contact. A server MUST process a roster set
+ and outbound presence subscription request in either order (i.e.,
+ in whatever order generated by the client).
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 31]
+
+RFC 6121 XMPP IM March 2011
+
+
+3.1.2. Server Processing of Outbound Subscription Request
+
+ Upon receiving the outbound presence subscription request, the user's
+ server MUST proceed as follows.
+
+ 1. Before processing the request, the user's server MUST check the
+ syntax of the JID contained in the 'to' attribute (however, it is
+ known that some existing implementations do not perform this
+ check). If the JID is of the form
+ <contact@domainpart/resourcepart> instead of
+ <contact@domainpart>, the user's server SHOULD treat it as if the
+ request had been directed to the contact's bare JID and modify
+ the 'to' address accordingly. The server MAY also verify that
+ the JID adheres to the format defined in [XMPP-ADDR] and possibly
+ return a <jid-malformed/> stanza error.
+
+ 2. If the potential contact is hosted on the same server as the
+ user, then the server MUST adhere to the rules specified under
+ Section 3.1.3 when processing the subscription request and
+ delivering it to the (local) contact.
+
+ 3. If the potential contact is hosted on a remote server, subject to
+ local service policies the user's server MUST then route the
+ stanza to that remote domain in accordance with core XMPP stanza
+ processing rules. (This can result in returning an appropriate
+ stanza error to the user, such as <remote-server-timeout/>.)
+
+ As mentioned, before locally delivering or remotely routing the
+ presence subscription request, the user's server MUST stamp the
+ outbound subscription request with the bare JID <user@domainpart> of
+ the user.
+
+ US: <presence from='romeo@example.net'
+ id='xk3h1v69'
+ to='juliet@example.com'
+ type='subscribe'/>
+
+ If the presence subscription request cannot be locally delivered or
+ remotely routed (e.g., because the request is malformed, the local
+ contact does not exist, the remote server does not exist, an attempt
+ to contact the remote server times out, or any other error is
+ determined or experienced by the user's server), then the user's
+ server MUST return an appropriate error stanza to the user. An
+ example follows.
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 32]
+
+RFC 6121 XMPP IM March 2011
+
+
+ US: <presence from='juliet@example.com'
+ id='xk3h1v69'
+ to='romeo@example.net'
+ type='error'>
+ <error type='modify'>
+ <remote-server-not-found
+ xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
+ </error>
+ </presence>
+
+ After locally delivering or remotely routing the presence
+ subscription request, the user's server MUST then send a roster push
+ to all of the user's interested resources, containing the potential
+ contact with a subscription state of "none" and with notation that
+ the subscription is pending (via an 'ask' attribute whose value is
+ "subscribe").
+
+ US: <iq id='b89c5r7ib574'
+ to='romeo@example.net/foo'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item ask='subscribe'
+ jid='juliet@example.com'
+ subscription='none'/>
+ </query>
+ </iq>
+
+ US: <iq id='b89c5r7ib575'
+ to='romeo@example.net/bar'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item ask='subscribe'
+ jid='juliet@example.com'
+ subscription='none'/>
+ </query>
+ </iq>
+
+ If a remote contact does not approve or deny the subscription request
+ within some configurable amount of time, the user's server SHOULD
+ resend the subscription request to the contact based on an
+ implementation-specific algorithm (e.g., whenever a new resource
+ becomes available for the user, or after a certain amount of time has
+ elapsed); this helps to recover from transient, silent errors that
+ might have occurred when the original subscription request was routed
+ to the remote domain. When doing so, it is RECOMMENDED for the
+ server to include an 'id' attribute so that it can track responses to
+ the resent subscription request.
+
+
+
+
+Saint-Andre Standards Track [Page 33]
+
+RFC 6121 XMPP IM March 2011
+
+
+3.1.3. Server Processing of Inbound Subscription Request
+
+ Before processing the inbound presence subscription request, the
+ contact's server SHOULD check the syntax of the JID contained in the
+ 'to' attribute. If the JID is of the form
+ <contact@domainpart/resourcepart> instead of <contact@domainpart>,
+ the contact's server SHOULD treat it as if the request had been
+ directed to the contact's bare JID and modify the 'to' address
+ accordingly. The server MAY also verify that the JID adheres to the
+ format defined in [XMPP-ADDR] and possibly return a <jid-malformed/>
+ stanza error.
+
+ When processing the inbound presence subscription request, the
+ contact's server MUST adhere to the following rules:
+
+ 1. Above all, the contact's server MUST NOT automatically approve
+ subscription requests on the contact's behalf -- unless the
+ contact has (a) pre-approved subscription requests from the user
+ as described under Section 3.4, (b) configured its account to
+ automatically approve subscription requests, or (c) accepted an
+ agreement with its service provider that allows automatic
+ approval (for instance, via an employment agreement within an
+ enterprise deployment). Instead, if a subscription request
+ requires approval then the contact's server MUST deliver that
+ request to the contact's available resource(s) for approval or
+ denial by the contact.
+
+ 2. If the contact exists and the user already has a subscription to
+ the contact's presence, then the contact's server MUST auto-reply
+ on behalf of the contact by sending a presence stanza of type
+ "subscribed" from the contact's bare JID to the user's bare JID.
+ Likewise, if the contact previously sent a presence stanza of
+ type "subscribed" and the contact's server treated that as
+ indicating "pre-approval" for the user's presence subscription
+ (see Section 3.4), then the contact's server SHOULD also auto-
+ reply on behalf of the contact.
+
+ CS: <presence from='juliet@example.com'
+ id='xk3h1v69'
+ to='romeo@example.net'
+ type='subscribed'/>
+
+ 3. Otherwise, if there is at least one available resource associated
+ with the contact when the subscription request is received by the
+ contact's server, then the contact's server MUST send that
+ subscription request to all available resources in accordance
+ with Section 8. As a way of acknowledging receipt of the
+ presence subscription request, the contact's server MAY send a
+
+
+
+Saint-Andre Standards Track [Page 34]
+
+RFC 6121 XMPP IM March 2011
+
+
+ presence stanza of type "unavailable" from the bare JID of the
+ contact to the bare JID of the user (the user's client MUST NOT
+ assume that this acknowledgement provides presence information
+ about the contact, since it comes from the contact's bare JID and
+ is received before the subscription request has been approved).
+
+ 4. Otherwise, if the contact has no available resources when the
+ subscription request is received by the contact's server, then
+ the contact's server MUST keep a record of the complete presence
+ stanza comprising the subscription request, including any
+ extended content contained therein (see Section 8.4 of
+ [XMPP-CORE]), and then deliver the request when the contact next
+ has an available resource. The contact's server MUST continue to
+ deliver the subscription request whenever the contact creates an
+ available resource, until the contact either approves or denies
+ the request. (The contact's server MUST NOT deliver more than
+ one subscription request from any given user when the contact
+ next has an available resource; e.g., if the user sends multiple
+ subscription requests to the contact while the contact is
+ offline, the contact's server SHOULD store only one of those
+ requests, such as the first request or last request, and MUST
+ deliver only one of the requests when the contact next has an
+ available resource; this helps to prevent "subscription request
+ spam".)
+
+ Security Warning: Until and unless the contact approves the
+ subscription request as described under Section 3.1.4, the
+ contact's server MUST NOT add an item for the user to the
+ contact's roster.
+
+ Security Warning: The mandate for the contact's server to store
+ the complete stanza of the presence subscription request
+ introduces the possibility of an application resource exhaustion
+ attack (see Section 2.1.2 of [DOS]), for example, by a rogue
+ server or a coordinated group of users (e.g., a botnet) against
+ the contact's server or particular contact. Server implementers
+ are advised to consider the possibility of such attacks and
+ provide tools for counteracting it, such as enabling service
+ administrators to set limits on the number or size of inbound
+ presence subscription requests that the server will store in
+ aggregate or for any given contact.
+
+3.1.4. Client Processing of Inbound Subscription Request
+
+ When an interactive client receives a subscription request, it MUST
+ present the request to the natural person controlling the client
+ (i.e., the "contact") for approval, unless the contact has explicitly
+ configured the client to automatically approve or deny some or all
+
+
+
+Saint-Andre Standards Track [Page 35]
+
+RFC 6121 XMPP IM March 2011
+
+
+ subscription requests as described above. An automated client that
+ is not controlled by a natural person will have its own application-
+ specific rules for approving or denying subscription requests.
+
+ A client approves a subscription request by sending a presence stanza
+ of type "subscribed", which is processed as described under
+ Section 3.1.5 for the contact's server and Section 3.1.6 for the
+ user's server.
+
+ CC: <presence id='h4v1c4kj'
+ to='romeo@example.net'
+ type='subscribed'/>
+
+ A client denies a subscription request by sending a presence stanza
+ of type "unsubscribed", which is processed as described under
+ Section 3.2 for both the contact's server and the user's server.
+
+ CC: <presence id='tb2m1b59'
+ to='romeo@example.net'
+ type='unsubscribed'/>
+
+ For tracking purposes, a client SHOULD include an 'id' attribute in a
+ subscription approval or subscription denial; this 'id' attribute
+ MUST NOT mirror the 'id' attribute of the subscription request.
+
+3.1.5. Server Processing of Outbound Subscription Approval
+
+ When the contact's client sends the subscription approval, the
+ contact's server MUST stamp the outbound stanza with the bare JID
+ <contact@domainpart> of the contact and locally deliver or remotely
+ route the stanza to the user.
+
+ CS: <presence from='juliet@example.com'
+ id='h4v1c4kj'
+ to='romeo@example.net'
+ type='subscribed'/>
+
+ The contact's server then MUST send an updated roster push to all of
+ the contact's interested resources, with the 'subscription' attribute
+ set to a value of "from". (Here we assume that the contact does not
+ already have a subscription to the user; if that were the case, the
+ 'subscription' attribute would be set to a value of "both", as
+ explained under Appendix A.)
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 36]
+
+RFC 6121 XMPP IM March 2011
+
+
+ CS: <iq id='a78b4q6ha463'
+ to='juliet@example.com/balcony'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='romeo@example.net'
+ subscription='from'/>
+ </query>
+ </iq>
+
+ CS: <iq id='x81g3bdy4n19'
+ to='juliet@example.com/chamber'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='romeo@example.net'
+ subscription='from'/>
+ </query>
+ </iq>
+
+ From the perspective of the contact, there now exists a subscription
+ from the user, which is why the 'subscription' attribute is set to a
+ value of "from". (Here we assume that the contact does not already
+ have a subscription to the user; if that were the case, the
+ 'subscription' attribute would be set to a value of "both", as
+ explained under Appendix A.)
+
+ The contact's server MUST then also send current presence to the user
+ from each of the contact's available resources.
+
+ CS: <presence from='juliet@example.com/balcony'
+ id='pw72bc5j'
+ to='romeo@example.net'/>
+
+ CS: <presence from='juliet@example.com/chamber'
+ id='ux31da4q'
+ to='romeo@example.net'/>
+
+ In order to subscribe to the user's presence, the contact would then
+ need to send a subscription request to the user. (XMPP clients will
+ often automatically send the subscription request instead of
+ requiring the contact to initiate the subscription request, since it
+ is assumed that the desired end state is a mutual subscription.)
+ Naturally, when the contact sends a subscription request to the user,
+ the subscription states will be different from those shown in the
+ foregoing examples (see Appendix A) and the roles will be reversed.
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 37]
+
+RFC 6121 XMPP IM March 2011
+
+
+3.1.6. Server Processing of Inbound Subscription Approval
+
+ When the user's server receives a subscription approval, it MUST
+ first check if the contact is in the user's roster with
+ subscription='none' or subscription='from' and the 'ask' flag set to
+ "subscribe" (i.e., a subscription state of "None + Pending Out",
+ "None + Pending Out+In", or "From + Pending Out"; see Appendix A).
+ If this check is successful, then the user's server MUST:
+
+ 1. Deliver the inbound subscription approval to all of the user's
+ interested resources (this helps to give the user's client(s)
+ proper context regarding the subscription approval so that they
+ can differentiate between a roster push originated by another of
+ the user's resources and a subscription approval received from
+ the contact). This MUST occur before sending the roster push
+ described in the next step.
+
+ US: <presence from='juliet@example.com'
+ id='h4v1c4kj'
+ to='romeo@example.net'
+ type='subscribed'/>
+
+ 2. 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 "to" (if the
+ subscription state was "None + Pending Out" or "None + Pending
+ Out+In") or "both" (if the subscription state was "From + Pending
+ Out").
+
+ US: <iq id='b89c5r7ib576'
+ to='romeo@example.net/foo'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='juliet@example.com'
+ subscription='to'/>
+ </query>
+ </iq>
+
+ US: <iq id='b89c5r7ib577'
+ to='romeo@example.net/bar'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='juliet@example.com'
+ subscription='to'/>
+ </query>
+ </iq>
+
+
+
+
+
+Saint-Andre Standards Track [Page 38]
+
+RFC 6121 XMPP IM March 2011
+
+
+ 3. The user's server MUST also deliver the available presence stanza
+ received from each of the contact's available resources to each
+ of the user's available resources.
+
+ [ ... to resource1 ... ]
+
+ US: <presence from='juliet@example.com/balcony'
+ id='pw72bc5j'
+ to='romeo@example.net'/>
+
+ [ ... to resource2 ... ]
+
+ US: <presence from='juliet@example.com/balcony'
+ id='pw72bc5j'
+ to='romeo@example.net'/>
+
+ [ ... to resource1 ... ]
+
+ US: <presence from='juliet@example.com/chamber'
+ id='ux31da4q'
+ to='romeo@example.net'/>
+
+ [ ... to resource2 ... ]
+
+ US: <presence from='juliet@example.com/chamber'
+ id='ux31da4q'
+ to='romeo@example.net'/>
+
+ Implementation Note: If the user's account has no available
+ resources when the inbound subscription approval notification is
+ received, the user's server MAY keep a record of the notification
+ (ideally the complete presence stanza) and then deliver the
+ notification when the account next has an available resource.
+ This behavior provides more complete signaling to the user
+ regarding the reasons for the roster change that occurred while
+ the user was offline.
+
+ Otherwise -- that is, if the user does not exist, if the contact is
+ not in the user's roster, or if the contact is in the user's roster
+ with a subscription state other than those described in the foregoing
+ check -- then the user's server MUST silently ignore the subscription
+ approval notification by not delivering it to the user, not modifying
+ the user's roster, and not generating a roster push to the user's
+ interested resources.
+
+ From the perspective of the user, there now exists a subscription to
+ the contact's presence (which is why the 'subscription' attribute is
+ set to a value of "to").
+
+
+
+Saint-Andre Standards Track [Page 39]
+
+RFC 6121 XMPP IM March 2011
+
+
+3.2. Canceling 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, to cancel a subscription pre-approval
+ (Section 3.4), or to deny a subscription request, it sends a presence
+ stanza of type "unsubscribed".
+
+ CC: <presence id='ij5b1v7g'
+ to='romeo@example.net'
+ type='unsubscribed'/>
+
+3.2.2. Server Processing of Outbound Subscription Cancellation
+
+ Upon receiving the outbound subscription cancellation, the contact's
+ server MUST proceed as follows.
+
+ 1. If the user's bare JID is not yet in the contact's roster or is
+ in the contact's roster with a state of "None", "None + Pending
+ Out", or "To", the contact's server SHOULD NOT route or deliver
+ the presence stanza of type "unsubscribed" to the user and MUST
+ NOT send presence notifications of type "unavailable" to the user
+ as described below.
+
+ 2. If the user's bare JID is in the contact's roster with a state of
+ "None", "None + Pending Out", or "To" and the 'approved' flag is
+ set to "true" (thus signaling a subscription pre-approval as
+ described under Section 3.4), the contact's server MUST remove
+ the pre-approval and MUST NOT route or deliver the presence
+ stanza of type "unsubscribed" to the user.
+
+ 3. Otherwise, as shown in the following examples, the contact's
+ server MUST route or deliver both presence notifications of type
+ "unavailable" and presence stanzas of type "unsubscribed" to the
+ user and MUST send a roster push to the contact.
+
+ While the user is still subscribed to the contact's presence (i.e.,
+ before the contact's server routes or delivers the presence stanza of
+ type "unsubscribed" to the user), the contact's server MUST send a
+ presence stanza of type "unavailable" from all of the contact's
+ online resources to the user.
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 40]
+
+RFC 6121 XMPP IM March 2011
+
+
+ CS: <presence from='juliet@example.com/balcony'
+ id='i8bsg3h3'
+ type='unavailable'/>
+
+ CS: <presence from='juliet@example.com/chamber'
+ id='bvx2c9mk'
+ type='unavailable'/>
+
+ Then the contact's server MUST route or deliver the presence stanza
+ of type "unsubscribed" to the user, making sure to stamp the outbound
+ subscription cancellation with the bare JID <contact@domainpart> of
+ the contact.
+
+ CS: <presence from='juliet@example.com'
+ id='ij5b1v7g'
+ to='romeo@example.net'
+ type='unsubscribed'/>
+
+ The contact's server then MUST send a roster push with the updated
+ roster item to all of the contact's interested resources, where the
+ subscription state is now either "none" or "to" (see Appendix A).
+
+ CS: <iq id='pw3f2v175b34'
+ to='juliet@example.com/balcony'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='romeo@example.net'
+ subscription='none'/>
+ </query>
+ </iq>
+
+ CS: <iq id='zu2y3f571v35'
+ to='juliet@example.com/chamber'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='romeo@example.net'
+ subscription='none'/>
+ </query>
+ </iq>
+
+3.2.3. Server Processing of Inbound Subscription Cancellation
+
+ When the user's server receives the inbound subscription
+ cancellation, it MUST first check if the contact is in the user's
+ roster with subscription='to' or subscription='both' (see
+ Appendix A). If this check is successful, then the user's server
+ MUST:
+
+
+
+
+Saint-Andre Standards Track [Page 41]
+
+RFC 6121 XMPP IM March 2011
+
+
+ 1. Deliver the inbound subscription cancellation to all of the
+ user's interested resources (this helps to give the user's
+ client(s) proper context regarding the subscription cancellation
+ so that they can differentiate between a roster push originated
+ by another of the user's resources and a subscription
+ cancellation received from the contact). This MUST occur before
+ sending the roster push described in the next step.
+
+ US: <presence from='juliet@example.com'
+ id='ij5b1v7g'
+ to='romeo@example.net'
+ type='unsubscribed'/>
+
+ 2. 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
+ subscription state was "To" or "To + Pending In") or "from" (if
+ the subscription state was "Both").
+
+ US: <iq id='h37h3u1bv400'
+ to='romeo@example.net/foo'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='juliet@example.com'
+ subscription='none'/>
+ </query>
+ </iq>
+
+ US: <iq id='h37h3u1bv401'
+ to='romeo@example.net/bar'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='juliet@example.com'
+ subscription='none'/>
+ </query>
+ </iq>
+
+ The user's server MUST also deliver the inbound presence stanzas of
+ type "unavailable".
+
+ Implementation Note: If the user's account has no available
+ resources when the inbound unsubscribed notification is received,
+ the user's server MAY keep a record of the notification (ideally
+ the complete presence stanza) and then deliver the notification
+ when the account next has an available resource. This behavior
+ provides more complete signaling to the user regarding the reasons
+ for the roster change that occurred while the user was offline.
+
+
+
+
+Saint-Andre Standards Track [Page 42]
+
+RFC 6121 XMPP IM March 2011
+
+
+ Otherwise -- that is, if the user does not exist, if the contact is
+ not in the user's roster, or if the contact is in the user's roster
+ with a subscription state other than those described in the foregoing
+ check -- then the user's server MUST silently ignore the unsubscribed
+ notification by not delivering it to the user, not modifying the
+ user's roster, and not generating a roster push to the user's
+ interested resources.
+
+3.3. Unsubscribing
+
+3.3.1. Client Generation of Unsubscribe
+
+ If a user would like to unsubscribe from a contact's presence, it
+ sends a presence stanza of type "unsubscribe".
+
+ UC: <presence id='ul4bs71n'
+ to='juliet@example.com'
+ type='unsubscribe'/>
+
+3.3.2. Server Processing of Outbound Unsubscribe
+
+ Upon receiving the outbound unsubscribe, the user's server MUST
+ proceed as follows.
+
+ 1. If the contact is hosted on the same server as the user, then the
+ server MUST adhere to the rules specified under Section 3.3.3
+ when processing the subscription request.
+
+ 2. If the contact is hosted on a remote server, subject to local
+ service policies the user's server MUST then route the stanza to
+ that remote domain in accordance with core XMPP stanza processing
+ rules. (This can result in returning an appropriate stanza error
+ to the user, such as <remote-server-timeout/>.)
+
+ As mentioned, before locally delivering or remotely routing the
+ unsubscribe, the user's server MUST stamp the stanza with the bare
+ JID <user@domainpart> of the user.
+
+ US: <presence from='romeo@example.net'
+ id='ul4bs71n'
+ to='juliet@example.com'
+ type='unsubscribe'/>
+
+ The user's server then MUST send a roster push with the updated
+ roster item to all of the user's interested resources, where the
+ subscription state is now either "none" or "from" (see Appendix A).
+
+
+
+
+
+Saint-Andre Standards Track [Page 43]
+
+RFC 6121 XMPP IM March 2011
+
+
+ US: <iq id='h37h3u1bv402'
+ to='romeo@example.net/foo'
+ type='set'>
+ <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'/>
+ </query>
+ </iq>
+
+3.3.3. Server Processing of Inbound Unsubscribe
+
+ When the contact's server receives the unsubscribe notification, it
+ MUST first check if the user's bare JID is in the contact's roster
+ with subscription='from' or subscription='both' (i.e., a subscription
+ state of "From", "From + Pending Out", or "Both"; see Appendix A).
+ If this check is successful, then the contact's server MUST:
+
+ 1. Deliver the inbound unsubscribe to all of the contact's
+ interested resources (this helps to give the contact's client(s)
+ proper context regarding the unsubscribe so that they can
+ differentiate between a roster push originated by another of the
+ contact's resources and an unsubscribe received from the user).
+ This MUST occur before sending the roster push described in the
+ next step.
+
+ CS: <presence from='romeo@example.net'
+ id='ul4bs71n'
+ to='juliet@example.com'
+ type='unsubscribe'/>
+
+ 2. Initiate a roster push to all of the contact's interested
+ resources, containing an updated roster item for the user with
+ the 'subscription' attribute set to a value of "none" (if the
+ subscription state was "From" or "From + Pending Out") or "to"
+ (if the subscription state was "Both").
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 44]
+
+RFC 6121 XMPP IM March 2011
+
+
+ CS: <iq id='tn2b5893g1s4'
+ to='juliet@example.com/balcony'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='romeo@example.net'
+ subscription='none'/>
+ </query>
+ </iq>
+
+ CS: <iq id='sp3b56n27hrp'
+ to='juliet@example.com/chamber'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='romeo@example.net'
+ subscription='none'/>
+ </query>
+ </iq>
+
+ 3. Generate an outbound presence stanza of type "unavailable" from
+ each of the contact's available resources to the user.
+
+ CS: <presence from='juliet@example.com/balcony'
+ id='o5v91w49'
+ to='romeo@example.net'
+ type='unavailable'/>
+
+ CS: <presence from='juliet@example.com/chamber'
+ id='n6b1c37k'
+ to='romeo@example.net'
+ type='unavailable'/>
+
+ Implementation Note: If the contact's account has no available
+ resources when the inbound unsubscribe notification is received,
+ the contact's server MAY keep a record of the notification
+ (ideally the complete presence stanza) and then deliver the
+ notification when the account next has an available resource.
+ This behavior provides more complete signaling to the user
+ regarding the reasons for the roster change that occurred while
+ the user was offline.
+
+ Otherwise -- that is, if the contact does not exist, if the user is
+ not in the contact's roster, or if the user's bare JID is in the
+ contact's roster with a subscription state other than those described
+ in the foregoing check -- then the contact's server MUST silently
+ ignore the unsubscribe stanza by not delivering it to the contact,
+ not modifying the contact's roster, and not generating a roster push
+ to the contact's interested resources. However, if the contact's
+ server is keeping track of an inbound presence subscription request
+
+
+
+Saint-Andre Standards Track [Page 45]
+
+RFC 6121 XMPP IM March 2011
+
+
+ from the user to the contact but the user is not yet in the contact's
+ roster (functionally equivalent to a subscription state of "None +
+ Pending In" where the contact never added the user to the contact's
+ roster), then the contact's server MUST simply remove any record of
+ the inbound presence subscription request (it cannot remove the user
+ from the contact's roster because the user was never added to the
+ contact's roster).
+
+ Implementation Note: The user's client MUST NOT depend on
+ receiving the unavailable presence notification from the contact,
+ since it MUST consider its presence subscription to the contact,
+ and its presence information about the contact, to be null and
+ void when it sends the presence stanza of type "unsubscribe" or
+ when it receives the roster push triggered by the unsubscribe
+ request.
+
+3.4. Pre-Approving a Subscription Request
+
+ If a user has not received a subscription request from a contact, the
+ user can "pre-approve" such a request so that it will be
+ automatically approved by the user's server.
+
+ Support for subscription pre-approvals is OPTIONAL on the part of
+ clients and servers. If a server supports subscription pre-
+ approvals, then it MUST advertise the following stream feature during
+ stream negotiation.
+
+ <sub xmlns='urn:xmpp:features:pre-approval'/>
+
+ The subscription pre-approval stream feature is merely informative
+ and therefore is never mandatory-to-negotiate.
+
+3.4.1. Client Generation of Subscription Pre-Approval
+
+ If the server to which a client connects has advertised support for
+ subscription pre-approvals, the client MAY generate a subscription
+ pre-approval by sending a presence stanza of type "subscribed" to the
+ contact.
+
+ UC: <presence id='pg81vx64'
+ to='juliet@example.com'
+ type='subscribed'/>
+
+ If the server does not advertise support for subscription pre-
+ approvals, the client MUST NOT attempt to pre-approve subscription
+ requests from potential or actual contacts.
+
+
+
+
+
+Saint-Andre Standards Track [Page 46]
+
+RFC 6121 XMPP IM March 2011
+
+
+3.4.2. Server Processing of Subscription Pre-Approval
+
+ Upon receiving the presence stanza of type "subscribed", the user's
+ server MUST proceed as follows if it supports subscription pre-
+ approvals.
+
+ 1. If the contact is in the user's roster with a state of "Both",
+ "From", or "From + Pending Out", the user's server MUST silently
+ ignore the stanza.
+
+ 2. If the contact is in the user's roster with a state of "To +
+ Pending In", "None + Pending In", or "None + Pending Out+In", the
+ user's server MUST handle the stanza as a normal subscription
+ approval (see under Section 3.1.5) by updating the existing
+ roster item to a state of "Both", "From", or "From + Pending Out"
+ (respectively), pushing the modified roster item to all of the
+ user's interested resources, and routing the presence stanza of
+ type "subscribed" to the contact.
+
+ 3. If the contact is in the user's roster with a state of "To",
+ "None", or "None + Pending Out", the user's server MUST note the
+ subscription pre-approval by setting the 'approved' flag to a
+ value of "true", then push the modified roster item to all of the
+ user's interested resources. However, the user's server MUST NOT
+ route the presence stanza of type "subscribed" to the contact.
+
+ 4. If the contact is not yet in the user's roster, the user's server
+ MUST create a roster item for the contact with a state of "None"
+ and set the 'approved' flag to a value of "true", then push the
+ roster item to all of the user's interested resources. However,
+ the user's server MUST NOT route the presence stanza of type
+ "subscribed" to the contact.
+
+ An example of the roster push follows.
+
+ US: <iq id='h3bs81vs763f'
+ to='romeo@example.net/bar'
+ type='set'>
+ <query xmlns='jabber:iq:roster'>
+ <item approved='true'
+ jid='juliet@example.com'
+ subscription='none'/>
+ </query>
+ </iq>
+
+ When the 'approved' flag is set to "true", the user's server MUST NOT
+ deliver a presence stanza of type "subscribe" from the contact to the
+ user, but instead MUST automatically respond to such a stanza on
+
+
+
+Saint-Andre Standards Track [Page 47]
+
+RFC 6121 XMPP IM March 2011
+
+
+ behalf of the user by returning a presence stanza of type
+ "subscribed" from the bare JID of the user to the bare JID of the
+ contact.
+
+ Implementation Note: It is a matter of implementation or local
+ service policy whether the server maintains a record of the
+ subscription approval after it has received a presence
+ subscription request from the contact. If the server does not
+ maintain such a record, upon receiving the subscription request it
+ will not include the 'approved' attribute in the roster item for
+ the contact (i.e., in subsequent roster pushes and roster
+ results). If the server maintains such a record, it will always
+ include the 'approved' attribute (set to "true") in the roster
+ item for the contact, until and unless the user sends a presence
+ stanza of type "unsubscribed" to the contact (or removes the
+ contact from the roster entirely).
+
+ Implementation Note: A client can cancel a pre-approval by sending
+ a presence stanza of type "unsubscribed", as described more fully
+ under Section 3.2. In this case, the user's server would send a
+ roster push to all of the user's interested resources with the
+ 'approved' attribute removed. (Alternatively, the client can
+ simply remove the roster item entirely.)
+
+4. Exchanging Presence Information
+
+4.1. Presence Fundamentals
+
+ The concept of presence refers to an entity's availability for
+ communication over a network. At the most basic level, presence is a
+ boolean "on/off" variable that signals whether an entity is available
+ or unavailable for communication (the terms "online" and "offline"
+ are also used). In XMPP, an entity's availability is signaled when
+ its client generates a <presence/> stanza with no 'type' attribute,
+ and an entity's lack of availability is signaled when its client
+ generates a <presence/> stanza whose 'type' attribute has a value of
+ "unavailable".
+
+ XMPP presence typically follows a "publish-subscribe" or "observer"
+ pattern, wherein an entity sends presence to its server, and its
+ server then broadcasts that information to all of the entity's
+ contacts who have a subscription to the entity's presence (in the
+ terminology of [IMP-MODEL], an entity that generates presence is a
+ "presentity" and the entities that receive presence are
+ "subscribers"). A client generates presence for broadcast to all
+ subscribed entities by sending a presence stanza to its server with
+ no 'to' address, where the presence stanza has either no 'type'
+ attribute or a 'type' attribute whose value is "unavailable". This
+
+
+
+Saint-Andre Standards Track [Page 48]
+
+RFC 6121 XMPP IM March 2011
+
+
+ kind of presence is called "broadcast presence". (A client can also
+ send "directed presence", i.e., a presence stanza with a 'to'
+ address; this is less common but is sometimes used to send presence
+ to entities that are not subscribed to the user's presence; see
+ Section 4.6.)
+
+ After a client completes the preconditions specified in [XMPP-CORE],
+ it can establish a "presence session" at its server by sending
+ initial presence (Section 4.2), where the presence session is
+ terminated by sending unavailable presence (Section 4.5). For the
+ duration of its presence session, a connected resource (in the
+ terminology of [XMPP-CORE]) is said to be an "available resource".
+
+ In XMPP, applications that combine messaging and presence
+ functionality, the default type of communication for which presence
+ signals availability is messaging; however, it is not necessary for
+ XMPP applications to combine messaging and presence functionality,
+ and they can provide standalone presence features without messaging
+ (in addition, XMPP servers do not require information about network
+ availability in order to successfully route message and IQ stanzas).
+
+ Informational Note: In the examples that follow, the user is
+ <juliet@example.com>, she has two available resources ("balcony"
+ and "chamber"), and she has three contacts in her roster with a
+ subscription state of "from" or "both": <romeo@example.net>,
+ <mercutio@example.com>, and <benvolio@example.net>.
+
+4.2. Initial Presence
+
+4.2.1. Client Generation of Initial Presence
+
+ After completing the preconditions described in [XMPP-CORE]
+ (REQUIRED) and requesting the roster (RECOMMENDED), a client signals
+ its availability for communication by sending "initial presence" to
+ its server, i.e., a presence stanza with no 'to' address (indicating
+ that it is meant to be broadcast by the server on behalf of the
+ client) and no 'type' attribute (indicating the user's availability).
+
+ UC: <presence/>
+
+ The initial presence stanza MAY contain the <priority/> element, the
+ <show/> element, and one or more instances of the <status/> element,
+ as well as extended content; details are provided under Section 4.7.
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 49]
+
+RFC 6121 XMPP IM March 2011
+
+
+4.2.2. Server Processing of Outbound Initial Presence
+
+ Upon receiving initial presence from a client, the user's server MUST
+ send the initial presence stanza from the full JID
+ <user@domainpart/resourcepart> of the user to all contacts that are
+ subscribed to the user's presence; such contacts are those for which
+ a JID is present in the user's roster with the 'subscription'
+ attribute set to a value of "from" or "both".
+
+ 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.net'/>
+
+ The user's server MUST also broadcast initial presence from the
+ user's newly available resource to all of the user's available
+ resources, including the resource that generated the presence
+ notification in the first place (i.e., an entity is implicitly
+ subscribed to its own presence).
+
+ [... to the "balcony" resource ...]
+
+ US: <presence from='juliet@example.com/balcony'
+ to='juliet@example.com'/>
+
+ [... to the "chamber" resource ...]
+
+ US: <presence from='juliet@example.com/balcony'
+ to='juliet@example.com'/>
+
+ In the absence of presence information about the user's contacts, the
+ user's server MUST also send presence probes to the user's contacts
+ on behalf of the user as specified under Section 4.3.
+
+4.2.3. Server Processing of Inbound Initial Presence
+
+ Upon receiving presence from the user, the contact's server MUST
+ deliver the user's presence stanza to all of the contact's available
+ resources.
+
+ [ ... to resource1 ... ]
+
+ CS: <presence from='juliet@example.com/balcony'
+ to='romeo@example.net'/>
+
+
+
+Saint-Andre Standards Track [Page 50]
+
+RFC 6121 XMPP IM March 2011
+
+
+ [ ... to resource2 ... ]
+
+ CS: <presence from='juliet@example.com/balcony'
+ to='romeo@example.net'/>
+
+4.2.4. Client Processing of Initial Presence
+
+ When the contact's client receives presence from the user, the
+ following behavior is suggested for interactive clients:
+
+ 1. If the user's bare JID is in the contact's roster, display the
+ presence information in an appropriate roster interface.
+
+ 2. If the user is not in the contact's roster but the contact and
+ the user are actively exchanging message or IQ stanzas, display
+ the presence information in the user interface for that
+ communication session (see also Section 4.6 and Section 5.1).
+
+ 3. Otherwise, ignore the presence information and do not display it
+ to the contact.
+
+4.3. Presence Probes
+
+ A "presence probe" is a request for a contact's current presence
+ information, sent on behalf of a user by the user's server;
+ syntactically it is a presence stanza whose 'type' attribute has a
+ value of "probe". In the context of presence subscriptions, the
+ value of the 'from' address MUST be the bare JID of the subscribed
+ user and the value of the 'to' address MUST be the bare JID of the
+ contact to which the user is subscribed, since presence subscriptions
+ are based on the bare JID.
+
+ US: <presence from='juliet@example.com'
+ id='ign291v5'
+ to='romeo@example.net'
+ type='probe'/>
+
+ Interoperability Note: RFC 3921 specified that probes are sent
+ from the full JID, not the bare JID (a rule that was changed
+ because subscriptions are based on the bare JID). Some existing
+ implementations send from the full JID instead of the bare JID.
+
+ Probes can also be sent by an entity that has received presence
+ outside the context of a presence subscription, typically when the
+ contact has sent directed presence as described under Section 4.6; in
+ this case the value of the 'from' or 'to' address can be a full JID
+ instead of a bare JID. See Section 4.6 for a complete discussion.
+
+
+
+
+Saint-Andre Standards Track [Page 51]
+
+RFC 6121 XMPP IM March 2011
+
+
+ Presence probes SHOULD NOT be sent by a client, because in general a
+ client will not need to send them since the task of gathering
+ presence from a user's contacts is managed by the user's server.
+ However, if a user's client generates an outbound presence probe then
+ the user's server SHOULD route the probe (if the contact is at
+ another server) or process the probe (if the contact is at the same
+ server) and MUST NOT use its receipt of the presence probe from a
+ connected client as the sole cause for returning a stanza or stream
+ error to the client.
+
+4.3.1. Server Generation of Outbound Presence Probe
+
+ When a server needs to discover the availability of a user's contact,
+ it sends a presence probe from the bare JID <user@domainpart> of the
+ user to the bare JID <contact@domainpart> of the contact.
+
+ Implementation Note: Although presence probes are intended for
+ sending to contacts (i.e., entities to which a user is
+ subscribed), a server MAY send a presence probe to the full JID of
+ an entity from which the user has received presence information
+ during the current session.
+
+ The user's server SHOULD send a presence probe whenever the user
+ starts a new presence session by sending initial presence; however,
+ the server MAY choose not to send the probe at that point if it has
+ what it deems to be reliable and up-to-date presence information
+ about the user's contacts (e.g., because the user has another
+ available resource or because the user briefly logged off and on
+ before the new presence session began). In addition, a server MAY
+ periodically send a presence probe to a contact if it has not
+ received presence information or other traffic from the contact in
+ some configurable amount of time; this can help to prevent "ghost"
+ contacts who appear to be online but in fact are not.
+
+ US: <presence from='juliet@example.com'
+ id='ign291v5'
+ to='romeo@example.net'
+ type='probe'/>
+
+ US: <presence from='juliet@example.com'
+ id='xv291f38'
+ to='mercutio@example.com'
+ type='probe'/>
+
+ Naturally, the user's server does not need to send a presence probe
+ to a contact if the contact's account resides on the same server as
+ the user, since the server possesses the contact's information
+ locally.
+
+
+
+Saint-Andre Standards Track [Page 52]
+
+RFC 6121 XMPP IM March 2011
+
+
+4.3.2. Server Processing of Inbound Presence Probe
+
+ Upon receiving a presence probe to the contact's bare JID from the
+ user's server on behalf of the user, the contact's server MUST reply
+ as follows:
+
+ 1. If the contact account does not exist or the user's bare JID is
+ in the contact's roster with a subscription state other than
+ "From", "From + Pending Out", or "Both" (as explained under
+ Appendix A), then the contact's server SHOULD return a presence
+ stanza of type "unsubscribed" in response to the presence probe
+ (this will trigger a protocol flow for canceling the user's
+ subscription to the contact as described under Section 3.2;
+ however, this MUST NOT result in cancellation of a subscription
+ pre-approval as described under Section 3.4). Here the 'from'
+ address MUST be the bare JID of the contact, since specifying a
+ full JID would constitute a presence leak as described in
+ [XMPP-CORE].
+
+ CS: <presence from='mercutio@example.com'
+ id='xv291f38'
+ to='juliet@example.com'
+ type='unsubscribed'/>
+
+ However, if a server receives a presence probe from a configured
+ domain of the server itself or another such trusted service, it MAY
+ provide presence information about the user to that entity.
+
+ 2. Else, if the contact has moved temporarily or permanently to
+ another address, then the server SHOULD return a presence stanza
+ of type "error" with a stanza error condition of <redirect/>
+ (temporary) or <gone/> (permanent) that includes the new address
+ of the contact.
+
+ CS: <presence from='mercutio@example.com'
+ id='xv291f38'
+ to='juliet@example.com'
+ type='error'>
+ <error type='modify'>
+ <gone xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>
+ xmpp:la-mer@example.com
+ </gone>
+ </error>
+ </presence>
+
+ 3. Else, if the contact has no available resources, then the server
+ SHOULD reply to the presence probe by sending to the user a
+ presence stanza of type "unavailable" (although sending
+
+
+
+Saint-Andre Standards Track [Page 53]
+
+RFC 6121 XMPP IM March 2011
+
+
+ unavailable presence here is preferable because it results in a
+ deterministic answer to the probe, it is not mandatory because it
+ can greatly increase the number of presence notifications
+ generated by the contact's server). Here the 'from' address is
+ the bare JID because there is no available resource associated
+ with the contact. If appropriate in accordance with local
+ security policies this presence notification MAY include the full
+ XML of the last unavailable presence stanza that the server
+ received from the contact (including the 'id' of the original
+ stanza), but if not then the presence notification SHOULD simply
+ indicate that the contact is unavailable without any of the
+ details originally provided. In any case, the presence
+ notification returned to the probing entity SHOULD include
+ information about the time when the last unavailable presence
+ stanza was generated (formatted using the XMPP delayed delivery
+ extension [DELAY]).
+
+ CS: <presence from='mercutio@example.com'
+ id='xv291f38'
+ to='juliet@example.com'
+ type='unavailable'>
+ <delay xmlns='urn:xmpp:delay'
+ stamp='2002-09-10T23:41:07Z'/>
+ </presence>
+
+ 4. Else, if the contact has at least one available resource, then
+ the server MUST reply to the presence probe by sending to the
+ user the full XML of the last presence stanza with no 'to'
+ attribute received by the server from each of the contact's
+ available resources. Here the 'from' addresses are the full JIDs
+ of each available resource.
+
+ CS: <presence from='romeo@example.net/foo'
+ id='hzf1v27k'
+ to='juliet@example.com'/>
+
+ CS: <presence from='romeo@example.net/bar'
+ id='ps6t1fu3'
+ to='juliet@example.com'>
+ <show>away</show>
+ </presence>
+
+ Implementation Note: By "full XML" is meant the complete stanza
+ from the opening <presence> tag to the closing </presence> tag,
+ including all elements and attributes whether qualified by the
+ content namespace or extended namespaces; however, in accordance
+
+
+
+
+
+Saint-Andre Standards Track [Page 54]
+
+RFC 6121 XMPP IM March 2011
+
+
+ with [XMPP-CORE], the contact's server will need to transform the
+ content namespace from 'jabber:client' to 'jabber:server' if it
+ sends the complete stanza over a server-to-server stream.
+
+ If the contact's server receives a presence probe addressed to a full
+ JID of the contact, the server MUST NOT return presence information
+ about any resource except the resource specified by the 'to' address
+ of the probe. Rules #1 and #2 for a bare JID probe apply equally to
+ the case of a full JID probe. If there is a resource matching the
+ full JID and the probing entity has authorization via a presence
+ subscription to see the contact's presence, then the server MUST
+ return an available presence notification, which SHOULD communicate
+ only the fact that the resource is available (not detailed
+ information such as the <show/>, <status/>, <priority/>, or presence
+ extensions).
+
+
+ CS: <presence from='romeo@example.net/bar'
+ to='lobby@chat.example.com'/>
+
+ Implementation Note: See Section 4.6 regarding rules that
+ supplement the foregoing for handling of directed presence.
+
+4.3.2.1. Handling of the 'id' Attribute
+
+ The handling of the 'id' attribute in relation to presence probes was
+ unspecified in RFC 3921. Although the pattern of "send a probe and
+ receive a reply" might seem like a request-response protocol similar
+ to the XMPP <iq/> stanza, in fact it is not because the response to a
+ probe might consist of multiple presence stanzas (one for each
+ available resource currently active for the contact). For this
+ reason, if the contact currently has available resources then the
+ contact's server SHOULD preserve the 'id' attribute of the contact's
+ original presence stanza (if any) when sending those presence
+ notifications to the probing entity. By contrast, if the contact
+ currently has no available resources, the probing entity is not
+ authorized (via presence subscription) to see the contact's presence,
+ or an error occurs in relation to the probe, then the contact's
+ server SHOULD mirror the 'id' of the user's presence probe when
+ replying to the probing entity.
+
+ The following examples illustrate the difference.
+
+ In the first scenario, Juliet sends presence from her "chamber"
+ resource.
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 55]
+
+RFC 6121 XMPP IM March 2011
+
+
+ CC: <presence from='juliet@example.com/chamber' id='pres1'>
+ <show>dnd</show>
+ <status>busy!</status>
+ </presence>
+
+ She also sends presence from her "balcony" resource.
+
+ CC: <presence from='juliet@example.com/balcony' id='pres2'>
+ <show>away</show>
+ <status>stepped away</status>
+ </presence>
+
+ Romeo's server then sends a probe to Juliet.
+
+ US: <presence from='romeo@example.net' id='probe1' type='probe'/>
+
+ Juliet's server then sends both of her presence notifications to
+ Romeo, preserving the 'id' attributes included in the stanzas that
+ her client has sent.
+
+ CS: <presence from='juliet@example.com/chamber' id='pres1'>
+ <show>dnd</show>
+ <status>busy!</status>
+ </presence>
+
+ CS: <presence from='juliet@example.com/balcony' id='pres2'>
+ <show>away</show>
+ <status>stepped away</status>
+ </presence>
+
+ In the second scenario, Juliet is offline when Romeo's server sends a
+ probe.
+
+ US: <presence from='romeo@example.net'
+ id='probe2'
+ type='probe'/>
+
+ Juliet's server replies with an unavailable notification, mirroring
+ the 'id' of Rome's presence probe because there is no 'id' to
+ preserve from an available notification that her client has sent.
+
+ CS: <presence from='juliet@example.com'
+ id='probe2'
+ type='unavailable'/>
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 56]
+
+RFC 6121 XMPP IM March 2011
+
+
+4.4. Subsequent Presence Broadcast
+
+4.4.1. Client Generation of Subsequent Presence Broadcast
+
+ After sending initial presence, at any time during its session the
+ user's client can update its availability for broadcast by sending a
+ presence stanza with no 'to' address and no 'type' attribute.
+
+ UC: <presence>
+ <show>away</show>
+ </presence>
+
+ The presence broadcast MAY contain the <priority/> element, the
+ <show/> element, and one or more instances of the <status/> element,
+ as well as extended content; details are provided under Section 4.7.
+
+ However, a user SHOULD send a presence update only to broadcast
+ information that is relevant to the user's availability for
+ communication or the communication capabilities of the resource.
+ Information that is not relevant in this way might be of interest to
+ the user's contacts but SHOULD be sent via other means, such as the
+ "publish-subscribe" method described in [XEP-0163].
+
+4.4.2. Server Processing of Subsequent Outbound Presence
+
+ Upon receiving a presence stanza expressing updated availability, the
+ user's server MUST broadcast the full XML of that presence stanza to
+ the contacts who are in the user's roster with a subscription type of
+ "from" or "both".
+
+ Interoperability Note: RFC 3921 specified that the user's server
+ would check to make sure that it had not received a presence error
+ from the contact before sending subsequent presence notifications.
+ That rule has been removed because this specification uses
+ presence stanzas of type "unsubscribe" (not "error") to solve
+ subscription synchronization problems, in part because such
+ stanzas change the contact's subscription state in the user's
+ roster to either "none" or "to" (see Section 3.3 and Appendix A),
+ thus obviating the need for the error check.
+
+ Interoperability Note: If the subscription type is "both", some
+ existing server implementations send subsequent presence
+ notifications to a contact only if the contact is online according
+ to the user's server (that is, if the user's server never received
+ a positive indication that the contact is online in response to
+ the presence probe it sent to the contact, the user's server does
+ not send subsequent presence notifications from the user to the
+
+
+
+
+Saint-Andre Standards Track [Page 57]
+
+RFC 6121 XMPP IM March 2011
+
+
+ contact). This behavior is perceived to save bandwidth, since
+ most presence subscriptions are bidirectional and many contacts
+ will not be online at any given time.
+
+ 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.net'>
+ <show>away</show>
+ </presence>
+
+ US: <presence from='juliet@example.com/balcony'
+ to='mercutio@example.com'>
+ <show>away</show>
+ </presence>
+
+ Implementation Note: See Section 4.6 regarding rules that
+ supplement the foregoing for handling of directed presence.
+
+ The user's server MUST also send the presence stanza to all of the
+ user's available resources (including the resource that generated the
+ presence notification in the first place).
+
+ US: <presence from='juliet@example.com/balcony'
+ to='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 Subsequent Inbound Presence
+
+ Upon receiving presence from the user, the contact's server MUST
+ deliver the user's presence stanza to all of the contact's available
+ resources.
+
+ [ ... to resource1 ... ]
+
+ CS: <presence from='juliet@example.com/balcony'
+ to='romeo@example.net'>
+ <show>away</show>
+ </presence>
+
+
+
+Saint-Andre Standards Track [Page 58]
+
+RFC 6121 XMPP IM March 2011
+
+
+ [ ... to resource2 ... ]
+
+ CS: <presence from='juliet@example.com/balcony'
+ to='romeo@example.net'>
+ <show>away</show>
+ </presence>
+
+4.4.4. Client Processing of Subsequent Presence
+
+ From the perspective of the contact's client, there is no significant
+ difference between initial presence broadcast and subsequent
+ presence, so the contact's client follows the rules for processing of
+ inbound presence defined under Section 4.4.3.
+
+4.5. Unavailable Presence
+
+4.5.1. Client Generation of Unavailable Presence
+
+ Before ending its presence session with a server, the user'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 is "unavailable".
+
+ UC: <presence type='unavailable'/>
+
+ Optionally, the unavailable presence stanza MAY contain one or more
+ <status/> elements specifying the reason why the user is no longer
+ available.
+
+ UC: <presence type='unavailable'>
+ <status>going on vacation</status>
+ </presence>
+
+ However, the unavailable presence stanza MUST NOT contain the
+ <priority/> element or the <show/> element, since these elements
+ apply only to available resources.
+
+4.5.2. Server Processing of Outbound Unavailable Presence
+
+ The user's server MUST NOT depend on receiving unavailable presence
+ from an available resource, since the resource might become
+ unavailable ungracefully (e.g., the resource's XML stream might be
+ closed with or without a stream error for any of the reasons
+ described in [XMPP-CORE]).
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 59]
+
+RFC 6121 XMPP IM March 2011
+
+
+ If an available resource becomes unavailable for any reason (either
+ gracefully or ungracefully), the user's server MUST broadcast
+ unavailable presence to all contacts that are in the user's roster
+ with a subscription type of "from" or "both".
+
+ Interoperability Note: RFC 3921 specified that the user's server
+ would check to make sure that it had not received a presence error
+ from the contact before sending unavailable presence
+ notifications. That rule has been removed because this
+ specification uses presence stanzas of type "unsubscribe" (not
+ "error") to solve subscription synchronization problems, in part
+ because such stanzas change the contact's subscription state in
+ the user's roster to either "none" or "to" (see Section 3.3 and
+ Appendix A), thus obviating the need for the error check.
+
+ Implementation Note: Even if the user's server does not broadcast
+ the user's subsequent presence notifications to contacts who are
+ offline (as described under Section 4.4.2), it MUST broadcast the
+ user's unavailable presence notification; if it did not do so, the
+ last presence received by the contact's server would be the user's
+ initial presence for the presence session, with the result that
+ the contact would consider the user to be online.
+
+ Implementation Note: See Section 4.6 regarding rules that
+ supplement the foregoing for handling of directed presence.
+
+ If the unavailable notification was gracefully received from the
+ client, then the server MUST broadcast the full XML of the presence
+ stanza.
+
+ US: <presence from='juliet@example.com/balcony'
+ to='romeo@example.net'
+ type='unavailable'>
+ <status>going on vacation</status>
+ </presence>
+
+ US: <presence from='juliet@example.com/balcony'
+ to='benvolio@example.net'
+ type='unavailable'>
+ <status>going on vacation</status>
+ </presence>
+
+ US: <presence from='juliet@example.com/balcony'
+ to='mercutio@example.com'
+ type='unavailable'>
+ <status>going on vacation</status>
+ </presence>
+
+
+
+
+Saint-Andre Standards Track [Page 60]
+
+RFC 6121 XMPP IM March 2011
+
+
+ The user's server MUST also send the unavailable notification to all
+ of the user's available resources (as well as to the resource that
+ generated the unavailable presence in the first place).
+
+ US: <presence from='juliet@example.com/balcony'
+ to='juliet@example.com/chamber'
+ type='unavailable'>
+ <status>going on vacation</status>
+ </presence>
+
+ If the server detects that the user has gone offline ungracefully,
+ then the server MUST generate the unavailable presence broadcast on
+ the user's behalf.
+
+ Implementation Note: Any presence stanza with no 'type' attribute
+ and no 'to' attribute that the client sends after the server
+ broadcasts or generates an unavailable presence notification MUST
+ be routed or delivered by the user's server 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 an unavailable notification from the user, the
+ contact's server MUST deliver the user's presence stanza to all of
+ the contact's available resources.
+
+ [ ... to resource1 ... ]
+
+ CS: <presence from='juliet@example.com/balcony'
+ to='romeo@example.net'
+ type='unavailable'>
+ <status>going on vacation</status>
+ </presence>
+
+ [ ... to resource2 ... ]
+
+ CS: <presence from='juliet@example.com/balcony'
+ to='romeo@example.net'
+ type='unavailable'>
+ <status>going on vacation</status>
+ </presence>
+
+ Implementation Note: If the contact's server does not broadcast
+ subsequent presence notifications to users who are offline (as
+ described under Section 4.4.2), it MUST also update its internal
+ representation of which entities are online by noting that the
+ user is unavailable.
+
+
+
+Saint-Andre Standards Track [Page 61]
+
+RFC 6121 XMPP IM March 2011
+
+
+4.5.4. Client Processing of Unavailable Presence
+
+ From the perspective of the contact's client, there is no significant
+ difference between available presence broadcast and unavailable
+ presence broadcast, so in general the contact's client follows the
+ rules for processing of inbound presence defined under Section 4.4.3.
+
+ However, if the contact receives an unavailable notification from the
+ bare JID of the user (rather than the full JID of a particular
+ available resource), the contact's client SHOULD treat the
+ unavailable notification as applying to all resources.
+
+4.6. Directed Presence
+
+ This section supplements the rules for client and server processing
+ of presence notifications and presence probes, but only for the
+ special case of directed presence.
+
+4.6.1. General Considerations
+
+ In general, a client sends directed presence when it wishes to share
+ availability information with an entity that is not subscribed to its
+ presence, typically on a temporary basis. Common uses of directed
+ presence include casual one-to-one chat sessions as described under
+ Section 5.1 and multi-user chat rooms as described in [XEP-0045].
+
+ The temporary relationship established by sharing directed presence
+ with another entity is secondary to the permanent relationship
+ established through a presence subscription. Therefore, the acts of
+ creating, modifying, or canceling a presence subscription MUST take
+ precedence over the rules specified in the following subsections.
+ For example, if a user shares directed presence with a contact but
+ then adds the contact to the user's roster by completing the presence
+ subscription "handshake", the user's server MUST treat the contact
+ just as it would any normal subscriber as described under Section 3,
+ for example, by sending subsequent presence broadcasts to the
+ contact. As another example, if the user then cancels the contact's
+ subscription to the user's presence, the user's server MUST handle
+ the cancellation just as it normally would as described under
+ Section 3.2, which includes sending unavailable presence to the
+ contact even if the user has sent directed presence to the contact.
+
+ XMPP servers typically implement directed presence by keeping a list
+ of the entities (bare JIDs or full JIDs) to which a user has sent
+ directed presence during the user's current session for a given
+ resource (full JID), then clearing the list when the user goes
+ offline (e.g., by sending a broadcast presence stanza of type
+ "unavailable"). The server MUST remove from the directed presence
+
+
+
+Saint-Andre Standards Track [Page 62]
+
+RFC 6121 XMPP IM March 2011
+
+
+ list (or its functional equivalent) any entity to which the user
+ sends directed unavailable presence and SHOULD remove any entity that
+ sends unavailable presence to the user.
+
+4.6.2. Client Generation of Directed Presence
+
+ As noted, directed presence is a client-generated presence stanza
+ with a 'to' attribute whose value is the bare JID or full JID of the
+ other entity and with either no 'type' attribute (indicating
+ availability) or a 'type' attribute whose value is "unavailable".
+
+4.6.3. Server Processing of Outbound Directed Presence
+
+ When the user's server receives a directed presence stanza, it SHOULD
+ process it according to the following rules.
+
+ 1. If the user sends directed available or unavailable presence to a
+ contact that is in the user's roster with a subscription type of
+ "from" or "both" after having sent initial presence and before
+ sending unavailable presence broadcast (i.e., during the user's
+ presence session), the user's server MUST locally deliver or
+ remotely route the full XML of that presence stanza but SHOULD
+ NOT otherwise modify the contact's status regarding presence
+ broadcast (i.e., it SHOULD include the contact's JID in any
+ subsequent presence broadcasts initiated by the user).
+
+ 2. If the user sends directed presence to an entity that is not in
+ the user's roster with a subscription type of "from" or "both"
+ after having sent initial presence and before sending unavailable
+ presence broadcast (i.e., during the user's presence session),
+ the user's server MUST locally deliver or remotely route the full
+ XML of that presence stanza to the entity but MUST NOT modify the
+ contact's status regarding available presence broadcast (i.e., it
+ MUST NOT include the entity's JID in any subsequent broadcasts of
+ available presence initiated by the user); however, if the
+ available resource from which the user sent the directed presence
+ becomes unavailable, the user's server MUST route that
+ unavailable presence to the entity (if the user has not yet sent
+ directed unavailable presence to that entity).
+
+ 3. If the user sends directed presence without first sending initial
+ presence or after having sent unavailable presence broadcast
+ (i.e., the resource is connected but not available), the user's
+ server MUST treat the entity to which the user sends directed
+ presence as in case #2 above.
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 63]
+
+RFC 6121 XMPP IM March 2011
+
+
+4.6.4. Server Processing of Inbound Directed Presence
+
+ From the perspective of the contact's server, there is no significant
+ difference between presence broadcast and directed presence, so the
+ contact's server follows the rules for processing of inbound presence
+ defined under Sections 4.3.2, 4.4.3, and 4.5.3.
+
+4.6.5. Client Processing of Inbound Directed Presence
+
+ From the perspective of the contact's client, there is no significant
+ difference between presence broadcast and directed presence, so the
+ contact's client follows the rules for processing of inbound presence
+ defined under Section 4.4.3.
+
+4.6.6. Server Processing of Presence Probes
+
+ If a user's client has sent directed presence to another entity
+ (e.g., a one-to-one chat partner or a multi-user chat room), after
+ some time the entity or its server might want to know if the client
+ is still online. This scenario is especially common in the case of
+ multi-user chat rooms, in which the user might be a participant for a
+ long period of time. If the user's client goes offline without the
+ chat room being informed (either by the client or the client's
+ server), the user's representation in the room might become a "ghost"
+ that appears to be participating but that in fact is no longer
+ present in the room. To detect such "ghosts", some multi-user chat
+ room implementations send presence probes to users that have joined
+ the room.
+
+ In the case of directed presence, the probing entity SHOULD send the
+ probe from the JID that received directed presence (whether a full
+ JID or a bare JID). The probe SHOULD be sent to the user's full JID,
+ not the user's bare JID without a resourcepart, because the temporary
+ "authorization" involved with directed presence is based on the full
+ JID from which the user sent directed presence to the probing entity.
+ When the user's server receives a probe, it MUST first apply any
+ logic associated with presence subscriptions as described under
+ Section 4.3.2. If the probing entity does not have a subscription to
+ the user's presence, then the server MUST check if the user has sent
+ directed presence to the entity during its current session; if so,
+ the server SHOULD answer the probe with only mere presence of type
+ "available" or "unavailable" (i.e., not including child elements) and
+ only for that full JID (i.e., not for any other resources that might
+ be currently associated with the user's bare JID).
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 64]
+
+RFC 6121 XMPP IM March 2011
+
+
+4.7. Presence Syntax
+
+4.7.1. Type Attribute
+
+ The absence of a 'type' attribute signals that the relevant entity is
+ available for communication (see Section 4.2 and Section 4.4).
+
+ A 'type' attribute with a value of "unavailable" signals that the
+ relevant entity is not available for communication (see Section 4.5).
+
+ The XMPP presence stanza is also used to negotiate and manage
+ subscriptions to the presence of other entities. These tasks are
+ completed via presence stanzas of type "subscribe", "unsubscribe",
+ "subscribed", and "unsubscribed" as described under Section 3.
+
+ If a user and contact are associated with different XMPP servers,
+ those servers also use a special presence stanza of type "probe" in
+ order to determine the availability of the entity on the peer server;
+ details are provided under Section 4.3. Clients SHOULD NOT send
+ presence stanzas of type "probe".
+
+ The values of the 'type' attribute can be summarized as follows:
+
+ o error -- An error has occurred regarding processing of a
+ previously sent presence stanza; if the presence stanza is of type
+ "error", it MUST include an <error/> child element (refer to
+ [XMPP-CORE]).
+
+ o probe -- A request for an entity's current presence; SHOULD be
+ generated only by a server on behalf of a user.
+
+ o subscribe -- The sender wishes to subscribe to the recipient's
+ presence.
+
+ o subscribed -- The sender has allowed the recipient to receive
+ their presence.
+
+ o unavailable -- The sender is no longer available for
+ communication.
+
+ o unsubscribe -- The sender is unsubscribing from the receiver's
+ presence.
+
+ o unsubscribed -- The subscription request has been denied or a
+ previously granted subscription has been canceled.
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 65]
+
+RFC 6121 XMPP IM March 2011
+
+
+ If the value of the 'type' attribute is not one of the foregoing
+ values, the recipient or an intermediate router SHOULD return a
+ stanza error of <bad-request/>.
+
+ Implementation Note: There is no default value for the 'type'
+ attribute of the <presence/> element.
+
+ Implementation Note: There is no value of "available" for the
+ 'type' attribute of the <presence/> element.
+
+4.7.2. Child Elements
+
+ In accordance with the default namespace declaration, a presence
+ stanza is qualified by the 'jabber:client' or 'jabber:server'
+ namespace, which defines certain child elements of presence stanzas,
+ in particular the <show/>, <status/>, and <priority/> elements.
+ These child elements are used to provide more detailed information
+ about an entity's availability. Typically these child elements are
+ included only if the presence stanza possesses no 'type' attribute,
+ although exceptions are noted in the text that follows.
+
+4.7.2.1. Show Element
+
+ The OPTIONAL <show/> element specifies the particular availability
+ sub-state of an entity or a specific resource thereof. A presence
+ stanza MUST NOT contain more than one <show/> element. There are no
+ attributes defined for the <show/> element. The <show/> element MUST
+ NOT contain mixed content (as defined in Section 3.2.2 of [XML]).
+ The XML character data of the <show/> element is not meant for
+ presentation to a human user. The XML character data MUST be one of
+ the following (additional availability states could be defined
+ through extended content elements):
+
+ o away -- The entity or resource is temporarily away.
+
+ o chat -- The entity or resource is actively interested in chatting.
+
+ o dnd -- The entity or resource is busy (dnd = "Do Not Disturb").
+
+ o xa -- The entity or resource is away for an extended period (xa =
+ "eXtended Away").
+
+ If no <show/> element is provided, the entity is assumed to be online
+ and available.
+
+ Any specialized processing of availability states by recipients and
+ intermediate routers is up to the implementation (e.g., incorporation
+ of availability states into stanza routing and delivery logic).
+
+
+
+Saint-Andre Standards Track [Page 66]
+
+RFC 6121 XMPP IM March 2011
+
+
+4.7.2.2. Status Element
+
+ The OPTIONAL <status/> element contains human-readable XML character
+ data specifying a natural-language description of an entity's
+ availability. It is normally used in conjunction with the show
+ element to provide a detailed description of an availability state
+ (e.g., "In a meeting") when the presence stanza has no 'type'
+ attribute.
+
+ <presence from='romeo@example.net/orchard'
+ xml:lang='en'>
+ <show>dnd</show>
+ <status>Wooing Juliet</status>
+ </presence>
+
+ There are no attributes defined for the <status/> element, with the
+ exception of the 'xml:lang' attribute inherited from [XML]. The
+ <status/> element MUST NOT contain mixed content (as defined in
+ Section 3.2.2 of [XML]). 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 from the sender's perspective can include the
+ XML stream header as described in [XMPP-CORE]).
+
+ <presence from='romeo@example.net/orchard'
+ id='jx62vs97'
+ xml:lang='en'>
+ <show>dnd</show>
+ <status>Wooing Juliet</status>
+ <status xml:lang='cs'>Dvo&#x0159;&#x00ED;m se Julii</status>
+ </presence>
+
+ A presence stanza of type "unavailable" MAY also include a <status/>
+ element to provide detailed information about why the entity is going
+ offline.
+
+ <presence from='romeo@example.net/orchard'
+ id='oy6sb241'
+ type='unavailable'
+ xml:lang='en'>
+ <status>Busy IRL</status>
+ </presence>
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 67]
+
+RFC 6121 XMPP IM March 2011
+
+
+ The <status/> child MAY also be sent in a subscription-related
+ presence stanza (i.e., type "subscribe", "subscribed", "unsubscribe",
+ or "unsubscribed") to provide a description of the action. An
+ interactive client MAY present this <status/> information to a human
+ user (see Section 11).
+
+ <presence from='romeo@example.net'
+ id='uc51xs63'
+ to='nurse@example.com'
+ type='subscribe'>
+ <status>Hi, Juliet told me to add you to my buddy list.</status>
+ </presence>
+
+4.7.2.3. Priority Element
+
+ The OPTIONAL <priority/> element contains non-human-readable XML
+ character data that specifies the priority level of the resource.
+ The value MUST be an integer between -128 and +127. A presence
+ stanza MUST NOT contain more than one <priority/> element. There are
+ no attributes defined for the <priority/> element. The <priority/>
+ element MUST NOT contain mixed content (as defined in Section 3.2.2
+ of [XML]).
+
+ <presence xml:lang='en'>
+ <show>dnd</show>
+ <status>Wooing Juliet</status>
+ <status xml:lang='cs'>Dvo&#x0159;&#x00ED;m se Julii</status>
+ <priority>1</priority>
+ </presence>
+
+ If no priority is provided, the processing server or client MUST
+ consider the priority to be zero ("0").
+
+ The client's server MAY override the priority value provided by the
+ client (e.g., in order to impose a message handling rule of
+ delivering a message intended for the account's bare JID to all of
+ the account's available resources). If the server does so, it MUST
+ communicate the modified priority value when it echoes the client's
+ presence back to itself and sends the presence notification to the
+ user's contacts (because this modified priority value is typically
+ the default value of zero, communicating the modified priority value
+ can be done by not including the <priority/> child element).
+
+ For information regarding the semantics of priority values in stanza
+ processing within instant messaging and presence applications, refer
+ to Section 8.
+
+
+
+
+
+Saint-Andre Standards Track [Page 68]
+
+RFC 6121 XMPP IM March 2011
+
+
+4.7.3. Extended Content
+
+ As described in [XMPP-CORE], an XML stanza MAY contain any child
+ element that is qualified by a namespace other than the default
+ namespace; this applies to the presence stanza as well.
+
+ (In the following example, the presence stanza includes entity
+ capabilities information as defined in [XEP-0115].)
+
+ <presence from='romeo@example.net'>
+ <c xmlns='http://jabber.org/protocol/caps'
+ hash='sha-1'
+ node='http://psi-im.org'
+ ver='q07IKJEyjvHSyhy//CH0CxmKi8w='/>
+ </presence>
+
+ Any extended content included in a presence stanza SHOULD represent
+ aspects of an entity's availability for communication or provide
+ information about communication-related capabilities.
+
+5. Exchanging Messages
+
+ Once a client has authenticated with a server and bound a resource to
+ an XML stream as described in [XMPP-CORE], an XMPP server will route
+ XML stanzas to and from that client. One kind of stanza that can be
+ exchanged is <message/> (if, that is, messaging functionality is
+ enabled on the server). Exchanging messages is a basic use of XMPP
+ and occurs when a user generates a message stanza that is addressed
+ to another entity. As defined under Section 8, the sender's server
+ is responsible for delivering the message to the intended recipient
+ (if the recipient is on the same local server) or for routing the
+ message to the recipient's server (if the recipient is on a remote
+ server). Thus a message stanza is used to "push" information to
+ another entity.
+
+5.1. One-to-One Chat Sessions
+
+ In practice, instant messaging activity between human users tends to
+ occur in the form of a conversational burst that we call a "chat
+ session": the exchange of multiple messages between two parties in
+ relatively rapid succession within a relatively brief period of time.
+
+ When a human user intends to engage in such a chat session with a
+ contact (rather than sending a single message to which no reply is
+ expected), the message type generated by the user's client SHOULD be
+ "chat" and the contact's client SHOULD preserve that message type in
+ subsequent replies. The user's client also SHOULD include a
+
+
+
+
+Saint-Andre Standards Track [Page 69]
+
+RFC 6121 XMPP IM March 2011
+
+
+ <thread/> element with its initial message, which the contact's
+ client SHOULD also preserve during the life of the chat session (see
+ Section 5.2.5).
+
+ The user's client SHOULD address the initial message in a chat
+ session to the bare JID <contact@domainpart> of the contact (rather
+ than attempting to guess an appropriate full JID
+ <contact@domainpart/resourcepart> based on the <show/>, <status/>, or
+ <priority/> value of any presence notifications it might have
+ received from the contact). Until and unless the user's client
+ receives a reply from the contact, it SHOULD send any further
+ messages to the contact's bare JID. The contact's client SHOULD
+ address its replies to the user's full JID
+ <user@domainpart/resourcepart> as provided in the 'from' address of
+ the initial message. Once the user's client receives a reply from
+ the contact's full JID, it SHOULD address its subsequent messages to
+ the contact's full JID as provided in the 'from' address of the
+ contact's replies, thus "locking in" on that full JID. A client
+ SHOULD "unlock" after having received a <message/> or <presence/>
+ stanza from any other resource controlled by the peer (or a presence
+ stanza from the locked resource); as a result, it SHOULD address its
+ next message(s) in the chat session to the bare JID of the peer (thus
+ "unlocking" the previous "lock") until it receives a message from one
+ of the peer's full JIDs.
+
+ When two parties engage in a chat session but do not share presence
+ with each other based on a presence subscription, they SHOULD send
+ directed presence to each other so that either party can easily
+ discover if the peer goes offline during the course of the chat
+ session. However, a client MUST provide a way for a user to disable
+ such presence sharing globally or to enable it only with particular
+ entities. Furthermore, a party SHOULD send directed unavailable
+ presence to the peer when it has reason to believe that the chat
+ session is over (e.g., if, after some reasonable amount of time, no
+ subsequent messages have been exchanged between the parties).
+
+ An example of a chat session is provided under Section 7.
+
+5.2. Message Syntax
+
+ The following sections describe the syntax of the <message/> stanza.
+
+5.2.1. To Attribute
+
+ An instant messaging client specifies an intended recipient for a
+ message by providing the JID of the intended recipient in the 'to'
+ attribute of the <message/> stanza.
+
+
+
+
+Saint-Andre Standards Track [Page 70]
+
+RFC 6121 XMPP IM March 2011
+
+
+ If the message is being sent outside the context of any existing chat
+ session or received message, the value of the 'to' address SHOULD be
+ of the form <localpart@domainpart> rather than of the form
+ <localpart@domainpart/resourcepart> (see Section 5.1).
+
+ <message
+ from='juliet@example.com/balcony'
+ id='ktx72v49'
+ to='romeo@example.net'
+ type='chat'
+ xml:lang='en'>
+ <body>Art thou not Romeo, and a Montague?</body>
+ </message>
+
+ If the message is being sent in reply to a message previously
+ received from an address of the form
+ <localpart@domainpart/resourcepart> (e.g., within the context of a
+ one-to-one chat session as described under Section 5.1), the value of
+ the 'to' address SHOULD be of the form
+ <localpart@domainpart/resourcepart> rather than of the form
+ <localpart@domainpart> unless the sender has knowledge (e.g., via
+ presence) that the intended recipient's resource is no longer
+ available.
+
+ <message
+ from='romeo@example.net/orchard'
+ id='sl3nx51f'
+ to='juliet@example.com/balcony'
+ type='chat'
+ xml:lang='en'>
+ <body>Neither, fair saint, if either thee dislike.</body>
+ </message>
+
+5.2.2. Type Attribute
+
+ Common uses of the message stanza in instant messaging applications
+ include: single messages; messages sent in the context of a one-to-
+ one chat session; messages sent in the context of a multi-user chat
+ room; alerts, notifications, or other information to which no reply
+ is expected; and errors. These uses are differentiated via the
+ 'type' attribute. Inclusion of the 'type' attribute is RECOMMENDED.
+ If included, the 'type' attribute MUST have one of the following
+ values:
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 71]
+
+RFC 6121 XMPP IM March 2011
+
+
+ o chat -- The message is sent in the context of a one-to-one chat
+ session. Typically an interactive client will present a message
+ of type "chat" in an interface that enables one-to-one chat
+ between the two parties, including an appropriate conversation
+ history. Detailed recommendations regarding one-to-one chat
+ sessions are provided under Section 5.1.
+
+ o error -- The message is generated by an entity that experiences an
+ error when processing a message received from another entity (for
+ details regarding stanza error syntax, refer to [XMPP-CORE]). A
+ client that receives a message of type "error" SHOULD present an
+ appropriate interface informing the original sender regarding the
+ nature of the error.
+
+ o groupchat -- The message is sent in the context of a multi-user
+ chat environment (similar to that of [IRC]). Typically a
+ receiving client will present a message of type "groupchat" in an
+ interface that enables many-to-many chat between the parties,
+ including a roster of parties in the chatroom and an appropriate
+ conversation history. For detailed information about XMPP-based
+ groupchat, refer to [XEP-0045].
+
+ o headline -- The message provides an alert, a notification, or
+ other transient information to which no reply is expected (e.g.,
+ news headlines, sports updates, near-real-time market data, or
+ syndicated content). Because no reply to the message is expected,
+ typically a receiving client will present a message of type
+ "headline" in an interface that appropriately differentiates the
+ message from standalone messages, chat messages, and groupchat
+ messages (e.g., by not providing the recipient with the ability to
+ reply). If the 'to' address is the bare JID, the receiving server
+ SHOULD deliver the message to all of the recipient's available
+ resources with non-negative presence priority and MUST deliver the
+ message to at least one of those resources; if the 'to' address is
+ a full JID and there is a matching resource, the server MUST
+ deliver the message to that resource; otherwise the server MUST
+ either silently ignore the message or return an error (see
+ Section 8).
+
+ o normal -- The message is a standalone message that is sent outside
+ the context of a one-to-one conversation or groupchat, and to
+ which it is expected that the recipient will reply. Typically a
+ receiving client will present a message of type "normal" in an
+ interface that enables the recipient to reply, but without a
+ conversation history. The default value of the 'type' attribute
+ is "normal".
+
+
+
+
+
+Saint-Andre Standards Track [Page 72]
+
+RFC 6121 XMPP IM March 2011
+
+
+ An IM application SHOULD support all of the foregoing message types.
+ If an application receives a message with no 'type' attribute or the
+ application does not understand the value of the 'type' attribute
+ provided, it MUST consider the message to be of type "normal" (i.e.,
+ "normal" is the default).
+
+ Guidelines for server handling of different message types is provided
+ under Section 8.
+
+ Although the 'type' attribute is OPTIONAL, it is considered polite to
+ mirror the type in any replies to a message; furthermore, some
+ specialized applications (e.g., a multi-user chat service) MAY at
+ their discretion enforce the use of a particular message type (e.g.,
+ type='groupchat').
+
+5.2.3. Body Element
+
+ The <body/> element contains human-readable XML character data that
+ specifies the textual contents of the message; this child element is
+ normally included but is OPTIONAL.
+
+ <message
+ from='juliet@example.com/balcony'
+ id='b4vs9km4'
+ to='romeo@example.net'
+ type='chat'
+ xml:lang='en'>
+ <body>Wherefore art thou, Romeo?</body>
+ </message>
+
+ There are no attributes defined for the <body/> element, with the
+ exception of the 'xml:lang' attribute. Multiple instances of the
+ <body/> element MAY be included in a message stanza for the purpose
+ of providing alternate versions of the same body, 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 from the
+ sender's perspective can include the XML stream header as described
+ in [XMPP-CORE]).
+
+
+
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 73]
+
+RFC 6121 XMPP IM March 2011
+
+
+ <message
+ from='juliet@example.com/balcony'
+ id='z94nb37h'
+ to='romeo@example.net'
+ type='chat'
+ xml:lang='en'>
+ <body>Wherefore art thou, Romeo?</body>
+ <body xml:lang='cs'>
+ Pro&#x010D;e&#x017D; jsi ty, Romeo?
+ </body>
+ </message>
+
+ The <body/> element MUST NOT contain mixed content (as defined in
+ Section 3.2.2 of [XML]).
+
+5.2.4. Subject Element
+
+ The <subject/> element contains human-readable XML character data
+ that specifies the topic of the message.
+
+ <message
+ from='juliet@example.com/balcony'
+ id='c8xg3nf8'
+ to='romeo@example.net'
+ type='chat'
+ xml:lang='en'>
+ <subject>I implore you!</subject>
+ <body>Wherefore art thou, Romeo?</body>
+ </message>
+
+ There are no attributes defined for the <subject/> element, with the
+ exception of the 'xml:lang' attribute inherited from [XML]. Multiple
+ instances of the <subject/> element MAY be included for the purpose
+ of providing alternate versions of the same subject, 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 from the
+ sender's perspective can include the XML stream header as described
+ in [XMPP-CORE]).
+
+
+
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 74]
+
+RFC 6121 XMPP IM March 2011
+
+
+ <message
+ from='juliet@example.com/balcony'
+ id='jk3v47gw'
+ to='romeo@example.net'
+ type='chat'
+ xml:lang='en'>
+ <subject>I implore you!</subject>
+ <subject xml:lang='cs'>
+ &#x00DA;p&#x011B;nliv&#x011B; pros&#x00ED;m!
+ </subject>
+ <body>Wherefore art thou, Romeo?</body>
+ <body xml:lang='cs'>
+ Pro&#x010D;e&#x017E; jsi ty, Romeo?
+ </body>
+ </message>
+
+ The <subject/> element MUST NOT contain mixed content (as defined in
+ Section 3.2.2 of [XML]).
+
+5.2.5. Thread Element
+
+ The primary use of the XMPP <thread/> element is to uniquely identify
+ a conversation thread or "chat session" between two entities
+ instantiated by <message/> stanzas of type 'chat'. However, the XMPP
+ <thread/> element MAY also be used to uniquely identify an analogous
+ thread between two entities instantiated by <message/> stanzas of
+ type 'headline' or 'normal', or among multiple entities in the
+ context of a multi-user chat room instantiated by <message/> stanzas
+ of type 'groupchat'. It MAY also be used for <message/> stanzas not
+ related to a human conversation, such as a game session or an
+ interaction between plugins. The <thread/> element is not used to
+ identify individual messages, only conversations or messaging
+ sessions.
+
+ The inclusion of the <thread/> element is OPTIONAL. Because the
+ <thread/> element identifies the particular conversation thread to
+ which a message belongs, a message stanza MUST NOT contain more than
+ one <thread/> element.
+
+ The <thread/> element MAY possess a 'parent' attribute that
+ identifies another thread of which the current thread is an offshoot
+ or child. The 'parent' attribute MUST conform to the syntax of the
+ <thread/> element itself and its value MUST be different from the XML
+ character data of the <thread/> element on which the 'parent'
+ attribute is included.
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 75]
+
+RFC 6121 XMPP IM March 2011
+
+
+ Implementation Note: The ability to specify both a parent thread
+ and a child thread introduces the possibility of conflicts between
+ thread identifiers for overlapping threads. For example, one
+ <thread/> element might contain XML character data of "foo" and a
+ 'parent' attribute whose value is "bar", a second <thread/>
+ element might contain XML character data of "bar" and a 'parent'
+ attribute whose value is "baz", and a third <thread/> element
+ might contain XML character data of "baz" and a 'parent' attribute
+ whose value is once again "foo". It is up to the implementation
+ how it will treat conflicts between such overlapping thread
+ identifiers (e.g., whether it will "chain together" thread
+ identifiers by showing "foo" as both a parent and grandchild of
+ "baz" in a multi-level user interface, or whether it will show
+ only one level of dependency at a time).
+
+ The value of the <thread/> element is not human-readable and MUST be
+ treated as opaque by entities; no semantic meaning can be derived
+ from it, and only exact comparisons can be made against it. The
+ value of the <thread/> element MUST uniquely identify the
+ conversation thread either between the conversation partners or more
+ generally (one way to ensure uniqueness is by generating a
+ universally unique identifier (UUID) as described in [UUID]).
+
+ Security Warning: An application that generates a ThreadID MUST
+ ensure that it does not reveal identifying information about the
+ entity (e.g., the MAC address of the device on which the XMPP
+ application is running).
+
+ The <thread/> element MUST NOT contain mixed content (as defined in
+ Section 3.2.2 of [XML]).
+
+ <message
+ from='juliet@example.com/balcony'
+ to='romeo@example.net'
+ type='chat'
+ xml:lang='en'>
+ <subject>I implore you!</subject>
+ <subject xml:lang='cs'>
+ &#x00DA;p&#x011B;nliv&#x011B; pros&#x00ED;m!
+ </subject>
+ <body>Wherefore art thou, Romeo?</body>
+ <body xml:lang='cs'>
+ Pro&#x010D;e&#x017E; jsi ty, Romeo?
+ </body>
+ <thread parent='e0ffe42b28561960c6b12b944a092794b9683a38'>
+ 0e3141cd80894871a68e6fe6b1ec56fa
+ </thread>
+ </message>
+
+
+
+Saint-Andre Standards Track [Page 76]
+
+RFC 6121 XMPP IM March 2011
+
+
+ For detailed recommendations regarding use of the <thread/> element,
+ refer to [XEP-0201].
+
+5.3. Extended Content
+
+ As described in [XMPP-CORE], an XML stanza MAY contain any child
+ element that is qualified by a namespace other than the default
+ namespace; this applies to the message stanza as well. Guidelines
+ for handling extended content on the part of both routing servers and
+ end recipients are provided in Section 8.4 of [XMPP-CORE].
+
+ (In the following example, the message stanza includes an XHTML-
+ formatted version of the message as defined in [XEP-0071]).)
+
+ <message
+ from='juliet@example.com/balcony'
+ to='romeo@example.net'
+ 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'>
+ <p>Wherefore <span style='font-style: italic'>art</span>
+ thou, <span style='color:red'>Romeo</span>?</p>
+ </body>
+ </html>
+ </message>
+
+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.,
+ that the 'id' attribute is mandatory) are defined in [XMPP-CORE],
+ whereas the specific semantics needed to complete particular use
+ cases are defined in all instances by the extended namespace that
+ qualifies the direct child element of an IQ stanza of type "get" or
+ "set". The 'jabber:client' and 'jabber:server' namespaces do not
+ define any children of IQ stanzas other than the <error/> element
+ common to all stanza types. 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.
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 77]
+
+RFC 6121 XMPP IM March 2011
+
+
+7. A Sample Session
+
+ The examples in this section illustrate a possible instant messaging
+ and presence session. The user is <romeo@example.net>, he has an
+ available resource whose resourcepart is "orchard", and he has the
+ following individuals in his roster:
+
+ o <juliet@example.com> (subscription="both" and she has two
+ available resources, "chamber" and "balcony")
+
+ o <benvolio@example.net> (subscription="to")
+
+ o <mercutio@example.org> (subscription="from")
+
+ First, the user completes the preconditions (stream establishment,
+ TLS and SASL negotiation, and resource binding) described in
+ [XMPP-CORE]; those protocol flows are not reproduced here.
+
+ Next, the user requests his roster.
+
+ Example 1: User requests current roster from server
+
+ UC: <iq from='romeo@example.net/orchard'
+ id='hf61v3n7'
+ type='get'>
+ <query xmlns='jabber:iq:roster'/>
+ </iq>
+
+ Example 2: User receives roster from server
+
+ US: <iq id='hf61v3n7'
+ to='romeo@example.net/orchard'
+ type='result'>
+ <query xmlns='jabber:iq:roster'>
+ <item jid='juliet@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>
+
+
+
+
+Saint-Andre Standards Track [Page 78]
+
+RFC 6121 XMPP IM March 2011
+
+
+ Now the user begins a presence session.
+
+ Example 3: User sends initial presence
+
+ UC: <presence/>
+
+ Example 4: User's server sends presence probes to contacts with
+ subscription="to" and subscription="both" on behalf of the user
+
+ US: <presence
+ from='romeo@example.net'
+ to='juliet@example.com'
+ type='probe'/>
+
+ US: <presence
+ from='romeo@example.net'
+ to='benvolio@example.org'
+ type='probe'/>
+
+ Example 5: User's server sends initial presence to contacts with
+ subscription="from" and subscription="both" on behalf of the user's
+ available resource, as well as to user
+
+ US: <presence
+ from='romeo@example.net/orchard'
+ to='juliet@example.com'/>
+
+ US: <presence
+ from='romeo@example.net/orchard'
+ to='mercutio@example.org'/>
+
+ US: <presence
+ from='romeo@example.net/orchard'
+ to='romeo@example.net'/>
+
+ Example 6: Contacts' servers reply to presence probe on behalf of all
+ available resources
+
+ CS: <presence
+ from='juliet@example.com/balcony'
+ to='romeo@example.net'
+ xml:lang='en'>
+ <show>away</show>
+ <status>be right back</status>
+ <priority>0</priority>
+ </presence>
+
+
+
+
+
+Saint-Andre Standards Track [Page 79]
+
+RFC 6121 XMPP IM March 2011
+
+
+ CS: <presence
+ from='juliet@example.com/chamber'
+ to='romeo@example.net'>
+ <priority>1</priority>
+ </presence>
+
+ CS: <presence
+ from='benvolio@example.org/pda'
+ to='romeo@example.net'
+ xml:lang='en'>
+ <show>dnd</show>
+ <status>gallivanting</status>
+ </presence>
+
+ Example 7: Contacts' servers deliver user's initial presence to all
+ available resources
+
+ 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='romeo@example.net/orchard'
+ to='mercutio@example.org'/>
+
+ Example 8: User sends directed presence to another user not 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 user engages in a chat session with one of his contacts.
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 80]
+
+RFC 6121 XMPP IM March 2011
+
+
+ Example 9: A threaded conversation
+
+ CC: <message
+ from='juliet@example.com/balcony'
+ to='romeo@example.net'
+ type='chat'
+ xml:lang='en'>
+ <body>My ears have not yet drunk a hundred words</body>
+ <thread>e0ffe42b28561960c6b12b944a092794b9683a38</thread>
+ </message>
+
+ CC: <message
+ from='juliet@example.com/balcony'
+ to='romeo@example.net'
+ type='chat'
+ xml:lang='en'>
+ <body>Of that tongue's utterance, yet I know the sound:</body>
+ <thread>e0ffe42b28561960c6b12b944a092794b9683a38</thread>
+ </message>
+
+ CC: <message
+ from='juliet@example.com/balcony'
+ to='romeo@example.net'
+ type='chat'
+ xml:lang='en'>
+ <body>Art thou not Romeo, and a 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.
+
+
+
+Saint-Andre Standards Track [Page 81]
+
+RFC 6121 XMPP IM March 2011
+
+
+ The user can also send subsequent presence broadcast.
+
+ Example 10: User sends updated available presence for broadcast
+
+ UC: <presence xml:lang='en'>
+ <show>away</show>
+ <status>I shall return!</status>
+ <priority>1</priority>
+ </presence>
+
+ Example 11: User's server broadcasts updated presence to the contacts
+ who have a subscription of type "both" or "from" (but not to the
+ entity to which the user sent directed presence)
+
+ US: <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>
+
+ US: <presence
+ from='romeo@example.net/orchard'
+ to='mercutio@example.org'
+ xml:lang='en'>
+ <show>away</show>
+ <status>I shall return!</status>
+ <priority>1</priority>
+ </presence>
+
+ Example 12: Contacts' servers deliver updated 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>
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 82]
+
+RFC 6121 XMPP IM March 2011
+
+
+ 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='mercutio@example.org'
+ xml:lang='en'>
+ <show>away</show>
+ <status>I shall return!</status>
+ <priority>1</priority>
+ </presence>
+
+ Example 13: One of the contact's resources broadcasts unavailable
+ notification
+
+ CC: <presence from='juliet@example.com/chamber' type='unavailable'/>
+
+ Example 14: Contact's server sends unavailable notification to user
+
+ CS: <presence
+ from='juliet@example.com/chamber'
+ to='romeo@example.net'
+ type='unavailable'/>
+
+ Now the user ends his presence session.
+
+ Example 15: User sends unavailable notification
+
+ UC: <presence type='unavailable' xml:lang='en'>
+ <status>gone home</status>
+ </presence>
+
+ Example 16: User's server broadcasts unavailable notification to
+ contacts as well as to the entity to whom the user sent directed
+ presence
+
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 83]
+
+RFC 6121 XMPP IM March 2011
+
+
+ US: <presence
+ from='romeo@example.net/orchard'
+ to='juliet@example.com'
+ type='unavailable'
+ xml:lang='en'>
+ <status>gone home</status>
+ </presence>
+
+ US: <presence
+ from='romeo@example.net/orchard'
+ to='mercutio@example.org'
+ type='unavailable'
+ xml:lang='en'>
+ <status>gone home</status>
+ </presence>
+
+ US: <presence
+ from='romeo@example.net/orchard'
+ to='nurse@example.com'
+ type='unavailable'
+ xml:lang='en'>
+ <status>gone home</status>
+ </presence>
+
+ Finally the user closes his stream and the server responds in kind.
+
+ Example 17: User closes stream
+
+ UC: </stream:stream>
+
+ Example 18: User's server closes stream
+
+ US: </stream:stream>
+
+ THE END
+
+8. Server Rules for Processing XML Stanzas
+
+ Basic server rules for processing XML stanzas are defined in
+ [XMPP-CORE], and the reader is referred to that specification for
+ underlying rules and security implications. This section defines
+ supplementary rules for XMPP instant messaging and presence servers.
+
+ Some delivery rules defined in this section specify the use of
+ "offline storage", i.e., the server's act of storing a message stanza
+ on behalf of the user and then delivering it when the user next
+ becomes available. For recommendations regarding offline message
+ storage, refer to [XEP-0160].
+
+
+
+Saint-Andre Standards Track [Page 84]
+
+RFC 6121 XMPP IM March 2011
+
+
+8.1. General Considerations
+
+ [XMPP-CORE] discusses general considerations for stanza delivery, in
+ particular the tradeoffs between (i) providing an acceptable level of
+ service regarding stanza delivery and (ii) preventing directory
+ harvesting attacks and presence leaks. However, the concept of a
+ directory harvesting attack does not apply if a contact is known to
+ and trusted by a user (because the contact is in the user's roster as
+ described under Section 2). Similarly, the concept of a presence
+ leak does not apply if a contact is authorized to know a user's
+ presence (by means of a presence subscription as described under
+ Section 3) or if the user has voluntarily sent presence to an entity
+ (by means of directed presence as described under Section 4.6).
+ Therefore, in cases where the following sections guard against
+ directory harvesting attacks and presence leaks by providing an
+ alternative of (a) silently ignoring a stanza or (b) returning an
+ error, a server SHOULD return an error if the originating entity is
+ in the user's roster (when the error would reveal whether the user's
+ account exists) or is authorized to receive presence from the user or
+ has received directed presence from the user (when the error would
+ reveal the presence of a user's resource).
+
+ Security Warning: All of the stanza processing rules described
+ below are defined with the understanding that they will be applied
+ subject to enforcement of relevant privacy and security policies,
+ such as those deployed by means of [XEP-0016] or [XEP-0191]. The
+ conformance language (MUST, SHOULD, etc.) in the following
+ sections is not meant to override any such local service policies.
+
+8.2. No 'to' Address
+
+ If the stanza possesses no 'to' attribute, the rules defined in
+ [XMPP-CORE] apply.
+
+8.3. Remote Domain
+
+ If the domainpart of the address contained in the 'to' attribute of
+ an outbound stanza does not match a configured domain of the server
+ itself, then the rules provided in Section 10.4 of [XMPP-CORE] apply.
+
+ Interoperability Note: RFC 3921 specified how to use the _im._xmpp
+ and _pres._xmpp SRV records [IMP-SRV] as a fallback method for
+ discovering whether a remote instant messaging and presence
+ service communicates via XMPP. Because those SRV records have not
+ been widely deployed, this document no longer specifies their use,
+ and new implementations are not encouraged.
+
+
+
+
+
+Saint-Andre Standards Track [Page 85]
+
+RFC 6121 XMPP IM March 2011
+
+
+8.4. Local Domain
+
+ If the domainpart of the JID contained in the 'to' attribute matches
+ one of the configured domains of the server, the domain is serviced
+ by the server itself (not by a specialized local service), and the
+ JID is of the form <domainpart> or <domainpart/resourcepart>, the
+ rules defined in [XMPP-CORE] apply.
+
+8.5. Local User
+
+ If the 'to' address specifies a bare JID <localpart@domainpart> or
+ full JID <localpart@domainpart/resourcepart> where the domainpart of
+ the JID matches a configured domain that is serviced by the server
+ itself, the server MUST proceed as follows.
+
+8.5.1. No Such User
+
+ If the user account identified by the 'to' attribute does not exist,
+ how the stanza is processed depends on the stanza type.
+
+ o For an IQ stanza, the server MUST return a <service-unavailable/>
+ stanza error to the sender.
+
+ o For a message stanza, the server MUST either (a) silently ignore
+ the message or (b) return a <service-unavailable/> stanza error to
+ the sender.
+
+ o For a presence stanza with no 'type' attribute or a 'type'
+ attribute of "unavailable", the server MUST silently ignore the
+ stanza.
+
+ o For a presence stanza of type "subscribe", "subscribed",
+ "unsubscribe", or "unsubscribed", the server MUST silently ignore
+ the stanza.
+
+ o For a presence stanza of type "probe", the server MUST either (a)
+ silently ignore the stanza or (b) return a presence stanza of type
+ "unsubscribed".
+
+8.5.2. localpart@domainpart
+
+ If the JID contained in the 'to' attribute is of the form
+ <localpart@domainpart>, then the server MUST adhere to the following
+ rules.
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 86]
+
+RFC 6121 XMPP IM March 2011
+
+
+8.5.2.1. Available or Connected Resources
+
+ If there is at least one available resource or connected resource,
+ how the stanza is processed depends on the stanza type.
+
+8.5.2.1.1. Message
+
+ For a message stanza of type "normal":
+
+ o If all of the available resources have a negative presence
+ priority then the server SHOULD either (a) store the message
+ offline for later delivery or (b) return a stanza error to the
+ sender, which SHOULD be <service-unavailable/>.
+
+ o If there is one available resource with a non-negative presence
+ priority then the server MUST deliver the message to that
+ resource.
+
+ o If there is more than one resource with a non-negative presence
+ priority then the server MUST either (a) deliver the message to
+ the "most available" resource or resources (according to the
+ server's implementation-specific algorithm, e.g., treating the
+ resource or resources with the highest presence priority as "most
+ available") or (b) deliver the message to all of the non-negative
+ resources.
+
+ For a message stanza of type "chat":
+
+ o If the only available resource has a negative presence priority
+ then the server SHOULD either (a) store the message offline for
+ later delivery or (b) return a stanza error to the sender, which
+ SHOULD be <service-unavailable/>.
+
+ o If the only available resource has a non-negative presence
+ priority then the server MUST deliver the message to that
+ resource.
+
+ o If there is more than one resource with a non-negative presence
+ priority then the server MUST either (a) deliver the message to
+ the "most available" resource or resources (according to the
+ server's implementation-specific algorithm, e.g., treating the
+ resource or resources with the highest presence priority as "most
+ available") or (b) deliver the message to all of the non-negative
+ resources that have opted in to receive chat messages.
+
+ For a message stanza of type "groupchat", the server MUST NOT deliver
+ the stanza to any of the available resources but instead MUST return
+ a stanza error to the sender, which SHOULD be <service-unavailable/>.
+
+
+
+Saint-Andre Standards Track [Page 87]
+
+RFC 6121 XMPP IM March 2011
+
+
+ For a message stanza of type "headline":
+
+ o If the only available resource has a negative presence priority
+ then the server MUST silently ignore the stanza.
+
+ o If the only available resource has a non-negative presence
+ priority then the server MUST deliver the message to that
+ resource.
+
+ o If there is more than one resource with a non-negative presence
+ priority then the server MUST deliver the message to all of the
+ non-negative resources.
+
+ For a message stanza of type "error", the server MUST silently ignore
+ the message.
+
+ However, for any message type the server MUST NOT deliver the stanza
+ to any available resource with a negative priority; if the only
+ available resource has a negative priority, the server SHOULD handle
+ the message as if there were no available resources or connected
+ resources as described under Section 8.5.2.2.
+
+ In all cases, the server MUST NOT rewrite the 'to' attribute (i.e.,
+ it MUST leave it as <localpart@domainpart> rather than change it to
+ <localpart@domainpart/resourcepart>).
+
+8.5.2.1.2. Presence
+
+ For a presence stanza with no type or of type "unavailable", the
+ server MUST deliver it to all available resources.
+
+ For a presence stanza of type "subscribe", "subscribed",
+ "unsubscribe", or "unsubscribed", the server MUST adhere to the rules
+ defined under Section 3 and summarized under Appendix A.
+
+ For a presence stanza of type "probe", the server MUST handle it
+ directly as described under Section 4.3.
+
+ In all cases, the server MUST NOT rewrite the 'to' attribute (i.e.,
+ it MUST leave it as <localpart@domainpart> rather than change it to
+ <localpart@domainpart/resourcepart>).
+
+8.5.2.1.3. IQ
+
+ For an IQ stanza, the server itself MUST reply on behalf of the user
+ with either an IQ result or an IQ error, and MUST NOT deliver the IQ
+ stanza to any of the user's available resources. Specifically, if
+ the semantics of the qualifying namespace define a reply that the
+
+
+
+Saint-Andre Standards Track [Page 88]
+
+RFC 6121 XMPP IM March 2011
+
+
+ server can provide on behalf of the user, then the server MUST reply
+ to the stanza on behalf of the user by returning either an IQ stanza
+ of type "result" or an IQ stanza of type "error" that is appropriate
+ to the original payload; if not, then the server MUST reply with a
+ <service-unavailable/> stanza error.
+
+8.5.2.2. No Available or Connected Resources
+
+ If there are no available resources or connected resources associated
+ with the user, how the stanza is processed depends on the stanza
+ type.
+
+8.5.2.2.1. Message
+
+ For a message stanza of type "normal" or "chat", the server SHOULD
+ either (a) add the message to offline storage or (b) return a stanza
+ error to the sender, which SHOULD be <service-unavailable/>.
+
+ For a message stanza of type "groupchat", the server MUST return an
+ error to the sender, which SHOULD be <service-unavailable/>.
+
+ For a message stanza of type "headline" or "error", the server MUST
+ silently ignore the message.
+
+8.5.2.2.2. Presence
+
+ For a presence stanza with no type or of type "unavailable", the
+ server SHOULD silently ignore the stanza by not storing it for later
+ delivery and not replying to it on behalf of the user.
+
+ For a presence stanza of type "subscribe", "subscribed",
+ "unsubscribe", or "unsubscribed", the server MUST adhere to the rules
+ defined under Section 3 and summarized under Appendix A.
+
+ For a presence stanza of type "probe", the server MUST handle it
+ directly as described under Section 4.3.
+
+8.5.2.2.3. IQ
+
+ For an IQ stanza, the server itself MUST reply on behalf of the user
+ with either an IQ result or an IQ error. Specifically, if the
+ semantics of the qualifying namespace define a reply that the server
+ can provide on behalf of the user, then the server MUST reply to the
+ stanza on behalf of the user by returning either an IQ stanza of type
+ "result" or an IQ stanza of type "error" that is appropriate to the
+ original payload; if not, then the server MUST reply with a <service-
+ unavailable/> stanza error.
+
+
+
+
+Saint-Andre Standards Track [Page 89]
+
+RFC 6121 XMPP IM March 2011
+
+
+8.5.3. localpart@domainpart/resourcepart
+
+ If the domainpart of the JID contained in the 'to' attribute of an
+ inbound stanza matches one of the configured domains of the server
+ itself and the JID contained in the 'to' attribute is of the form
+ <localpart@domainpart/resourcepart>, then the server MUST adhere to
+ the following rules.
+
+8.5.3.1. Resource Matches
+
+ If an available resource or connected resource exactly matches the
+ full JID, how the stanza is processed depends on the stanza type.
+
+ o For an IQ stanza of type "get" or "set", if the intended recipient
+ does not share presence with the requesting entity either by means
+ of a presence subscription of type "both" or "from" or by means of
+ directed presence, then the server SHOULD NOT deliver the IQ
+ stanza but instead SHOULD return a <service-unavailable/> stanza
+ error to the requesting entity. This policy helps to prevent
+ presence leaks (see Section 11).
+
+ o For an IQ stanza of type "result" or "error", the server MUST
+ deliver the stanza to the resource.
+
+ o For a message stanza, the server MUST deliver the stanza to the
+ resource.
+
+ o For a presence stanza with no 'type' attribute or a 'type'
+ attribute of "unavailable", the server MUST deliver the stanza to
+ the resource.
+
+ o For a presence stanza of type "subscribe", "subscribed",
+ "unsubscribe", or "unsubscribed", the server MUST follow the
+ guidelines provided under Section 3.
+
+ o For a presence stanza of type "probe", the server MUST follow the
+ guidelines provided under Section 4.3.
+
+8.5.3.2. No Resource Matches
+
+ If no available resource or connected resource exactly matches the
+ full JID, how the stanza is processed depends on the stanza type.
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 90]
+
+RFC 6121 XMPP IM March 2011
+
+
+8.5.3.2.1. Message
+
+ For a message stanza of type "normal", "groupchat", or "headline",
+ the server MUST either (a) silently ignore the stanza or (b) return
+ an error stanza to the sender, which SHOULD be <service-
+ unavailable/>.
+
+ For a message stanza of type "chat":
+
+ o If there is no available or connected resource, the server MUST
+ either (a) store the message offline for later delivery or (b)
+ return an error stanza to the sender, which SHOULD be <service-
+ unavailable/>.
+
+ o If all of the available resources have a negative presence
+ priority then the server SHOULD (a) store the message offline for
+ later delivery or (b) return a stanza error to the sender, which
+ SHOULD be <service-unavailable/>.
+
+ o If there is one available resource with a non-negative presence
+ priority then the server MUST deliver the message to that
+ resource.
+
+ o If there is more than one resource with a non-negative presence
+ priority then the server MUST either (a) deliver the message to
+ the "most available" resource or resources (according to the
+ server's implementation-specific algorithm, e.g., treating the
+ resource or resources with the highest presence priority as "most
+ available") or (b) deliver the message to all of the non-negative
+ resources that have opted in to receive chat messages.
+
+ For a message stanza of type "error", the server MUST silently ignore
+ the stanza.
+
+8.5.3.2.2. Presence
+
+ For a presence stanza with no 'type' attribute or a 'type' attribute
+ of "unavailable", the server MUST silently ignore the stanza.
+
+ For a presence stanza of type "subscribe", the server MUST follow the
+ guidelines provided under Section 3.1.3.
+
+ For a presence stanza of type "subscribed", "unsubscribe", or
+ "unsubscribed", the server MUST ignore the stanza.
+
+ For a presence stanza of type "probe", the server MUST follow the
+ guidelines provided under Section 4.3.
+
+
+
+
+Saint-Andre Standards Track [Page 91]
+
+RFC 6121 XMPP IM March 2011
+
+
+8.5.3.2.3. IQ
+
+ For an IQ stanza, the server MUST return a <service-unavailable/>
+ stanza error to the sender.
+
+8.5.4. Summary of Message Delivery Rules
+
+ The following table summarizes the message (not stanza) delivery
+ rules described earlier in this section. The left column shows
+ various combinations of conditions (non-existent account, no active
+ resources, only one resource and it has a negative presence priority,
+ only one resource and it has a non-negative presence priority, or
+ more than one resource and each one has a non-negative presence
+ priority) and 'to' addresses (bare JID, full JID matching an
+ available resource, or full JID matching no available resource). The
+ subsequent columns list the four primary message types (normal, chat,
+ groupchat, or headline) along with six possible delivery options:
+ storing the message offline (O), bouncing the message with a stanza
+ error (E), silently ignoring the message (S), delivering the message
+ to the resource specified in the 'to' address (D), delivering the
+ message to the "most available" resource or resources according to
+ the server's implementation-specific algorithm, e.g., treating the
+ resource or resources with the highest presence priority as "most
+ available" (M), or delivering the message to all resources with non-
+ negative presence priority (A -- where for chat messages "all
+ resources" can mean the set of resources that have explicitly opted
+ in to receiving every chat message). The '/' character stands for
+ "exclusive or". The server SHOULD observe the rules given in section
+ 8.1 when choosing which action to take for a particular message.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 92]
+
+RFC 6121 XMPP IM March 2011
+
+
+ Table 1: Message Delivery Rules
+
+ +----------------------------------------------------------+
+ | Condition | Normal | Chat | Groupchat | Headline |
+ +----------------------------------------------------------+
+ | ACCOUNT DOES NOT EXIST |
+ | bare | S/E | S/E | E | S |
+ | full | S/E | S/E | S/E | S/E |
+ +----------------------------------------------------------+
+ | ACCOUNT EXISTS, BUT NO ACTIVE RESOURCES |
+ | bare | O/E | O/E | E | S |
+ | full (no match) | S/E | O/E | S/E | S/E |
+ +----------------------------------------------------------+
+ | 1+ NEGATIVE RESOURCES BUT ZERO NON-NEGATIVE RESOURCES |
+ | bare | O/E | O/E | E | S |
+ | full match | D | D | D | D |
+ | full no match | S/E | O/E | S/E | S/E |
+ +----------------------------------------------------------+
+ | 1 NON-NEGATIVE RESOURCE |
+ | bare | D | D | E | D |
+ | full match | D | D | D | D |
+ | full no match | S/E | D | S/E | S/E |
+ +----------------------------------------------------------+
+ | 1+ NON-NEGATIVE RESOURCES |
+ | bare | M/A | M/A* | E | A |
+ | full match | D | D/A* | D | D |
+ | full no match | S/E | M/A* | S/E | S/E |
+ +----------------------------------------------------------+
+
+ * For messages of type "chat", a server SHOULD NOT act in
+ accordance with option (A) unless clients can explicitly opt in to
+ receiving all chat messages; however, methods for opting in are
+ outside the scope of this specification.
+
+9. Handling of URIs
+
+ The addresses of XMPP entities as used in communication over an XMPP
+ network (e.g., in the 'from' and 'to' addresses of an XML stanza)
+ MUST NOT be prepended with a Uniform Resource Identifier [URI]
+ scheme.
+
+ However, an application that is external to XMPP itself (e.g., a page
+ on the World Wide Web) might need to identify an XMPP entity either
+ as a URI or as an Internationalized Resource Identifier [IRI], and an
+ XMPP client might need to interact with such an external application
+ (for example, an XMPP client might be invoked by clicking a link
+ provided on a web page). In the context of such interactions, XMPP
+ clients are encouraged to handle addresses that are encoded as
+
+
+
+Saint-Andre Standards Track [Page 93]
+
+RFC 6121 XMPP IM March 2011
+
+
+ "xmpp:" URIs and IRIs as specified in [XMPP-URI] and further
+ described in [XEP-0147]. Although XMPP clients are also encouraged
+ to handle addresses that are encoded as "im:" URIs as specified in
+ [CPIM] and "pres:" URIs as specified in [CPP], they can do so by
+ removing the "im:" or "pres:" scheme and entrusting address
+ resolution to the server as specified under Section 8.3.
+
+10. Internationalization Considerations
+
+ For internationalization considerations, refer to the relevant
+ section of [XMPP-CORE].
+
+11. Security Considerations
+
+ Core security considerations for XMPP are provided in Section 13 of
+ [XMPP-CORE], including discussion of channel encryption,
+ authentication, information leaks, denial-of-service attacks, and
+ interdomain federation.
+
+ Section 13.1 of [XMPP-CORE] outlines the architectural roles of
+ clients and servers in typical deployments of XMPP, and discusses the
+ security properties associated with those roles. These roles have an
+ impact on the security of instant messages, presence subscriptions,
+ and presence notifications as described in this document. In
+ essence, an XMPP user registers (or has provisioned) an account on an
+ XMPP server and therefore places some level of trust in the server to
+ complete various tasks on the user's behalf, enforce security
+ policies, etc. Thus it is the server's responsibility to:
+
+ 1. Preferably mandate the use of channel encryption for
+ communication with local clients and remote servers.
+
+ 2. Authenticate any client that wishes to access the user's account.
+
+ 3. Process XML stanzas to and from clients that have authenticated
+ as the user (specifically with regard to instant messaging and
+ presence functionality, store the user's roster, process inbound
+ and outbound subscription requests and responses, generate and
+ handle presence probes, broadcast outbound presence
+ notifications, route outbound messages, and deliver inbound
+ messages and presence notifications).
+
+ As discussed in Sections 13.1 and 13.4 of [XMPP-CORE], even if the
+ server fulfills the foregoing responsibilities, the client does not
+ have any assurance that stanzas it might exchange with other clients
+ (whether on the same server or a remote server) are protected for all
+ hops along the XMPP communication path, or within the server itself.
+ It is the responsibility of the client to use an appropriate
+
+
+
+Saint-Andre Standards Track [Page 94]
+
+RFC 6121 XMPP IM March 2011
+
+
+ technology for encryption and signing of XML stanzas if it wishes to
+ ensure end-to-end confidentiality and integrity of its
+ communications.
+
+ 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 configured domains, the server MUST NOT reveal the user's
+ presence if the sender is an entity that is not authorized to
+ receive that information as determined by presence subscriptions
+ (see Section 4).
+
+ o A user's server MUST NOT leak the user's network availability to
+ entities who are not authorized to know the user's presence. In
+ XMPP itself, authorization takes the form of an explicit
+ subscription from a contact to the user (as described under
+ Section 3). However, some XMPP deployments might consider an
+ entity to be authorized if there is an existing trust relationship
+ between the entity and the user who is generating presence
+ information (as an example, a corporate deployment of XMPP might
+ automatically add the user's presence information to a private
+ directory of employees if the organization mandates the sharing of
+ presence information as part of an employment agreement).
+
+ o When a server processes an outbound presence stanza with no type
+ or of type "unavailable", it MUST follow the rules defined under
+ Section 4 in order to ensure that such presence information is not
+ sent to entities that are not authorized to know such information.
+
+ o A client MAY ignore the <status/> element when contained in a
+ presence stanza of type "subscribe", "unsubscribe", "subscribed",
+ or "unsubscribed"; this can help prevent "presence subscription
+ spam".
+
+12. Conformance Requirements
+
+ This section describes a protocol feature set that summarizes the
+ conformance requirements of this specification. This feature set is
+ appropriate for use in software certification, interoperability
+ testing, and implementation reports. For each feature, this section
+ provides the following information:
+
+ o A human-readable name
+
+ o An informational description
+
+
+
+Saint-Andre Standards Track [Page 95]
+
+RFC 6121 XMPP IM March 2011
+
+
+ o A reference to the particular section of this document that
+ normatively defines the feature
+
+ o Whether the feature applies to the Client role, the Server role,
+ or both (where "N/A" signifies that the feature is not applicable
+ to the specified role)
+
+ o Whether the feature MUST or SHOULD be implemented, where the
+ capitalized terms are to be understood as described in [KEYWORDS]
+
+ The feature set specified here attempts to adhere to the concepts and
+ formats proposed by Larry Masinter within the IETF's NEWTRK Working
+ Group in 2005, as captured in [INTEROP]. Although this feature set
+ is more detailed than called for by [REPORTS], it provides a suitable
+ basis for the generation of implementation reports to be submitted in
+ support of advancing this specification from Proposed Standard to
+ Draft Standard in accordance with [PROCESS].
+
+ Feature: message-body
+ Description: Support the <body/> child element of the <message/>
+ stanza.
+ Section: Section 5.2.3
+ Roles: Client MUST, Server N/A.
+
+ Feature: message-subject
+ Description: Support the <subject/> child element of the <message/>
+ stanza.
+ Section: Section 5.2.4
+ Roles: Client SHOULD, Server N/A.
+
+ Feature: message-thread
+ Description: Support the <thread/> child element of the <message/>
+ stanza.
+ Section: Section 5.2.5
+ Roles: Client SHOULD, Server N/A.
+
+ Feature: message-type-support
+ Description: Support reception of messages of type "normal", "chat",
+ "groupchat", "headline", and "error".
+ Section: Section 5.2.2
+ Roles: Client SHOULD, Server N/A.
+
+ Feature: message-type-deliver
+ Description: Appropriately deliver messages of type "normal",
+ "chat", "groupchat", "headline", and "error".
+ Section: Section 8
+ Roles: Client N/A, Server SHOULD.
+
+
+
+
+Saint-Andre Standards Track [Page 96]
+
+RFC 6121 XMPP IM March 2011
+
+
+ Feature: presence-notype
+ Description: Treat a presence stanza with no 'type' attribute as
+ indicating availability.
+ Section: Section 4.7.1
+ Roles: Client MUST, Server MUST.
+
+ Feature: presence-probe
+ Description: Send and receive presence stanzas with a 'type'
+ attribute of "probe" for the discovery of presence information.
+ Section: Section 4.7.1
+ Roles: Client N/A, Server MUST.
+
+ Feature: presence-sub-approval
+ Description: Treat an outbound presence stanza of type "subscribed"
+ as the act of approving a presence subscription request previously
+ received from another entity, and treat an inbound presence stanza
+ of type "subscribed" as a subscription approval from another
+ entity.
+ Section: Section 3.1
+ Roles: Client MUST, Server MUST.
+
+ Feature: presence-sub-cancel
+ Description: Treat an outbound presence stanza of type
+ "unsubscribed" as the act of denying a subscription request
+ received from another entity or canceling a subscription approval
+ previously granted to another entity, and treat an inbound
+ presence stanza of type "unsubscribed" as an subscription denial
+ or cancellation from another entity.
+ Section: Section 3.2
+ Roles: Client MUST, Server MUST.
+
+ Feature: presence-sub-preapproval
+ Description: Treat an outbound presence stanza of type "subscribed"
+ in certain circumstances as the act of pre-approving a
+ subscription request received from another entity; this includes
+ support for the 'approved' attribute of the <item/> element within
+ the 'jabber:iq:roster' namespace.
+ Section: Section 3.4
+ Roles: Client MAY, Server MAY.
+
+ Feature: presence-sub-request
+ Description: Treat an outbound presence stanza of type "subscribe"
+ as the act of requesting a subscription to the presence
+ information of another entity, and treat an inbound presence
+ stanza of type "subscribe" as a presence subscription request from
+ another entity.
+ Section: Section 3.1
+ Roles: Client MUST, Server MUST.
+
+
+
+Saint-Andre Standards Track [Page 97]
+
+RFC 6121 XMPP IM March 2011
+
+
+ Feature: presence-sub-unsubscribe
+ Description: Treat an outbound presence stanza of type "unsubscribe"
+ as the act of unsubscribing from another entity, and treat an
+ inbound presence stanza of type "unsubscribe" as an unsubscribe
+ notification from another entity.
+ Section: Section 3.3
+ Roles: Client MUST, Server MUST.
+
+ Feature: presence-unavailable
+ Description: Treat a presence stanza with a 'type' attribute of
+ "unavailable" as indicating lack of availability.
+ Section: Section 4.7.1
+ Roles: Client MUST, Server MUST.
+
+ Feature: roster-get
+ Description: Treat an IQ stanza of type "get" containing an empty
+ <query/> element qualified by the 'jabber:iq:roster' namespace as
+ a request to retrieve the roster information associated with an
+ account on a server.
+ Section: Section 2.1.3
+ Roles: Client MUST, Server MUST.
+
+ Feature: roster-set
+ Description: Treat an IQ stanza of type "set" containing a <query/>
+ element qualified by the 'jabber:iq:roster' namespace as a request
+ to add or update the item contained in the <query/> element.
+ Section: Section 2.1.5
+ Roles: Client MUST, Server MUST.
+
+ Feature: roster-push
+ Description: Send a roster push to each interested resource whenever
+ the server-side representation of the roster information
+ materially changes, or handle such a push when received from the
+ server.
+ Section: Section 2.1.6
+ Roles: Client MUST, Server MUST.
+
+ Feature: roster-version
+ Description: Treat the 'ver' attribute of the <query/> element
+ qualified by the 'jabber:iq:roster' namespace as an identifier of
+ the particular version of roster information being sent or
+ received.
+ Section: Section 2.1.1
+ Roles: Client SHOULD, Server MUST.
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 98]
+
+RFC 6121 XMPP IM March 2011
+
+
+13. References
+
+13.1. Normative References
+
+ [DELAY] Saint-Andre, P., "Delayed Delivery", XSF XEP 0203,
+ September 2009.
+
+ [KEYWORDS]
+ Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [XML] Maler, E., Yergeau, F., Sperberg-McQueen, C., Paoli, J.,
+ and T. Bray, "Extensible Markup Language (XML) 1.0 (Fifth
+ Edition)", World Wide Web Consortium
+ Recommendation REC-xml-20081126, November 2008,
+ <http://www.w3.org/TR/2008/REC-xml-20081126>.
+
+ [XML-NAMES]
+ Bray, T., Hollander, D., and A. Layman, "Namespaces in
+ XML", W3C REC-xml-names, January 1999,
+ <http://www.w3.org/TR/REC-xml-names>.
+
+ [XMPP-CORE]
+ Saint-Andre, P., "Extensible Messaging and Presence
+ Protocol (XMPP): Core", RFC 6120, March 2011.
+
+13.2. Informative References
+
+ [CPIM] Peterson, J., "Common Profile for Instant Messaging
+ (CPIM)", RFC 3860, August 2004.
+
+ [CPP] Peterson, J., "Common Profile for Presence (CPP)",
+ RFC 3859, August 2004.
+
+ [DOS] Handley, M., Rescorla, E., and IAB, "Internet Denial-of-
+ Service Considerations", RFC 4732, December 2006.
+
+ [IMP-MODEL]
+ Day, M., Rosenberg, J., and H. Sugano, "A Model for
+ Presence and Instant Messaging", RFC 2778, February 2000.
+
+ [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.
+
+
+
+Saint-Andre Standards Track [Page 99]
+
+RFC 6121 XMPP IM March 2011
+
+
+ [INTEROP] Masinter, L., "Formalizing IETF Interoperability
+ Reporting", Work in Progress, October 2005.
+
+ [IRC] Kalt, C., "Internet Relay Chat: Architecture", RFC 2810,
+ April 2000.
+
+ [IRI] Duerst, M. and M. Suignard, "Internationalized Resource
+ Identifiers (IRIs)", RFC 3987, January 2005.
+
+ [PROCESS] Bradner, S., "The Internet Standards Process -- Revision
+ 3", BCP 9, RFC 2026, October 1996.
+
+ [REPORTS] Dusseault, L. and R. Sparks, "Guidance on Interoperation
+ and Implementation Reports for Advancement to Draft
+ Standard", BCP 9, RFC 5657, September 2009.
+
+ [RFC3920] Saint-Andre, P., Ed., "Extensible Messaging and Presence
+ Protocol (XMPP): Core", RFC 3920, October 2004.
+
+ [RFC3921] Saint-Andre, P., Ed., "Extensible Messaging and Presence
+ Protocol (XMPP): Instant Messaging and Presence",
+ RFC 3921, October 2004.
+
+ [SASL] Melnikov, A. and K. Zeilenga, "Simple Authentication and
+ Security Layer (SASL)", RFC 4422, June 2006.
+
+ [SIP-PRES]
+ Rosenberg, J., "A Presence Event Package for the Session
+ Initiation Protocol (SIP)", RFC 3856, August 2004.
+
+ [TLS] Dierks, T. and E. Rescorla, "The Transport Layer Security
+ (TLS) Protocol Version 1.2", RFC 5246, August 2008.
+
+ [TLS-CERTS]
+ Saint-Andre, P. and J. Hodges, "Representation and
+ Verification of Domain-Based Application Service Identity
+ within Internet Public Key Infrastructure Using X.509
+ (PKIX) Certificates in the Context of Transport Layer
+ Security (TLS)", RFC 6125, March 2011.
+
+ [UNICODE] The Unicode Consortium, "The Unicode Standard, Version
+ 6.0", 2010,
+ <http://www.unicode.org/versions/Unicode6.0.0/>.
+
+ [URI] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
+ Resource Identifier (URI): Generic Syntax", STD 66,
+ RFC 3986, January 2005.
+
+
+
+
+Saint-Andre Standards Track [Page 100]
+
+RFC 6121 XMPP IM March 2011
+
+
+ [UUID] Leach, P., Mealling, M., and R. Salz, "A Universally
+ Unique IDentifier (UUID) URN Namespace", RFC 4122,
+ July 2005.
+
+ [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,
+ July 2008.
+
+ [XEP-0054]
+ Saint-Andre, P., "vcard-temp", XSF XEP 0054, July 2008.
+
+ [XEP-0071]
+ Saint-Andre, P., "XHTML-IM", XSF XEP 0071, September 2008.
+
+ [XEP-0115]
+ Hildebrand, J., Saint-Andre, P., and R. Troncon, "Entity
+ Capabilities", XSF XEP 0115, February 2008.
+
+ [XEP-0147]
+ Saint-Andre, P., "XMPP URI Scheme Query Components", XSF
+ XEP 0147, September 2006.
+
+ [XEP-0160]
+ Saint-Andre, P., "Best Practices for Handling Offline
+ Messages", XSF XEP 0160, January 2006.
+
+ [XEP-0163]
+ Saint-Andre, P. and K. Smith, "Personal Eventing
+ Protocol", XSF XEP 0163, July 2010.
+
+ [XEP-0191]
+ Saint-Andre, P., "Simple Communications Blocking", XSF
+ XEP 0191, February 2007.
+
+ [XEP-0201]
+ Saint-Andre, P., Paterson, I., and K. Smith, "Best
+ Practices for Message Threads", XSF XEP 0201,
+ November 2010.
+
+ [XEP-0237]
+ Saint-Andre, P. and D. Cridland, "Roster Versioning", XSF
+ XEP 0237, March 2010.
+
+
+
+
+
+Saint-Andre Standards Track [Page 101]
+
+RFC 6121 XMPP IM March 2011
+
+
+ [XML-DATATYPES]
+ Biron, P. and A. Malhotra, "XML Schema Part 2: Datatypes
+ Second Edition", W3C REC-xmlschema-2, October 2004,
+ <http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/>.
+
+ [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>.
+
+ [XMPP-ADDR]
+ Saint-Andre, P., "Extensible Messaging and Presence
+ Protocol (XMPP): Address Format", RFC 6122, March 2011.
+
+ [XMPP-URI]
+ Saint-Andre, P., "Internationalized Resource Identifiers
+ (IRIs) and Uniform Resource Identifiers (URIs) for the
+ Extensible Messaging and Presence Protocol (XMPP)",
+ RFC 5122, February 2008.
+
+ [VCARD] Dawson, F. and T. Howes, "vCard MIME Directory Profile",
+ RFC 2426, September 1998.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 102]
+
+RFC 6121 XMPP IM March 2011
+
+
+Appendix A. Subscription States
+
+ This section provides detailed information about subscription states
+ and server processing of subscription-related presence stanzas (i.e.,
+ presence stanzas of type "subscribe", "subscribed", "unsubscribe",
+ and "unsubscribed").
+
+A.1. Defined States
+
+ There are four primary subscription states (these states are
+ described from the perspective of the user, not the contact):
+
+ None: The user does not have a subscription to the contact's
+ presence, and the contact does not have a subscription to the
+ user's presence.
+
+ To: The user has a subscription to the contact's presence, but the
+ contact does not have a subscription to the user's presence.
+
+ From: The contact has a subscription to the user's presence, but the
+ user does not have a subscription to the contact's presence.
+
+ Both: Both the user and the contact have subscriptions to each
+ other's presence (i.e., the union of 'from' and 'to').
+
+ Implementation Note: For the purpose of processing subscription-
+ related presence stanzas as described in the following sections, a
+ subscription state of "None" includes the case of the contact not
+ being in the user's roster at all, i.e., an unknown entity from
+ the perspective of the user's roster.
+
+ The foregoing states are supplemented by various sub-states related
+ to pending inbound and outbound subscriptions, thus yielding nine
+ possible subscription 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 user's 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 user's
+ 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. This state might or might not be reflected
+ in the user's roster, as follows: if the user has created a
+
+
+
+Saint-Andre Standards Track [Page 103]
+
+RFC 6121 XMPP IM March 2011
+
+
+ roster item for the contact then the server MUST maintain that
+ roster item and also note the existence of the inbound presence
+ subscription request, whereas if the user has not created a
+ roster item for the contact then the user's server MUST note the
+ existence of the inbound presence subscription request but MUST
+ NOT create a roster item for the contact (instead, the server
+ MUST wait until the user has approved the subscription request
+ before adding the contact to the user's roster).
+
+ 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
+ user's roster by subscription='none' and ask='subscribe'.
+
+ 5. "To" = User is subscribed to contact (one-way); this is reflected
+ in the user's 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 user's roster by subscription='to'.
+
+ 7. "From" = Contact is subscribed to user (one-way); this is
+ reflected in the user's 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 user's roster by
+ subscription='from' and ask='subscribe'.
+
+ 9. "Both" = User and contact are subscribed to each other (two-way);
+ this is reflected in the user's roster by subscription='both'.
+
+A.2. Server Processing of Outbound Presence Subscription Stanzas
+
+ Outbound presence subscription stanzas enable the user to manage his
+ or her subscription to the contact's presence (via the "subscribe"
+ and "unsubscribe" types), and to manage the contact's access to the
+ user's presence (via the "subscribed" and "unsubscribed" types).
+
+ The following rules apply to outbound routing of the stanza as well
+ as changes to the user's roster. (These rules are described from the
+ perspective of the user, not the contact. In addition, "S.N." stands
+ for SHOULD NOT and "M.N." stands for MUST NOT.)
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 104]
+
+RFC 6121 XMPP IM March 2011
+
+
+A.2.1. Subscribe
+
+ Table 2: Processing of outbound "subscribe" stanzas
+
+ +------------------------------------------------------------------+
+ | EXISTING STATE | ROUTE? | NEW STATE |
+ +------------------------------------------------------------------+
+ | "None" | MUST [1] | "None + Pending Out" |
+ | "None + Pending Out" | MUST | no state change |
+ | "None + Pending In" | MUST [1] | "None + Pending Out+In" |
+ | "None + Pending Out+In" | MUST | no state change |
+ | "To" | MUST | no state change |
+ | "To + Pending In" | MUST | no state change |
+ | "From" | MUST [1] | "From + Pending Out" |
+ | "From + Pending Out" | MUST | no state change |
+ | "Both" | MUST | no state change |
+ +------------------------------------------------------------------+
+
+ [1] A state change to "pending out" includes setting the 'ask'
+ flag to a value of "subscribe" in the user's roster.
+
+A.2.2. Unsubscribe
+
+ Table 3: Processing of outbound "unsubscribe" stanzas
+
+ +-----------------------------------------------------------------+
+ | EXISTING STATE | ROUTE? | NEW STATE |
+ +-----------------------------------------------------------------+
+ | "None" | MUST | no state change |
+ | "None + Pending Out" | MUST | "None" |
+ | "None + Pending In" | MUST | no state change |
+ | "None + Pending Out+In" | MUST | "None + Pending In" |
+ | "To" | MUST | "None" |
+ | "To + Pending In" | MUST | "None + Pending In" |
+ | "From" | MUST | no state change |
+ | "From + Pending Out" | MUST | "From" |
+ | "Both" | MUST | "From" |
+ +-----------------------------------------------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 105]
+
+RFC 6121 XMPP IM March 2011
+
+
+A.2.3. Subscribed
+
+ Table 4: Processing of outbound "subscribed" stanzas
+
+ +-----------------------------------------------------------------+
+ | EXISTING STATE | ROUTE? | NEW STATE |
+ +-----------------------------------------------------------------+
+ | "None" | M.N. | pre-approval [1] |
+ | "None + Pending Out" | M.N. | pre-approval [1] |
+ | "None + Pending In" | MUST | "From" |
+ | "None + Pending Out+In" | MUST | "From + Pending Out" |
+ | "To" | M.N. | pre-approval [1] |
+ | "To + Pending In" | MUST | "Both" |
+ | "From" | M.N. | no state change |
+ | "From + Pending Out" | M.N. | no state change |
+ | "Both" | M.N. | no state change |
+ +-----------------------------------------------------------------+
+
+ [1] Detailed information regarding subscription pre-approval is
+ provided under Section 3.4.
+
+A.2.4. Unsubscribed
+
+ Table 5: Processing of outbound "unsubscribed" stanzas
+
+ +-----------------------------------------------------------------+
+ | EXISTING STATE | ROUTE? | NEW STATE |
+ +-----------------------------------------------------------------+
+ | "None" | S.N. | no state change [1] |
+ | "None + Pending Out" | S.N. | no state change [1] |
+ | "None + Pending In" | MUST | "None" |
+ | "None + Pending Out+In" | MUST | "None + Pending Out" |
+ | "To" | S.N. | no state change [1] |
+ | "To + Pending In" | MUST | "To" |
+ | "From" | MUST | "None" |
+ | "From + Pending Out" | MUST | "None + Pending Out" |
+ | "Both" | MUST | "To" |
+ +-----------------------------------------------------------------+
+
+ [1] This event can result in cancellation of a subscription pre-
+ approval, as described under Section 3.4.
+
+A.3. Server Processing 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
+
+
+
+
+Saint-Andre Standards Track [Page 106]
+
+RFC 6121 XMPP IM March 2011
+
+
+ "unsubscribe" type), or enable the user to manage the contact's
+ access to the user's presence information (via the "subscribed" and
+ "unsubscribed" types).
+
+ The following rules apply to delivery of the inbound stanza as well
+ as changes to the user's roster. (These rules for server processing
+ of inbound presence subscription stanzas are described from the
+ perspective of the user, not the contact. In addition, "S.N." stands
+ for SHOULD NOT.)
+
+A.3.1. Subscribe
+
+ Table 6: Processing of inbound "subscribe" stanzas
+
+ +------------------------------------------------------------------+
+ | EXISTING STATE | DELIVER? | NEW STATE |
+ +------------------------------------------------------------------+
+ | "None" | MUST [1] | "None + Pending In" |
+ | "None + Pending Out" | MUST | "None + Pending Out+In" |
+ | "None + Pending In" | S.N. | no state change |
+ | "None + Pending Out+In" | S.N. | no state change |
+ | "To" | MUST | "To + Pending In" |
+ | "To + Pending In" | S.N. | no state change |
+ | "From" | S.N. [2] | no state change |
+ | "From + Pending Out" | S.N. [2] | no state change |
+ | "Both" | S.N. [2] | no state change |
+ +------------------------------------------------------------------+
+
+ [1] If the user previously sent presence of type "subscribed" as
+ described under Appendix A.2.3 and Section 3.4, then the server
+ MAY auto-reply with "subscribed" and change the state to "From"
+ rather than "None + Pending In".
+
+ [2] Server SHOULD auto-reply with "subscribed".
+
+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, MUST deliver the presence stanza
+ from the contact to the user, and SHOULD auto-reply by sending a
+ presence stanza of type "unsubscribed" to the contact on behalf of
+ the user. Otherwise the user's server MUST NOT change the state and
+ (because there is no state change) SHOULD NOT deliver the stanza.
+ These rules are summarized in the following table.
+
+
+
+
+
+Saint-Andre Standards Track [Page 107]
+
+RFC 6121 XMPP IM March 2011
+
+
+ Table 7: Processing of inbound "unsubscribe" stanzas
+
+ +------------------------------------------------------------------+
+ | EXISTING STATE | DELIVER? | NEW STATE |
+ +------------------------------------------------------------------+
+ | "None" | S.N. | no state change |
+ | "None + Pending Out" | S.N. | no state change |
+ | "None + Pending In" | MUST [1] | "None" |
+ | "None + Pending Out+In" | MUST [1] | "None + Pending Out" |
+ | "To" | S.N. | no state change |
+ | "To + Pending In" | MUST [1] | "To" |
+ | "From" | MUST [1] | "None" |
+ | "From + Pending Out" | MUST [1] | "None + Pending Out" |
+ | "Both" | MUST [1] | "To" |
+ +------------------------------------------------------------------+
+
+ [1] Server SHOULD auto-reply with "unsubscribed".
+
+A.3.3. Subscribed
+
+ When the user's server receives a presence stanza of type
+ "subscribed" for the user from the contact, if there is no pending
+ outbound request for access to the contact's presence information,
+ then it MUST NOT change the subscription state and (because there is
+ no state change) 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 and MUST deliver the stanza to the
+ user. If the user already is subscribed 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 (because there is
+ no state change) SHOULD NOT deliver the stanza to the user. These
+ rules are summarized in the following table.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 108]
+
+RFC 6121 XMPP IM March 2011
+
+
+ Table 8: Processing of inbound "subscribed" stanzas
+
+ +------------------------------------------------------------------+
+ | EXISTING STATE | DELIVER? | NEW STATE |
+ +------------------------------------------------------------------+
+ | "None" | S.N. | no state change |
+ | "None + Pending Out" | MUST | "To" |
+ | "None + Pending In" | S.N. | no state change |
+ | "None + Pending Out+In" | MUST | "To + Pending In" |
+ | "To" | S.N. | no state change |
+ | "To + Pending In" | S.N. | no state change |
+ | "From" | S.N. | no state change |
+ | "From + Pending Out" | MUST | "Both" |
+ | "Both" | S.N. | no state change |
+ +------------------------------------------------------------------+
+
+A.3.4. Unsubscribed
+
+ When the user's server receives a presence stanza of type
+ "unsubscribed" for the user from the contact, if there is a pending
+ outbound request for access to the contact's presence information or
+ if the user currently is subscribed to the contact's presence
+ information, then the user's server MUST change the subscription
+ state and MUST deliver the stanza to the user. Otherwise, the user's
+ server MUST NOT change the subscription state and (because there is
+ no state change) SHOULD NOT deliver the stanza. These rules are
+ summarized in the following table.
+
+ Table 9: Processing of inbound "unsubscribed" stanzas
+
+ +------------------------------------------------------------------+
+ | EXISTING STATE | DELIVER? | NEW STATE |
+ +------------------------------------------------------------------+
+ | "None" | S.N. | no state change |
+ | "None + Pending Out" | MUST | "None" |
+ | "None + Pending In" | S.N. | no state change |
+ | "None + Pending Out+In" | MUST | "None + Pending In" |
+ | "To" | MUST | "None" |
+ | "To + Pending In" | MUST | "None + Pending In" |
+ | "From" | S.N. | no state change |
+ | "From + Pending Out" | MUST | "From" |
+ | "Both" | MUST | "From" |
+ +------------------------------------------------------------------+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 109]
+
+RFC 6121 XMPP IM March 2011
+
+
+Appendix B. Blocking Communication
+
+ Sections 2.3.5 and 5.4.10 of [IMP-REQS] require that a compliant
+ instant messaging and presence technology needs to enable a user to
+ block communications from selected users. Protocols for doing so are
+ specified in [XEP-0016] and [XEP-0191].
+
+Appendix 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 XMPP community to provide such information but is out of
+ scope for this specification (documentation of this protocol is
+ contained in [XEP-0054]).
+
+Appendix D. XML Schema for jabber:iq:roster
+
+ The following schema formally defines the 'jabber:iq:roster'
+ namespace used in this document, in conformance with [XML-SCHEMA].
+ Because validation of XML streams and stanzas is optional, this
+ schema is not normative and is provided for descriptive purposes
+ only. For schemas defining core XMPP namespaces, refer to
+ [XMPP-CORE].
+
+ <?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:attribute name='ver'
+ type='xs:string'
+ use='optional'/>
+ </xs:complexType>
+ </xs:element>
+
+
+
+
+
+Saint-Andre Standards Track [Page 110]
+
+RFC 6121 XMPP IM March 2011
+
+
+ <xs:element name='item'>
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref='group'
+ minOccurs='0'
+ maxOccurs='unbounded'/>
+ </xs:sequence>
+ <xs:attribute name='approved'
+ type='xs:boolean'
+ use='optional'/>
+ <xs:attribute name='ask'
+ use='optional'>
+ <xs:simpleType>
+ <xs:restriction base='xs:NMTOKEN'>
+ <xs:enumeration value='subscribe'/>
+ </xs:restriction>
+ </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'
+ default='none'>
+ <xs:simpleType>
+ <xs:restriction base='xs:NMTOKEN'>
+ <xs:enumeration value='both'/>
+ <xs:enumeration value='from'/>
+ <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>
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 111]
+
+RFC 6121 XMPP IM March 2011
+
+
+Appendix E. Differences From RFC 3921
+
+ Based on consensus derived from implementation and deployment
+ experience as well as formal interoperability testing, the following
+ substantive modifications were made from [RFC3921] (in addition to
+ numerous changes of an editorial nature).
+
+ 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, for the sake of
+ backward-compatibility server implementations are encouraged to
+ advertise support for the feature, even though session
+ establishment is a "no-op".
+
+ o In order to more seamlessly repair lack of synchronization in
+ subscription states between rosters located at different servers,
+ clarified and modified error handling related to presence
+ subscription requests, presence probes and presence notifications.
+
+ o Changed the 'from' address for presence probes so that it is the
+ bare JID, not the full JID.
+
+ o Adjusted and clarified stanza delivery rules based on
+ implementation and deployment experience.
+
+ o Explicitly specified that a server is allowed to deliver a message
+ stanza of type "normal" or "chat" to all resources if it has a
+ method for allowing resources to opt in to such behavior.
+
+ o Allowed a server to use its own algorithm for determining the
+ "most available" resource for the purpose of message delivery, but
+ mentioned the recommended algorithm from RFC 3921 (based on
+ presence priority) as one possible algorithm.
+
+ o Added optional versioning of roster information to save bandwidth
+ in cases where the roster has not changed (or has changed very
+ little) between sessions; the relevant protocol interactions were
+ originally described in [XEP-0237].
+
+ o Added optional server support for pre-approved presence
+ subscriptions via presence stanzas of type "subscribed", including
+ a new 'approved' attribute that can be set to "true" (for a pre-
+ approved subscription) or "false" (the default).
+
+ o Added optional 'parent' attribute to <thread/> element.
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 112]
+
+RFC 6121 XMPP IM March 2011
+
+
+ o Moved the protocol for communications blocking (specified in
+ Section 10 of RFC 3921) back to [XEP-0016], from which it was
+ originally taken.
+
+ o Recommended returning presence unavailable in response to probes.
+
+ o Clarified handling of presence probes sent to full JIDs.
+
+ o Explicitly specified that the default value for the presence
+ <priority/> element is zero.
+
+ o Removed recommendation to support the "_im" and "_pres" SRV
+ records.
+
+Appendix F. Acknowledgements
+
+ This document is an update to, and derived from, RFC 3921. This
+ document would have been impossible without the work of the
+ contributors and commenters acknowledged there.
+
+ Hundreds of people have provided implementation feedback, bug
+ reports, requests for clarification, and suggestions for improvement
+ since publication of RFC 3921. Although the document editor has
+ endeavored to address all such feedback, he is solely responsible for
+ any remaining errors and ambiguities.
+
+ Some of the text about roster versioning was borrowed from
+ [XEP-0237], and some of the text about message threads was borrowed
+ from [XEP-0201].
+
+ Special thanks are due to Kevin Smith, Matthew Wild, Dave Cridland,
+ Waqas Hussain, Philipp Hancke, Florian Zeitz, Jonas Lindberg, Jehan
+ Pages, Tory Patnoe, and others for their comments during Working
+ Group Last Call.
+
+ Thanks also to Richard Barnes for his review on behalf of the
+ Security Directorate.
+
+ The Working Group chairs were Ben Campbell and Joe Hildebrand. The
+ responsible Area Director was Gonzalo Camarillo.
+
+
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 113]
+
+RFC 6121 XMPP IM March 2011
+
+
+Author's Address
+
+ Peter Saint-Andre
+ Cisco
+ 1899 Wyknoop Street, Suite 600
+ Denver, CO 80202
+ USA
+
+ Phone: +1-303-308-3282
+ EMail: psaintan@cisco.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Saint-Andre Standards Track [Page 114]
+