-
Notifications
You must be signed in to change notification settings - Fork 122
/
xep-0012.xml
276 lines (272 loc) · 14.5 KB
/
xep-0012.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE xep SYSTEM 'xep.dtd' [
<!ENTITY % ents SYSTEM 'xep.ent'>
%ents;
]>
<?xml-stylesheet type='text/xsl' href='xep.xsl'?>
<xep>
<header>
<title>Last Activity</title>
<abstract>This specification defines an XMPP protocol extension for communicating information about the last activity associated with an XMPP entity. It is typically used by an IM client to retrieve the most recent presence information from an offline contact by sending a last activity request to the server that hosts the account controlled by the contact.</abstract>
&LEGALNOTICE;
<number>0012</number>
<status>Final</status>
<type>Standards Track</type>
<sig>Standards</sig>
<approver>Council</approver>
<dependencies>
<spec>XMPP Core</spec>
<spec>XMPP IM</spec>
</dependencies>
<supersedes/>
<supersededby/>
<shortname>iq-last</shortname>
<schemaloc>
<url>http://www.xmpp.org/schemas/iq-last.xsd</url>
</schemaloc>
&jer;
&temas;
&stpeter;
<revision>
<version>2.0</version>
<date>2008-11-26</date>
<initials>psa</initials>
<remark><p>Per a vote of the XMPP Council, advanced specification to Final; clarified a few small points in the text; added a reference to XEP-0115.</p></remark>
</revision>
<revision>
<version>1.3</version>
<date>2008-07-16</date>
<initials>psa</initials>
<remark><p>Corrected server processing rules to block queries to a full JID when the requesting entity is not authorized to view the presence of the user.</p></remark>
</revision>
<revision>
<version>1.2</version>
<date>2007-02-15</date>
<initials>psa</initials>
<remark><p>Per a vote of the XMPP Council, changed from Historical and Active to Standards Track and Draft; added Implementation Notes and clarified text throughout; added proviso to security considerations regarding client support; added section on Service Discovery.</p></remark>
</revision>
<revision>
<version>1.1</version>
<date>2004-01-22</date>
<initials>psa</initials>
<remark><p>Editorial revisions.</p></remark>
</revision>
<revision>
<version>1.0</version>
<date>2002-01-22</date>
<initials>psa</initials>
<remark><p>Changed status to Active.</p></remark>
</revision>
<revision>
<version>0.3</version>
<date>2002-01-14</date>
<initials>psa</initials>
<remark><p>Made appropriate changes to reflect status as informational.</p></remark>
</revision>
<revision>
<version>0.2</version>
<date>2002-01-04</date>
<initials>tjm</initials>
<remark><p>Converted to XML format.</p></remark>
</revision>
<revision>
<version>0.1</version>
<date>2001-01-25</date>
<initials>jm</initials>
<remark><p>Initial version from website.</p></remark>
</revision>
</header>
<section1 topic='Introduction' anchor='intro'>
<p>It is often helpful to know the time of the last activity associated with a entity. The canonical usage is to discover when a disconnected user last accessed its server. The 'jabber:iq:last' namespace provides a method for retrieving that information. The 'jabber:iq:last' namespace can also be used to discover or publicize when a connected user was last active on the server (i.e., the user's idle time) or to query servers and components about their current uptime.</p>
</section1>
<section1 topic='Protocol' anchor='protocol'>
<p>In order to request last activity information regarding another entity, the requesting entity sends an &IQ; stanza of type "get" to the target entity, containing a &QUERY; element qualified by the 'jabber:iq:last' namespace:</p>
<example caption='Last Activity Query'><![CDATA[
<iq from='[email protected]/orchard'
id='last1'
to='[email protected]'
type='get'>
<query xmlns='jabber:iq:last'/>
</iq>
]]></example>
<p>The target entity MUST return either an IQ-result or an IQ-error. When returning an IQ-result, the target entity sends an &IQ; stanza of type='result' containing a &QUERY; element with a REQUIRED 'seconds' attribute and OPTIONAL XML character data.</p>
<example caption='Last Activity Response'><![CDATA[
<iq from='[email protected]'
id='last1'
to='[email protected]/orchard'
type='result'>
<query xmlns='jabber:iq:last' seconds='903'/>
</iq>
]]></example>
<p>The requesting entity interprets the IQ-result based on the responding entity's JID type in order to determine the meaning of the information. Specifically, the information means something different depending on the identity of the responding entity:</p>
<ol>
<li>An account registered on an XMPP server, with a JID of the form &LOCALBARE;.</li>
<li>A connected or available resource associated with such an account, with a JID of the form &LOCALFULL;.</li>
<li>An "always-on" XMPP server or service, with a JID of the form &DOMAINBARE;.</li>
</ol>
<p>These differences are explained more fully below.</p>
</section1>
<section1 topic='Offline User Query' anchor='offline'>
<p>The primary usage of the 'jabber:iq:last' namespace is to find out how long ago a user logged out (and, additionally, what their status message was at that time). This primary usage assumes that the IQ-get is sent to a bare JID &LOCALBARE;. When used in this way, the &QUERY; element contained in the IQ-result has a 'seconds' attribute, which is the number of seconds that have passed since the user last logged out. In addition, the element MAY contain XML character data that specifies the status message of the last unavailable presence received from the user. An example is shown below:</p>
<example caption='Last Activity Query'><![CDATA[
<iq from='[email protected]/orchard'
id='last1'
to='[email protected]'
type='get'>
<query xmlns='jabber:iq:last'/>
</iq>
]]></example>
<p>As specified in &xmppcore; and &xmppim;, an IQ stanza of type "get" sent to a bare JID &LOCALBARE; is handled by the user's server on the user's behalf, not delivered to one or more connected or available resources.</p>
<p>If the requesting entity is not authorized to view the user's presence information (normally via a presence subscription as defined in <cite>XMPP-IM</cite>), the user's server MUST NOT return last activity information but instead MUST return a &forbidden; error in response to the last activity request.</p>
<example caption='Requesting Entity is Not Authorized to Retrieve Last Activity Information'><![CDATA[
<iq from='[email protected]'
id='last1'
to='[email protected]/orchard'
type='error'>
<error type='auth'>
<forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error>
</iq>
]]></example>
<p>If the requesting entity is authorized to view the user's presence information, the server shall return information about the last presence activity recorded by the server for that user.</p>
<example caption='Last Activity Response by Server'><![CDATA[
<iq from='[email protected]'
id='last1'
to='[email protected]/orchard'
type='result'>
<query xmlns='jabber:iq:last' seconds='903'>Heading Home</query>
</iq>
]]></example>
<p>In this example, the user logged out fifteen minutes and three seconds ago, and when they logged out they sent a presence stanza of type='unavailable' whose <status/> element contained the text "Heading Home".</p>
<p>If the user has at least one connected or available resource when the server receives the request, the response MUST (subject to local security policies) contain an empty <query/> element whose 'seconds' attribute is set to a value of '0'.</p>
</section1>
<section1 topic='Online User Query' anchor='online'>
<p>A requesting entity can send a last activity query to the full JID &LOCALFULL; of a connected or available resource associated with an account.</p>
<example caption='Last Activity Query Sent to Full JID'><![CDATA[
<iq from='[email protected]/orchard'
id='last2'
to='[email protected]/balcony'
type='get'>
<query xmlns='jabber:iq:last'/>
</iq>
]]></example>
<p>In this case, the user's server shall either deliver the IQ to an available resource or respond on behalf of the user.</p>
<p>In particular, as with the offline query use case above, if the requesting entity is not authorized to view the user's presence information (normally via a presence subscription as defined in <cite>XMPP IM</cite>), the user's server MUST NOT deliver the IQ-get to an available resource but instead MUST return a &forbidden; error in response to the last activity request.</p>
<example caption='Requesting Entity is Not Authorized to Retrieve Last Activity Information'><![CDATA[
<iq from='[email protected]'
id='last1'
to='[email protected]/orchard'
type='error'>
<error type='auth'>
<forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error>
</iq>
]]></example>
<p>If the user's server delivers the IQ-get to one of the user's available resources, the user's client MAY respond with the idle time of the user (i.e., the last time that a human user interacted with the client application).</p>
<example caption='Last Activity Response by Client'><![CDATA[
<iq from='[email protected]/balcony'
id='last2'
to='[email protected]/orchard'
type='result'>
<query xmlns='jabber:iq:last' seconds='123'/>
</iq>
]]></example>
<p>In the foregoing example, the user has been idle for about two minutes.</p>
<p>Support for this functionality is OPTIONAL. A client that does not support the protocol, or that does not wish to divulge this information, MUST return a &unavailable; error.</p>
<example caption='Service Unavailable Error'><![CDATA[
<iq from='[email protected]/balcony'
id='last2'
to='[email protected]/orchard'
type='error'>
<error type='cancel'>
<service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error>
</iq>
]]></example>
<p>If there is no available resource matching the &LOCALBARE; in the 'to' attribute of the request, the server MUST follow the rules in <cite>XMPP IM</cite> in order to determine what error stanza to return.</p>
</section1>
<section1 topic='Server and Component Query' anchor='server'>
<p>When the last activity query is sent to a server or component (i.e., to a JID of the form &DOMAINBARE;), the information contained in the IQ reply reflects the uptime of the JID sending the reply. The seconds attribute specifies how long the host has been running since it was last (re-)started. The &QUERY; element SHOULD NOT contain XML character data.</p>
<example caption='Last Activity Query Sent to Server or Service'><![CDATA[
<iq from='[email protected]/orchard'
id='last3'
to='capulet.com'
type='get'>
<query xmlns='jabber:iq:last'/>
</iq>
]]></example>
<example caption='Last Activity Response from Server or Service'><![CDATA[
<iq from='capulet.com'
id='last3'
to='[email protected]/orchard'
type='result'>
<query xmlns='jabber:iq:last' seconds='123456'/>
</iq>
]]></example>
<p>In this example, the server has been running for a little more than 34 hours.</p>
</section1>
<section1 topic='Determining Support' anchor='support'>
<p>If an entity supports the Last Activity protocol, it MUST advertise that fact in its responses to &xep0030; information ("disco#info") requests by returning a feature of "jabber:iq:last".</p>
<example caption='Requesting entity queries responding entity regarding protocol support'><![CDATA[
<iq from='[email protected]/roundabout'
id='disco1'
to='jabber.org'
type='get'>
<query xmlns='http://jabber.org/protocol/disco#info'/>
</iq>
]]></example>
<example caption='Responding entity communicates protocol support'><![CDATA[
<iq from='jabber.org'
id='disco1'
to='[email protected]/roundabout'
type='result'>
<query xmlns='http://jabber.org/protocol/disco#info'>
<feature var='jabber:iq:last'/>
</query>
</iq>
]]></example>
<p>In order for an application to determine whether an entity supports this protocol, where possible it SHOULD use the dynamic, presence-based profile of service discovery defined in &xep0115;. However, if an application has not received entity capabilities information from an entity, it SHOULD use explicit service discovery instead.</p>
</section1>
<section1 topic='Implementation Notes' anchor='impl'>
<p>The information contained in an IQ reply for this namespace is inherently ambiguous. Specifically, for a bare JID &LOCALBARE; the information is the time since the JID was last connected to its server; for a full JID &LOCALFULL; the information is the time since the resource was last active in the context of an existing session; and for a bare domain the information is the uptime for the server or component. An application MUST take these differences into account when presenting the information to a human user (if any).</p>
</section1>
<section1 topic='Security Considerations' anchor='security'>
<p>A server MUST NOT allow an unauthorized entity to learn a user's network availability by sending a Last Activity request to a JID of the form &LOCALBARE; or &LOCALFULL;, since doing so would constitute a "presence leak" as described in &rfc6120;. That is, Last Activity information MAY be divulged only to those entities that have permission to view the user's presence via a presence subscription (potentially as restricted by &xep0016; or &xep0191;).</p>
<p>A client MUST provide a way for a human user to disable sending of Last Activity responses from the client's full JID &LOCALFULL;.</p>
</section1>
<section1 topic='IANA Considerations' anchor='iana'>
<p>This document requires no interaction with &IANA;.</p>
</section1>
<section1 topic='XMPP Registrar Considerations' anchor='registrar'>
<p>No action on the part of the ®ISTRAR; is necessary as a result of this document, since 'jabber:iq:last' is already registered in the protocol namespaces registry located at &NAMESPACES;.</p>
</section1>
<section1 topic='XML Schema' anchor='schema'>
<code><![CDATA[
<?xml version='1.0' encoding='UTF-8'?>
<xs:schema
xmlns:xs='http://www.w3.org/2001/XMLSchema'
targetNamespace='jabber:iq:last'
xmlns='jabber:iq:last'
elementFormDefault='qualified'>
<xs:annotation>
<xs:documentation>
The protocol documented by this schema is defined in
XEP-0012: http://www.xmpp.org/extensions/xep-0012.html
</xs:documentation>
</xs:annotation>
<xs:element name='query'>
<xs:complexType>
<xs:simpleContent>
<xs:extension base='xs:string'>
<xs:attribute
name='seconds'
type='xs:unsignedLong'
use='optional'/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
]]></code>
</section1>
</xep>