the identity of the Originating Server, so that the Originating
Server can send, and the Receiving Server can accept, XML stanzas
over the "initial stream" (i.e., the stream from the Originating
Server to the Receiving Server). In order to verify the identities
of the entities using the "response stream" (i.e., the stream from
the Receiving Server to the Originating Server), dialback MUST be
completed in the opposite direction as well.
After successful dialback negotiation, the Receiving Server SHOULD
accept subsequent <db:result/> packets (e.g., validation requests
sent to a subdomain or other hostname serviced by the Receiving
Server) from the Originating Server over the existing validated
connection; this enables "piggybacking" of the original validated
connection in one direction.
Even if dialback negotiation is successful, a server MUST verify that
all XML stanzas received from the other server include a ’from’
attribute and a ’to’ attribute; if a stanza does not meet this
restriction, the server that receives the stanza MUST generate an
<improper-addressing/> stream error condition and terminate both the
XML stream and the underlying TCP connection. Furthermore, a server
MUST verify that the ’from’ attribute of stanzas received from the
other server includes a validated domain for the stream; if a stanza
does not meet this restriction, the server that receives the stanza
MUST generate an <invalid-from/> stream error condition and terminate
both the XML stream and the underlying TCP connection. Both of these
checks help to prevent spoofing related to particular stanzas.
9. XML Stanzas
After TLS negotiation (Section 5) if desired, SASL negotiation
(Section 6), and Resource Binding (Section 7) if necessary, XML
stanzas can be sent over the streams. Three kinds of XML stanza are
defined for the ’jabber:client’ and ’jabber:server’ namespaces:
<message/>, <presence/>, and <iq/>. In addition, there are five
common attributes for these kinds of stanza. These common
attributes, as well as the basic semantics of the three stanza kinds,
are defined herein; more detailed information regarding the syntax of
XML stanzas in relation to instant messaging and presence
applications is provided in [XMPP-IM].
9.1. Common Attributes
The following five attributes are common to message, presence, and IQ
stanzas:
9.1.1. to
The ’to’ attribute specifies the JID of the intended recipient for
the stanza.
In the ’jabber:client’ namespace, a stanza SHOULD possess a ’to’
attribute, although a stanza sent from a client to a server for
handling by that server (e.g., presence sent to the server for
broadcasting to other entities) SHOULD NOT possess a ’to’ attribute.
In the ’jabber:server’ namespace, a stanza MUST possess a ’to’
attribute; if a server receives a stanza that does not meet this
restriction, it MUST generate an <improper-addressing/> stream error
condition and terminate both the XML stream and the underlying TCP
connection with the offending server.
If the value of the ’to’ attribute is invalid or cannot be contacted,
the entity discovering that fact (usually the sender’s or recipient’s
server) MUST return an appropriate error to the sender, setting the
’from’ attribute of the error stanza to the value provided in the
’to’ attribute of the offending stanza.
9.1.2. from
The ’from’ attribute specifies the JID of the sender.
When a server receives an XML stanza within the context of an
authenticated stream qualified by the ’jabber:client’ namespace, it
MUST do one of the following:
1. validate that the value of the ’from’ attribute provided by the
client is that of a connected resource for the associated entity
2. add a ’from’ address to the stanza whose value is the bare JID
(<node@domain>) or the full JID (<node@domain/resource>)
determined by the server for the connected resource that
generated the stanza (see Determination of Addresses (Section
3.5))
If a client attempts to send an XML stanza for which the value of the
’from’ attribute does not match one of the connected resources for
that entity, the server SHOULD return an <invalid-from/> stream error
to the client. If a client attempts to send an XML stanza over a
stream that is not yet authenticated, the server SHOULD return a
<not-authorized/> stream error to the client. If generated, both of
these conditions MUST result in closure of the stream and termination
of the underlying TCP connection; this helps to prevent a denial of
service attack launched from a rogue client.
When a server generates a stanza from the server itself for delivery
to a connected client (e.g., in the context of data storage services
provided by the server on behalf of the client), the stanza MUST
either (1) not include a ’from’ attribute or (2) include a ’from’
attribute whose value is the account’s bare JID (<node@domain>) or
client’s full JID (<node@domain/resource>). A server MUST NOT send
to the client a stanza without a ’from’ attribute if the stanza was
not generated by the server itself. When a client receives a stanza
that does not include a ’from’ attribute, it MUST assume that the
stanza is from the server to which the client is connected.
In the ’jabber:server’ namespace, a stanza MUST possess a ’from’
attribute; if a server receives a stanza that does not meet this
restriction, it MUST generate an <improper-addressing/> stream error
condition. Furthermore, the domain identifier portion of the JID
contained in the ’from’ attribute MUST match the hostname of the
sending server (or any validated domain thereof, such as a validated
subdomain of the sending server’s hostname or another validated
domain hosted by the sending server) as communicated in the SASL
negotiation or dialback negotiation; if a server receives a stanza
that does not meet this restriction, it MUST generate an
<invalid-from/> stream error condition. Both of these conditions
MUST result in closing of the stream and termination of the
underlying TCP connection; this helps to prevent a denial of service
attack launched from a rogue server.
9.1.3. id
The optional ’id’ attribute MAY be used by a sending entity for
internal tracking of stanzas that it sends and receives (especially
for tracking the request-response interaction inherent in the
semantics of IQ stanzas). It is OPTIONAL for the value of the ’id’
attribute to be unique globally, within a domain, or within a stream.
The semantics of IQ stanzas impose additional restrictions; see IQ
Semantics (Section 9.2.3).
9.1.4. type
The ’type’ attribute specifies detailed information about the purpose
or context of the message, presence, or IQ stanza. The particular
allowable values for the ’type’ attribute vary depending on whether
the stanza is a message, presence, or IQ; the values for message and
presence stanzas are specific to instant messaging and presence
applications and therefore are defined in [XMPP-IM], whereas the
values for IQ stanzas specify the role of an IQ stanza in a
structured request-response "conversation" and thus are defined under
IQ Semantics (Section 9.2.3) below. The only ’type’ value common to
all three stanzas is "error"; see Stanza Errors (Section 9.3).
9.1.5. xml:lang
A stanza SHOULD possess an ’xml:lang’ attribute (as defined in
Section 2.12 of [XML]) if the stanza contains XML character data that
is intended to be presented to a human user (as explained in RFC 2277
[CHARSET], "internationalization is for humans"). The value of the
’xml:lang’ attribute specifies the default language of any such
human-readable XML character data, which MAY be overridden by the
’xml:lang’ attribute of a specific child element. If a stanza does
not possess an ’xml:lang’ attribute, an implementation MUST assume
that the default language is that specified for the stream as defined
under Stream Attributes (Section 4.4) above. The value of the
’xml:lang’ attribute MUST be an NMTOKEN and MUST conform to the
format defined in RFC 3066 [LANGTAGS].
9.2. Basic Semantics
9.2.1. Message Semantics
The <message/> stanza kind can be seen as a "push" mechanism whereby
one entity pushes information to another entity, similar to the
communications that occur in a system such as email. All message
stanzas SHOULD possess a ’to’ attribute that specifies the intended
recipient of the message; upon receiving such a stanza, a server
SHOULD route or deliver it to the intended recipient (see Server
Rules for Handling XML Stanzas (Section 10) for general routing and
delivery rules related to XML stanzas).
9.2.2. Presence Semantics
The <presence/> element can be seen as a basic broadcast or
"publish-subscribe" mechanism, whereby multiple entities receive
information about an entity to which they have subscribed (in this
case, network availability information). In general, a publishing
entity SHOULD send a presence stanza with no ’to’ attribute, in which
case the server to which the entity is connected SHOULD broadcast or
multiplex that stanza to all subscribing entities. However, a
publishing entity MAY also send a presence stanza with a ’to’
attribute, in which case the server SHOULD route or deliver that
stanza to the intended recipient. See Server Rules for Handling XML
Stanzas (Section 10) for general routing and delivery rules related
to XML stanzas, and [XMPP-IM] for presence-specific rules in the
context of an instant messaging and presence application.
9.2.3. IQ Semantics
Info/Query, or IQ, is a request-response mechanism, similar in some
ways to [HTTP]. The semantics of IQ enable an entity to make a
request of, and receive a response from, another entity. The data
content of the request and response is defined by the namespace
declaration of a direct child element of the IQ element, and the
interaction is tracked by the requesting entity through use of the
’id’ attribute. Thus, IQ interactions follow a common pattern of
structured data exchange such as get/result or set/result (although
an error may be returned in reply to a request if appropriate):
Requesting Responding
Entity Entity
---------- ----------
| |
| <iq type=’get’ id=’1’> |
| ------------------------> |
| |
| <iq type=’result’ id=’1’> |
| <------------------------ |
| |
| <iq type=’set’ id=’2’> |
| ------------------------> |
| |
| <iq type=’error’ id=’2’> |
| <------------------------ |
| |
In order to enforce these semantics, the following rules apply:
1. The ’id’ attribute is REQUIRED for IQ stanzas.
2. The ’type’ attribute is REQUIRED for IQ stanzas. The value MUST
be one of the following:
* get -- The stanza is a request for information or
requirements.
* set -- The stanza provides required data, sets new values, or
replaces existing values.
* result -- The stanza is a response to a successful get or set
request.
* error -- An error has occurred regarding processing or
delivery of a previously-sent get or set (see Stanza Errors
(Section 9.3)).
3. An entity that receives an IQ request of type "get" or "set" MUST
reply with an IQ response of type "result" or "error" (the
response MUST preserve the ’id’ attribute of the request).
4. An entity that receives a stanza of type "result" or "error" MUST
NOT respond to the stanza by sending a further IQ response of
type "result" or "error"; however, as shown above, the requesting
entity MAY send another request (e.g., an IQ of type "set" in
order to provide required information discovered through a
get/result pair).
5. An IQ stanza of type "get" or "set" MUST contain one and only one
child element that specifies the semantics of the particular
request or response.
6. An IQ stanza of type "result" MUST include zero or one child
elements.
7. An IQ stanza of type "error" SHOULD include the child element
contained in the associated "get" or "set" and MUST include an
<error/> child; for details, see Stanza Errors (Section 9.3).
9.3. Stanza Errors
Stanza-related errors are handled in a manner similar to stream
errors (Section 4.7). However, unlike stream errors, stanza errors
are recoverable; therefore error stanzas include hints regarding
actions that the original sender can take in order to remedy the
error.
9.3.1. Rules
The following rules apply to stanza-related errors:
o The receiving or processing entity that detects an error condition
in relation to a stanza MUST return to the sending entity a stanza
of the same kind (message, presence, or IQ), whose ’type’
attribute is set to a value of "error" (such a stanza is called an
"error stanza" herein).
o The entity that generates an error stanza SHOULD include the
original XML sent so that the sender can inspect and, if
necessary, correct the XML before attempting to resend.
o An error stanza MUST contain an <error/> child element.
o An <error/> child MUST NOT be included if the ’type’ attribute has
a value other than "error" (or if there is no ’type’ attribute).
o An entity that receives an error stanza MUST NOT respond to the
stanza with a further error stanza; this helps to prevent looping.
9.3.2. Syntax
The syntax for stanza-related errors is as follows:
<stanza-kind to=’sender’ type=’error’>
[RECOMMENDED to include sender XML here]
<error type=’error-type’>
<defined-condition xmlns=’urn:ietf:params:xml:ns:xmpp-stanzas’/>
<text xmlns=’urn:ietf:params:xml:ns:xmpp-stanzas’
xml:lang=’langcode’>
OPTIONAL descriptive text
</text>
[OPTIONAL application-specific condition element]
</error>
</stanza-kind>
The stanza-kind is one of message, presence, or iq.
The value of the <error/> element’s ’type’ attribute MUST be one of
the following:
o cancel -- do not retry (the error is unrecoverable)
o continue -- proceed (the condition was only a warning)
o modify -- retry after changing the data sent
o auth -- retry after providing credentials
o wait -- retry after waiting (the error is temporary)
The <error/> element:
o MUST contain a child element corresponding to one of the defined
stanza error conditions specified below; this element MUST be
qualified by the ’urn:ietf:params:xml:ns:xmpp-stanzas’ namespace.
o MAY contain a <text/> child containing XML character data that
describes the error in more detail; this element MUST be qualified
by the ’urn:ietf:params:xml:ns:xmpp-stanzas’ namespace and SHOULD
possess an ’xml:lang’ attribute.
o MAY contain a child element for an application-specific error
condition; this element MUST be qualified by an
application-defined namespace, and its structure is defined by
that namespace.
The <text/> element is OPTIONAL. If included, it SHOULD be used only
to provide descriptive or diagnostic information that supplements the
meaning of a defined condition or application-specific condition. It
SHOULD NOT be interpreted programmatically by an application. It
SHOULD NOT be used as the error message presented to a user, but MAY
be shown in addition to the error message associated with the
included condition element (or elements).
Finally, to maintain backward compatibility, the schema (specified in
[XMPP-IM]) allows the optional inclusion of a ’code’ attribute on the
<error/> element.
9.3.3. Defined Conditions
The following conditions are defined for use in stanza errors.
o <bad-request/> -- the sender has sent XML that is malformed or
that cannot be processed (e.g., an IQ stanza that includes an
unrecognized value of the ’type’ attribute); the associated error
type SHOULD be "modify".
o <conflict/> -- access cannot be granted because an existing
resource or session exists with the same name or address; the
associated error type SHOULD be "cancel".
o <feature-not-implemented/> -- the feature requested is not
implemented by the recipient or server and therefore cannot be
processed; the associated error type SHOULD be "cancel".
o <forbidden/> -- the requesting entity does not possess the
required permissions to perform the action; the associated error
type SHOULD be "auth".
o <gone/> -- the recipient or server can no longer be contacted at
this address (the error stanza MAY contain a new address in the
XML character data of the <gone/> element); the associated error
type SHOULD be "modify".
o <internal-server-error/> -- the server could not process the
stanza because of a misconfiguration or an otherwise-undefined
internal server error; the associated error type SHOULD be "wait".
o <item-not-found/> -- the addressed JID or item requested cannot be
found; the associated error type SHOULD be "cancel".
o <jid-malformed/> -- the sending entity has provided or
communicated an XMPP address (e.g., a value of the ’to’ attribute)
or aspect thereof (e.g., a resource identifier) that does not
adhere to the syntax defined in Addressing Scheme (Section 3); the
associated error type SHOULD be "modify".
o <not-acceptable/> -- the recipient or server understands the
request but is refusing to process it because it does not meet
criteria defined by the recipient or server (e.g., a local policy
regarding acceptable words in messages); the associated error type
SHOULD be "modify".
o <not-allowed/> -- the recipient or server does not allow any
entity to perform the action; the associated error type SHOULD be
"cancel".
o <not-authorized/> -- the sender must provide proper credentials
before being allowed to perform the action, or has provided
improper credentials; the associated error type SHOULD be "auth".
o <payment-required/> -- the requesting entity is not authorized to
access the requested service because payment is required; the
associated error type SHOULD be "auth".
o <recipient-unavailable/> -- the intended recipient is temporarily
unavailable; the associated error type SHOULD be "wait" (note: an
application MUST NOT return this error if doing so would provide
information about the intended recipient’s network availability to
an entity that is not authorized to know such information).
o <redirect/> -- the recipient or server is redirecting requests for
this information to another entity, usually temporarily (the error
stanza SHOULD contain the alternate address, which MUST be a valid
JID, in the XML character data of the <redirect/> element); the
associated error type SHOULD be "modify".
o <registration-required/> -- the requesting entity is not
authorized to access the requested service because registration is
required; the associated error type SHOULD be "auth".
o <remote-server-not-found/> -- a remote server or service specified
as part or all of the JID of the intended recipient does not
exist; the associated error type SHOULD be "cancel".
o <remote-server-timeout/> -- a remote server or service specified
as part or all of the JID of the intended recipient (or required
to fulfill a request) could not be contacted within a reasonable
amount of time; the associated error type SHOULD be "wait".
o <resource-constraint/> -- the server or recipient lacks the system
resources necessary to service the request; the associated error
type SHOULD be "wait".
o <service-unavailable/> -- the server or recipient does not
currently provide the requested service; the associated error type
SHOULD be "cancel".
o <subscription-required/> -- the requesting entity is not
authorized to access the requested service because a subscription
is required; the associated error type SHOULD be "auth".
o <undefined-condition/> -- the error condition is not one of those
defined by the other conditions in this list; any error type may
be associated with this condition, and it SHOULD be used only in
conjunction with an application-specific condition.
o <unexpected-request/> -- the recipient or server understood the
request but was not expecting it at this time (e.g., the request
was out of order); the associated error type SHOULD be "wait".
9.3.4. Application-Specific Conditions
As noted, an application MAY provide application-specific stanza
error information by including a properly-namespaced child in the
error element. The application-specific element SHOULD supplement or
further qualify a defined element. Thus, the <error/> element will
contain two or three child elements:
<iq type=’error’ id=’some-id’>
<error type=’modify’>
<bad-request xmlns=’urn:ietf:params:xml:ns:xmpp-stanzas’/>
<too-many-parameters xmlns=’application-ns’/>
</error>
</iq>
<message type=’error’ id=’another-id’>
<error type=’modify’>
<undefined-condition
xmlns=’urn:ietf:params:xml:ns:xmpp-stanzas’/>
<text xml:lang=’en’
xmlns=’urn:ietf:params:xml:ns:xmpp-stanzas’>
Some special application diagnostic information...
</text>
<special-application-condition xmlns=’application-ns’/>
</error>
</message>
10. Server Rules for Handling XML Stanzas
Compliant server implementations MUST ensure in-order processing of
XML stanzas between any two entities.
Beyond the requirement for in-order processing, each server
implementation will contain its own "delivery tree" for handling
stanzas it receives. Such a tree determines whether a stanza needs
to be routed to another domain, processed internally, or delivered to
a resource associated with a connected node. The following rules
apply:
10.1. No ’to’ Address
If the stanza possesses no ’to’ attribute, the server SHOULD process
it on behalf of the entity that sent it. Because all stanzas
received from other servers MUST possess a ’to’ attribute, this rule
applies only to stanzas received from a registered entity (such as a
client) that is connected to the server. If the server receives a
presence stanza with no ’to’ attribute, the server SHOULD broadcast
it to the entities that are subscribed to the sending entity’s
presence, if applicable (the semantics of presence broadcast for
instant messaging and presence applications are defined in
[XMPP-IM]). If the server receives an IQ stanza of type "get" or
"set" with no ’to’ attribute and it understands the namespace that
qualifies the content of the stanza, it MUST either process the
stanza on behalf of the sending entity (where the meaning of
"process" is determined by the semantics of the qualifying namespace)
or return an error to the sending entity.
10.2. Foreign Domain
If the hostname of the domain identifier portion of the JID contained