XMPP Working Group                                   P. Saint-Andre, Ed.
Internet-Draft                                                       JSF
Intended status: Informational                          October 13, 2006
Expires: April 16, 2007


Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and
                                Presence
                     draft-saintandre-rfc3921bis-00

Status of this Memo

   By submitting this Internet-Draft, each author represents that any
   applicable patent or other IPR claims of which he or she is aware
   have been or will be disclosed, and any of which he or she becomes
   aware will be disclosed, in accordance with Section 6 of BCP 79.

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF), its areas, and its working groups.  Note that
   other groups may also distribute working documents as Internet-
   Drafts.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   The list of current Internet-Drafts can be accessed at
   http://www.ietf.org/ietf/1id-abstracts.txt.

   The list of Internet-Draft Shadow Directories can be accessed at
   http://www.ietf.org/shadow.html.

   This Internet-Draft will expire on April 16, 2007.

Copyright Notice

   Copyright (C) The Internet Society (2006).

Abstract

   This document describes extensions to the core features of the
   Extensible Messaging and Presence Protocol (XMPP) that provide basic
   instant messaging (IM) and presence functionality in conformance with
   RFC 2779.

   This document obseletes RFC 3921.




Saint-Andre              Expires April 16, 2007                 [Page 1]


Internet-Draft                   XMPP IM                    October 2006


Table of Contents

   1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  3
   2.  Managing the Roster  . . . . . . . . . . . . . . . . . . . . .  5
   3.  Managing Presence Subscriptions  . . . . . . . . . . . . . . . 11
   4.  Exchanging Presence Information  . . . . . . . . . . . . . . . 13
   5.  Exchanging Messages  . . . . . . . . . . . . . . . . . . . . . 22
   6.  Exchanging IQ Stanzas  . . . . . . . . . . . . . . . . . . . . 26
   7.  Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
   8.  Server Rules for Handling XML Stanzas  . . . . . . . . . . . . 32
   9.  IM and Presence Compliance Requirements  . . . . . . . . . . . 35
   10. Internationalization Considerations  . . . . . . . . . . . . . 36
   11. Security Considerations  . . . . . . . . . . . . . . . . . . . 36
   12. IANA Considerations  . . . . . . . . . . . . . . . . . . . . . 36
   13. References . . . . . . . . . . . . . . . . . . . . . . . . . . 37
     13.1.  Normative References  . . . . . . . . . . . . . . . . . . 37
     13.2.  Informative References  . . . . . . . . . . . . . . . . . 38
   Appendix A.  Integration of Roster Management and Presence
                Subscriptions . . . . . . . . . . . . . . . . . . . . 38
   Appendix B.  Subscription States . . . . . . . . . . . . . . . . . 63
   Appendix C.  Blocking Communication  . . . . . . . . . . . . . . . 69
   Appendix D.  vCards  . . . . . . . . . . . . . . . . . . . . . . . 69
   Appendix E.  XML Schemas . . . . . . . . . . . . . . . . . . . . . 70
   Appendix F.  Differences From RFC 3921 . . . . . . . . . . . . . . 79
   Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 79
   Intellectual Property and Copyright Statements . . . . . . . . . . 81

























Saint-Andre              Expires April 16, 2007                 [Page 2]


Internet-Draft                   XMPP IM                    October 2006


1.  Introduction

1.1.  Overview

   The Extensible Messaging and Presence Protocol (XMPP) is a protocol
   for streaming Extensible Markup Language [XML] elements in order to
   exchange messages, presence (availability) information, and other
   structured data in close to real time.  The core features of XMPP are
   defined in [XMPP-CORE].  These features -- mainly XML streams, use of
   TLS and SASL, and the <message/>, <presence/>, and <iq/> children of
   the stream root -- provide the building blocks for many types of
   near-real-time applications, which may be layered on top of the core
   by sending application-specific data qualified by particular XML
   namespaces (see [XML-NAMES]).  This document describes extensions to
   the core features of XMPP that provide the basic functionality
   expected of an instant messaging (IM) and presence application as
   defined in [IMP-REQS].

   This document obsoletes RFC 3921.

1.2.  Requirements

   Traditionally, instant messaging applications have combined the
   following factors:

   1.  The central point of focus is a list of one's contacts or
       "buddies" (in XMPP this list is called a "roster").
   2.  The purpose of using such an application is to exchange
       relatively brief text messages with each of one's contacts in
       close to real time -- often relatively large numbers of such
       messages in rapid succession, in the form of one-to-one "chat
       sessions".
   3.  The catalyst for exchanging messages is "presence" -- i.e.,
       knowledge about the network availability of each of one's
       contacts (thus knowing who is online and available for a chat
       session).
   4.  Presence information is provided only to contacts that a user has
       authorized via a presence subscription.

   Thus at a high level this document assumes that a user must be able
   to complete the following use cases:

   o  Manage items in a contact list
   o  Exchange messages with one's contacts
   o  Exchange presence information with one's contacts
   o  Manage presence subscriptions to and from one's contacts

   Detailed definitions of these functionality areas are contained in



Saint-Andre              Expires April 16, 2007                 [Page 3]


Internet-Draft                   XMPP IM                    October 2006


   [IMP-REQS], and the interested reader should refer to that document
   regarding the requirements addressed herein.  While the XMPP instant
   messaging and presence extensions specified herein meet the
   requirements of [IMP-REQS], they were not designed explicitly with
   that specification in mind, since the base protocol evolved through
   an open development process within the Jabber open-source community
   before RFC 2779 was written.  Note also that although XMPP protocol
   extensions addressing many other functionality areas have been
   defined in the Jabber Software Foundation's XEP series, such
   extensions are not included in this document because they are not
   required by [IMP-REQS].

   Note: [IMP-REQS] stipulates that presence services must be separable
   from instant messaging services and vice-versa; i.e., it must be
   possible to use the protocol to provide a presence service, an
   instant messaging service, or both.  Although the text of this
   document assumes that implementations and deployments will want to
   offer a unified instant messaging and presence service, there is no
   requirement that a service must offer both a presence service and an
   instant messaging service, and the protocol makes it possible to
   offer separate and distinct services for presence and for instant
   messaging.  (For example, a presence-only service could return
   <service-unavailable/> errors in response to attempts to route
   <message/> stanzas.)

1.3.  Typical Session Flow

   [XMPP-CORE] specifies how an XMPP client connects to an XMPP server.
   In particular, it specifies the preconditions (including XML stream
   establishment, authentication, and binding of a resource to the
   stream) that must be fulfilled before a client is allowed to send XML
   stanzas (the basic unit of meaning in XMPP) to other entities on an
   XMPP network.  The reader is referred to [XMPP-CORE] for details, and
   knowledge of [XMPP-CORE] is assumed herein.

   Upon fulfillment of the preconditions specified in [XMPP-CORE], an
   XMPP client has a session with an XMPP server and may send and
   receive a potentially unlimited number of XML stanzas over the
   underlying XML stream.  The typical flow for an instant messaging and
   presence session is as follows:

   1.  Retrieve one's roster.  (See Section 2.3.)
   2.  Send initial presence to the server for broadcasting to all
       subscribed contacts, thus "going online" from the perspective of
       XMPP communications.  (See Section 4.2.)
   3.  Exchange messages, manage presence subscriptions, perform roster
       updates, and in general process and generate other XML stanzas
       with particular semantics throughout the life of the session.



Saint-Andre              Expires April 16, 2007                 [Page 4]


Internet-Draft                   XMPP IM                    October 2006


       (See the various sections below.)
   4.  Terminate the session when desired by sending unavailable
       presence and closing the underlying XML stream.  (See
       Section 4.5.)

1.4.  Terminology

   This document inherits the terminology defined in [XMPP-CORE].

   The following keywords are to be interpreted as described in RFC 2119
   [TERMS]: "MUST", "SHALL", "REQUIRED"; "MUST NOT", "SHALL NOT";
   "SHOULD", "RECOMMENDED"; "SHOULD NOT", "NOT RECOMMENDED"; "MAY",
   "OPTIONAL".


2.  Managing the Roster

   In XMPP, one's roster contains any number of specific contacts.  A
   user's roster is stored by the user's server on the user's behalf so
   that the user may access roster information from any resource.

   Note: There are important interactions between rosters and
   subscriptions; these are defined under Integration of Managing the
   Roster and Presence Subscriptions (Appendix A), and the reader must
   refer to that section for a complete understanding of roster
   management (however, such an understanding is necessary only for
   developers of XMPP servers, since most of the complexity is shielded
   from clients).

2.1.  Syntax and Semantics

   Rosters are managed using IQ stanzas, specifically by means of a
   <query/> child element qualified by the 'jabber:iq:roster' namespace.
   The <query/> element MAY contain one or more <item/> children, each
   describing a unique roster item or "contact".

   The "key" or unique identifier for each roster item is a Jabber
   Identifier or JID, encapsulated in the 'jid' attribute of the <item/>
   element (which is REQUIRED).

   Note: When the item added represents another IM user, the value of
   the 'jid' attribute MUST be of the form <contact@domain> rather
   <contact@domain/resource>.

   The state of the presence subscription in relation to a roster item
   is captured in the 'subscription' attribute of the <item/> element.
   Allowable values for this attribute are:




Saint-Andre              Expires April 16, 2007                 [Page 5]


Internet-Draft                   XMPP IM                    October 2006


   o  "none" -- the user does not have a subscription to the contact's
      presence information, and the contact does not have a subscription
      to the user's presence information
   o  "to" -- the user has a subscription to the contact's presence
      information, but the contact does not have a subscription to the
      user's presence information
   o  "from" -- the contact has a subscription to the user's presence
      information, but the user does not have a subscription to the
      contact's presence information
   o  "both" -- both the user and the contact have subscriptions to each
      other's presence information (also called a "mutual subscription")

   Each <item/> element MAY possess a 'name' attribute, which sets the
   "handle" to be associated with the JID, as determined by the user
   (not the contact).  The value of the 'name' attribute is opaque.

   Each <item/> element MAY contain one or more <group/> child elements,
   for use in collecting roster items into various categories.  The XML
   character data of the <group/> element is opaque.

2.2.  Business Rules

   A server MUST ignore any 'to' address on a roster "set", and MUST
   treat any roster "set" as applying to the sender.  For added safety,
   a client SHOULD check the "from" address of a "roster push" (incoming
   IQ of type "set" containing a roster item) to ensure that it is from
   a trusted source; specifically, the stanza MUST either have no 'from'
   attribute (i.e., implicitly from the server) or have a 'from'
   attribute whose value matches the user's bare JID (of the form
   <user@domain>) or full JID (of the form <user@domain/resource>);
   otherwise, the client SHOULD ignore the "roster push".

2.3.  Retrieving One's Roster on Login

   Upon authenticating with a server and binding a resource (thus
   becoming a "connected resource"), a client SHOULD request the roster
   before sending initial presence (however, because receiving the
   roster may not be desirable for all resources, e.g., a connection
   with limited bandwidth, the client's request for the roster is
   recommended and not required).  If an available resource does not
   request the roster during a session, the server MUST NOT send it
   presence subscriptions and associated roster updates.  For the sake
   of brevity, the term "interested resource" is used herein to refer to
   the concept of "an available resource that has requested the roster".







Saint-Andre              Expires April 16, 2007                 [Page 6]


Internet-Draft                   XMPP IM                    October 2006


   Example: Client requests current roster from server:

   <iq from='juliet@example.com/balcony' type='get' id='roster_1'>
     <query xmlns='jabber:iq:roster'/>
   </iq>

   Example: Client receives roster from server:

   <iq to='juliet@example.com/balcony' type='result' id='roster_1'>
     <query xmlns='jabber:iq:roster'>
       <item jid='romeo@example.net'
             name='Romeo'
             subscription='both'>
         <group>Friends</group>
       </item>
       <item jid='mercutio@example.org'
             name='Mercutio'
             subscription='from'/>
       <item jid='benvolio@example.org'
             name='Benvolio'
             subscription='both'/>
     </query>
   </iq>

2.4.  Adding a Roster Item

   At any time, a user MAY add an item to his or her roster by sending
   an IQ stanza of type "set" containing a <query/> element that in turn
   contains one <item/> element.

   Example: Client adds a new item:

   <iq from='juliet@example.com/balcony' type='set' id='roster_2'>
     <query xmlns='jabber:iq:roster'>
       <item jid='nurse@example.com'
             name='Nurse'>
         <group>Servants</group>
       </item>
     </query>
   </iq>

   Note: The <query/> element MUST NOT contain more than one <item/>
   child element when the client sends an IQ set to the server.  In
   addition, the <item/> element MAY contain more than one <group/>
   element but the XML character data of each <group/> element MUST
   specify distinct groups (where duplicates are to be determined using
   the Resourceprep profile of stringprep as defined in [XMPP-CORE]).
   If either of these rules is violated, the server MUST return a <bad-



Saint-Andre              Expires April 16, 2007                 [Page 7]


Internet-Draft                   XMPP IM                    October 2006


   format/> error to the client.

   Note: A client MUST NOT add itself to its own roster; i.e., the value
   of the <item/> element's 'jid' attribute MUST NOT match the bare JID
   (node@domain) portion of the <iq/> element's 'from' attribute.  If
   this rule is violated, the server MUST return a <not-allowed/> error
   to the client.

   If the server can successfully process the roster addition, it MUST
   update the roster information in persistent storage and push the
   change out to all of the user's interested resources.  This "roster
   push" consists of an IQ stanza of type "set" from the server to the
   client and enables all interested resources to remain in sync with
   the server-based roster information.

   Example: Server (1) pushes the updated roster information to all
   interested resources and (2) replies with an IQ result to the sending
   resource:

   <iq to='juliet@example.com/balcony'
       type='set'
       id='a78b4q6ha463'>
     <query xmlns='jabber:iq:roster'>
       <item jid='nurse@example.com'
             name='Nurse'
             subscription='none'>
         <group>Servants</group>
       </item>
     </query>
   </iq>

   <iq to='juliet@example.com/chamber'
       type='set'
       id='a78b4q6ha464'>
     <query xmlns='jabber:iq:roster'>
       <item jid='nurse@example.com'
             name='Nurse'
             subscription='none'>
         <group>Servants</group>
       </item>
     </query>
   </iq>

   <iq to='juliet@example.com/balcony' type='result' id='roster_2'/>

   As required by the semantics of the IQ stanza kind as defined in
   [XMPP-CORE], each resource that received the roster push MUST reply
   with an IQ stanza of type "result" (or "error").



Saint-Andre              Expires April 16, 2007                 [Page 8]


Internet-Draft                   XMPP IM                    October 2006


   Example: Resources reply with an IQ result to the server:

   <iq from='juliet@example.com/balcony'
       to='example.com'
       type='result'
       id='a78b4q6ha463'/>
   <iq from='juliet@example.com/chamber'
       to='example.com'
       type='result'
       id='a78b4q6ha464'/>

2.5.  Updating a Roster Item

   Updating an existing roster item (e.g., changing the group) is done
   in the same way as adding a new roster item, i.e., by sending the
   roster item in an IQ set to the server.

   Example: User updates roster item (add group):

   <iq from='juliet@example.com/chamber' type='set' id='roster_3'>
     <query xmlns='jabber:iq:roster'>
       <item jid='romeo@example.net'
             name='Romeo'>
         <group>Friends</group>
         <group>Lovers</group>
       </item>
     </query>
   </iq>

   Example: User updates roster item (remove group):

   <iq from='juliet@example.com/chamber' type='set' id='roster_4'>
     <query xmlns='jabber:iq:roster'>
       <item jid='romeo@example.net'
             name='Romeo'>
         <group>Lovers</group>
       </item>
     </query>
   </iq>












Saint-Andre              Expires April 16, 2007                 [Page 9]


Internet-Draft                   XMPP IM                    October 2006


   Example: User updates roster item (change handle):

   <iq from='juliet@example.com/chamber' type='set' id='roster_5'>
     <query xmlns='jabber:iq:roster'>
       <item jid='romeo@example.net'
             name='MyRomeo'>
         <group>Lovers</group>
       </item>
     </query>
   </iq>

   Example: User updates roster item (remove handle):

   <iq from='juliet@example.com/chamber' type='set' id='roster_6'>
     <query xmlns='jabber:iq:roster'>
       <item jid='romeo@example.net'
             name=''>
         <group>Lovers</group>
       </item>
     </query>
   </iq>

   As with adding a roster item, when updating a roster item the server
   MUST update the roster information in persistent storage, initiate a
   roster push to all of the user's interested resources, and send an IQ
   result to the initiating resource.

