Appendix A. XML Schemas
The following schemas formally define various namespaces used in this document, in conformance with [XML-SCHEMA]. Because validation of XML streams and stanzas is optional, these schemas are not normative and are provided for descriptive purposes only.A.1. Stream Namespace
<?xml version='1.0' encoding='UTF-8'?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='http://etherx.jabber.org/streams' xmlns='http://etherx.jabber.org/streams' elementFormDefault='unqualified'> <xs:import namespace='jabber:client'/> <xs:import namespace='jabber:server'/> <xs:import namespace='urn:ietf:params:xml:ns:xmpp-sasl'/> <xs:import namespace='urn:ietf:params:xml:ns:xmpp-streams'/> <xs:import namespace='urn:ietf:params:xml:ns:xmpp-tls'/> <xs:element name='stream'> <xs:complexType> <xs:sequence xmlns:client='jabber:client' xmlns:server='jabber:server'> <xs:element ref='features' minOccurs='0' maxOccurs='1'/> <xs:any namespace='urn:ietf:params:xml:ns:xmpp-tls' minOccurs='0' maxOccurs='1'/> <xs:any namespace='urn:ietf:params:xml:ns:xmpp-sasl' minOccurs='0' maxOccurs='1'/> <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded' processContents='lax'/> <xs:choice minOccurs='0' maxOccurs='1'> <xs:choice minOccurs='0' maxOccurs='unbounded'> <xs:element ref='client:message'/> <xs:element ref='client:presence'/> <xs:element ref='client:iq'/> </xs:choice>
<xs:choice minOccurs='0' maxOccurs='unbounded'> <xs:element ref='server:message'/> <xs:element ref='server:presence'/> <xs:element ref='server:iq'/> </xs:choice> </xs:choice> <xs:element ref='error' minOccurs='0' maxOccurs='1'/> </xs:sequence> <xs:attribute name='from' type='xs:string' use='optional'/> <xs:attribute name='id' type='xs:string' use='optional'/> <xs:attribute name='to' type='xs:string' use='optional'/> <xs:attribute name='version' type='xs:decimal' use='optional'/> <xs:attribute ref='xml:lang' use='optional'/> <xs:anyAttribute namespace='##other' processContents='lax'/> </xs:complexType> </xs:element> <xs:element name='features'> <xs:complexType> <xs:sequence> <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded' processContents='lax'/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name='error'> <xs:complexType> <xs:sequence xmlns:err='urn:ietf:params:xml:ns:xmpp-streams'> <xs:group ref='err:streamErrorGroup'/> <xs:element ref='err:text' minOccurs='0' maxOccurs='1'/> <xs:any namespace='##other' minOccurs='0' maxOccurs='1' processContents='lax'/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
A.2. Stream Error Namespace
<?xml version='1.0' encoding='UTF-8'?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='urn:ietf:params:xml:ns:xmpp-streams' xmlns='urn:ietf:params:xml:ns:xmpp-streams' elementFormDefault='qualified'> <xs:element name='bad-format' type='empty'/> <xs:element name='bad-namespace-prefix' type='empty'/> <xs:element name='conflict' type='empty'/> <xs:element name='connection-timeout' type='empty'/> <xs:element name='host-gone' type='empty'/> <xs:element name='host-unknown' type='empty'/> <xs:element name='improper-addressing' type='empty'/> <xs:element name='internal-server-error' type='empty'/> <xs:element name='invalid-from' type='empty'/> <xs:element name='invalid-id' type='empty'/> <xs:element name='invalid-namespace' type='empty'/> <xs:element name='invalid-xml' type='empty'/> <xs:element name='not-authorized' type='empty'/> <xs:element name='not-well-formed' type='empty'/> <xs:element name='policy-violation' type='empty'/> <xs:element name='remote-connection-failed' type='empty'/> <xs:element name='reset' type='empty'/> <xs:element name='resource-constraint' type='empty'/> <xs:element name='restricted-xml' type='empty'/> <xs:element name='see-other-host' type='xs:string'/> <xs:element name='system-shutdown' type='empty'/> <xs:element name='undefined-condition' type='empty'/> <xs:element name='unsupported-encoding' type='empty'/> <xs:element name='unsupported-stanza-type' type='empty'/> <xs:element name='unsupported-version' type='empty'/> <xs:group name='streamErrorGroup'> <xs:choice> <xs:element ref='bad-format'/> <xs:element ref='bad-namespace-prefix'/> <xs:element ref='conflict'/> <xs:element ref='connection-timeout'/> <xs:element ref='host-gone'/> <xs:element ref='host-unknown'/> <xs:element ref='improper-addressing'/> <xs:element ref='internal-server-error'/> <xs:element ref='invalid-from'/> <xs:element ref='invalid-id'/>
<xs:element ref='invalid-namespace'/> <xs:element ref='invalid-xml'/> <xs:element ref='not-authorized'/> <xs:element ref='not-well-formed'/> <xs:element ref='policy-violation'/> <xs:element ref='remote-connection-failed'/> <xs:element ref='reset'/> <xs:element ref='resource-constraint'/> <xs:element ref='restricted-xml'/> <xs:element ref='see-other-host'/> <xs:element ref='system-shutdown'/> <xs:element ref='undefined-condition'/> <xs:element ref='unsupported-encoding'/> <xs:element ref='unsupported-stanza-type'/> <xs:element ref='unsupported-version'/> </xs:choice> </xs:group> <xs:element name='text'> <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:simpleType name='empty'> <xs:restriction base='xs:string'> <xs:enumeration value=''/> </xs:restriction> </xs:simpleType> </xs:schema>A.3. STARTTLS Namespace
<?xml version='1.0' encoding='UTF-8'?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='urn:ietf:params:xml:ns:xmpp-tls' xmlns='urn:ietf:params:xml:ns:xmpp-tls' elementFormDefault='qualified'>
<xs:element name='starttls'> <xs:complexType> <xs:choice minOccurs='0' maxOccurs='1'> <xs:element name='required' type='empty'/> </xs:choice> </xs:complexType> </xs:element> <xs:element name='proceed' type='empty'/> <xs:element name='failure' type='empty'/> <xs:simpleType name='empty'> <xs:restriction base='xs:string'> <xs:enumeration value=''/> </xs:restriction> </xs:simpleType> </xs:schema>A.4. SASL Namespace
<?xml version='1.0' encoding='UTF-8'?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='urn:ietf:params:xml:ns:xmpp-sasl' xmlns='urn:ietf:params:xml:ns:xmpp-sasl' elementFormDefault='qualified'> <xs:element name='mechanisms'> <xs:complexType> <xs:sequence> <xs:element name='mechanism' minOccurs='1' maxOccurs='unbounded' type='xs:NMTOKEN'/> <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded' processContents='lax'/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name='abort' type='empty'/>
<xs:element name='auth'> <xs:complexType> <xs:simpleContent> <xs:extension base='xs:string'> <xs:attribute name='mechanism' type='xs:NMTOKEN' use='required'/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name='challenge' type='xs:string'/> <xs:element name='response' type='xs:string'/> <xs:element name='success' type='xs:string'/> <xs:element name='failure'> <xs:complexType> <xs:sequence> <xs:choice minOccurs='0'> <xs:element name='aborted' type='empty'/> <xs:element name='account-disabled' type='empty'/> <xs:element name='credentials-expired' type='empty'/> <xs:element name='encryption-required' type='empty'/> <xs:element name='incorrect-encoding' type='empty'/> <xs:element name='invalid-authzid' type='empty'/> <xs:element name='invalid-mechanism' type='empty'/> <xs:element name='malformed-request' type='empty'/> <xs:element name='mechanism-too-weak' type='empty'/> <xs:element name='not-authorized' type='empty'/> <xs:element name='temporary-auth-failure' type='empty'/> </xs:choice> <xs:element ref='text' minOccurs='0' maxOccurs='1'/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name='text'> <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:simpleType name='empty'> <xs:restriction base='xs:string'> <xs:enumeration value=''/> </xs:restriction> </xs:simpleType> </xs:schema>A.5. Client Namespace
<?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' processContents='lax'/> <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:NMTOKEN'> <xs:enumeration value='chat'/> <xs:enumeration value='error'/> <xs:enumeration value='groupchat'/> <xs:enumeration value='headline'/> <xs:enumeration value='normal'/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs: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'> <xs:complexType> <xs:simpleContent> <xs:extension base='xs:NMTOKEN'> <xs:attribute name='parent' type='xs:NMTOKEN' use='optional'/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element>
<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' processContents='lax'/> <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'> <xs:simpleType> <xs:restriction base='xs:NMTOKEN'> <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:NMTOKEN'> <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> <xs:element name='priority' type='xs:byte'/> <xs:element name='iq'> <xs:complexType> <xs:sequence> <xs:any namespace='##other' minOccurs='0' maxOccurs='1' processContents='lax'/> <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:NMTOKEN'> <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='by' type='xs:string' use='optional'/> <xs:attribute name='type' use='required'> <xs:simpleType> <xs:restriction base='xs:NMTOKEN'> <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>
A.6. Server Namespace
<?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' processContents='lax'/> <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:NMTOKEN'> <xs:enumeration value='chat'/> <xs:enumeration value='error'/> <xs:enumeration value='groupchat'/> <xs:enumeration value='headline'/> <xs:enumeration value='normal'/> </xs:restriction>
</xs:simpleType> </xs:attribute> <xs: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'> <xs:complexType> <xs:simpleContent> <xs:extension base='xs:NMTOKEN'> <xs:attribute name='parent' type='xs:NMTOKEN' use='optional'/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element>
<xs:element name='subject'> <xs:complexType> <xs:simpleContent> <xs:extension base='xs:NMTOKEN'> <xs:attribute name='parent' type='xs:NMTOKEN' use='optional'/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <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' processContents='lax'/> <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'> <xs:simpleType> <xs:restriction base='xs:NMTOKEN'> <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:NMTOKEN'> <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> <xs:element name='priority' type='xs:byte' default='0'/> <xs:element name='iq'> <xs:complexType> <xs:sequence> <xs:any namespace='##other' minOccurs='0' maxOccurs='1' processContents='lax'/> <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:NMTOKEN'> <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='by' type='xs:string' use='optional'/> <xs:attribute name='type' use='required'> <xs:simpleType> <xs:restriction base='xs:NMTOKEN'> <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>
A.7. Resource Binding Namespace
<?xml version='1.0' encoding='UTF-8'?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='urn:ietf:params:xml:ns:xmpp-bind' xmlns='urn:ietf:params:xml:ns:xmpp-bind' elementFormDefault='qualified'> <xs:element name='bind'> <xs:complexType> <xs:choice> <xs:element name='resource' type='resourceType'/> <xs:element name='jid' type='fullJIDType'/> </xs:choice> </xs:complexType> </xs:element> <xs:simpleType name='fullJIDType'> <xs:restriction base='xs:string'> <xs:minLength value='8'/> <xs:maxLength value='3071'/> </xs:restriction> </xs:simpleType> <xs:simpleType name='resourceType'> <xs:restriction base='xs:string'> <xs:minLength value='1'/> <xs:maxLength value='1023'/> </xs:restriction> </xs:simpleType> </xs:schema>A.8. Stanza Error Namespace
<?xml version='1.0' encoding='UTF-8'?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='urn:ietf:params:xml:ns:xmpp-stanzas' xmlns='urn:ietf:params:xml:ns:xmpp-stanzas' elementFormDefault='qualified'> <xs:element name='bad-request' type='empty'/> <xs:element name='conflict' type='empty'/> <xs:element name='feature-not-implemented' type='empty'/>
<xs:element name='forbidden' type='empty'/> <xs:element name='gone' type='xs:string'/> <xs:element name='internal-server-error' type='empty'/> <xs:element name='item-not-found' type='empty'/> <xs:element name='jid-malformed' type='empty'/> <xs:element name='not-acceptable' type='empty'/> <xs:element name='not-allowed' type='empty'/> <xs:element name='not-authorized' type='empty'/> <xs:element name='policy-violation' type='empty'/> <xs:element name='recipient-unavailable' type='empty'/> <xs:element name='redirect' type='xs:string'/> <xs:element name='registration-required' type='empty'/> <xs:element name='remote-server-not-found' type='empty'/> <xs:element name='remote-server-timeout' type='empty'/> <xs:element name='resource-constraint' type='empty'/> <xs:element name='service-unavailable' type='empty'/> <xs:element name='subscription-required' type='empty'/> <xs:element name='undefined-condition' type='empty'/> <xs:element name='unexpected-request' type='empty'/> <xs:group name='stanzaErrorGroup'> <xs:choice> <xs:element ref='bad-request'/> <xs:element ref='conflict'/> <xs:element ref='feature-not-implemented'/> <xs:element ref='forbidden'/> <xs:element ref='gone'/> <xs:element ref='internal-server-error'/> <xs:element ref='item-not-found'/> <xs:element ref='jid-malformed'/> <xs:element ref='not-acceptable'/> <xs:element ref='not-authorized'/> <xs:element ref='not-allowed'/> <xs:element ref='policy-violation'/> <xs:element ref='recipient-unavailable'/> <xs:element ref='redirect'/> <xs:element ref='registration-required'/> <xs:element ref='remote-server-not-found'/> <xs:element ref='remote-server-timeout'/> <xs:element ref='resource-constraint'/> <xs:element ref='service-unavailable'/> <xs:element ref='subscription-required'/> <xs:element ref='undefined-condition'/> <xs:element ref='unexpected-request'/> </xs:choice> </xs:group>
<xs:element name='text'> <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:simpleType name='empty'> <xs:restriction base='xs:string'> <xs:enumeration value=''/> </xs:restriction> </xs:simpleType> </xs:schema>Appendix B. Contact Addresses
Consistent with [MAILBOXES], organization that offer XMPP services are encouraged to provide an Internet mailbox of "XMPP" for inquiries related to that service, where the host portion of the resulting mailto URI is the organization's domain, not the domain of the XMPP service itself (e.g., the XMPP service might be offered at im.example.com but the Internet mailbox would be <xmpp@example.com>).Appendix C. Account Provisioning
Account provisioning is out of scope for this specification. Possible methods for account provisioning include account creation by a server administrator and in-band account registration using the 'jabber:iq:register' namespace as documented in [XEP-0077]. An XMPP server implementation or administrative function MUST ensure that any JID assigned during account provisioning (including localpart, domainpart, resourcepart, and separator characters) conforms to the canonical format for XMPP addresses defined in [XMPP-ADDR].Appendix D. Differences from RFC 3920
Based on consensus derived from implementation and deployment experience as well as formal interoperability testing, the following substantive modifications were made from RFC 3920 (in addition to numerous changes of an editorial nature). o Moved specification of the XMPP address format to a separate document.
o Recommended or mandated use of the 'from' and 'to' attributes on stream headers. o More fully specified the stream closing handshake. o Specified the recommended stream reconnection algorithm. o Changed the name of the <xml-not-well-formed/> stream error condition to <not-well-formed/> for compliance with the XML specification. o Removed the unnecessary and unused <invalid-id/> stream error (see RFC 3920 for historical documentation). o Specified return of the <restricted-xml/> stream error in response to receipt of prohibited XML features. o More completely specified the format and handling of the <see- other-host/> stream error, including consistency with RFC 3986 and RFC 5952 with regard to IPv6 addresses (e.g., enclosing the IPv6 address in square brackets '[' and ']'). o Specified that the SASL SCRAM mechanism is a mandatory-to- implement technology for client-to-server streams. o Specified that TLS plus the SASL PLAIN mechanism is a mandatory- to-implement technology for client-to-server streams. o Specified that support for the SASL EXTERNAL mechanism is required for servers but only recommended for clients (since end-user X.509 certificates are difficult to obtain and not yet widely deployed). o Removed the hard two-connection rule for server-to-server streams. o More clearly specified the certificate profile for both public key certificates and issuer certificates. o Added the <reset/> stream error (Section 4.9.3.16) condition to handle expired/revoked certificates or the addition of security- critical features to an existing stream. o Added the <account-disabled/>, <credentials-expired/>, <encryption-required/>, and <malformed-request/> SASL error conditions to handle error flows mistakenly left out of RFC 3920 or discussed in RFC 4422 but not in RFC 2222. o Removed the unused <payment-required/> stanza error.
o Removed the unnecessary requirement for escaping of characters that map to certain predefined entities, since they do not need to be escaped in XML. o Clarified the process of DNS SRV lookups and fallbacks. o Clarified the handling of SASL security layers. o Clarified that a SASL simple user name is the localpart, not the bare JID. o Clarified the stream negotiation process and associated flow chart. o Clarified the handling of stream features. o Added a 'by' attribute to the <error/> element for stanza errors so that the entity that has detected the error can include its JID for diagnostic or tracking purposes. o Clarified the handling of data that violates the well-formedness definitions for XML 1.0 and XML namespaces. o Specified the security considerations in more detail, especially with regard to presence leaks and denial-of-service attacks. o Moved documentation of the Server Dialback protocol from this specification to a separate specification maintained by the XMPP Standards Foundation.Appendix E. Acknowledgements
This document is an update to, and derived from, RFC 3920. This document would have been impossible without the work of the contributors and commenters acknowledged there. Hundreds of people have provided implementation feedback, bug reports, requests for clarification, and suggestions for improvement since publication of RFC 3920. Although the document editor has endeavored to address all such feedback, he is solely responsible for any remaining errors and ambiguities. Special thanks are due to Kevin Smith, Matthew Wild, Dave Cridland, Philipp Hancke, Waqas Hussain, Florian Zeitz, Ben Campbell, Jehan Pages, Paul Aurich, Justin Karneges, Kurt Zeilenga, Simon Josefsson, Ralph Meijer, Curtis King, and others for their comments during Working Group Last Call.
Thanks also to Yaron Sheffer and Elwyn Davies for their reviews on behalf of the Security Directorate and the General Area Review Team, respectively. The Working Group chairs were Ben Campbell and Joe Hildebrand. The responsible Area Director was Gonzalo Camarillo.Author's Address
Peter Saint-Andre Cisco 1899 Wyknoop Street, Suite 600 Denver, CO 80202 USA Phone: +1-303-308-3282 EMail: psaintan@cisco.com