Internet DRAFT - draft-hudson-impp-transfer-proposal
draft-hudson-impp-transfer-proposal
INTERNET-DRAFT Greg Hudson
Expires: November 3, 2000 ghudson@mit.edu
MIT
Instant Message and Presence Transfer Protocols
draft-hudson-impp-transfer-proposal-01.txt
1. Status of this Memo
This document is an Internet-Draft and is in full conformance with all
provisions of Section 10 of RFC2026.
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.
2. Abstract
This document specifies transfer protocols for instant messages and
presence information. The Presence Information Transfer Protocol
(PITP) allows clients to set presence information for presentities
they control and to request presence information from other
presentities. The Instant Message Transfer Protocol (IMTP) allows
clients to send and receive instant messages. Both protocols can also
be used to relay instant message and presence requests between servers
as necessary.
These protocols are specified in the same document because they have
very similar structure. However, they are two logically separate
protocols. Sections specific to one or the other protocol will be
recognizeable by a leading "PITP" or "IMTP".
3. Terminology
PITP stands for "Presence Information Transfer Protocol," one of the
protocols specified in this document.
IMTP stands for "Instant Message Transfer Protocol," the other
protocol specified in this document.
PI stands for "Presence Information." The data format for presence
information is specified in [PIDF].
IM stands for "Instant Message." Instant messages are opaque payloads
tagged by a MIME [RFC 2045-2049] content type.
The terms "presentity", "watcher", "sender", and "instant inbox" are
defined in section 4.
The terms "operation", "originator", "target", "relay" and "gateway"
are defined in section 8.
The term "watcher class" is defined in section 5.
The term "principal" is used vaguely to refer to an entity (which is
usually a person, but might be an organization or program in some
cases) interacting with the presence or instant message system. IMTP
and PITP make no assumptions about the nature of principals.
The terms MUST, SHOULD, and MAY are used in uppercase with the meaning
defined in [RFC 2119].
4. Identifiers and domain architecture
The abstract entities who have PI are called "presentities." The
entities who fetch or subscribe to PI are called "watchers."
Presentities and watchers both have identifiers within the "presence"
URL scheme. A watcher with the same identifier as a presentity is
assumed to be under the control of the same principal. A presence
identifier has a local part and a domain part, as defined in section
9.
The abstract entities who receive IMs are called "instant inboxes."
The entities who send instant messages information are called
"senders." Instant inboxes and senders both have identifiers within
the "im" URL scheme. Just as with presence identifiers, a sender with
the same identifier as an instant inbox is assumed to be under the
control of the same principal, and an instant messaging identifier has
a local part and a domain part, as defined in section 9.
PITP and IMTP clients communicate only with the servers for the home
domains of the identifiers they use. Servers relay requests to other
servers as necessary. For example, if the watcher
"presence:joe@example.net" wishes to fetch the presence information
for the presentity "presence:harry@domain.com", it makes the request
to a server serving its home domain, example.net. The example.net
server will forward the request to a server for domain.com and forward
back the response.
A domain may be served by multiple servers. How the distribution of
responsibility is carried out is beyond the scope of this protocol;
however, IMTP and PITP can be used to relay operations between servers
within a domain as well as between servers in different domains.
Thus, PITP and IMTP can be used between the following pairs of
parties:
* A client and a server in its home domain
* Two servers for the same domain
* Two servers for different domains
5. (PITP) Presence store
A presence server contains, at least abstractly, a store of
dynamically changing PI. The view of the presence store from a
watcher's perspective is very simple: each presentity has one piece of
PI at any given time. The view of the presence store from a
presentity's perspective is more complicated, since a principal may
wish to reveal different presence information to different classes of
watchers.
>From a presentity's perspective, the presence store contains an
enumerated list of mappings from watcher class to optional PI.
Numbering of the mappings begins at 1. A watcher class is a set of
identifier patterns, as defined in section 11.3. A watcher class
matches any watcher which matches one or more of the patterns making
up the class.
When a watcher requests presence information, the server will provide
it with the PI corresponding to the first matching watcher class in
the list. If the matched watcher class has no PI, or if the watcher
does not match any class in the list, the server will deny access to
the presentity's PI.
For example, at some particular time, the presentity
"presence:joe@example.net" might have, on the example.net servers, the
following PI mappings (where PI1..PI5 are placeholders for PI
documents in the format specified in [PIDF]):
(1) presence:fred@example.net -> PI1
(2) presence:harry@domain.com,
presence:alice@domain.com -> <no PI>
(3) presence:*@example.net -> PI2
(4) presence:* -> PI3
(5) * -> PI4
A watcher "presence:fred@example.com" would receive PI1; a watcher
"presence:harry@domain.com" would be denied a subscription or fetch.
If example.net's servers run a local gateway (see section 8) to a
different presence service, a watcher from that namespace would
receive PI4.
Note that it is easy to construct PI lists where specific watcher
classes are shadowed by more general classes; for instance, if the
list is:
(1) presence:*@example.net -> PI1
(2) presence:fred@example.net -> PI2
then fred@example.net receives PI1 even though there is a more
specific entry mapping to PI2. A user agent SHOULD detect and prevent
or warn about cases such as this, but a server MUST NOT disallow them.
6. Making a connection
As mentioned in section 4, a PITP or IMTP connection may be used in
three different scenarios: a client may be connecting to a server in
its home domain, a server may be relaying with another server in its
own domain, or a server may be relaying with a server in a foreign
domain.
6.1. Client-server connections
A client MAY support site-specific means of server discovery, but it
SHOULD support the following standard discovery algorithm: the client
performs a SRV [RFC 2782] lookup for its home domain using the
protocol "tcp" and the service "presence-clients" (for PITP) or
"im-clients" (for IMTP). If no SRV record is present, the client
performs an A look up on the domain and uses the resulting IP
addresses with the allocated port XXX (for PITP) or XXX (for IMTP).
6.2. Server-server connections within a single domain
If a domain has multiple servers, it may be necessary to relay
presence operations between those servers. How a server chooses
another server to connect to within the same domain is not within the
scope of this specification.
6.3. Server-server connections between domains
A server MUST discover a foreign domain's server using the following
algorithm: the server performs a SRV lookup for the foreign domain
using the protocol "tcp" and the service "presence-servers" (for PITP)
or "im-servers" (for IMTP). If no SRV record is present, the server
performs an A lookup on the foreign domain and uses the resulting IP
addresses with the allocated port XXX (for PITP) or XXX (for IMTP).
6.4. Initial data from server
After accepting a connection, a server volunteers a list of SASL [RFC
2222] authentication mechanisms it supports using the "mech" syntax
defined in section 10. Implementators should note that this mechanism
list is not integrity-protected. The measures documented in [RFC
2222] section 9 will help to prevent an attacker from forcing a
negotiation of a weak mechanism; also, because the mechanism list is
retransmitted after the negotiation of a security layer (see section
14.1), servers and clients can help reduce the risk of such an attack
by only supporting mechanisms which negotiate an integrity-protecting
security layer.
XXX NOTE: it is my hope to define a SASL or GSSAPI mechanism for
authentication between two administrative domains using public keys in
the DNS, and require this mechanism to be implemented by all servers
(although the mechanism would fall back to authentication-by-assertion
in the event that either party has no public key in the DNS, so this
would not force all server implementations to include crypto support).
This mechanism would provide good authentication strength in the
presence of DNSSEC deployment and some authentication strength (since
DNS spoofing attacks are not currently trivial) in the absence of
DNSSEC deployment.
7. Connections and data flow
PITP and IMTP data consists of mechanism lists, nops, commands,
responses; the syntax of these protocol messages is defined in section
10. Each command corresponds to a single response. Responses to
commands do not necessarily arrive in order.
PITP and IMTP are bidirectional asynchronous protocols; once a
connection is established, commands and responses may flow in either
direction, and either side may send multiple commands without waiting
for a response. Because these are not lock-step protocols, deadlock
is possible if both sides of a connection attempt to write too much
data without reading pending data. A server MUST prevent such
deadlocks by reading data as it comes in, even if it has data to
write. For a Unix sockets implementation, this means the server must
perform writes in non-blocking mode, or use select() or poll() to
detect the writeability of a socket before writing data, or use
separate threads for reading and for writing on each connection. A
client MAY perform blocking writes, since the server will prevent
deadlocks.
The lifetime of a connection varies according to what type of
connection it is. For a client-server connection, a connection lasts
as long as the client wants to be able to receive data from the
server, or has data to send to the server. For instance, an IMTP
client listening on an instant inbox will hold its connection open as
long as it wants to be able to receive messages send to that inbox.
For a server-server connection between two different domains,
connections may be closed by either side at any time when there are no
outstanding commands on the connection from that server's point of
view. Any commands sent to a server which closed the connection
before sending a reply can safely be assumed to have gone unprocessed.
For a server-server connection within a domain, the lifetime of the
connection is implementation-defined. The connection might be
permanent, or it might end after a single transaction, or it might use
a mechanism similar to the one for inter-domain connections.
8. Relays and gateways
In this specification, an "operation" refers to the process of
communicating a request from an originator to a target, possibly
through one or more relays or gateways, and communicating back a
reply. The mechanism through which an operation occurs is a series of
protocol messages; for instance, if im:joe@example.net wishes to send
an IM to im:tara@domain.com, the sequence of protocol operations might
be:
Joe's client -> example.net: send
example.net -> domain.com: send
domain.com -> Tara's client: send
Tara's client -> domain.com: ok (send)
domain.com -> example.net ok (send)
example.net -> Joe's client: ok (send)
(where "example.net" is an abbreviation for "a server for the domain
example.net" and likewise for "domain.com"). Of course, the
originator only sees itself sending the command and eventually
receiving the response, and the target only sees itself receiving the
command and sending the response.
A server is said to be acting as a relay when it receives a command or
response and continues the operation by forwarding the request or
reply to another PITP or IMTP entity. A server is said to be acting
as a gateway when it receives a command or responds and continues the
operation by forwarding it to another entity using a different
protocol.
If a relay receives a command or response with a header it does not
recognize, it MUST include the unmodified header in the command or
response it sends to the next hop.
Under appropriate circumstances, a relay MAY reject a command with an
appropriate error response and decline to forward it. A relay MUST
forward the command if it does not respond with an error. If a relay
forwards a command, it MUST NOT respond to the command before it
receives a response from the next hop.
A gateway can operate in one of two different ways. A "local gateway"
supports URL schemes other than "presence" (for PITP) or "im" (for
IMTP), thus allowing its clients to communicate with presence or IM
services using other protocols. A "remote gateway" uses regular
presence or im identifiers, but forwards operations using a protocol
other than PITP or IMTP for some or all local parts.
8.1. Authorization to represent source identifiers
Most PITP and IMTP commands include a source identifier (see section
12). To prevent forgery, the receiver of a command needs to decide if
the sending connection is authorized to communicate the intentions of
the specified source identifier. The principles PITP and IMTP apply
to this authorization task are:
* Within a domain, authorization is a site-specific issue.
* Between domains, a server for domain X is authorized only to
communicate the intentions of an identifier within domain X.
* A client's view of the entire presence or IM service is
through its server, so a client trusts its server to
communicate the intentions of all identifiers.
Following are specific rules to be applied by clients and servers to
implement the above principles.
If a client is sending a command to a server, the server SHOULD reject
the command with an error type of "source-authorization" if the domain
part of the source identifier is not a domain served by the server.
Beyond that, it is a site-specific decision whether to allow a given
client connection to act on behalf of a given identifier based on the
credentials the client has presented using the auth-sasl command.
If a server S1 sends a command to another server S2 in the same
domain, it is a site-specific decision whether to allow the command.
If a server S1 sends a command to another server S2 in a different
domain, the server S2 MUST reject the command with an error type of
"source-authorization" if the domain part of the source identifier is
not the same as the domain S1 authenticated as. The server S2 SHOULD
NOT reject the command on the basis of the source address otherwise.
If a server is sending a command to a client, the client SHOULD NOT
reject the command on the basis of the source address regarldess of
what the source address is.
9. Identifier syntax
Following is an ABNF [RFC 2234] syntax for a presence or instant
messaging URL. Note that presence and instant message identifiers use
only US-ASCII characters.
presence-id = word-presence ":" local-part "@" domain
im-id = word-im ":" local-part "@" domain
local-part = dotted-string / quoted-string
domain = 1*domain-label *("." 1*domain-label)
domain-label = (ALPHA / DIGIT)
[*(ALPHA / DIGIT / "-") (ALPHA / DIGIT)]
dotted-string = 1*atext *("." 1*atext)
quoted-string = DQUOTE *qcontent DQUOTE
qcontent = qtext / quoted-pair
quoted-pair = "\" (%x1-9 / %xB-C / %xE-7E)
qtext = %x1-8 / %xB-C / %xD-1F / %x20-21 / %x23-5B
/ %x5D-7E
atext = "!" / "#" / "$" / "%" / "&" / "'" / "*"
/ "+" / "-" / "/" / "=" / "?" /"^" / "_"
/ "`" / "{" / "|" / "}" / "~" / ALPHA / DIGIT
/ %x1-8 / %xB-C / %xD-1F / %x7F
scheme = presence-scheme / im-scheme
word-presence = %x70.72.65.73.65.6E.63.65
word-im = %x69.6D
Following are some examples of valid presence and instant messaging
identifiers:
presence:joe@example.net
im:"Jane Smith"@domain.com
im:"a\""@example.com
A user agent for PITP or IMTP SHOULD recognize a presence or instant
messaging identifier without the scheme if it is entered in a presence
or instant messaging context. Similarly, a user agent SHOULD display
a presence or instant messaging identifier without the scheme if it is
displayed in a presence or instant messaging context.
The syntax for the local part of presence and im URLs is very similar
to the syntax for email addresses in [RFC 822]. However, note that a
CR or LF is never valid in a presence or im URL and that comments and
group specifications are not allowed. Also note that, unlike a mailto
URL [RFC 2368], a presence or imto URL cannot contain multiple
addresses.
10. Protocol message syntax
The underlying character set for protocol messages in PITP and IMTP is
Unicode, represented in UTF-8 [RFC 2279]. Payloads are an exception;
they should be treated as unprocessed octets. An implementation MUST
properly handle arbitrary binary data in the payload.
A protocol message is either a mechanism list, a NOP, a command, or a
response. A mechanism list advertises supported SASL mechanisms and
is sent by the receiver of a connection at two specific times (upon
receiving a connection and upon completing a SASL authentication). A
NOP has no effect and does not incur a reply. Commands and responses
both begin with a start line, continue with a series of headers
terminated by a blank line, and are possibly followed by a payload.
The presence of a payload is signalled by a Content-Length header,
which specifies (as an unsigned US-ASCII decimal integer) the number
of octets in the payload.
Headers may be "folded" across several lines by including leading
whitespace on the continuation lines. Folding whitespace is part of
the header value and is thus only valid where whitespace and CRLF is
allowed in the particular header value; for instance, folding cannot
occur within a presence or im URL.
A payload MUST NOT be included unless the description of the
particular method allows it. If a payload is included, the protocol
message headers MAY include a Content-Type as specified in [RFC 2045];
if no Content-Type is provided, the default is "application/presence"
for PITP commands, "text/plain; charset=UTF-8" for IMTP commands, and
"application/octet-stream" for the auth command. The
Content-Transfer-Encoding header from [RFC 2045] is not necessary in
IMTP or PITP and MUST NOT be included in any command or response. An
implementation which receives a Content-Transfer-Encoding header
should reject the command with an Error-Type of "malformed".
Following is an ABNF [RFC 2234] grammar for protocol messages:
pmessage = mech / nop / command / response
mech = "=" word-mech *(" " mechname) CRLF
mechname = 1*20(ALPHA / DIGIT / "-" / "_")
nop = "=" word-nop CRLF
command = ">" id 1*WSP method content
response = "<" id 1*WSP status *WSP "(" method ")"
content
content = CRLF *header CRLF [payload]
header = header-name ":" [header-value] CRLF
header-value = *([fws] printable) *WSP
payload = *OCTET
fws = [*WSP CRLF] 1*WSP
id = 1*(ALPHA / DIGIT)
method = 1*(ALPHA / DIGIT)
status = word-ok / word-error
header-name = 1*(%x21-39 / %x3B-7E) ; ASCII, no colons
printable = %x21-7E / %x80-D7FF / %xE000-FFFD
/ %x10000-310FFFF
word-ok = %x6F.6B
word-error = %x6E.72.72.6F.72
word-nop = %x6E.6F.70
word-mech = %x6D.65.63.38
The id part of a response is used to match it up with the
corresponding command, since responses to commands do not necessarily
arrive in order. The simplest choice for ID strings is a counter ("1"
for the first command, "2" for the second, etc.), but any combination
of US-ASCII letters and digits is acceptable. Once an ID string has
been used for a command, it MUST NOT be reused on that connection by
the same requestor until the response to that command has been
received.
The syntaxes of particular headers are defined in section 11. A
header value MUST match the header-value syntax defined above as well
as the syntax of the specific header defined in section 11. If a
client or server receives a protocol message with a header name it
does not recognize, it MUST process the message as if the header were
not present, with the exception that a server MUST forward the unknown
header to the next hop if it is acting as a relay.
A header name MUST NOT be repeated unless the description of a method
in sections 14-16 allows it. If a client or server receives a message
with a repeated header of a type which must not be repeated, it MUST
process the message as if only the first value of the header is
present, with the exception that a server acting as a relay MUST
forward all of the header values if it is supposed to forward the
header at all.
The meanings of particular methods are defined in sections 14-16. If
a client or server receives a protocol message with a method it does
not recognize, it MUST reject the message with an error type of
"unknown-method" (see section 12).
Method names and headers are case-sensitive. Examples of protocol
messages can be found in the definitions of the particular methods.
11. Header syntaxes
This section describes the syntax and interpretation of the headers
defined in this standard. The actual usage of headers is defined in
the descriptions of particular methods in sections 14-16.
11.1. Headers containing URLs
Several headers used in PITP and IMTP contain a single URL. The
syntax for such a header is:
url-hdr = [fws] url *WSP
where the "url" syntactic element conforms to the URL syntax defined
in [RFC 1738]. Normally, this URL will be a presence identifier for
PIDF commands or an IM identifier for IMTP commands, but it may be a
different type of URL if a local gateway is in use (see section 8).
Headers which include URLs include:
Protocol Header Methods using header
-------- ------ --------------------
PITP Watcher fetch, fetch-notify
PITP Presentity (most)
IMTP Sender send
IMTP Inbox listen, send
IMTP Orig-Sender send
IMTP Orig-Inbox send
11.2. Headers containing origination points
The "Error-Originator" header, used in error responses, and the
"Unreliable" header, used in successful "send" and "change-notify"
responses, both contain points of origin for the error or
unreliability indication. The syntax for this header is:
origin-hdr = [fws] (domain / url) *WSP
where the "domain" syntactic element is defined in section 9 and the
"url" syntactic element conforms to the URL syntax defined in [RFC
1738]. The presence or absence of a colon easily disambiguates
domains from URLs.
A URL origin-hdr indicates origination from a client representing the
given URL. A domain origin-hdr indicates origination from a server
representing the given domain.
11.3. Headers containing identifier patterns
Several headers in PITP and IMTP contain an identifier pattern. These
headers have the following syntax:
idpattern-hdr = [fws] ("*" / our-ptrn / generic-ptrn)
*WSP
our-ptrn = (word-presence / word-im) ":"
("*" / "*@" ["*."] domain-part /
local-part "@" domain-part)
generic-ptrn = scheme ":" ("*" / scheme-specific-part)
where the "scheme" and "scheme-specific-part" syntactic elements
conform to the syntax defined in [RFC 1738], and the
"presence-scheme", "local-part", and "domain-part" syntactic elements
are defined in section 9.
An id-pattern header specifies a pattern matching a class of URLs. It
can match the following kids of classes:
* Any URL ("*")
* Any URL with a particular scheme ("scheme:*")
* Any presence or IM identifier with a particular domain
("presence:*@domain" or "im:*@domain")
* Any presence or IM identifier in a subdomain of a particular
domain ("presence:*@*.domain" or "im:*@*.domain")
* A specific URL
Headers which include identifier patterns include:
Protocol Header Methods using header
-------- ------ --------------------
PITP Wpattern get-class (response),
insert-mapping, set-class
IMTP Only listen
IMTP Except listen
11.4. The "Astrength" header
When a server acts as a relay, it MUST communicate to the next node a
rough indication of the authentication strength of the previous hops
using the "Astrength" header. The syntax for the Astrength header is:
astrength-hdr = [fws] astrength *WSP
astrength = %x73.74.72.6F.6E.67 ; "strong"
/ %x6D.65.64.69.75.6D ; "medium"
/ %x77.65.61.6B ; "weak"
/ %x6E.6F.6E.65 ; "none"
The meanings of the astrength values are:
strong Message authenticity and integrity cannot be
compromised by an attacker who has full
control of all network links, assuming no
compromise of keying materials, installed
software, or cryptographic algorithms.
medium Message authenticity or integrity could be
compromised by a packet substitution or DNS
spoofing attack.
weak Message could be forged by an attacker who has
previously been a passive listener on one or
more network links.
none Message could be forged by an attacker with no
special information.
Examples of medium protection include one-time passwords [RFC 2289]
and HTTP digest authentication [RFC 2617 section 3]. Examples of weak
protection include cleartext passwords or security protocols subject
to replay attacks.
If a server or client receives a protocol message with no Astrength
header, it should assume that the sender is the originator of the
operation and thus the equivalent Astrength is "strong". A server
relaying a message MUST communicate the weaker of the strength of the
connection it received the message on and the Astrength value
communicated from the last entity.
A relay or gateway MAY choose to reject a command with a
"source-authorization" error because it does not come with sufficient
authentication strength (either as reported by the Astrength value or
based on the connection from the immediate requestor). A relay MUST
NOT reject a response on the basis of insufficient authentication
strength.
Note that, separately from connection-level authentication, an
operation may be authenticated using an end-to-end signature. The
Astrength header does not bear any relation to this kind of
authentication.
An example scenario: an IMTP client connects to a server for
example.net and, without authenticating, issues a "send" command from
alice@example.net to bob@domain.com. The example.net server connects
to domain.com, authenticates using DNSSEC-signed public keys and
forwards the IM with "Astrength: none" because the previous link was
unauthenticated. The domain.com server sends the message to the
clients receiving messages for bob@domain.com with "Astrength: none"
since that was the authentication value claimed by example.net, even
though domain.com received the message over a strongly authenticated
link.
Another example scenario: an IMTP client connects to a server for
example.net and authenticates using some strong SASL mechanism as
alice. It then issues a "send" command from alice@example.net to
bob@domain.com. The example.net server connects to domain.com and
authenticates, but example.net's public key DNS record is not signed,
so it could have been forged by a DNS spoofing attack. The
example.net server sends the IM with "Astrength: strong" because it
received the message from Alice over a strongly authenticated link;
however, the domain.com server will weaken the Astrength to "Medium"
when forwarding the message to Bob's clients.
11.5. (PITP) The "Mapping" header
The Mapping header is used in the following PITP methods:
change
delete-mapping
fetch-for-update
get-class
insert-mapping
set-class
The Mapping header has the following syntax:
mapping-hdr = [fws] positive-digit *DIGIT *WSP
positive-digit = %x31-39 ; 1-9
The sequence of digits represents an positive number, which selects
the PI mapping the operation applies to.
11.6. The "Mechanism" header
The Mechanism header is used with the "auth" method. It has the
following syntax:
mechanism-hdr = [fws] mechname *WSP
where the "mechname" syntactic element is defined in section 10.
11.7. (PITP) The "Subscription" header
The Subscription header is used in the following PITP methods:
change-notify
start-wi (response)
subscribe
subscribe-notify
terminate
terminate-notify
unsubscribe
It has the following syntax:
subscription-hdr= [fws] connection-id [fws] "/" [fws] url *WSP
connection-id = *(ALPHA / DIGIT)
where the "url" syntactic element conforms to the syntax defined in
[RFC 1738]. The URL part of a Subscription header specifies the
watcher who is making or who made the subscription.
The connection ID part of a Subscription header is an opaque token
stored with a subscription and is used by the watcher's server to
distinguish between different client connections using the same
watcher identifier. A client originating a subscribe operation MUST
leave the connection-id blank; if it does not, the receiving server
MUST reject the command with an Error-Type of "malformed". The
receiving server SHOULD generate a token identifying the client
connection and use it when forwarding the subscribe command or when
providing watcher information to other clients. When the server
forwards a change-notify or terminate-notify command to the watching
client, it MUST use a blank connection-id.
Similarly, a client originating an unsubscribe operation MUST leave
the connection-id blank, or the server MUST reject the command with an
Error-Type of "malformed". The receiving server MUST use the same
connection-id as it generated for the subscription command when
forwarding the unsubscription command or when providing watcher
information to other clients.
11.8. (IMTP) The "Visited" header
The Visited header is used with the IMTP "send" command. This header
helps to prevent IM routing loops by giving a list of domains (server
names or IM domains) an IM has passed through. It has the following
syntax:
visited-hdr = *([fws] domain) *WSP
where the "domain" syntactic element is described in section 9.
12. Error responses
Error responses MUST contain an Error-Type header specifying the type
of error. Error types are case sensitive. Possible error types are
defined later in this section and in sections 14-16 in the definitions
of particular command methods. An error response MAY contain an
Error-Description header giving a human-readable description of the
error. A relay MUST include the values of the Error-Type and
Error-Description (if present) unmodified, when passing on the error
response.
When a client or server originates an error response, it MUST NOT
include an Error-Originator header. When a server relays an error
response which does not include an Error-Originator header, it MUST
add in the relayed response an Error-Originator header specifying
which party generated the error, using the origin-hdr syntax. When a
server relays an error response which does include an Error-Originator
header, it MUST include the value of that header unmodified when
passing on the response.
The following Error-Type values may occur in response to any command:
malformed The command is not properly formed.
unknown-method The client or server does not
recognize the specified method.
resources A temporary resource failure
occurred.
communications A temporary communications failure
occurred.
Most commands include a header which indicates what URL the command is
acting on the behalf of. The following Error-Type values may occur in
response to any command which involves a source URL:
source-authorization The requestor is not authorized to
represent the intentions of the source
URL.
quota The command would result in
unacceptable resource use on behalf of
the source URL.
Some commands include a header which indicates what URL the command is
targeting, separate from the URL is acting on the behalf of. The
following Error-Type values may occur in response to any command which
involves a target URL.
target-authorization The source URL is not authorized to
perform the requested operation on the
target URL.
target-not-found The target URL does not exist.
The following table clarifies which headers specify the source and
target URLs for the methods defined in sections 14-16. If this table
does not list a source header for a method, then
"source-authorization" and "quota" are not valid responses; likewise,
if this table does not list a target header for a method, then
"target-authorization" is not a valid response.
Method Source Header Target Header
------ ------------- -------------
change Presentity n/a
change-notify Presentity n/a
delete-mapping Presentity n/a
fetch Watcher Presentity
fetch-for-update Presentity n/a
fetch-notify n/a n/a
get-class Presentity n/a
insert-mapping Presentity n/a
set-class Presentity n/a
start-wi Presentity n/a
subscribe Subscription Presentity
subscribe-notify n/a n/a
terminate Presentity n/a
terminate-notify n/a n/a
unsubscribe Subscription n/a
unsubscribe-notify n/a n/a
listen Inbox n/a
send Sender Inbox
13. Notation used in command examples
The following three sections define the command methods used in PITP
and IMTP. Most definitions include examples of exchanges between
clients and servers or between two servers. A leading "C: " indicates
text sent by a hypothetical client, and a leading "S: " indicates text
sent by a server. Similarly, "S1: " and "S2: " indicate text sent by
one or the other of two servers. All lines in examples are terminated
by a CRLF pair. (Note that command payloads can consist of arbitrary
octets; for clarity, all of the payloads in the examples consist of
CRLF-terminated lines.)
14. Common command methods
This section describes commands common to both protocols.
14.1. "auth" method
This command begins or continues a SASL [RFC 2222] authentication
exchange. It MUST only be sent by the party which initiated a TCP
connection. This command MUST include the following header if it is
beginning an authentication exchange, but MUST NOT include it if it is
continuing an authentication exchange:
Mechanism: A mechanism-hdr specifying the SASL mechanism
to use
If this command is continuing an authentication exchange, it MAY
include the following header in order to abort the exchange:
Abort: No value--header value MUST be left blank and
MUST be ignored if present
If this command is beginning an authentication exchange, it MAY
include a payload containing the initial SASL response. If this
command is continuing an authentication exchange and does not include
the "Abort:" header, it MUST include a payload containing the response
to the last challenge. All payloads used in the SASL authentication
exchange MUST have the content type "application/octet-stream", which
is the default for this command.
An ok response to this method indicates that the authentication
exchange is has completed successfully, or has been aborted if the
command inclded the "Abort:" header. An ok response MAY include a
payload containing SASL additional data.
An error response to this method may indicate that the authentication
has failed, or it may simply mean that another token exchange is
required. There are two Error-Type values particular to this method:
sasl-challenge More data is required for the exchange
sasl-failure Authentication has failed
An error reply with type sasl-challenge MUST include a payload
containing the SASL challenge data.
The initiator of an authentication exchange MUST NOT send any commands
other than auth commands until the exchange is complete. If the
authentication exchange negotiates a security layer, it takes effect
beginning with the first octet of the protocol message following the
transmission or reception of the ok response.
Upon the successful completion of an authentication exchange, the
receiver of the auth command MUST, before sending any other commands
or responses, transmit a "mech" protocol message reiterating its list
of supported mechanisms. This mechanism list MUST be identical to the
one it advertised at the beginning of the connection. If the
mechanism list does not match, the initiator of the authentication
exchange SHOULD assume that an attacker has compromised the mechanism
negotiation and close the connection.
The GSSAPI service name for PITP is "PITP"; the GSSAPI service name
for IMTP is "IMTP".
14.2. "shutdown" command
This command is sent by a server to a client to negotiate a graceful
shutdown of the connection. There are no special headers for this
command. This command is only particularly useful for domains with
SRV records or site-specific server selection algorithms which could
select multiple servers. Upon receiving the command, the client
SHOULD attempt to make a connection to a different server for the
domain, establish subscriptions or IM forwarding on the new
connection, and then close its connection to the old server.
An ok response indicates that the client has received the shutdown
request. If this command is accidentally sent to a server which has
not yet authenticated as such, then the server SHOULD respond with
"unknown-method". A client MAY respond to this command with a
"communications" error if it could not establish contact with another
server, but the server MAY abort the connection in the face of such an
error.
15. PITP commands
A remote gateway which only uses PITP to communicate with other
servers only needs to understand the following commands:
auth (from section 14)
change-notify
fetch
subscribe
terminate-notify
unsubscribe
The other commands can only be sent by clients, or perhaps forwarded
between servers in the same domain.
15.1. "change" method
This command instructs a server to change the PI for a presentity.
This command MUST include the following headers:
Presentity: A url-hdr specifying the presentity being
changed
Mapping: A mapping-hdr specifying which PI mapping to
change the PI for
A payload MAY be included with this command, specifying the new PI.
If the payload is omitted, then the mapping will have no PI.
An ok response to this command indicates that the PI has been changed
or removed. The changing or removal of a mapping's may change the PI
of the presentity or result in a denial of access from the point of
view of some currently subscribed watchers. The server MUST issue
change-notify or terminate-notify requests to update those watchers.
An error response to this command indicates that the PI has not been
changed. The Error-Type values particular to this method are:
mapping-range The specified mapping number is greater than
the number of mappings for the presentity.
update-race There was a fetch-for-update command prior to
this change request, and the PI for the
specified mapping has changed since then.
Here is an example of a change command and response:
C: >1 change
C: Presentity: joe@example.net
C: Mapping: 1
C: Content-Length: 134
C:
C: date = "Thu, 30 Mar 2000 09:59:34 -0500"
C: contact = mailto:joe@example.net
C: contact = imto:joe@example.net {
C: status = deferred
C: }
S: <1 error (change)
S: Error-Originator: impp.example.net
S: Error-Type: auth
S: Error-Description: Please authenticate first.
15.2. "change-notify" method
This command is sent to notify a watcher of a change in presence
information for a presentity the watcher is subscribed to. This
command MUST include the following headers:
Presentity: A url-hdr specifying the presentity whose PI
has changed
Subscription: A subscription-hdr specifying the watcher and
connection ID of the subscription
A payload MUST be included with this command, specifying the new PI
for the presentity.
An ok response to this command indicates that the notification was
received by the watching client. If the receiver of this command is a
gateway to a protocol which cannot provide a final acknowledgement
from a receiving client it MUST include the following header:
Unreliable: An origin-hdr giving the point beyond which
reliability could not be guaranteed
An error response to this command means that the notification was not
received. The Error-Type values particular to this method are:
not-subscribed Watcher is not subscribed to this presentity
with specified connection ID
Here is an example of a change-notify command and response:
S1: >A3X change-notify
S1: Presentity: joe@example.net
S1: Subscription: 1/fred@domain.com
S1: Content-Length: 134
S1:
S1: date = "Thu, 30 Mar 2000 09:59:34 -0500"
S1: contact = mailto:joe@example.net
S1: contact = imto:joe@example.net {
S1: status = deferred
S1: }
S2: <A3X ok (change-notify)
S2: AStrength: strong
S2:
15.3. The "delete-mapping" method
This command instructs a server to delete a watcher mapping and
associated presence information for a presentity. This command MUST
include the following headers:
Presentity: A url-hdr specifying the presentity being
changed
Mapping: A mapping-hdr specifying which PI mapping to
delete
An ok response to this command indicates that the mapping has been
deleted. All mappings in the presentity's list after the specified
mapping number have their mapping numbers decreased by 1 to keeping
the mapping numbers consecutive.
Note that the deletion of a mapping may change the PI of the
presentity or result in a denial of access from the point of view of
some currently subscribed watchers. The server MUST issue
change-notify or terminate-notify requests to update those watchers.
An error response to this command means that the mapping has not been
deleted. The Error-Type values particular to this method are:
mapping-range The specified mapping number is greater than
the number of mappings for the presentity.
15.4. "fetch" method
This command requests the current PI for a presentity. This command
MUST include the following headers:
Watcher: A url-hdr specifying the watcher observing the
PI
Presentity: A url-hdr specifying the presentity to fetch
PI for
An ok response to this command MUST include a payload specifying the
current PI for the presentity. An error response indicates that the
fetch failed. There are no Error-Type values particular to this
method.
15.5. "fetch-for-update" method
This command is used by a client to request the PI for a presentity it
controls in preparation for an update. This command MUST include the
following headers:
Presentity: A url-hdr specifying the presentity being
updated
Mapping: A mapping-hdr specifying the PI mapping being
updated
An ok response to this command MUST include a payload specifying the
current PI for the specified presentity and mapping number. The next
change command on this connection for the specified mapping will fail
with an error type of "update-race" if the PI has changed due to a
request from a different client between the fetch-for-update command
and the change command.
The Error-Type values particular to this method are:
mapping-range The specified mapping number is greater than
the number of mappings for the presentity.
15.6. "fetch-notify" method
This command is sent by a server to inform a client of a fetch
operation for a presentity it is receiving watcher information for.
This command MUST include the following headers:
Watcher: A url-hdr specifying the watcher which
performed the fetch operation
Presentity: A url-hdr specifying the presentity whose PI
was fetched
An ok response to this command indicates that the notify operation was
received by the client. There are no Error-Type values particular to
this method.
15.7. "get-class" method
This command requests the watcher class for a PI mapping for a
presentity (see section 5). This command UST include the following
headers:
Presentity: A url-hdr specifying the presentity to fetch
the watcher class for
Mapping: A mapping-hdr specifying the PI mapping to
fetch the watcher class for
An ok response to this command conveys the watcher class for the
specified mapping to the requester using zero or more of the following
header:
Wpattern: An idpattern-hdr specifying a pattern of
watchers in the watcher class
The Error-Type values for this method are:
mapping-range The specified mapping number is greater than
the number of mappings for the presentity.
15.8. "insert-mapping" method
This command instructs a server to insert a PI mapping (see section 5)
into the list for a presentity. This command MUST include the
following header:
Presentity: A url-hdr specifying the presentity being
changed
Mapping: A mapping-hdr specifying where to insert the
new PI mapping into the list
This command conveys the watcher class for the new mapping using zero
or more of the following header:
Wpattern: An idpattern-hdr specifying a pattern of
watchers to match
A payload MAY be included with this command, specifying the initial PI
for the new watcher mapping. If no payload is included, the mapping
will intially have no PI.
An ok response to this command indicates that the mapping has been
added. Any existing PI mappings with numbers equal to or greater than
the specified mapping number will have their mapping numbers increased
by 1 to make room for the new mapping.
Note that the addition of a mapping may change the PI of the
presentity or result in a denial of access from the point of view of
some currently subscribed watchers. The server MUST issue
change-notify or terminate-notify requests to update those watchers.
An error response to this command indicates that the mapping has not
been added. The Error-Type values particular to this method are:
mapping-range The specified mapping number is greater than
the number of existing mappings for the
presentity plus one
15.9. "set-class" method
This command instructs a server to set the watcher class for a PI
mapping to a different value. This command MUST contain the following
headers:
Presentity: A url-hdr specifying the presentity being
changed
Mapping: A mapping-hdr specifying the PI mapping to
change
This command conveys the watcher class for the new mapping using zero
or more of the following header:
Wpattern: An idpattern-hdr specifying a pattern of
watchers to match
An ok response to this command indicates that the mapping has been
changed to the new watcher class. Note that changing a mapping's
watcher class may change the PI of the presentity from the point of
view of some currently subscribed watchers. The server MUST issue
change-notify commands to update those watchers with the proper PI.
The Error-Type values particular to this method are:
mapping-range The specified mapping number is greater than
the number of mappings for the presentity.
15.10. "start-wi" method
This command instructs a server to start sending watcher information
to a client. This command MUST contain the following header:
Presentity: A url-hdr specifying the presentity to receive
watcher information for
An ok response to this command indicates that the server will begin
sending watcher information in the form of fetch-notify,
subscribe-notify, and unsubscribe-notify events. An ok response also
conveys the current subscribers to the presentity using zero or more
instances of the following header:
Subscription: A subscription-hdr specifying a watcher
subscribing to the specified presentity and
its connection ID
There are no Error-Type values particular to this operation.
15.11. "subscribe" method
This command requests a subscription to a presentity from a specified
watcher. This command MUST contain the following headers:
Subscription: A subscription-hdr specifying the watcher and
connection ID of the subscription
Presentity: A url-hdr specifying the presentity to
subscribe to
An ok response to this command indicates that the subscription was
successful and the client will receive change-notify requests when the
presentity's PI changes. An ok response also MUST contain a payload
giving the current PI for the presentity.
A client MUST end its subscriptions with the unsubscribe command
before closing its connection to a server. If a client does not do
so, the server SHOULD end the clients' subscriptions to presentities
in other domains, but the server MAY simply wait for the next
change-notify or terminate-notify operation for that subscription and
respond with an error type of "not-subscribed".
There are no Error-Type values particular to this method.
15.12. "subscribe-notify" method
This command is sent by a server to inform a client that a
subscription was made to a presentity it is receiving watcher
information for. This command MUST include the following headers:
Subscription: A subscription-hdr specifying the watcher and
connection ID of the subscription
Presentity: A url-hdr specifying the presentity whose PI
was subscribed to
An ok response to this command indicates that the notify operation was
received by the client.
There are no Error-Type values particular to this method.
15.13. "terminate" method
This command instructs a server to terminate the a subscription to a
presentity. Unlike the unsubscribe command, this command is issued on
the behalf of the presentity, not the watcher, and this command does
not cross domains. This command MUST include the following headers:
Presentity: A url-hdr specifying the presentity to
terminate the subscription to
Subscription: A subscription-hdr specifying the watcher and
connection ID of the subscription to terminate
An ok response to this command indicates that the subscription has
been terminated. A server MUST send an unsubscribe-notify command to
any connections receiving watcher information for the presentity when
a subscription is terminated (which may include the connection which
sent the terminate command).
The Error-Type values particular to this method are:
not-subscribed Watcher is not subscribed to this presentity
with specified connection ID
15.14. "terminate-notify" method
This command notifies a client that its subscription to a presentity
has been terminated. This command MUST include the following headers:
Presentity: A url-hdr specifying the presentity to which
the subscription was terminated
Subscription: A subscription-hdr specifying the watcher and
connection ID of the subscription which was
terminated
An ok response to this command indicates that the subscribing client
has received the notification. The Error-Type values particular to
this method are:
not-subscribed Watcher is not subscribed to this presentity
with specified connection ID
15.15. "unsubscribe" method
This command instructs a server to terminate a subscription to a
presentity. This command MUST include the following headers:
Subscription: A subscription-hdr specifying the watcher and
connection ID of the subscription to end
Presentity: A url-hdr specifying the presentity subscribed
to
An ok response to this command indicates that the subscription was
successfully ended.
The Error-Type values particular to this method are:
not-subscribed Watcher is not subscribed to this presentity
with specified connection ID
15.16. "unsubscribe-notify" method
This command is sent by a server to inform a client that an
unsubscription was made from a presentity it is receiving watcher
information for. This command MUST include the following headers:
Subscription: A url-hdr specifying the watcher and
connection ID of the subscription
Presentity: A url-hdr specifying the presentity whose PI
was unsubscribed from
An ok response to this command indicates that the notify operation was
received by the client.
There are no Error-Type values particular to this method.
16. IMTP commands
16.1. "listen" command
This command is sent by a client to a server to request reception of
messages sent to a specified instant inbox. This command MUST include
the following headers:
Inbox: A url-hdr giving the inbox to receive messages
from
This command MAY use one or more instances of the following headers to
restrict the client to listening for specific senders:
Only: An idpattern-hdr specifying senders to receive
messages from
Except: An idpattern-hdr specifying senders not to
receive messages from
If any Only headers are included, then the server MUST NOT forward
messages to the client if the sender does not match one of the
identifier patterns in an Only header. If any Except headers are
included, then the server MUST NOT forward messages to the client if
the sender matches one of the identifier patterns in an Except header.
If a sender fails to meet the criteria for forwarding to this client
connection, then the server MUST act as if this client connection were
not listening to the inbox (i.e. forward to other client connections
listening on the same inbox if the sender matches the forwarding
criteria for those inboxes, or reject the send command with a
"no-listeners" error if there are no such connections).
If the client connection is already listening to the specified inbox,
then this command acts as a request to update the forwarding criteria
for the inbox. The server MUST, if it accepts the command, discard
all previous Only and Except filters and begin using the ones
specified in the command.
An ok response to this command indicates that the server will forward
messages to the client as specified by the headers. There are no
Error-Type values particular to this method.
16.2. "send" method
This command causes an IM to be sent to an instant inbox. This
command MUST include the following headers:
Sender: A url-hdr giving the sender of the IM
Inbox: A url-hdr giving the recipient of the IM
A relay MUST also include the following header:
Visited: A visited-hdr giving a list of domains the
IM has passed through
The value of the Visited header MUST be composed of the domain list
send from the previous node, if any, followed by a domain representing
the relay. This domain MAY be the domain served by the relay server,
a fully-qualified hostname of the server machine, or some other domain
under the administrative control of the server operators; care must be
taken not to conflict with the domain used by servers under other
administrative control.
This command MAY include the following headers:
Orig-Sender: A url-hdr giving the original sender of the IM
Orig-Inbox: A url-hdr giving the original recipient of the
IM
The Orig-Inbox header may occur multiple times. If any Orig-Inbox
headers are included, they MUST specify all of the recipients
originally specified for the IM (including the URL specified by the
Inbox header, if that was one of the original recipients). The
Orig-Sender and Orig-Inbox headers are useful when a message passes
through a redistribution list; the Orig-Inbox header can also be used
to indicate when a message is sent to multiple recipients. User
interfaces should note that the Orig-Sender header is not protected by
the source address authorization scheme defined in section 8.1.
A payload MUST be included with this command, specifying the IM to
send.
An ok response to this command indicates that the IM has been received
by the instant inbox. If the receiver of this command is a gateway to
a protocol which cannot provide a final acknowledgement from a
receiving client it MUST include the following header:
Unreliable: An origin-hdr giving the point beyond which
reliability could not be guaranteed
Relay MUST include the unmodified Unreliable header when passing on a
response.
An ok response to this command MAY include a payload. In this case,
the payload should be treated as a "vacation"-style message indicating
that the IM has been received but will not be read immediately.
If the receiver of this command is a server for the home domain of the
inbox and there are multiple client connections listening to that
inbox, the server is faced with the task of combining several
responses into one. The following rules apply to this operation:
* If at least one of the clients gives an ok response, the
server MUST give an ok response.
* If at least one of the clients responds with a payload, the
server MUST include one of the payloads.
* If multiple clients respond with payloads, the server may
use any algorithm to pick which payload to include.
* If all clients respond with errors, the server may use any
algorithm to pick which error to report.
The Error-Type values particular to this method are:
no-listeners No clients are listening to this instant inbox
loop The message was routed through a loop and
cannot be delivered
Here is an example of a send command and response:
C: >1 send
C: Sender: joe@example.net
C: Inbox: fred@domain.com
C: Content-Length: 18
C:
C: Testing, testing
S: <1 ok (send)
S: Unreliable: domain.com
S: Content-Length: 191
S:
S: Your message has been sent to my one-way pager. Hopefully
S: I will get it. However, I have shut off my pager's alert
S: noise because I am asleep, so I won't read it until
S: tomorrow morning.
17. Security considerations
18. IANA considerations
19. References
[PIDF]
G. Hudson. "Presence Information Data Format." Work in progress,
draft-hudson-impp-pidf-proposal-00.txt.
[RFC 822]
D. Crocker. "Standard for the format of ARPA Internet text messages."
RFC 822, August 1982.
[RFC 1738]
T. Berners-Lee, L. Masinter, M. McCahill. "Uniform Resource Locators
(URL)." RFC 1738, December 1994.
[RFC 2045-2049]
N. Freed, N. Borenstein. "Multipurpose Internet Mail Extensions
(MIME)." RFC 2045-2049, November 1996.
[RFC 2119]
S. Bradner. "Key Words for Use in RFCs to Indicate Requirement
Levels." RFC 2119, March 1997.
[RFC 2222]
J. Myers. "Simple Authentication and Security Layer (SASL)." RFC
2222, October 1997.
[RFC 2234]
D. Crocker, Ed., P. Overell. "Augmented BNF for Syntax
Specifications: ABNF." RFC 2234, November 1997.
[RFC 2279]
F. Yergeau. "UTF-8, a transformation format of ISO 10646." RFC 2279,
January 1998.
[RFC 2289]
N. Haller, C. Metz, P. Nesser, M. Straw. "A One-Time Password
System." RFC 2289, February 1998.
[RFC 2368]
P. Hoffman, L. Masinter, J. Zawinski. "The mailto URL scheme." RFC
2368, July 1998.
[RFC 2617]
J. Franks, P. Hallam-Baker, J. Hostetler, S. Lawrence, P. Leach, A.
Luotonen, L. Stewart. "HTTP Authentication: Basic and Digest Access
Authentication." RFC 2617, June 1999.
[RFC 2782]
A. Gulbrandsen, P. Vixie, L. Esibov. "A DNS RR for specifying the
location of services (DNS SRV)." RFC 2782, February 2000.
[Unicode]
The Unicode Consortium. "The Unicode Standard Version 3.0."
Addison-Wesley, February 2000.
20. Author's address
Greg Hudson
Massachusetts Institute of Technology
Cambridge, MA 02139
ghudson@mit.edu