2.6.  Deleting a Roster Item

   At any time, a user MAY delete an item from his or her roster by
   sending an IQ set to the server and setting the value of the
   'subscription' attribute to "remove" (a compliant server MUST ignore
   any other values of the 'subscription' attribute when received from a
   client).

   Example: Client removes an item:

   <iq from='juliet@example.com/balcony' type='set' id='roster_7'>
     <query xmlns='jabber:iq:roster'>
       <item jid='nurse@example.com' subscription='remove'/>
     </query>
   </iq>

   As with adding a roster item, when deleting a roster item the server
   MUST update the roster information in persistent storage, initiate 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.



Saint-Andre              Expires April 16, 2007                [Page 10]


Internet-Draft                   XMPP IM                    October 2006


   This command will result in cancellation of existing presence
   subscriptions; for details, see Removing a Roster Item and Cancelling
   All Subscriptions (Appendix A.6).


3.  Managing Presence Subscriptions

   In order to protect the privacy of instant messaging users and any
   other entities, presence and availability information is disclosed
   only to other entities that the user has approved.  When a user has
   agreed that another entity may view its presence, the entity is said
   to have a subscription to the user's presence information.  A
   subscription lasts across sessions; indeed, it lasts until the
   subscriber unsubscribes or the subscribee cancels the previously-
   granted subscription.

   Subscriptions are managed within XMPP by sending presence stanzas
   containing specially-defined attributes.  In particular, a
   subscription request is a presence stanza whose 'type' attribute has
   a value of "subscribe".  If the subscription request is being sent to
   an instant messaging contact, the JID supplied in the 'to' attribute
   SHOULD be of the form <contact@domain> rather than
   <contact@domain/resource>, since the desired result is normally for
   the user to receive presence from all of the contact's resources, not
   merely the particular resource specified in the 'to' attribute.

   Note: There are important interactions between subscriptions and
   rosters; these are defined under Integration of Managing the Roster
   and Presence Subscriptions (Appendix A), and the reader must refer to
   that section for a complete understanding of presence subscriptions.

3.1.  Requesting a Subscription

   A request to subscribe to another entity's presence is made by
   sending a presence stanza of type "subscribe".

   Example: Sending a subscription request:

   <presence from='romeo@example.net'
             to='juliet@example.com'
             type='subscribe'/>

   A user's server MUST NOT automatically approve subscription requests
   on the user's behalf.  All subscription requests MUST be delivered to
   the user's client, specifically to one or more of the user's
   interested resources.  If the user has no interested resources when
   the subscription request is received by the user's server, the user's
   server MUST keep a record of the complete subscription request



Saint-Andre              Expires April 16, 2007                [Page 11]


Internet-Draft                   XMPP IM                    October 2006


   (including any extended namespacescontained therein) and deliver the
   request when the user next has an interested resource, until the user
   either approves or denies the request.  If there is more than one
   interested resource associated with the user when the subscription
   request is received by the user's server, the user's server MUST
   broadcast that subscription request to all interested resources in
   accordance with Server Rules for Handling XML Stanzas (Section 8).
   However, if the user receives a presence stanza of type "subscribe"
   from a contact to whom the user has already granted permission to see
   the user's presence information (e.g., in cases when the contact is
   seeking to resynchronize subscription states), the user's server
   SHOULD auto-reply on behalf of the user.  In addition, the user's
   server MAY choose to re-send an unapproved pending 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 may have occurred in relation to
   the original subscription request.

   Note: When a contact generates a subscription request to a user, the
   contact's server MUST stamp the outgoing presence stanza with the
   bare JID (<contact@domain>) of the contact, not the full JID
   (<contact@domain/resource>).  The same is true for presence stanzas
   of type "subscribed", "unsubscribe", and "unsubscribed".

   Note: If a user sends a presence subscription request to a contact
   but has not already added the contact to the user's roster, the
   user's server MUST send a roster push to all of the user's interested
   resources.  Thus a client MAY simply wait for the roster push rather
   than proactively adding to the contact to the user's roster.

3.2.  Handling a Subscription Request

   When a client receives a subscription request from another entity, it
   SHOULD either approve the request by sending a presence stanza of
   type "subscribed" or refuse the request by sending a presence stanza
   of type "unsubscribed".

   Example: Approving a subscription request:

   <presence from='juliet@example.com'
             to='romeo@example.net'
             type='subscribed'/>








Saint-Andre              Expires April 16, 2007                [Page 12]


Internet-Draft                   XMPP IM                    October 2006


   Example: Refusing a presence subscription request:

   <presence from='juliet@example.com'
             to='romeo@example.net'
             type='unsubscribed'/>

3.3.  Cancelling a Subscription from Another Entity

   If a user would like to cancel a previously-granted subscription
   request, it sends a presence stanza of type "unsubscribed".

   Example: Cancelling a previously granted subscription request:

   <presence from='juliet@example.com'
             to='romeo@example.net'
             type='unsubscribed'/>

3.4.  Unsubscribing from Another Entity's Presence

   If a user would like to unsubscribe from the presence of another
   entity, it sends a presence stanza of type "unsubscribe".

   Example: Unsubscribing from an entity's presence:

   <presence from='romeo@example.net'
             to='juliet@example.com'
             type='unsubscribe'/>


4.  Exchanging Presence Information

4.1.  Overview

   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, a principal's availability is signalled when
   a client controlled by the principal generates a <presence/> stanza
   with no 'type' attribute, and an entity's lack of availability is
   signalled when a client or entity generates a <presence/> stanza
   whose 'type' attribute has a value of "unavailable".  In XMPP-based
   applications that combine messaging and presence functionality, the
   default type of communication for which presence signals availability
   is messaging; however, XMPP-based applications are not required to
   combine messaging and presence functionality, and can provide
   standalone presence features without messaging (in addition, XMPP
   servers do not require presence information in order to successfully



Saint-Andre              Expires April 16, 2007                [Page 13]


Internet-Draft                   XMPP IM                    October 2006


   route message and IQ stanzas).

   XMPP presence typically follows a "publish-subscribe" or "observer"
   pattern, wherein an entity sends presence information to its server,
   and its server then broadcasts or multiplexes 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 information is a "presentity" and the entities that receive
   presence information are "subscribers").  A client generates presence
   for broadcasting 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".  A user's server MUST NOT leak the user's network
   availability to entities who are not authorized to know the user's
   presence, either via an explicit subscription as described herein or
   via an existing trust relationship (such as presence-enabled user
   directories within organizations).  However, a client MAY also send
   directed presence (Section 4.6) to entities that are not subscribed
   to the principal's presence (this does not constitute a presence
   leak, since it is initiated by the client); this is done by
   specifying a 'to' address on the relevant presence stanza.  (Note:
   While presence information MAY be provided on a user's behalf by an
   automated service, normally it is provided by the user's client.)

   After a client completes the preconditions specified in [XMPP-CORE],
   it can establish a "presence session" at its server by sending
   "initial presence" as described below, that is by sending a presence
   stanza with to 'type' or 'to' attribute.

   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.
   Clients SHOULD NOT send presence stanzas of type "probe".

   Naturally, a presence stanza may also be of type "error".

   The values of the 'type' attribute are summarized below (the reader
   is reminded that a presence stanza with no 'type' attribute signals
   that the relevant entity is available for communication):

   o  unavailable -- Signals that the entity is no longer available for
      communication.




Saint-Andre              Expires April 16, 2007                [Page 14]


Internet-Draft                   XMPP IM                    October 2006


   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  unsubscribe -- The sender is unsubscribing from another entity's
      presence.
   o  unsubscribed -- The subscription request has been denied or a
      previously-granted subscription has been cancelled.
   o  probe -- A request for an entity's current presence; SHOULD be
      generated only by a server on behalf of a user.
   o  error -- An error has occurred regarding processing or delivery of
      a previously-sent presence stanza.

4.2.  Initial Presence

   After completing the preconditions described in [XMPP-CORE]
   (REQUIRED) and requesting the roster (RECOMMENDED), a client SHOULD
   send initial presence to its server in order to signal its
   availability for communications.  As defined herein, the initial
   presence stanza (1) MUST possess no 'to' address (signalling that it
   is meant to be broadcasted by the server on behalf of the client) and
   (2) MUST possess no 'type' attribute (signalling the user's
   availability).  After sending initial presence, a connected resource
   (in the terminology of [XMPP-CORE]) is said to be an "available
   resource".

   Upon receiving initial presence from a client, the user's server MUST
   do the following if there is not already one or more available
   resources for the user (if there is already one or more available
   resources for the user, the server obviously does not need to send
   the presence probes, since it already possesses the requisite
   information):

   1.  Send presence probes (i.e., presence stanzas whose 'type'
       attribute is set to a value of "probe") from the full JID (e.g.,
       <juliet@example.com/balcony>) of the user to all contacts to
       which the user is subscribed in order to determine if they are
       available; such contacts are those for which a JID is present in
       the user's roster with the 'subscription' attribute set to a
       value of "to" or "both".
   2.  Broadcast initial presence from the full JID (e.g.,
       <juliet@example.com/balcony>) of the user to all contacts that
       are subscribed to the user's presence information; 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".

   In addition, the user's server MUST broadcast initial presence from
   the user's newly available resource to the user's existing available



Saint-Andre              Expires April 16, 2007                [Page 15]


Internet-Draft                   XMPP IM                    October 2006


   resources (if any).

   Upon receiving initial presence from the user, the contact's server
   MUST deliver the user's presence stanza to the full JIDs (e.g.,
   <romeo@example.net/orchard>) associated with all of the contact's
   available resources, but only if the user is in the contact's roster
   with a subscription state of "to" or "both".

   If the user's server receives a presence stanza of type "error" in
   response to the initial presence that it sent to a contact on behalf
   of the user, it SHOULD NOT send further presence updates to that
   contact (until and unless it receives a presence stanza from the
   contact).

4.3.  Presence Probes

   Upon receiving a presence probe from the user's server on behalf of
   the user, the contact's server SHOULD reply as follows:

   1.  If the user is in the contact's roster with a subscription state
       other than "From", "From + Pending Out", or "Both" (as defined
       under Subscription States (Appendix B)), the contact's server
       MUST return a presence stanza of type "error" in response to the
       presence probe (however, if a server receives a presence probe
       from a subdomain of the server's hostname or another such trusted
       service, it MAY provide presence information about the user to
       that entity).  Specifically:
       *  if the user is in the contact's roster with a subscription
          state of "None", "None + Pending Out", or "To" (or is not in
          the contact's roster at all), the contact's server MUST return
          a <forbidden/> stanza error in response to the presence probe.
       *  if the user is in the contact's roster with a subscription
          state of "None + Pending In", "None + Pending Out/In", or "To
          + Pending In", the contact's server MUST return a <not-
          authorized/> stanza error in response to the presence probe.
   2.  Else, if the contact has no available resources, the server MUST
       either (1) reply to the presence probe by sending to the user the
       full XML of the last presence stanza of type "unavailable"
       received by the server from the contact, or (2) not reply at all.
   3.  Else, if the contact has at least one available resource, the
       server 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.







Saint-Andre              Expires April 16, 2007                [Page 16]


Internet-Draft                   XMPP IM                    October 2006


4.4.  Subsequent Presence Broadcast

   After sending initial presence, the user MAY update its availability
   for broadcasting at any time during its session by sending a presence
   stanza with no 'to' address and no 'type' attribute.  (Note: A user's
   client SHOULD NOT send a presence update to broadcast information
   that changes independently of the user's presence and availability.)

   Upon receiving such a presence stanza expressing updated
   availability, the user's server MUST broadcast the full XML of that
   presence stanza to all contacts (1) that are in the user's roster
   with a subscription type of "from" or "both" and (2) from whom the
   server has not received unavailable presence or a presence error
   during the user's session, as well as to the user's other available
   resources.  (Note: Regarding rule 2 above, if the subscription state
   is "both" then the server MAY broadcast subsequent presence only if
   the server has received available presence from the contact at some
   point during the user's session; i.e., if the server never received
   available presence from the contact and the user has a mutual
   presence subscription with the contact, it MAY decline to send
   subsequent presence to the contact.)

4.5.  Unavailable Presence

   Before ending its session with a server, a client SHOULD gracefully
   become unavailable by sending a final presence stanza that possesses
   no 'to' attribute and that possesses a 'type' attribute whose value
   is "unavailable" (optionally, the final presence stanza MAY contain
   one or more <status/> elements specifying the reason why the user is
   no longer available).  However, the user's server MUST NOT depend on
   receiving final presence from an available resource, since the
   resource may become unavailable unexpectedly or may be timed out by
   the server.  If one of the user's resources becomes unavailable for
   any reason (either gracefully or ungracefully), the user's server
   MUST broadcast unavailable presence to all contacts (1) that are in
   the user's roster with a subscription type of "from" or "both" and
   (2) from whom the server has not received unavailable presence or a
   presence error during the user's session; the user's server MUST also
   send that unavailable presence stanza to the user's other available
   resources.  (Note: Regarding rule 2 above, if the subscription state
   is "both" then the server MAY broadcast unavailable presence only if
   the server has received available presence from the contact at some
   point during the user's session; i.e., if the server never received
   available presence from the contact and the user has a mutual
   presence subscription with the contact, it MAY decline to send
   unavailable presence to the contact).  If the unavailable presence
   stanza was received from the client, the server MUST broadcast the
   full XML of that presence stanza to all entities that fit the above



Saint-Andre              Expires April 16, 2007                [Page 17]


Internet-Draft                   XMPP IM                    October 2006


   description.

   Any presence stanza with no 'type' attribute and no 'to' attribute
   that is sent after sending broadcasted unavailable presence MUST be
   broadcasted by the server to all subscribers (i.e., MUST be treated
   as equivalent to "initial presence" for a new presence session).

4.6.  Directed Presence

   This section supplements and in some respects modifies the rules
   defined above, but only for the special case of "directed presence".

   Broadcasted presence is generated when a client sends a presence
   stanza with no type (or with type "unavailable") and no 'to' address
   over the XML to its server.  However, a user MAY also send directed
   presence to another entity -- i.e., a presence stanza with a 'to'
   attribute whose value is the JID of the other entity and with either
   no 'type' attribute or a 'type' attribute whose value is
   "unavailable".  There are three possible cases:

   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 broadcasted unavailable presence, the user's server MUST
       route or deliver the full XML of that presence stanza but SHOULD
       NOT otherwise modify the contact's status regarding broadcasted
       presence (i.e., it SHOULD include the contact's JID in any
       subsequent presence broadcasts initiated by the user).
   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 broadcasted
       unavailable presence, the user's server MUST route or deliver 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 become 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 entities to which the user sends directed
       presence in the same way that it treats the entities listed in
       case #2 above.

   A server SHOULD respond to presence probes from entities to which a



Saint-Andre              Expires April 16, 2007                [Page 18]


Internet-Draft                   XMPP IM                    October 2006


   user has sent directed presence (before sending directed or
   broadcasted unavailable presence), even if such entities are not in
   the user's roster with a subscription type of "from" or "both".  For
   instance, a user may join a multi-user chat room (see [XEP-0045]) by
   sending directed presence to the room:

   <presence from='romeo@example.net/orchard'
             to='shakespeare@chat.example.com/RM'/>

   In order to discover if the user remains online, the chat service
   SHOULD send a presence probe to the user on behalf of the room:

   <presence from='shakespeare@chat.example.com'
             to='romeo@example.net'/>

   If the user is still online, the user's server SHOULD send an empty
   available presence to the requesting entity:

   <presence from='romeo@example.net/orchard'
             to='shakespeare@chat.example.com'/>

   If the user is now offline, the user's server SHOULD send an empty
   unavailable presence to the requesting entity:

   <presence from='romeo@example.net/orchard'
             to='shakespeare@chat.example.com'
             type='unavailable'/>

4.7.  Presence Syntax

   In accordance with the default namespace declaration, a presence
   stanza is qualified by the 'jabber:client' or 'jabber:server'
   namespace, which defines certain allowable children 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 provided only if the presence stanza possesses no 'type'
   attribute, although exceptions are noted below.

4.7.1.  Availability States

   The OPTIONAL <show/> element contains non-human-readable XML
   character data that 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.  The <show/> element MUST
   NOT possess any attributes.  If provided, the XML character data
   value MUST be one of the following (additional availability types
   could be defined through a properly-namespaced child element of the



Saint-Andre              Expires April 16, 2007                [Page 19]


Internet-Draft                   XMPP IM                    October 2006


   presence stanza):

   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.

   Example: Availability status:

   <presence>
     <show>dnd</show>
   </presence>

4.7.2.  Availability Description

   The OPTIONAL <status/> element contains 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.  The <status/>
   element MUST NOT possess any attributes, with the exception of the
   'xml:lang' attribute.  Multiple instances of the <status/> element
   MAY be included, but only if each instance possesses an 'xml:lang'
   attribute with a distinct language value (either explicitly or by
   inheritance of the 'xml:lang' value of an element farther up in the
   XML hierarchy, which may include the XML stream header as described
   in Section 4.4 of [XMPP-CORE]).

   Example: Availability description:

   <presence from='romeo@example.net/orchard'
             xml:lang='en'>
     <show>dnd</show>
     <status>Wooing Juliet</status>
     <status xml:lang='cz'>Ja dvo&#x0159;&#x00ED;m Juliet</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.







Saint-Andre              Expires April 16, 2007                [Page 20]


Internet-Draft                   XMPP IM                    October 2006


   Example: Unavailability description:

   <presence from='romeo@example.net/orchard'
             type='unavailable'>
     <status>Busy IRL</status>
   </presence>

   The <status/> child MAY also be sent in a presence stanza of type
   "subscribe" to provide a description of the subscription request:

   Example: Description of subscription request:

   <presence from='romeo@example.net'
             to='nurse@example.com'
             type='subscribe'>
     <status>Hi, Juliet said I should add you to my buddy list.</status>
   </presence>

4.7.3.  Resource Priority

   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.  The
   <priority/> element MUST NOT possess any attributes.  If no priority
   is provided, a server SHOULD consider the priority to be zero.

   Example: Presence priority:

   <presence xml:lang='en'>
     <show>dnd</show>
     <status>Wooing Juliet</status>
     <status xml:lang='cz'>Ja dvo&#x0159;&#x00ED;m Juliet</status>
     <priority>1</priority>
   </presence>

   For information regarding the semantics of priority values in stanza
   routing within instant messaging and presence applications, refer to
   Server Rules for Handling XML Stanzas (Section 8).

4.7.4.  Presence Errors

   If the presence stanza is of type "error", it MUST include an
   <error/> child element; for details, see [XMPP-CORE].







Saint-Andre              Expires April 16, 2007                [Page 21]


Internet-Draft                   XMPP IM                    October 2006


4.7.5.  Extended Namespaces

   As described in [XMPP-CORE], an XML stanza MAY contain any properly-
   namespaced child element; this applies to the presence stanza as
   well.


5.  Exchanging Messages

5.1.  Overview

   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 type of stanza that may be
   exchanged is <message/>.  Exchanging messages is a basic use of XMPP
   and is brought about when a user generates a message stanza that is
   addressed to another entity.  As defined under Server Rules for
   Handling XML Stanzas (Section 8), the sender's server is responsible
   for delivering the message to the intended recipient (if the
   recipient is on the same server) or for routing the message to the
   recipient's server (if the recipient is on a different server).  Thus
   the message stanza is used to "push" information to another entity.

   An instant messaging client SHOULD specify an intended recipient for
   a message by providing the JID of an entity other than the sender in
   the 'to' attribute of the <message/> stanza.  If the message is being
   sent in reply to a message previously received from an address of the
   form <user@domain/resource> (e.g., within the context of a chat
   session), the value of the 'to' address SHOULD be of the form
   <user@domain/resource> rather than of the form <user@domain> unless
   the sender has knowledge (via presence) that the intended recipient's
   resource is no longer available.  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 <user@domain>
   rather than of the form <user@domain/resource>.

   Common uses of the message stanza in instant messaging applications
   include single messages, messages sent in the context of a chat
   conversation, messages sent in the context of a multi-user chat room,
   headlines and other alerts, and errors.  These uses are
   differentiated via 'type' attribute.  Inclusion of the 'type'
   attribute is RECOMMENDED.  If included, the 'type' attribute MUST
   have one of the following values:

   o  chat -- The message is sent in the context of a one-to-one chat
      conversation.  A compliant client SHOULD present the message in an
      interface enabling one-to-one chat between the two parties,
      including an appropriate conversation history.



Saint-Andre              Expires April 16, 2007                [Page 22]


Internet-Draft                   XMPP IM                    October 2006


   o  error -- An error has occurred related to a previous message sent
      by the sender (for details regarding stanza error syntax, refer to
      [XMPP-CORE]).  A compliant client SHOULD present an appropriate
      interface informing the sender of 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]).  A compliant client
      SHOULD present the message in an interface enabling many-to-many
      chat between the parties, including a roster of parties in the
      chatroom and an appropriate conversation history.  Full definition
      of XMPP-based groupchat protocols is out of scope for this
      document (for details see [XEP-0045]).
   o  headline -- The message is probably generated by an automated
      service that delivers or broadcasts content (news, sports, market
      information, syndicated content, etc.).  No reply to the message
      is expected, and a compliant client SHOULD present the message in
      an interface that appropriately differentiates the message from
      standalone messages, chat sessions, or groupchat sessions (e.g.,
      by not providing the recipient with the ability to reply).
   o  normal -- The message is a single 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.  A compliant client
      SHOULD present the message in an interface enabling the recipient
      to reply, but without a conversation history.  This is the default
      value of the 'type' attribute.

   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).  The "error" type MUST be generated only in
   response to an error related to a message received from another
   entity.

   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').

   In addition to the 'type' attribute (which differentiates the
   conversational context of the message), an XMPP message stanza MAY
   contain any allowable child elements qualified by the 'jabber:client'
   (or 'jabber:server') namespace, as well as any other properly-
   namespaced child element.  These payloads are described below.







Saint-Andre              Expires April 16, 2007                [Page 23]


Internet-Draft                   XMPP IM                    October 2006


5.2.  Specifying a Message Body

   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.  The <body/> element MUST NOT
   possess any attributes, with the exception of the 'xml:lang'
   attribute.  Multiple instances of the <body/> element MAY be
   included, but only if each instance possesses an 'xml:lang' attribute
   with a distinct language value (either explicitly or by inheritance
   of the 'xml:lang' value of an element farther up in the XML
   hierarchy, which may include the XML stream header as described in
   Section 4.4 of [XMPP-CORE]).  The <body/> element MUST NOT contain
   mixed content (as defined in Section 3.2.2 of [XML]).

   A message stanza often will contain a child <body/> element whose XML
   character data specifies the primary meaning of the message.

   Example: A message with a body:

   <message
       to='romeo@example.net'
       from='juliet@example.com/balcony'
       type='chat'
       xml:lang='en'>
     <body>Wherefore art thou, Romeo?</body>
     <body xml:lang='cz'>Pro&#x010D;e&#x017D; jsi ty, Romeo?</body>
   </message>

5.3.  Specifying a Message Subject

   The <subject/> element contains human-readable XML character data
   that specifies the topic of the message.  The <subject/> element MUST
   NOT possess any attributes, with the exception of the 'xml:lang'
   attribute.  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
   of the 'xml:lang' value of an element farther up in the XML
   hierarchy, which may include the XML stream header as described in
   Section 4.4 of [XMPP-CORE]).  The <subject/> element MUST NOT contain
   mixed content (as defined in Section 3.2.2 of [XML]).










Saint-Andre              Expires April 16, 2007                [Page 24]


Internet-Draft                   XMPP IM                    October 2006


   Example: A message with a subject:

   <message
       to='romeo@example.net'
       from='juliet@example.com/balcony'
       type='chat'
       xml:lang='en'>
     <subject>I implore you!</subject>
     <subject
         xml:lang='cz'>&#x00DA;p&#x011B;nliv&#x011B; prosim!</subject>
     <body>Wherefore art thou, Romeo?</body>
     <body xml:lang='cz'>Pro&#x010D;e&#x017D; jsi ty, Romeo?</body>
   </message>

5.4.  Specifying a Conversation Thread

   The <thread/> element contains non-human-readable XML character data
   specifying an identifier that is used for tracking a conversation
   thread (sometimes referred to as an "instant messaging session")
   between two entities.  The value of the <thread/> element is
   generated by the sender and SHOULD be copied back in any replies.  If
   used, it MUST be unique to that conversation thread within the stream
   and MUST be consistent throughout that conversation (a client that
   receives a message from the same full JID but with a different thread
   ID MUST assume that the message in question exists outside the
   context of the existing conversation thread).  The use of the
   <thread/> element is OPTIONAL and is not used to identify individual
   messages, only conversations.  A message stanza MUST NOT contain more
   than one <thread/> element.  The <thread/> element MUST NOT possess
   any attributes.  The value of the <thread/> element MUST be treated
   as opaque by entities; no semantic meaning may be derived from it,
   and only exact comparisons may be made against it.  The <thread/>
   element MUST NOT contain mixed content (as defined in Section 3.2.2
   of [XML]).

5.5.  Message Errors

   If the message stanza is of type "error", it MUST include an <error/>
   child; for details, see [XMPP-CORE].

5.6.  Extended Namespaces

   As described in [XMPP-CORE], an XML stanza MAY contain any properly-
   namespaced child element; this applies to the message stanza as well.







Saint-Andre              Expires April 16, 2007                [Page 25]


Internet-Draft                   XMPP IM                    October 2006


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 required) are defined in [XMPP-CORE],
   whereas the specific semantics required to complete particular use
   cases are defined in all cases by an extended namespace.  Note that
   the 'jabber:client' and 'jabber:server' namespaces do not define any
   children of IQ stanzas other than the common <error/>.  This document
   defines such an extended namespace, for Managing the Roster
   (Section 2).  However, an IQ stanza MAY contain structured
   information qualified by any extended namespace.


7.  Examples

   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 resource identifier is "orchard", and he has
   the following individuals in his roster:

   o  juliet@example.com (subscription="both" and she has two available
      resources, one whose resource is "chamber" and another whose
      resource is "balcony")
   o  benvolio@example.org (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 packet flows are not reproduced here.

   Next, the user requests his roster:

   Example 1: Client requests current roster from server:

   <iq from='romeo@example.net/balcony' type='get' id='ex1'>
     <query xmlns='jabber:iq:roster'/>
   </iq>













Saint-Andre              Expires April 16, 2007                [Page 26]


Internet-Draft                   XMPP IM                    October 2006


   Example 2: Client receives roster from server:

   <iq to='romeo@example.com/balcony' type='result' id='ex1'>
     <query xmlns='jabber:iq:roster'>
       <item jid='romeo@example.net'
             name='Juliet'
             subscription='both'>
         <group>Friends</group>
       </item>
       <item jid='benvolio@example.org'
             name='Benvolio'
             subscription='to'/>
       <item jid='mercutio@example.org'
             name='Mercutio'
             subscription='from'/>
     </query>
   </iq>

   Now the user sends initial presence.

   Example 3: User sends initial presence:

   <presence from='romeo@example.net/orchard'/>

   Example 4: User's server sends presence probes to contacts with
   subscription="to" and subscription="both" on behalf of the user's
   available resource:

   <presence
       type='probe'
       from='romeo@example.net/orchard'
       to='juliet@example.com'/>

   <presence
       type='probe'
       from='romeo@example.net/orchard'
       to='benvolio@example.org'/>

   Example 5: User's server sends initial presence to contacts with
   subscription="from" and subscription="both" on behalf of the user's
   available resource:

   <presence
       from='romeo@example.net/orchard'
       to='juliet@example.com'/>

   <presence
       from='romeo@example.net/orchard'



Saint-Andre              Expires April 16, 2007                [Page 27]


Internet-Draft                   XMPP IM                    October 2006


       to='mercutio@example.org'/>

   Example 6: Contacts' servers reply to presence probe on behalf of all
   available resources:

   <presence
       from='juliet@example.com/balcony'
       to='romeo@example.net/orchard'
       xml:lang='en'>
     <show>away</show>
     <status>be right back</status>
     <priority>0</priority>
   </presence>

   <presence
       from='juliet@example.com/chamber'
       to='romeo@example.net/orchard'>
     <priority>1</priority>
   </presence>

   <presence
       from='benvolio@example.org/pda'
       to='romeo@example.net/orchard'
       xml:lang='en'>
     <show>dnd</show>
     <status>gallivanting</status>
   </presence>

   Example 7: Contacts' servers deliver user's initial presence to all
   available resources or return error to user:

   <presence
       from='romeo@example.net/orchard'
       to='juliet@example.com/chamber'/>

   <presence
       from='romeo@example.net/orchard'
       to='juliet@example.com/balcony'/>

   <presence
       type='error'
       from='mercutio@example.org'
       to='romeo@example.net/orchard'>
     <error type='cancel'>
       <gone xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
     </error>
   </presence>




Saint-Andre              Expires April 16, 2007                [Page 28]


Internet-Draft                   XMPP IM                    October 2006


   Example 8: User sends directed presence to another user not in his
   roster:

   <presence
       from='romeo@example.net/orchard'
       to='nurse@example.com'
       xml:lang='en'>
     <show>dnd</show>
     <status>courting Juliet</status>
     <priority>0</priority>
   </presence>

   Now the user has a threaded conversation (chat session) with one of
   his contacts.

   Example 9: A threaded conversation

   <message
       to='romeo@example.net/orchard'
       from='juliet@example.com/balcony'
       type='chat'
       xml:lang='en'>
     <body>Art thou not Romeo, and a Montague?</body>
     <thread>e0ffe42b28561960c6b12b944a092794b9683a38</thread>
   </message>

   <message
       to='juliet@example.com/balcony'
       from='romeo@example.net/orchard'
       type='chat'
       xml:lang='en'>
     <body>Neither, fair saint, if either thee dislike.</body>
     <thread>e0ffe42b28561960c6b12b944a092794b9683a38</thread>
   </message>

   <message
       to='romeo@example.net/orchard'
       from='juliet@example.com/balcony'
       type='chat'
       xml:lang='en'>
     <body>How cam'st thou hither, tell me, and wherefore?</body>
     <thread>e0ffe42b28561960c6b12b944a092794b9683a38</thread>
   </message>

   And so on.

   The user can also send subsequent presence broadcast.




Saint-Andre              Expires April 16, 2007                [Page 29]


Internet-Draft                   XMPP IM                    October 2006


   Example 10: User sends updated available presence information for
   broadcasting:

   <presence xml:lang='en'>
     <show>away</show>
     <status>I shall return!</status>
     <priority>1</priority>
   </presence>

   Example 11: User's server broadcasts updated presence information
   only to one contact (not those from whom an error was received or to
   whom the user sent directed presence):

   <presence
       from='romeo@example.net/orchard'
       to='juliet@example.com'
       xml:lang='en'>
     <show>away</show>
     <status>I shall return!</status>
     <priority>1</priority>
   </presence>

   Example 12: Contact's server delivers updated presence information to
   all of the contact's available resources:

   [to "balcony" resource...]

   <presence
       from='romeo@example.net/orchard'
       to='juliet@example.com'
       xml:lang='en'>
     <show>away</show>
     <status>I shall return!</status>
     <priority>1</priority>
   </presence>

   [to "chamber" resource...]

   <presence
       from='romeo@example.net/orchard'
       to='juliet@example.com'
       xml:lang='en'>
     <show>away</show>
     <status>I shall return!</status>
     <priority>1</priority>
   </presence>





Saint-Andre              Expires April 16, 2007                [Page 30]


Internet-Draft                   XMPP IM                    October 2006


   Example 13: One of the contact's resources broadcasts final presence:

   <presence from='juliet@example.com/balcony' type='unavailable'/>

   Example 14: Contact's server sends unavailable presence information
   to user:

   <presence
       type='unavailable'
       from='juliet@example.com/balcony'
       to='romeo@example.net/orchard'/>

   Example 15: User sends unavailable presence:

   <presence from='romeo@example.net/orchard'
             type='unavailable'
             xml:lang='en'>
     <status>gone home</status>
   </presence>

   Example 16: User's server broadcasts unavailable presence information
   to contact as well as to the person to whom the user sent directed
   presence:

   <presence
       type='unavailable'
       from='romeo@example.net/orchard'
       to='juliet@example.com'
       xml:lang='en'>
     <status>gone home</status>
   </presence>

   <presence
       type='unavailable'
       from='romeo@example.net/orchard'
       to='nurse@example.com'
       xml:lang='en'>
     <status>gone home</status>
   </presence>

   Now the user closes his stream:

   </stream:stream>

   And the user's server closes its stream as well:

   </stream:stream>




Saint-Andre              Expires April 16, 2007                [Page 31]


Internet-Draft                   XMPP IM                    October 2006


   THE END


8.  Server Rules for Handling XML Stanzas

   Basic routing and delivery rules for servers are defined in
   [XMPP-CORE].  This section defines additional rules for XMPP-
   compliant instant messaging and presence servers.

8.1.  Inbound Stanzas

   If the hostname of the domain identifier portion of the JID contained
   in the 'to' attribute of an inbound stanza matches a hostname of the
   server itself and the JID contained in the 'to' attribute is of the
   form <user@example.com> or <user@example.com/resource>, the server
   MUST follow the rules defined below:

   1.  If the JID is of the form <user@domain/resource> and an available
       resource matches the full JID, the recipient's server MUST
       deliver the stanza to that resource.
   2.  Else if the JID is of the form <user@domain> or
       <user@domain/resource> and the associated user account does not
       exist, the recipient's server (a) SHOULD silently ignore the
       stanza (i.e., neither deliver it nor return an error) if it is a
       presence stanza, (b) MUST return a <service-unavailable/> stanza
       error to the sender if it is an IQ stanza, and (c) SHOULD return
       a <service-unavailable/> stanza error to the sender if it is a
       message stanza.
   3.  Else if the JID is of the form <user@domain/resource> and no
       connected or available resource matches the full JID, the
       recipient's server (a) SHOULD silently ignore the stanza (i.e.,
       neither deliver it nor return an error) if it is a presence
       stanza, (b) MUST return a <service-unavailable/> stanza error to
       the sender if it is an IQ stanza, and (c) SHOULD treat the stanza
       as if it were addressed to <user@domain> if it is a message
       stanza.
   4.  Else if the JID is of the form <user@domain> and there is at
       least one available resource available for the user, the
       recipient's server MUST follow these rules:
       1.  For message stanzas, the server SHOULD deliver the stanza to
           the highest-priority available resource (if the resource did
           not provide a value for the <priority/> element, the server
           SHOULD consider it to have provided a value of zero).  If two
           or more available resources have the same priority, the
           server MAY use some other rule (e.g., most recent connect
           time, most recent activity time, or highest availability as
           determined by some hierarchy of <show/> values) to choose
           between them or MAY deliver the message to all such



Saint-Andre              Expires April 16, 2007                [Page 32]


Internet-Draft                   XMPP IM                    October 2006


           resources.  However, the server MUST NOT deliver the stanza
           to an 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 (defined below).  In addition, the server MUST NOT
           rewrite the 'to' attribute (i.e., it MUST leave it as
           <user@domain> rather than change it to
           <user@domain/resource>).
       2.  For presence stanzas other than those of type "probe", the
           server MUST deliver the stanza to all available resources;
           for presence probes, the server SHOULD reply based on the
           rules defined in Presence Probes (Section 4.3).  In addition,
           the server MUST NOT rewrite the 'to' attribute (i.e., it MUST
           leave it as <user@domain> rather than change it to
           <user@domain/resource>).
       3.  For IQ stanzas, the server itself MUST reply on behalf of the
           user with either an IQ result or an IQ error, and MUST NOT
           deliver the IQ stanza to the available resources.
           Specifically, if the semantics of the qualifying namespace
           define a reply that the server can provide, the server MUST
           reply to the stanza on behalf of the user; if not, the server
           MUST reply with a <service-unavailable/> stanza error.
   5.  Else if the JID is of the form <user@domain> and there are no
       available resources associated with the user, how the stanza
       shall be handled depends on the stanza type:
       1.  For presence stanzas of type "subscribe", "subscribed",
           "unsubscribe", and "unsubscribed", the server MUST maintain a
           record of the stanza and deliver the stanza at least once
           (i.e., when the user next creates an available resource and
           requests the roster); in addition, the server MUST continue
           to deliver presence stanzas of type "subscribe" until the
           user either approves or denies the subscription request (see
           also Managing Presence Subscriptions (Section 3)).
       2.  For all other presence stanzas, the server SHOULD silently
           ignore the stanza by not storing it for later delivery or
           replying to it on behalf of the user.
       3.  For message stanzas, the server MAY choose to store the
           stanza on behalf of the user and deliver it when the user
           next becomes available, or forward the message to the user
           via some other means (e.g., to the user's email account).
           However, if offline message storage or message forwarding is
           not enabled, the server MUST return to the sender a <service-
           unavailable/> stanza error.  (Note: Offline message storage
           and message forwarding are not defined in XMPP, since they
           are strictly a matter of implementation and service
           provisioning.)





Saint-Andre              Expires April 16, 2007                [Page 33]


Internet-Draft                   XMPP IM                    October 2006


       4.  For IQ stanzas, the server itself MUST reply on behalf of the
           user with either an IQ result or an IQ error.  Specifically,
           if the semantics of the qualifying namespace define a reply
           that the server can provide, the server MUST reply to the
           stanza on behalf of the user; if not, the server MUST reply
           with a <service-unavailable/> stanza error.

8.2.  Outbound Stanzas

   If the hostname of the domain identifier portion of the address
   contained in the 'to' attribute of an outbound stanza matches a
   hostname of the server itself, the server MUST deliver the stanza to
   a local entity according the rules for Inbound Stanzas (Section 8.1).

   If the hostname of the domain identifier portion of the address
   contained in the 'to' attribute of an outbound stanza does not match
   a hostname of the server itself, the server MUST attempt to route the
   stanza to the foreign domain.  The recommended order of actions is as
   follows:

   1.  First attempt to resolve the foreign hostname using an [SRV]
       Service of "xmpp-server" and Proto of "tcp", resulting in
       resource records such as "_xmpp-server._tcp.example.com.", as
       specified in [XMPP-CORE].
   2.  If the "xmpp-server" address record resolution fails, attempt to
       resolve the "_im" or "_pres" [SRV] Service as specified in
       [IMP-SRV], using the "_im" Service for <message/> stanzas and the
       "_pres" Service for <presence/> stanzas (it is up to the
       implementation how to handle <iq/> stanzas).  This will result in
       one or more resolutions of the form "_im.<proto>.example.com." or
       "_pres.<proto>.example.com.", where "<proto>" would be a label
       registered in the Instant Messaging SRV Protocol Label registry
       or the Presence SRV Protocol Label registry: either "_xmpp" for
       an XMPP-aware domain or some other IANA-registered label (e.g.,
       "_simple") for a non-XMPP-aware domain.
   3.  If both SRV address record resolutions fail, attempt to perform a
       normal IPv4/IPv6 address record resolution to determine the IP
       address using the "xmpp-server" port of 5269 registered with the
       IANA, as specified in [XMPP-CORE].

   Administrators of server deployments are strongly encouraged to keep
   the _im._xmpp, _pres._xmpp, and _xmpp._tcp SRV records properly
   synchronized, since different implementations might perform the "_im"
   and "_pres" lookups before the "xmpp-server" lookup.







Saint-Andre              Expires April 16, 2007                [Page 34]


Internet-Draft                   XMPP IM                    October 2006


9.  IM and Presence Compliance Requirements

   This section summarizes the specific aspects of the Extensible
   Messaging and Presence Protocol that MUST be supported by instant
   messaging and presence servers and clients in order to be considered
   compliant implementations.  All such applications MUST comply with
   the requirements specified in [XMPP-CORE].  The text in this section
   specifies additional compliance requirements for instant messaging
   and presence servers and clients; note well that the requirements
   described here supplement but do not supersede the core requirements.
   Note also that a server or client MAY support only presence or
   instant messaging, and is not required to support both if only a
   presence service or an instant messaging service is desired.

9.1.  Servers

   In addition to core server compliance requirements, an instant
   messaging and presence server MUST additionally support the following
   protocols:

   o  All server-related instant messaging and presence syntax and
      semantics defined in this document, including presence broadcast
      on behalf of clients, presence subscriptions, roster storage and
      manipulation, and IM-specific routing and delivery rules

9.2.  Clients

   In addition to core client compliance requirements, an instant
   messaging and presence client MUST additionally support the following
   protocols:

   o  Generation and handling of the IM-specific semantics of XML
      stanzas as defined by the XML schemas, including the 'type'
      attribute of message and presence stanzas as well as their child
      elements
   o  All client-related instant messaging syntax and semantics defined
      in this document, including presence subscriptions, and roster
      management
   o  End-to-end object encryption as defined in End-to-End Object
      Encryption in the Extensible Messaging and Presence Protocol
      (XMPP) [XMPP-E2E]

   A client MUST also handle addresses that are encoded as "im:" URIs as
   specified in [CPIM], and MAY do so by removing the "im:" scheme and
   entrusting address resolution to the server as specified under
   Outbound Stanzas (Section 8.2).





Saint-Andre              Expires April 16, 2007                [Page 35]


Internet-Draft                   XMPP IM                    October 2006


10.  Internationalization Considerations

   For internationalization considerations, refer to the relevant
   section of [XMPP-CORE].


11.  Security Considerations

   Core security considerations for XMPP are defined in the relevant
   section of [XMPP-CORE].

   Additional considerations that apply only to instant messaging and
   presence applications of XMPP are defined in several places within
   this document; specifically:

   o  When a server processes an inbound presence stanza of type "probe"
      whose intended recipient is a user associated with one of the
      server's hostnames, the server MUST NOT reveal the user's presence
      information if the sender is an entity that is not authorized to
      receive that information as determined by presence subscriptions
      (see Exchanging Presence Information (Section 4)).
   o  When a server processes an outbound presence stanza with no type
      or of type "unavailable", it MUST follow the rules defined under
      Exchanging Presence Information (Section 4) in order to ensure
      that such presence information is not broadcasted to entities that
      are not authorized to know such information.
   o  When a server generates an error stanza in response to receiving a
      stanza for a user who does not exist, the use of the <service-
      unavailable/> error condition helps protect against well-known
      dictionary attacks, since this is the same error condition that is
      returned if, for instance, the namespace of an IQ child element is
      not understood, or if offline message storage or message
      forwarding is not enabled for a domain.


12.  IANA Considerations

   For a number of related IANA considerations, refer to the relevant
   section of [XMPP-CORE].

12.1.  Instant Messaging SRV Protocol Label Registration

   Address Resolution for Instant Messaging and Presence [IMP-SRV]
   defines an Instant Messaging SRV Protocol Label registry for
   protocols that can provide services that conform to the "_im" SRV
   Service label.  Because XMPP is one such protocol, the IANA registers
   the "_xmpp" protocol label in the appropriate registry, as follows:




Saint-Andre              Expires April 16, 2007                [Page 36]


Internet-Draft                   XMPP IM                    October 2006


   Protocol label:  _xmpp
   Specification:  RFC 3921
   Description:  Instant messaging protocol label for the Extensible
      Messaging and Presence Protocol (XMPP) as defined by RFC 3921.
   Registrant Contact:  IETF, XMPP Working Group, <xmppwg@jabber.org>

12.2.  Presence SRV Protocol Label Registration

   Address Resolution for Instant Messaging and Presence [IMP-SRV]
   defines a Presence SRV Protocol Label registry for protocols that can
   provide services that conform to the "_pres" SRV Service label.
   Because XMPP is one such protocol, the IANA registers the "_xmpp"
   protocol label in the appropriate registry, as follows:

   Protocol label:  _xmpp
   Specification:  RFC 3921
   Description:  Presence protocol label for the Extensible Messaging
      and Presence Protocol (XMPP) as defined by RFC 3921.
   Registrant Contact:  IETF, XMPP Working Group, <xmppwg@jabber.org>


13.  References

13.1.  Normative References

   [CPIM]     Peterson, J., "Common Profile for Instant Messaging
              (CPIM)", RFC 3860, August 2004.

   [IMP-REQS]
              Day, M., Aggarwal, S., and J. Vincent, "Instant Messaging
              / Presence Protocol Requirements", RFC 2779,
              February 2000.

   [IMP-SRV]  Peterson, J., "Address Resolution for Instant Messaging
              and Presence", RFC 3861, August 2004.

   [SRV]      Gulbrandsen, A., Vixie, P., and L. Esibov, "A DNS RR for
              specifying the location of services (DNS SRV)", RFC 2782,
              February 2000.

   [TERMS]    Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119, March 1997.

   [XML]      Bray, T., Paoli, J., Sperberg-McQueen, C., and E. Maler,
              "Extensible Markup Language (XML) 1.0 (2nd ed)", W3C REC-
              xml, October 2000, <http://www.w3.org/TR/REC-xml>.

   [XML-NAMES]



Saint-Andre              Expires April 16, 2007                [Page 37]


Internet-Draft                   XMPP IM                    October 2006


              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 3920, October 2004.

   [XMPP-E2E]
              Saint-Andre, P., "End-to-End Signing and Object Encryption
              for the Extensible Messaging and Presence Protocol
              (XMPP)", RFC 3923, October 2004.

13.2.  Informative References

   [IMP-MODEL]
              Day, M., Rosenberg, J., and H. Sugano, "A Model for
              Presence and Instant Messaging", RFC 2778, February 2000.

   [IRC]      Oikarinen, J. and D. Reed, "Internet Relay Chat Protocol",
              RFC 1459, May 1993.

   [XEP-0016]
              Millard, P. and P. Saint-Andre, "Privacy Lists", JSF
              XEP 0016, October 2006.

   [XEP-0045]
              Saint-Andre, P., "Multi-User Chat", JSF XEP 0045,
              June 2004.

   [XEP-0054]
              Saint-Andre, P., "vcard-temp", JSF XEP 0054, March 2003.

   [XEP-0191]
              Saint-Andre, P., "Simple Communications Blocking", JSF
              XEP 0191, August 2006.

   [VCARD]    Dawson, F. and T. Howes, "vCard MIME Directory Profile",
              RFC 2426, September 1998.


Appendix A.  Integration of Roster Management and Presence Subscriptions

   This Appendix provides a detailed description of how roster
   management and presence subscriptions are integrated in XMPP-based
   instant messaging and presence applications, mainly for the benefit
   of server developers (most of the complexity specified here can be
   safely ignored by client developers).



Saint-Andre              Expires April 16, 2007                [Page 38]


Internet-Draft                   XMPP IM                    October 2006


A.1.  Overview

   Some level of integration between roster items and presence
   subscriptions is normally expected by an instant messaging user
   regarding the user's subscriptions to and from other contacts.  This
   section describes the level of integration that MUST be supported
   within XMPP instant messaging applications.

   There are four primary subscription states:

   o  None -- the user does not have a subscription to the contact's
      presence information, and the contact does not have a subscription
      to the user's presence information
   o  To -- the user has a subscription to the contact's presence
      information, but the contact does not have a subscription to the
      user's presence information
   o  From -- the contact has a subscription to the user's presence
      information, but the user does not have a subscription to the
      contact's presence information
   o  Both -- both the user and the contact have subscriptions to each
      other's presence information (i.e., the union of 'from' and 'to')

   Each of these states is reflected in the roster of both the user and
   the contact, thus resulting in durable subscription states.
   Narrative explanations of how these subscription states interact with
   roster items in order to complete certain defined use cases are
   provided in the following sub-sections.  Full details regarding
   server and client handling of all subscription states (including
   pending states between the primary states listed above) is provided
   in Subscription States (Appendix B).

   The server MUST NOT send presence subscription requests or roster
   pushes to unavailable resources, nor to available resources that have
   not requested the roster.

   The 'from' and 'to' addresses are OPTIONAL in roster pushes; if
   included, their values SHOULD be the full JID of the resource for
   that session.  A client MUST acknowledge each roster push with an IQ
   stanza of type "result" (for the sake of brevity, these stanzas are
   not shown in the following examples but are required by the IQ
   semantics defined in [XMPP-CORE]).

A.2.  User Subscribes to Contact

   The process by which a user subscribes to a contact, including the
   interaction between roster items and subscription states, is
   described below.




Saint-Andre              Expires April 16, 2007                [Page 39]


Internet-Draft                   XMPP IM                    October 2006


   1.  In preparation for being able to render the contact in the user's
       client interface and for the server to keep track of the
       subscription, the user's client SHOULD perform a "roster set" for
       the new roster item.  This request consists of sending an IQ
       stanza of type='set' containing a <query/> element qualified by
       the 'jabber:iq:roster' namespace, which in turn contains an
       <item/> element that defines the new roster item; the <item/>
       element MUST possess a 'jid' attribute, MAY possess a 'name'
       attribute, MUST NOT possess a 'subscription' attribute, and MAY
       contain one or more <group/> child elements:

   <iq type='set' id='set1'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='contact@example.org'
           name='MyContact'>
         <group>MyBuddies</group>
       </item>
     </query>
   </iq>

   2.  As a result, the user's server (1) MUST initiate a roster push
       for the new roster item to all available resources associated
       with this user that have requested the roster, setting the
       'subscription' attribute to a value of "none"; and (2) MUST reply
       to the sending resource with an IQ result indicating the success
       of the roster set:

   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='contact@example.org'
           subscription='none'
           name='MyContact'>
         <group>MyBuddies</group>
       </item>
     </query>
   </iq>

   <iq type='result' id='set1'/>

   3.  If the user wants to request a subscription to the contact's
       presence information, the user's client MUST send a presence
       stanza of type='subscribe' to the contact:

   <presence to='contact@example.org' type='subscribe'/>





Saint-Andre              Expires April 16, 2007                [Page 40]


Internet-Draft                   XMPP IM                    October 2006


   4.  As a result, the user's server MUST initiate a second roster push
       to all of the user's interested resources, setting the contact to
       the pending sub-state of the 'none' subscription state; this
       pending sub-state is denoted by the inclusion of the
       ask='subscribe' attribute in the roster item:

   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='contact@example.org'
           subscription='none'
           ask='subscribe'
           name='MyContact'>
         <group>MyBuddies</group>
       </item>
     </query>
   </iq>

       Note: If the user did not create a roster item before sending the
       subscription request, the server MUST now create one on behalf of
       the user, then send a roster push to all of the user's interested
       resources, absent the 'name' attribute and the <group/> child
       shown above.
   5.  The user's server MUST also stamp the presence stanza of type
       "subscribe" with the user's bare JID (i.e., <user@example.com>)
       as the 'from' address (if the user provided a 'from' address set
       to the user's full JID, the server SHOULD remove the resource
       identifier).  If the contact is served by a different host than
       the user, the user's server MUST route the presence stanza to the
       contact's server for delivery to the contact (this case is
       assumed throughout; however, if the contact is served by the same
       host, then the server can simply deliver the presence stanza
       directly):

   <presence
       from='user@example.com'
       to='contact@example.org'
       type='subscribe'/>

       Note: If the user's server receives a presence stanza of type
       "error" from the contact's server, it MUST deliver the error
       stanza to the user, whose client MAY determine that the error is
       in response to the outgoing presence stanza of type "subscribe"
       it sent previously (e.g., by tracking an 'id' attribute) and then
       choose to resend the "subscribe" request or revert the roster to
       its previous state by sending a presence stanza of type
       "unsubscribe" to the contact.




Saint-Andre              Expires April 16, 2007                [Page 41]


Internet-Draft                   XMPP IM                    October 2006


   6.  Upon receiving the presence stanza of type "subscribe" addressed
       to the contact, the contact's server MUST determine if there is
       at least one available resource from which the contact has
       requested the roster.  If so, it MUST deliver the subscription
       request to the contact (if not, the contact's server MUST store
       the subscription request offline for delivery when this condition
       is next met; normally this is done by adding a roster item for
       the contact to the user's roster, with a state of "None + Pending
       In" as defined under Subscription States (Appendix B), however a
       server SHOULD NOT push or deliver roster items in that state to
       the contact).  No matter when the subscription request is
       delivered, the contact must decide whether or not to approve it
       (subject to the contact's configured preferences, the contact's
       client MAY approve or refuse the subscription request without
       presenting it to the contact).  Here we assume the "happy path"
       that the contact approves the subscription request (the alternate
       flow of declining the subscription request is defined in
       Appendix A.2.1).  In this case, the contact's client (1) SHOULD
       perform a roster set specifying the desired handle and group for
       the user (if any); and (2) MUST send a presence stanza of type
       "subscribed" to the user in order to approve the subscription
       request.

   <iq type='set' id='set2'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='user@example.com'
           name='SomeUser'>
         <group>SomeGroup</group>
       </item>
     </query>
   </iq>

   <presence to='user@example.com' type='subscribed'/>

   7.  As a result, the contact's server (1) MUST initiate a roster push
       to all available resources associated with the contact that have
       requested the roster, containing a roster item for the user with
       the subscription state set to 'from' (the server MUST send this
       even if the contact did not perform a roster set); (2) MUST
       return an IQ result to the sending resource indicating the
       success of the roster set; (3) MUST route the presence stanza of
       type "subscribed" to the user, first stamping the 'from' address
       as the bare JID (<contact@example.org>) of the contact; and (4)
       MUST send available presence from all of the contact's available
       resources to the user:





Saint-Andre              Expires April 16, 2007                [Page 42]


Internet-Draft                   XMPP IM                    October 2006


   <iq type='set' to='contact@example.org/resource'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='user@example.com'
           subscription='from'
           name='SomeUser'>
         <group>SomeGroup</group>
       </item>
     </query>
   </iq>

   <iq type='result' to='contact@example.org/resource' id='set2'/>

   <presence
       from='contact@example.org'
       to='user@example.com'
       type='subscribed'/>

   <presence
       from='contact@example.org/resource'
       to='user@example.com'/>

       Note: If the contact's server receives a presence stanza of type
       "error" from the user's server, it MUST deliver the error stanza
       to the contact, whose client MAY determine that the error is in
       response to the outgoing presence stanza of type "subscribed" it
       sent previously (e.g., by tracking an 'id' attribute) and then
       choose to resend the "subscribed" notification or revert the
       roster to its previous state by sending a presence stanza of type
       "unsubscribed" to the user.
   8.  Upon receiving the presence stanza of type "subscribed" addressed
       to the user, the user's server MUST first verify that the contact
       is in the user's roster with either of the following states: (a)
       subscription='none' and ask='subscribe' or (b)
       subscription='from' and ask='subscribe'.  If the contact is not
       in the user's roster with either of those states, the user's
       server MUST silently ignore the presence stanza of type
       "subscribed" (i.e., it MUST NOT route it to the user, modify the
       user's roster, or generate a roster push to the user's available
       resources).  If the contact is in the user's roster with either
       of those states, the user's server (1) MUST deliver the presence
       stanza of type "subscribed" from the contact to the user; (2)
       MUST initiate a roster push to all of the user's interested
       resources, containing an updated roster item for the contact with
       the 'subscription' attribute set to a value of "to"; and (3) MUST
       deliver the available presence stanza received from each of the
       contact's available resources to each of the user's available
       resources:



Saint-Andre              Expires April 16, 2007                [Page 43]


Internet-Draft                   XMPP IM                    October 2006


   <presence
       to='user@example.com'
       from='contact@example.org'
       type='subscribed'/>

   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='contact@example.org'
           subscription='to'
           name='MyContact'>
         <group>MyBuddies</group>
       </item>
     </query>
   </iq>

   <presence
       from='contact@example.org/resource'
       to='user@example.com/resource'/>

   9.  Upon receiving the presence stanza of type "subscribed", the user
       SHOULD acknowledge receipt of that subscription state
       notification through either "affirming" it by sending a presence
       stanza of type "subscribe" to the contact or "denying" it by
       sending a presence stanza of type "unsubscribe" to the contact;
       this step does not necessarily affect the subscription state (see
       Subscription States (Appendix B) for details), but instead lets
       the user's server know that it MUST no longer send notification
       of the subscription state change to the user (see Appendix B.4).

   From the perspective of the user, there now exists a subscription to
   the contact's presence information; from the perspective of the
   contact, there now exists a subscription from the user.

A.2.1.  Alternate Flow: Contact Declines Subscription Request

   The above activity flow represents the "happy path" regarding the
   user's subscription request to the contact.  The main alternate flow
   occurs if the contact refuses the user's subscription request, as
   described below.

   1.  If the contact wants to refuse the request, the contact's client
       MUST send a presence stanza of type "unsubscribed" to the user
       (instead of the presence stanza of type "subscribed" sent in Step
       6 of Appendix A.2):

   <presence to='user@example.com' type='unsubscribed'/>




Saint-Andre              Expires April 16, 2007                [Page 44]


Internet-Draft                   XMPP IM                    October 2006


   2.  As a result, the contact's server MUST route the presence stanza
       of type "unsubscribed" to the user, first stamping the 'from'
       address as the bare JID (<contact@example.org>) of the contact:

   <presence
       from='contact@example.org'
       to='user@example.com'
       type='unsubscribed'/>

       Note: If the contact's server previously added the user to the
       contact's roster for tracking purposes, it MUST remove the
       relevant item at this time.
   3.  Upon receiving the presence stanza of type "unsubscribed"
       addressed to the user, the user's server (1) MUST deliver that
       presence stanza to the user and (2) MUST initiate 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" and with no 'ask' attribute:

   <presence
       from='contact@example.org'
       to='user@example.com'
       type='unsubscribed'/>

   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='contact@example.org'
           subscription='none'
           name='MyContact'>
         <group>MyBuddies</group>
       </item>
     </query>
   </iq>

   4.  Upon receiving the presence stanza of type "unsubscribed", the
       user SHOULD acknowledge receipt of that subscription state
       notification through either "affirming" it by sending a presence
       stanza of type "unsubscribe" to the contact or "denying" it by
       sending a presence stanza of type "subscribe" to the contact;
       this step does not necessarily affect the subscription state (see
       Subscription States (Appendix B) for details), but instead lets
       the user's server know that it MUST no longer send notification
       of the subscription state change to the user (see Appendix B.4).

   As a result of this activity, the contact is now in the user's roster
   with a subscription state of "none", whereas the user is not in the
   contact's roster at all.



Saint-Andre              Expires April 16, 2007                [Page 45]


Internet-Draft                   XMPP IM                    October 2006


A.3.  Creating a Mutual Subscription

   The user and contact can build on the "happy path" described above to
   create a mutual subscription (i.e., a subscription of type "both").
   The process is described below.

   1.  If the contact wants to create a mutual subscription, the contact
       MUST send a subscription request to the user (subject to the
       contact's configured preferences, the contact's client MAY send
       this automatically):

   <presence to='user@example.com' type='subscribe'/>

   2.  As a result, the contact's server (1) MUST initiate a roster push
       to all available resources associated with the contact that have
       requested the roster, with the user still in the 'from'
       subscription state but with a pending 'to' subscription denoted
       by the inclusion of the ask='subscribe' attribute in the roster
       item; and (2) MUST route the presence stanza of type "subscribe"
       to the user, first stamping the 'from' address as the bare JID
       (<contact@example.org>) of the contact:

   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='user@example.com'
           subscription='from'
           ask='subscribe'
           name='SomeUser'>
         <group>SomeGroup</group>
       </item>
     </query>
   </iq>

   <presence
       from='contact@example.org'
       to='user@example.com'
       type='subscribe'/>

       Note: If the contact's server receives a presence stanza of type
       "error" from the user's server, it MUST deliver the error stanza
       to the contact, whose client MAY determine that the error is in
       response to the outgoing presence stanza of type "subscribe" it
       sent previously (e.g., by tracking an 'id' attribute) and then
       choose to resend the "subscribe" request or revert the roster to
       its previous state by sending a presence stanza of type
       "unsubscribe" to the user.




Saint-Andre              Expires April 16, 2007                [Page 46]


Internet-Draft                   XMPP IM                    October 2006


   3.  Upon receiving the presence stanza of type "subscribe" addressed
       to the user, the user's server must determine if there is at
       least one available resource for which the user has requested the
       roster.  If so, the user's server MUST deliver the subscription
       request to the user (if not, it MUST store the subscription
       request offline for delivery when this condition is next met).
       No matter when the subscription request is delivered, the user
       must then decide whether or not to approve it (subject to the
       user's configured preferences, the user's client MAY approve or
       refuse the subscription request without presenting it to the
       user).  Here we assume the "happy path" that the user approves
       the subscription request (the alternate flow of declining the
       subscription request is defined in Appendix A.3.1).  In this
       case, the user's client MUST send a presence stanza of type
       "subscribed" to the contact in order to approve the subscription
       request.

   <presence to='contact@example.org' type='subscribed'/>

   4.  As a result, the user's server (1) MUST initiate a roster push to
       all of the user's interested resources, containing a roster item
       for the contact with the 'subscription' attribute set to a value
       of "both"; (2) MUST route the presence stanza of type
       "subscribed" to the contact, first stamping the 'from' address as
       the bare JID (<user@example.com>) of the user; and (3) MUST send
       to the contact the full XML of the last presence stanza with no
       'to' attribute received by the server from each of the user's
       available resources:























Saint-Andre              Expires April 16, 2007                [Page 47]


Internet-Draft                   XMPP IM                    October 2006


   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='contact@example.org'
           subscription='both'
           name='MyContact'>
         <group>MyBuddies</group>
       </item>
     </query>
   </iq>

   <presence
       from='user@example.com'
       to='contact@example.org'
       type='subscribed'/>

   <presence
       from='user@example.com/resource'
       to='contact@example.org'/>

       Note: If the user's server receives a presence stanza of type
       "error" from the contact's server, it MUST deliver the error
       stanza to the user, whose client MAY determine that the error is
       in response to the outgoing presence stanza of type "subscribed"
       it sent previously (e.g., by tracking an 'id' attribute) and then
       choose to resend the subscription request or revert the roster to
       its previous state by sending a presence stanza of type
       "unsubscribed" to the contact.
   5.  Upon receiving the presence stanza of type "subscribed" addressed
       to the contact, the contact's server MUST first verify that the
       user is in the contact's roster with either of the following
       states: (a) subscription='none' and ask='subscribe' or (b)
       subscription='from' and ask='subscribe'.  If the user is not in
       the contact's roster with either of those states, the contact's
       server MUST silently ignore the presence stanza of type
       "subscribed" (i.e., it MUST NOT route it to the contact, modify
       the contact's roster, or generate a roster push to the contact's
       available resources).  If the user is in the contact's roster
       with either of those states, the contact's server (1) MUST
       deliver the presence stanza of type "subscribed" from the user to
       the contact; (2) MUST initiate a roster push to all available
       resources associated with the contact that have requested the
       roster, containing an updated roster item for the user with the
       'subscription' attribute set to a value of "both"; and (3) MUST
       deliver the available presence stanza received from each of the
       user's available resources to each of the contact's available
       resources:




Saint-Andre              Expires April 16, 2007                [Page 48]


Internet-Draft                   XMPP IM                    October 2006


   <presence
       from='user@example.com'
       to='contact@example.org'
       type='subscribed'/>

   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='user@example.com'
           subscription='both'
           name='SomeUser'>
         <group>SomeGroup</group>
       </item>
     </query>
   </iq>

   <presence
       from='user@example.com/resource'
       to='contact@example.org/resource'/>

   6.  Upon receiving the presence stanza of type "subscribed", the
       contact SHOULD acknowledge receipt of that subscription state
       notification through either "affirming" it by sending a presence
       stanza of type "subscribe" to the user or "denying" it by sending
       a presence stanza of type "unsubscribe" to the user; this step
       does not necessarily affect the subscription state (see
       Subscription States (Appendix B) for details), but instead lets
       the contact's server know that it MUST no longer send
       notification of the subscription state change to the contact (see
       Appendix B.4).

   The user and the contact now have a mutual subscription to each
   other's presence -- i.e., the subscription is of type "both".

A.3.1.  Alternate Flow: User Declines Subscription Request

   The above activity flow represents the "happy path" regarding the
   contact's subscription request to the user.  The main alternate flow
   occurs if the user refuses the contact's subscription request, as
   described below.

   1.  If the user wants to refuse the request, the user's client MUST
       send a presence stanza of type "unsubscribed" to the contact
       (instead of the presence stanza of type "subscribed" sent in Step
       3 of Appendix A.3):

   <presence to='contact@example.org' type='unsubscribed'/>




Saint-Andre              Expires April 16, 2007                [Page 49]


Internet-Draft                   XMPP IM                    October 2006


   2.  As a result, the user's server MUST route the presence stanza of
       type "unsubscribed" to the contact, first stamping the 'from'
       address as the bare JID (<user@example.com>) of the user:

   <presence
       from='user@example.com'
       to='contact@example.org'
       type='unsubscribed'/>

   3.  Upon receiving the presence stanza of type "unsubscribed"
       addressed to the contact, the contact's server (1) MUST deliver
       that presence stanza to the contact; and (2) MUST initiate a
       roster push to all available resources associated with the
       contact that have requested the roster, containing an updated
       roster item for the user with the 'subscription' attribute set to
       a value of "from" and with no 'ask' attribute:

   <presence
       from='user@example.com'
       to='contact@example.org'
       type='unsubscribed'/>

   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='user@example.com'
           subscription='from'
           name='SomeUser'>
         <group>SomeGroup</group>
       </item>
     </query>
   </iq>

   4.  Upon receiving the presence stanza of type "unsubscribed", the
       contact SHOULD acknowledge receipt of that subscription state
       notification through either "affirming" it by sending a presence
       stanza of type "unsubscribe" to the user or "denying" it by
       sending a presence stanza of type "subscribe" to the user; this
       step does not necessarily affect the subscription state (see
       Subscription States (Appendix B) for details), but instead lets
       the contact's server know that it MUST no longer send
       notification of the subscription state change to the contact (see
       Appendix B.4).

   As a result of this activity, there has been no change in the
   subscription state; i.e., the contact is in the user's roster with a
   subscription state of "to" and the user is in the contact's roster
   with a subscription state of "from".



Saint-Andre              Expires April 16, 2007                [Page 50]


Internet-Draft                   XMPP IM                    October 2006


A.4.  Unsubscribing

   At any time after subscribing to a contact's presence information, a
   user MAY unsubscribe.  While the XML that the user sends to make this
   happen is the same in all instances, the subsequent subscription
   state is different depending on the subscription state obtaining when
   the unsubscribe "command" is sent.  Both possible scenarios are
   described below.

A.4.1.  Case #1: Unsubscribing When Subscription is Not Mutual

   In the first case, the user has a subscription to the contact's
   presence information but the contact does not have a subscription to
   the user's presence information (i.e., the subscription is not yet
   mutual).

   1.  If the user wants to unsubscribe from the contact's presence
       information, the user MUST send a presence stanza of type
       "unsubscribe" to the contact:

   <presence to='contact@example.org' type='unsubscribe'/>

   2.  As a result, the user's server (1) MUST send 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"; and (2) MUST route the presence stanza of type
       "unsubscribe" to the contact, first stamping the 'from' address
       as the bare JID (<user@example.com>) of the user:

   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='contact@example.org'
           subscription='none'
           name='MyContact'>
         <group>MyBuddies</group>
       </item>
     </query>
   </iq>

   <presence
       from='user@example.com'
       to='contact@example.org'
       type='unsubscribe'/>

   3.  Upon receiving the presence stanza of type "unsubscribe"
       addressed to the contact, the contact's server (1) MUST initiate
       a roster push to all available resources associated with the



Saint-Andre              Expires April 16, 2007                [Page 51]


Internet-Draft                   XMPP IM                    October 2006


       contact that have requested the roster, containing an updated
       roster item for the user with the 'subscription' attribute set to
       a value of "none" (if the contact is unavailable or has not
       requested the roster, the contact's server MUST modify the roster
       item and send that modified item the next time the contact
       requests the roster); and (2) MUST deliver the "unsubscribe"
       state change notification to the contact:

   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='user@example.com'
           subscription='none'
           name='SomeUser'>
         <group>SomeGroup</group>
       </item>
     </query>
   </iq>

   <presence
       from='user@example.com'
       to='contact@example.org'
       type='unsubscribe'/>

   4.  Upon receiving the presence stanza of type "unsubscribe", the
       contact SHOULD acknowledge receipt of that subscription state
       notification through either "affirming" it by sending a presence
       stanza of type "unsubscribed" to the user or "denying" it by
       sending a presence stanza of type "subscribed" to the user; this
       step does not necessarily affect the subscription state (see
       Subscription States (Appendix B) for details), but instead lets
       the contact's server know that it MUST no longer send
       notification of the subscription state change to the contact (see
       Appendix B.4).
   5.  The contact's server then (1) MUST send a presence stanza of type
       "unsubscribed" to the user; and (2) SHOULD send unavailable
       presence from all of the contact's available resources to the
       user:

   <presence
       from='contact@example.org'
       to='user@example.com'
       type='unsubscribed'/>

   <presence
       from='contact@example.org/resource'
       to='user@example.com'
       type='unavailable'/>



Saint-Andre              Expires April 16, 2007                [Page 52]


Internet-Draft                   XMPP IM                    October 2006


   6.  When the user's server receives the presence stanzas of type
       "unsubscribed" and "unavailable", it MUST deliver them to the
       user:

   <presence
       from='contact@example.org'
       to='user@example.com'
       type='unsubscribed'/>

   <presence
       from='contact@example.org/resource'
       to='user@example.com'
       type='unavailable'/>

   7.  Upon receiving the presence stanza of type "unsubscribed", the
       user SHOULD acknowledge receipt of that subscription state
       notification through either "affirming" it by sending a presence
       stanza of type "unsubscribe" to the contact or "denying" it by
       sending a presence stanza of type "subscribe" to the contact;
       this step does not necessarily affect the subscription state (see
       Subscription States (Appendix B) for details), but instead lets
       the user's server know that it MUST no longer send notification
       of the subscription state change to the user (see Appendix B.4).

A.4.2.  Case #2: Unsubscribing When Subscription is Mutual

   In the second case, the user has a subscription to the contact's
   presence information and the contact also has a subscription to the
   user's presence information (i.e., the subscription is mutual).

   1.  If the user wants to unsubscribe from the contact's presence
       information, the user MUST send a presence stanza of type
       "unsubscribe" to the contact:

   <presence to='contact@example.org' type='unsubscribe'/>

   2.  As a result, the user's server (1) MUST send 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 "from"; and (2) MUST route the presence stanza of type
       "unsubscribe" to the contact, first stamping the 'from' address
       as the bare JID (<user@example.com>) of the user:









Saint-Andre              Expires April 16, 2007                [Page 53]


Internet-Draft                   XMPP IM                    October 2006


   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='contact@example.org'
           subscription='from'
           name='MyContact'>
         <group>MyBuddies</group>
       </item>
     </query>
   </iq>

   <presence
       from='user@example.com'
       to='contact@example.org'
       type='unsubscribe'/>

   3.  Upon receiving the presence stanza of type "unsubscribe"
       addressed to the contact, the contact's server (1) MUST initiate
       a roster push to all available resources associated with the
       contact that have requested the roster, containing an updated
       roster item for the user with the 'subscription' attribute set to
       a value of "to" (if the contact is unavailable or has not
       requested the roster, the contact's server MUST modify the roster
       item and send that modified item the next time the contact
       requests the roster); and (2) MUST deliver the "unsubscribe"
       state change notification to the contact:

   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='user@example.com'
           subscription='to'
           name='SomeUser'>
         <group>SomeGroup</group>
       </item>
     </query>
   </iq>

   <presence
       from='user@example.com'
       to='contact@example.org'
       type='unsubscribe'/>

   4.  Upon receiving the presence stanza of type "unsubscribe", the
       contact SHOULD acknowledge receipt of that subscription state
       notification through either "affirming" it by sending a presence
       stanza of type "unsubscribed" to the user or "denying" it by
       sending a presence stanza of type "subscribed" to the user; this



Saint-Andre              Expires April 16, 2007                [Page 54]


Internet-Draft                   XMPP IM                    October 2006


       step does not necessarily affect the subscription state (see
       Subscription States (Appendix B) for details), but instead lets
       the contact's server know that it MUST no longer send
       notification of the subscription state change to the contact (see
       Appendix B.4).
   5.  The contact's server then (1) MUST send a presence stanza of type
       "unsubscribed" to the user; and (2) SHOULD send unavailable
       presence from all of the contact's available resources to the
       user:

   <presence
       from='contact@example.org'
       to='user@example.com'
       type='unsubscribed'/>

   <presence
       from='contact@example.org/resource'
       to='user@example.com'
       type='unavailable'/>

   6.  When the user's server receives the presence stanzas of type
       "unsubscribed" and "unavailable", it MUST deliver them to the
       user:

   <presence
       from='contact@example.org'
       to='user@example.com'
       type='unsubscribed'/>

   <presence
       from='contact@example.org/resource'
       to='user@example.com'
       type='unavailable'/>

   7.  Upon receiving the presence stanza of type "unsubscribed", the
       user SHOULD acknowledge receipt of that subscription state
       notification through either "affirming" it by sending a presence
       stanza of type "unsubscribe" to the contact or "denying" it by
       sending a presence stanza of type "subscribe" to the contact;
       this step does not necessarily affect the subscription state (see
       Subscription States (Appendix B) for details), but instead lets
       the user's server know that it MUST no longer send notification
       of the subscription state change to the user (see Appendix B.4).

   Note: Obviously this does not result in removal of the roster item
   from the user's roster, and the contact still has a subscription to
   the user's presence information.  In order to both completely cancel
   a mutual subscription and fully remove the roster item from the



Saint-Andre              Expires April 16, 2007                [Page 55]


Internet-Draft                   XMPP IM                    October 2006


   user's roster, the user SHOULD update the roster item with
   subscription='remove' as defined under Removing a Roster Item and
   Cancelling All Subscriptions (Appendix A.6).

A.5.  Cancelling a Subscription

   At any time after approving a subscription request from a user, a
   contact MAY cancel that subscription.  While the XML that the contact
   sends to make this happen is the same in all instances, the
   subsequent subscription state is different depending on the
   subscription state obtaining when the cancellation was sent.  Both
   possible scenarios are described below.

A.5.1.  Case #1: Cancelling When Subscription is Not Mutual

   In the first case, the user has a subscription to the contact's
   presence information but the contact does not have a subscription to
   the user's presence information (i.e., the subscription is not yet
   mutual).

   1.  If the contact wants to cancel the user's subscription, the
       contact MUST send a presence stanza of type "unsubscribed" to the
       user:

   <presence to='user@example.com' type='unsubscribed'/>

   2.  As a result, the contact's server (1) MUST send 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"; (2) MUST route the presence stanza of type
       "unsubscribed" to the user, first stamping the 'from' address as
       the bare JID (<contact@example.org>) of the contact; and (3)
       SHOULD send unavailable presence from all of the contact's
       available resources to the user:

















Saint-Andre              Expires April 16, 2007                [Page 56]


Internet-Draft                   XMPP IM                    October 2006


   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='user@example.com'
           subscription='none'
           name='SomeUser'>
         <group>SomeGroup</group>
       </item>
     </query>
   </iq>

   <presence
       from='contact@example.org'
       to='user@example.com'
       type='unsubscribed'/>

   <presence
       from='contact@example.org/resource'
       to='user@example.com'
       type='unavailable'/>

   3.  Upon receiving the presence stanza of type "unsubscribed"
       addressed to the user, the user's server (1) MUST initiate a
       roster push to all of the user's interested resources, containing
       an updated roster item for the contact with the 'subscription'
       attribute set to a value of "none" (if the user is unavailable or
       has not requested the roster, the user's server MUST modify the
       roster item and send that modified item the next time the user
       requests the roster); (2) MUST deliver the "unsubscribed" state
       change notification to all of the user's available resources; and
       (3) MUST deliver the unavailable presence to all of the user's
       available resources:



















Saint-Andre              Expires April 16, 2007                [Page 57]


Internet-Draft                   XMPP IM                    October 2006


   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='contact@example.org'
           subscription='none'
           name='MyContact'>
         <group>MyBuddies</group>
       </item>
     </query>
   </iq>

   <presence
       from='contact@example.org'
       to='user@example.com'
       type='unsubscribed'/>

   <presence
       from='contact@example.org/resource'
       to='user@example.com'
       type='unavailable'/>

   4.  Upon receiving the presence stanza of type "unsubscribed", the
       user SHOULD acknowledge receipt of that subscription state
       notification through either "affirming" it by sending a presence
       stanza of type "unsubscribe" to the contact or "denying" it by
       sending a presence stanza of type "subscribe" to the contact;
       this step does not necessarily affect the subscription state (see
       Subscription States (Appendix B) for details), but instead lets
       the user's server know that it MUST no longer send notification
       of the subscription state change to the user (see Appendix B.4).

A.5.2.  Case #2: Cancelling When Subscription is Mutual

   In the second case, the user has a subscription to the contact's
   presence information and the contact also has a subscription to the
   user's presence information (i.e., the subscription is mutual).

   1.  If the contact wants to cancel the user's subscription, the
       contact MUST send a presence stanza of type "unsubscribed" to the
       user:

   <presence to='user@example.com' type='unsubscribed'/>

   2.  As a result, the contact's server (1) MUST send 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 "to"; (2) MUST route the presence stanza of type
       "unsubscribed" to the user, first stamping the 'from' address as



Saint-Andre              Expires April 16, 2007                [Page 58]


Internet-Draft                   XMPP IM                    October 2006


       the bare JID (<contact@example.org>) of the contact; and (3)
       SHOULD send unavailable presence from all of the contact's
       available resources to all of the user's available resources:

   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='user@example.com'
           subscription='to'
           name='SomeUser'>
         <group>SomeGroup</group>
       </item>
     </query>
   </iq>

   <presence
       from='contact@example.org'
       to='user@example.com'
       type='unsubscribed'/>

   <presence
       from='contact@example.org/resource'
       to='user@example.com'
       type='unavailable'/>

   3.  Upon receiving the presence stanza of type "unsubscribed"
       addressed to the user, the user's server (1) MUST initiate a
       roster push to all of the user's interested resources, containing
       an updated roster item for the contact with the 'subscription'
       attribute set to a value of "from" (if the user is unavailable or
       has not requested the roster, the user's server MUST modify the
       roster item and send that modified item the next time the user
       requests the roster); and (2) MUST deliver the "unsubscribed"
       state change notification to all of the user's available
       resources; and (3) MUST deliver the unavailable presence to all
       of the user's available resources:















Saint-Andre              Expires April 16, 2007                [Page 59]


Internet-Draft                   XMPP IM                    October 2006


   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='contact@example.org'
           subscription='from'
           name='MyContact'>
         <group>MyBuddies</group>
       </item>
     </query>
   </iq>

   <presence
       from='contact@example.org'
       to='user@example.com'
       type='unsubscribed'/>

   <presence
       from='contact@example.org/resource'
       to='user@example.com'
       type='unavailable'/>

   4.  Upon receiving the presence stanza of type "unsubscribed", the
       user SHOULD acknowledge receipt of that subscription state
       notification through either "affirming" it by sending a presence
       stanza of type "unsubscribe" to the contact or "denying" it by
       sending a presence stanza of type "subscribe" to the contact;
       this step does not necessarily affect the subscription state (see
       Subscription States (Appendix B) for details), but instead lets
       the user's server know that it MUST no longer send notification
       of the subscription state change to the user (see Appendix B.4).

   Note: Obviously this does not result in removal of the roster item
   from the contact's roster, and the contact still has a subscription
   to the user's presence information.  In order to both completely
   cancel a mutual subscription and fully remove the roster item from
   the contact's roster, the contact should update the roster item with
   subscription='remove' as defined under Removing a Roster Item and
   Cancelling All Subscriptions (Appendix A.6).

A.6.  Removing a Roster Item and Cancelling All Subscriptions

   Because there may be many steps involved in completely removing a
   roster item and cancelling subscriptions in both directions, the
   roster management protocol includes a "shortcut" method for doing so.
   The process may be initiated no matter what the current subscription
   state is by sending a roster set containing an item for the contact
   with the 'subscription' attribute set to a value of "remove":




Saint-Andre              Expires April 16, 2007                [Page 60]


Internet-Draft                   XMPP IM                    October 2006


   <iq type='set' id='remove1'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='contact@example.org'
           subscription='remove'/>
     </query>
   </iq>

   When the user removes a contact from his or her roster by setting the
   'subscription' attribute to a value of "remove", the user's server
   (1) MUST automatically cancel any existing presence subscription
   between the user and the contact (both 'to' and 'from' as
   appropriate); (2) MUST remove the roster item from the user's roster
   and inform all of the user's interested resources of the roster item
   removal; (3) MUST inform the resource that initiated the removal of
   success; and (4) SHOULD send unavailable presence from all of the
   user's available resources to the contact:

   <presence
       from='user@example.com'
       to='contact@example.org'
       type='unsubscribe'/>

   <presence
       from='user@example.com'
       to='contact@example.org'
       type='unsubscribed'/>

   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='contact@example.org'
           subscription='remove'/>
     </query>
   </iq>

   <iq type='result' id='remove1'/>

   <presence
       from='user@example.com/resource'
       to='contact@example.org'
       type='unavailable'/>

   Upon receiving the presence stanza of type "unsubscribe", the
   contact's server (1) MUST initiate a roster push to all available
   resources associated with the contact that have requested the roster,
   containing an updated roster item for the user with the
   'subscription' attribute set to a value of "to" (if the contact is



Saint-Andre              Expires April 16, 2007                [Page 61]


Internet-Draft                   XMPP IM                    October 2006


   unavailable or has not requested the roster, the contact's server
   MUST modify the roster item and send that modified item the next time
   the contact requests the roster); and (2) MUST also deliver the
   "unsubscribe" state change notification to all of the contact's
   available resources:

   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='user@example.com'
           subscription='to'
           name='SomeUser'>
         <group>SomeGroup</group>
       </item>
     </query>
   </iq>

   <presence
       from='user@example.com'
       to='contact@example.org'
       type='unsubscribe'/>

   Upon receiving the presence stanza of type "unsubscribed", the
   contact's server (1) MUST initiate a roster push to all available
   resources associated with the contact that have requested the roster,
   containing an updated roster item for the user with the
   'subscription' attribute set to a value of "none" (if the contact is
   unavailable or has not requested the roster, the contact's server
   MUST modify the roster item and send that modified item the next time
   the contact requests the roster); and (2) MUST also deliver the
   "unsubscribe" state change notification to all of the contact's
   available resources:

   <iq type='set'>
     <query xmlns='jabber:iq:roster'>
       <item
           jid='user@example.com'
           subscription='none'
           name='SomeUser'>
         <group>SomeGroup</group>
       </item>
     </query>
   </iq>

   <presence
       from='user@example.com'
       to='contact@example.org'
       type='unsubscribed'/>



Saint-Andre              Expires April 16, 2007                [Page 62]


Internet-Draft                   XMPP IM                    October 2006


   Upon receiving the presence stanza of type "unavailable" addressed to
   the contact, the contact's server MUST deliver the unavailable
   presence to all of the user's available resources:

   <presence
       from='user@example.com/resource'
       to='contact@example.org'
       type='unavailable'/>

   Note: When the user removes the contact from the user's roster, the
   end state of the contact's roster is that the user is still in the
   contact's roster with a subscription state of "none"; in order to
   completely remove the roster item for the user, the contact needs to
   also send a roster removal request.


Appendix B.  Subscription States

   This section provides detailed information about subscription states
   and server handling of subscription-related presence stanzas (i.e.,
   presence stanzas of type "subscribe", "subscribed", "unsubscribe",
   and "unsubscribed").

B.1.  Defined States

   There are nine possible subscription states, which are described here
   from the user's (not contact's) perspective:

   1.  "None" = contact and user are not subscribed to each other, and
       neither has requested a subscription from the other; this is
       reflected in the roster by subscription='none'
   2.  "None + Pending Out" = contact and user are not subscribed to
       each other, and user has sent contact a subscription request but
       contact has not replied yet; this is reflected in the roster by
       subscription='none' and ask='subscribe'
   3.  "None + Pending In" = contact and user are not subscribed to each
       other, and contact has sent user a subscription request but user
       has not replied yet (note: contact's server SHOULD NOT push or
       deliver roster items in this state, but instead SHOULD wait until
       user has approved subscription request from contact); this is
       reflected in the roster by subscription='none'
   4.  "None + Pending Out/In" = contact and user are not subscribed to
       each other, contact has sent user a subscription request but user
       has not replied yet, and user has sent contact a subscription
       request but contact has not replied yet; this is reflected in the
       roster by subscription='none' and ask='subscribe'





Saint-Andre              Expires April 16, 2007                [Page 63]


Internet-Draft                   XMPP IM                    October 2006


   5.  "To" = user is subscribed to contact (one-way); this is reflected
       in the roster by subscription='to'
   6.  "To + Pending In" = user is subscribed to contact, and contact
       has sent user a subscription request but user has not replied
       yet; this is reflected in the roster by subscription='to'
   7.  "From" = contact is subscribed to user (one-way); this is
       reflected in the roster by subscription='from'
   8.  "From + Pending Out" = contact is subscribed to user, and user
       has sent contact a subscription request but contact has not
       replied yet; this is reflected in the roster by
       subscription='none' and ask='subscribe'
   9.  "Both" = user and contact are subscribed to each other (two-way);
       this is reflected in the roster by subscription='both'

B.2.  Server Handling of Outbound Presence Subscription Stanzas

   Outbound presence subscription stanzas enable the user to manage his
   or her subscription to the contact's presence information (via the
   "subscribe" and "unsubscribe" types), and to manage the contact's
   access to the user's presence information (via the "subscribed" and
   "unsubscribed" types).

   Because it is possible for the user's server and the contact's server
   to lose synchronization regarding subscription states, the user's
   server MUST without exception route all outbound presence stanzas of
   type "subscribe" or "unsubscribe" to the contact so that the user is
   able to resynchronize his or her subscription to the contact's
   presence information if needed.

   The user's server SHOULD NOT route a presence stanza of type
   "subscribed" or "unsubscribed" to the contact if the stanza does not
   result in a subscription state change from the user's perspective,
   and MUST NOT make a state change.  If the stanza results in a
   subscription state change, the user's server MUST route the stanza to
   the contact and MUST make the appropriate state change.  These rules
   are summarized in the following tables.















Saint-Andre              Expires April 16, 2007                [Page 64]


Internet-Draft                   XMPP IM                    October 2006


   Table 1: Recommended handling of outbound "subscribed" stanzas

   +----------------------------------------------------------------+
   |  EXISTING STATE          |  ROUTE?  |  NEW STATE               |
   +----------------------------------------------------------------+
   |  "None"                  |  no      |  no state change         |
   |  "None + Pending Out"    |  no      |  no state change         |
   |  "None + Pending In"     |  yes     |  "From"                  |
   |  "None + Pending Out/In" |  yes     |  "From + Pending Out"    |
   |  "To"                    |  no      |  no state change         |
   |  "To + Pending In"       |  yes     |  "Both"                  |
   |  "From"                  |  no      |  no state change         |
   |  "From + Pending Out"    |  no      |  no state change         |
   |  "Both"                  |  no      |  no state change         |
   +----------------------------------------------------------------+

   Table 2: Recommended handling of outbound "unsubscribed" stanzas

   +----------------------------------------------------------------+
   |  EXISTING STATE          |  ROUTE?  |  NEW STATE               |
   +----------------------------------------------------------------+
   |  "None"                  |  no      |  no state change         |
   |  "None + Pending Out"    |  no      |  no state change         |
   |  "None + Pending In"     |  yes     |  "None"                  |
   |  "None + Pending Out/In" |  yes     |  "None + Pending Out"    |
   |  "To"                    |  no      |  no state change         |
   |  "To + Pending In"       |  yes     |  "To"                    |
   |  "From"                  |  yes     |  "None"                  |
   |  "From + Pending Out"    |  yes     |  "None + Pending Out"    |
   |  "Both"                  |  yes     |  "To"                    |
   +----------------------------------------------------------------+

B.3.  Server Handling of Inbound Presence Subscription Stanzas

   Inbound presence subscription stanzas request a subscription-related
   action from the user (via the "subscribe" type), inform the user of
   subscription-related actions taken by the contact (via the
   "unsubscribe" type), or enable the contact to manage the user's
   access to the contact's presence information (via the "subscribed"
   and "unsubscribed" types).

   When the user's server receives a subscription request for the user
   from the contact (i.e., a presence stanza of type "subscribe"), it
   MUST deliver that request to the user for approval if the user has
   not already granted the contact access to the user's presence
   information and if there is no pending inbound subscription request;
   however, the user's server SHOULD NOT deliver the new request if
   there is a pending inbound subscription request, since the previous



Saint-Andre              Expires April 16, 2007                [Page 65]


Internet-Draft                   XMPP IM                    October 2006


   subscription request will have been recorded.  If the user has
   already granted the contact access to the user's presence
   information, the user's server SHOULD auto-reply to an inbound
   presence stanza of type "subscribe" from the contact by sending a
   presence stanza of type "subscribed" to the contact on behalf of the
   user; this rule enables the contact to resynchronize the subscription
   state if needed.  These rules are summarized in the following table.

   Table 3: Recommended handling of inbound "subscribe" stanzas

   +------------------------------------------------------------------+
   |  EXISTING STATE          |  DELIVER?  |  NEW STATE               |
   +------------------------------------------------------------------+
   |  "None"                  |  yes       |  "None + Pending In"     |
   |  "None + Pending Out"    |  yes       |  "None + Pending Out/In" |
   |  "None + Pending In"     |  no        |  no state change         |
   |  "None + Pending Out/In" |  no        |  no state change         |
   |  "To"                    |  yes       |  "To + Pending In"       |
   |  "To + Pending In"       |  no        |  no state change         |
   |  "From"                  |  no *      |  no state change         |
   |  "From + Pending Out"    |  no *      |  no state change         |
   |  "Both"                  |  no *      |  no state change         |
   +------------------------------------------------------------------+

   * Server SHOULD auto-reply with "subscribed" stanza

   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 SHOULD auto-reply by sending a presence stanza of type
   "unsubscribed" to the contact on behalf of the user, MUST deliver the
   "unsubscribe" stanza to the user, and MUST change the state.  If no
   subscription state change results, the user's server SHOULD NOT
   deliver the stanza and MUST NOT change the state.  These rules are
   summarized in the following table.
















Saint-Andre              Expires April 16, 2007                [Page 66]


Internet-Draft                   XMPP IM                    October 2006


   Table 4: Recommended handling of inbound "unsubscribe" stanzas

   +------------------------------------------------------------------+
   |  EXISTING STATE          |  DELIVER?  |  NEW STATE               |
   +------------------------------------------------------------------+
   |  "None"                  |  no        |  no state change         |
   |  "None + Pending Out"    |  no        |  no state change         |
   |  "None + Pending In"     |  yes *     |  "None"                  |
   |  "None + Pending Out/In" |  yes *     |  "None + Pending Out"    |
   |  "To"                    |  no        |  no state change         |
   |  "To + Pending In"       |  yes *     |  "To"                    |
   |  "From"                  |  yes *     |  "None"                  |
   |  "From + Pending Out"    |  yes *     |  "None + Pending Out     |
   |  "Both"                  |  yes *     |  "To"                    |
   +------------------------------------------------------------------+

   * Server SHOULD auto-reply with "unsubscribed" stanza

   When the user's server receives a presence stanza of type
   "subscribed" for the user from the contact, it MUST NOT deliver the
   stanza to the user and MUST NOT change the subscription state if
   there is no pending outbound request for access to the contact's
   presence information.  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,
   the user's server MUST deliver the stanza to the user and MUST change
   the subscription state.  If the user already has access to the
   contact's presence information, the inbound presence stanza of type
   "subscribed" does not result in a subscription state change;
   therefore the user's server SHOULD NOT deliver the stanza to the user
   and MUST NOT change the subscription state.  These rules are
   summarized in the following table.

   Table 5: Recommended handling of inbound "subscribed" stanzas

   +------------------------------------------------------------------+
   |  EXISTING STATE          |  DELIVER?  |  NEW STATE               |
   +------------------------------------------------------------------+
   |  "None"                  |  no        |  no state change         |
   |  "None + Pending Out"    |  yes       |  "To"                    |
   |  "None + Pending In"     |  no        |  no state change         |
   |  "None + Pending Out/In" |  yes       |  "To + Pending In"       |
   |  "To"                    |  no        |  no state change         |
   |  "To + Pending In"       |  no        |  no state change         |
   |  "From"                  |  no        |  no state change         |
   |  "From + Pending Out"    |  yes       |  "Both"                  |
   |  "Both"                  |  no        |  no state change         |
   +------------------------------------------------------------------+



Saint-Andre              Expires April 16, 2007                [Page 67]


Internet-Draft                   XMPP IM                    October 2006


   When the user's server receives a presence stanza of type
   "unsubscribed" for the user from the contact, it MUST deliver the
   stanza to the user and MUST change the subscription state if there is
   a pending outbound request for access to the contact's presence
   information or if the user currently has access to the contact's
   presence information.  Otherwise, the user's server SHOULD NOT
   deliver the stanza and MUST NOT change the subscription state.  These
   rules are summarized in the following table.

   Table 6: Recommended handling of inbound "unsubscribed" stanzas

   +------------------------------------------------------------------+
   |  EXISTING STATE          |  DELIVER?  |  NEW STATE               |
   +------------------------------------------------------------------+
   |  "None"                  |  no        |  no state change         |
   |  "None + Pending Out"    |  yes       |  "None"                  |
   |  "None + Pending In"     |  no        |  no state change         |
   |  "None + Pending Out/In" |  yes       |  "None + Pending In"     |
   |  "To"                    |  yes       |  "None"                  |
   |  "To + Pending In"       |  yes       |  "None + Pending In"     |
   |  "From"                  |  no        |  no state change         |
   |  "From + Pending Out"    |  yes       |  "From"                  |
   |  "Both"                  |  yes       |  "From"                  |
   +------------------------------------------------------------------+

B.4.  Server Delivery and Client Acknowledgement of Subscription
      Requests and State Change Notifications

   When a server receives an inbound presence stanza of type "subscribe"
   (i.e., a subscription request) or of type "subscribed",
   "unsubscribe", or "unsubscribed" (i.e., a subscription state change
   notification), in addition to sending the appropriate roster push (or
   updated roster when the roster is next requested by an available
   resource), it MUST deliver the request or notification to the
   intended recipient at least once.  A server MAY require the recipient
   to acknowledge receipt of all state change notifications (and MUST
   require acknowledgement in the case of subscription requests, i.e.,
   presence stanzas of type "subscribe").  In order to require
   acknowledgement, a server SHOULD send the request or notification to
   the recipient each time the recipient logs in, until the recipient
   acknowledges receipt of the notification by "affirming" or "denying"
   the notification, as shown in the following table:









Saint-Andre              Expires April 16, 2007                [Page 68]


Internet-Draft                   XMPP IM                    October 2006


   Table 7: Acknowledgement of subscription state change notifications

   +--------------------------------------------------+
   |  STANZA TYPE   |  ACCEPT        |  DENY          |
   +--------------------------------------------------+
   |  subscribe     |  subscribed    |  unsubscribed  |
   |  subscribed    |  subscribe     |  unsubscribe   |
   |  unsubscribe   |  unsubscribed  |  subscribed    |
   |  unsubscribed  |  unsubscribe   |  subscribe     |
   +--------------------------------------------------+

   Obviously, given the foregoing subscription state charts, some of the
   acknowledgement stanzas will be routed to the contact and result in
   subscription state changes, while others will not.  However, any such
   stanzas MUST result in the server's no longer sending the
   subscription state notification to the user.

   Because a user's server MUST automatically generate outbound presence
   stanzas of type "unsubscribe" and "unsubscribed" upon receiving a
   roster set with the 'subscription' attribute set to a value of
   "remove" (see Removing a Roster Item and Cancelling All Subscriptions
   (Appendix A.6)), the server MUST treat a roster remove request as
   equivalent to sending both of those presence stanzas for purposes of
   determining whether to continue sending subscription state change
   notifications of type "subscribe" or "subscribed" to the user.


Appendix C.  Blocking Communication

   Sections 2.3.5 and 5.4.10 of [IMP-REQS] requires that a compliant
   instant messaging and presence technology must enable a user to block
   communications from selected users.  A protocol for doing so is
   specified in [XEP-0016] and a simplified "front-end" to that protocol
   is specified in [XEP-0191].


Appendix D.  vCards

   Sections 3.1.3 and 4.1.4 of [IMP-REQS] require that it be possible to
   retrieve out-of-band contact information for other users (e.g.,
   telephone number or email address).  An XML representation of the
   vCard specification defined in RFC 2426 [VCARD] is in common use
   within the Jabber community to provide such information but is out of
   scope for XMPP (documentation of this protocol is contained in
   [XEP-0054]).






Saint-Andre              Expires April 16, 2007                [Page 69]


Internet-Draft                   XMPP IM                    October 2006


Appendix E.  XML Schemas

   The following XML schemas are descriptive, not normative.  For
   schemas defining the core features of XMPP, refer to [XMPP-CORE].

E.1.  jabber:client

<?xml version='1.0' encoding='UTF-8'?>

<xs:schema
    xmlns:xs='http://www.w3.org/2001/XMLSchema'
    targetNamespace='jabber:client'
    xmlns='jabber:client'
    elementFormDefault='qualified'>

  <xs:import namespace='urn:ietf:params:xml:ns:xmpp-stanzas'/>

  <xs:element name='message'>
     <xs:complexType>
        <xs:sequence>
          <xs:choice minOccurs='0' maxOccurs='unbounded'>
            <xs:element ref='subject'/>
            <xs:element ref='body'/>
            <xs:element ref='thread'/>
          </xs:choice>
          <xs:any     namespace='##other'
                      minOccurs='0'
                      maxOccurs='unbounded'/>
          <xs:element ref='error'
                      minOccurs='0'/>
        </xs:sequence>
        <xs:attribute name='from'
                      type='xs:string'
                      use='optional'/>
        <xs:attribute name='id'
                      type='xs:NMTOKEN'
                      use='optional'/>
        <xs:attribute name='to'
                      type='xs:string'
                      use='optional'/>
        <xs:attribute name='type' use='optional' default='normal'>
          <xs:simpleType>
            <xs:restriction base='xs:NCName'>
              <xs:enumeration value='chat'/>
              <xs:enumeration value='error'/>
              <xs:enumeration value='groupchat'/>
              <xs:enumeration value='headline'/>
              <xs:enumeration value='normal'/>



Saint-Andre              Expires April 16, 2007                [Page 70]


Internet-Draft                   XMPP IM                    October 2006


            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
        <xs:attribute ref='xml:lang' use='optional'/>
     </xs:complexType>
  </xs:element>

  <xs:element name='body'>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base='xs:string'>
          <xs:attribute ref='xml:lang' use='optional'/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>

  <xs:element name='subject'>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base='xs:string'>
          <xs:attribute ref='xml:lang' use='optional'/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>

  <xs:element name='thread' type='xs:NMTOKEN'/>

  <xs:element name='presence'>
    <xs:complexType>
      <xs:sequence>
        <xs:choice minOccurs='0' maxOccurs='unbounded'>
          <xs:element ref='show'/>
          <xs:element ref='status'/>
          <xs:element ref='priority'/>
        </xs:choice>
        <xs:any     namespace='##other'
                    minOccurs='0'
                    maxOccurs='unbounded'/>
        <xs:element ref='error'
                    minOccurs='0'/>
      </xs:sequence>
      <xs:attribute name='from'
                    type='xs:string'
                    use='optional'/>
      <xs:attribute name='id'
                    type='xs:NMTOKEN'



Saint-Andre              Expires April 16, 2007                [Page 71]


Internet-Draft                   XMPP IM                    October 2006


                    use='optional'/>
      <xs:attribute name='to'
                    type='xs:string'
                    use='optional'/>
      <xs:attribute name='type' use='optional'>
        <xs:simpleType>
          <xs:restriction base='xs:NCName'>
            <xs:enumeration value='error'/>
            <xs:enumeration value='probe'/>
            <xs:enumeration value='subscribe'/>
            <xs:enumeration value='subscribed'/>
            <xs:enumeration value='unavailable'/>
            <xs:enumeration value='unsubscribe'/>
            <xs:enumeration value='unsubscribed'/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute ref='xml:lang' use='optional'/>
    </xs:complexType>
  </xs:element>

  <xs:element name='show'>
    <xs:simpleType>
      <xs:restriction base='xs:NCName'>
        <xs:enumeration value='away'/>
        <xs:enumeration value='chat'/>
        <xs:enumeration value='dnd'/>
        <xs:enumeration value='xa'/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <xs:element name='status'>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base='string1024'>
          <xs:attribute ref='xml:lang' use='optional'/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name='string1024'>
    <xs:restriction base='xs:string'>
      <xs:minLength value='1'/>
      <xs:maxLength value='1024'/>
    </xs:restriction>
  </xs:simpleType>



Saint-Andre              Expires April 16, 2007                [Page 72]


Internet-Draft                   XMPP IM                    October 2006


  <xs:element name='priority' type='xs:byte'/>

  <xs:element name='iq'>
    <xs:complexType>
      <xs:sequence>
        <xs:any     namespace='##other'
                    minOccurs='0'/>
        <xs:element ref='error'
                    minOccurs='0'/>
      </xs:sequence>
      <xs:attribute name='from'
                    type='xs:string'
                    use='optional'/>
      <xs:attribute name='id'
                    type='xs:NMTOKEN'
                    use='required'/>
      <xs:attribute name='to'
                    type='xs:string'
                    use='optional'/>
      <xs:attribute name='type' use='required'>
        <xs:simpleType>
          <xs:restriction base='xs:NCName'>
            <xs:enumeration value='error'/>
            <xs:enumeration value='get'/>
            <xs:enumeration value='result'/>
            <xs:enumeration value='set'/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute ref='xml:lang' use='optional'/>
    </xs:complexType>
  </xs:element>

  <xs:element name='error'>
    <xs:complexType>
      <xs:sequence  xmlns:err='urn:ietf:params:xml:ns:xmpp-stanzas'>
        <xs:group   ref='err:stanzaErrorGroup'/>
        <xs:element ref='err:text'
                    minOccurs='0'/>
      </xs:sequence>
      <xs:attribute name='code' type='xs:unsignedShort' use='optional'/>
      <xs:attribute name='type' use='required'>
        <xs:simpleType>
          <xs:restriction base='xs:NCName'>
            <xs:enumeration value='auth'/>
            <xs:enumeration value='cancel'/>
            <xs:enumeration value='continue'/>
            <xs:enumeration value='modify'/>



Saint-Andre              Expires April 16, 2007                [Page 73]


Internet-Draft                   XMPP IM                    October 2006


            <xs:enumeration value='wait'/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

</xs:schema>

E.2.  jabber:server

<?xml version='1.0' encoding='UTF-8'?>

<xs:schema
    xmlns:xs='http://www.w3.org/2001/XMLSchema'
    targetNamespace='jabber:server'
    xmlns='jabber:server'
    elementFormDefault='qualified'>

  <xs:import namespace='urn:ietf:params:xml:ns:xmpp-stanzas'/>

  <xs:element name='message'>
     <xs:complexType>
        <xs:sequence>
          <xs:choice minOccurs='0' maxOccurs='unbounded'>
            <xs:element ref='subject'/>
            <xs:element ref='body'/>
            <xs:element ref='thread'/>
          </xs:choice>
          <xs:any     namespace='##other'
                      minOccurs='0'
                      maxOccurs='unbounded'/>
          <xs:element ref='error'
                      minOccurs='0'/>
        </xs:sequence>
        <xs:attribute name='from'
                      type='xs:string'
                      use='required'/>
        <xs:attribute name='id'
                      type='xs:NMTOKEN'
                      use='optional'/>
        <xs:attribute name='to'
                      type='xs:string'
                      use='required'/>
        <xs:attribute name='type' use='optional' default='normal'>
          <xs:simpleType>
            <xs:restriction base='xs:NCName'>
              <xs:enumeration value='chat'/>



Saint-Andre              Expires April 16, 2007                [Page 74]


Internet-Draft                   XMPP IM                    October 2006


              <xs:enumeration value='error'/>
              <xs:enumeration value='groupchat'/>
              <xs:enumeration value='headline'/>
              <xs:enumeration value='normal'/>
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
        <xs:attribute ref='xml:lang' use='optional'/>
     </xs:complexType>
  </xs:element>

  <xs:element name='body'>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base='xs:string'>
          <xs:attribute ref='xml:lang' use='optional'/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>

  <xs:element name='subject'>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base='xs:string'>
          <xs:attribute ref='xml:lang' use='optional'/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>

  <xs:element name='thread' type='xs:NMTOKEN'/>

  <xs:element name='presence'>
    <xs:complexType>
      <xs:sequence>
        <xs:choice minOccurs='0' maxOccurs='unbounded'>
          <xs:element ref='show'/>
          <xs:element ref='status'/>
          <xs:element ref='priority'/>
        </xs:choice>
        <xs:any     namespace='##other'
                    minOccurs='0'
                    maxOccurs='unbounded'/>
        <xs:element ref='error'
                    minOccurs='0'/>
      </xs:sequence>
      <xs:attribute name='from'



Saint-Andre              Expires April 16, 2007                [Page 75]


Internet-Draft                   XMPP IM                    October 2006


                    type='xs:string'
                    use='required'/>
      <xs:attribute name='id'
                    type='xs:NMTOKEN'
                    use='optional'/>
      <xs:attribute name='to'
                    type='xs:string'
                    use='required'/>
      <xs:attribute name='type' use='optional'>
        <xs:simpleType>
          <xs:restriction base='xs:NCName'>
            <xs:enumeration value='error'/>
            <xs:enumeration value='probe'/>
            <xs:enumeration value='subscribe'/>
            <xs:enumeration value='subscribed'/>
            <xs:enumeration value='unavailable'/>
            <xs:enumeration value='unsubscribe'/>
            <xs:enumeration value='unsubscribed'/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute ref='xml:lang' use='optional'/>
    </xs:complexType>
  </xs:element>

  <xs:element name='show'>
    <xs:simpleType>
      <xs:restriction base='xs:NCName'>
        <xs:enumeration value='away'/>
        <xs:enumeration value='chat'/>
        <xs:enumeration value='dnd'/>
        <xs:enumeration value='xa'/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <xs:element name='status'>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base='string1024'>
          <xs:attribute ref='xml:lang' use='optional'/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name='string1024'>
    <xs:restriction base='xs:string'>



Saint-Andre              Expires April 16, 2007                [Page 76]


Internet-Draft                   XMPP IM                    October 2006


      <xs:minLength value='1'/>
      <xs:maxLength value='1024'/>
    </xs:restriction>
  </xs:simpleType>

  <xs:element name='priority' type='xs:byte'/>

  <xs:element name='iq'>
    <xs:complexType>
      <xs:sequence>
        <xs:any     namespace='##other'
                    minOccurs='0'/>
        <xs:element ref='error'
                    minOccurs='0'/>
      </xs:sequence>
      <xs:attribute name='from'
                    type='xs:string'
                    use='required'/>
      <xs:attribute name='id'
                    type='xs:NMTOKEN'
                    use='required'/>
      <xs:attribute name='to'
                    type='xs:string'
                    use='required'/>
      <xs:attribute name='type' use='required'>
        <xs:simpleType>
          <xs:restriction base='xs:NCName'>
            <xs:enumeration value='error'/>
            <xs:enumeration value='get'/>
            <xs:enumeration value='result'/>
            <xs:enumeration value='set'/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute ref='xml:lang' use='optional'/>
    </xs:complexType>
  </xs:element>

  <xs:element name='error'>
    <xs:complexType>
      <xs:sequence  xmlns:err='urn:ietf:params:xml:ns:xmpp-stanzas'>
        <xs:group   ref='err:stanzaErrorGroup'/>
        <xs:element ref='err:text'
                    minOccurs='0'/>
      </xs:sequence>
      <xs:attribute name='code' type='xs:unsignedShort' use='optional'/>
      <xs:attribute name='type' use='required'>
        <xs:simpleType>



Saint-Andre              Expires April 16, 2007                [Page 77]


Internet-Draft                   XMPP IM                    October 2006


          <xs:restriction base='xs:NCName'>
            <xs:enumeration value='auth'/>
            <xs:enumeration value='cancel'/>
            <xs:enumeration value='continue'/>
            <xs:enumeration value='modify'/>
            <xs:enumeration value='wait'/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

</xs:schema>

E.3.  jabber:iq:roster

   <?xml version='1.0' encoding='UTF-8'?>

   <xs:schema
       xmlns:xs='http://www.w3.org/2001/XMLSchema'
       targetNamespace='jabber:iq:roster'
       xmlns='jabber:iq:roster'
       elementFormDefault='qualified'>

     <xs:element name='query'>
       <xs:complexType>
         <xs:sequence>
           <xs:element ref='item'
                       minOccurs='0'
                       maxOccurs='unbounded'/>
         </xs:sequence>
       </xs:complexType>
     </xs:element>

     <xs:element name='item'>
       <xs:complexType>
         <xs:sequence>
           <xs:element ref='group'
                       minOccurs='0'
                       maxOccurs='unbounded'/>
         </xs:sequence>
         <xs:attribute name='ask' use='optional'>
           <xs:simpleType>
             <xs:restriction base='xs:NCName'>
               <xs:enumeration value='subscribe'/>
             </xs:restriction>
           </xs:simpleType>
         </xs:attribute>



Saint-Andre              Expires April 16, 2007                [Page 78]


Internet-Draft                   XMPP IM                    October 2006


         <xs:attribute name='jid' type='xs:string' use='required'/>
         <xs:attribute name='name' type='xs:string' use='optional'/>
         <xs:attribute name='subscription' use='optional'>
           <xs:simpleType>
             <xs:restriction base='xs:NCName'>
               <xs:enumeration value='both'/>
               <xs:enumeration value='from'/>
               <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>


Appendix F.  Differences From RFC 3921

   This section is informative.

   Based on consensus derived from interoperability testing and
   implementation experience, the following modifications were made from
   RFC 3921.  In addition, several smaller changes were made to more
   clearly specify and explain the protocols.

   o  The protocol for session establishment was determined to be
      unnecessary and therefore the content previously defined in
      Section 3 of RFC 3921 was removed.  However, server
      implementations may still want to advertise support for the
      feature in order to ensure backwards-compatibility, even though it
      is a "no-op".
   o  The protocol for communications blocking specified in Section 10
      of RFC 3921 has been moved to [XEP-0016] and a simplified "front-
      end" to that functionality has been defined in [XEP-0191] to ease
      the task of implementing communications blocking in servers and
      clients.










Saint-Andre              Expires April 16, 2007                [Page 79]


Internet-Draft                   XMPP IM                    October 2006


Author's Address

   Peter Saint-Andre (editor)
   Jabber Software Foundation

   Email: stpeter@jabber.org













































Saint-Andre              Expires April 16, 2007                [Page 80]


Internet-Draft                   XMPP IM                    October 2006


Full Copyright Statement

   Copyright (C) The Internet Society (2006).

   This document is subject to the rights, licenses and restrictions
   contained in BCP 78, and except as set forth therein, the authors
   retain all their rights.

   This document and the information contained herein are provided on an
   "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
   OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
   ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
   INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
   INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.


Intellectual Property

   The IETF takes no position regarding the validity or scope of any
   Intellectual Property Rights or other rights that might be claimed to
   pertain to the implementation or use of the technology described in
   this document or the extent to which any license under such rights
   might or might not be available; nor does it represent that it has
   made any independent effort to identify any such rights.  Information
   on the procedures with respect to rights in RFC documents can be
   found in BCP 78 and BCP 79.

   Copies of IPR disclosures made to the IETF Secretariat and any
   assurances of licenses to be made available, or the result of an
   attempt made to obtain a general license or permission for the use of
   such proprietary rights by implementers or users of this
   specification can be obtained from the IETF on-line IPR repository at
   http://www.ietf.org/ipr.

   The IETF invites any interested party to bring to its attention any
   copyrights, patents or patent applications, or other proprietary
   rights that may cover technology that may be required to implement
   this standard.  Please address the information to the IETF at
   ietf-ipr@ietf.org.


Acknowledgment

   Funding for the RFC Editor function is provided by the IETF
   Administrative Support Activity (IASA).





Saint-Andre              Expires April 16, 2007                [Page 81]