<?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>Presence Obtained via Kinesthetic Excitation (POKE)</title>
  <abstract>This document defines an XMPP protocol extension that enables probing for presence via physical rather than electronic means.</abstract>
  &LEGALNOTICE;
  <number>0132</number>
  <status>Active</status>
  <type>Humorous</type>
  <sig>None</sig>
  <dependencies>
    <spec>XMPP Core</spec>
    <spec>XMPP IM</spec>
  </dependencies>
  <supersedes/>
  <supersededby/>
  <shortname>poke</shortname>
  &stpeter;
  &hildjj;
  <revision>
    <version>1.0</version>
    <date>2004-04-01</date>
    <initials>psa</initials>
    <remark><p>April Fools!</p></remark>
  </revision>
</header>
<section1 topic='Introduction' anchor='intro'>
  <p>&xmppcore; and &xmppim; define methods for exchanging information about a person's network availability via the XML &lt;presence/&gt; stanza. In general, such presence information is generated only when a person initiates interaction with a client, although it can be generated programmatically through features such as auto-away. However, sometimes a user is present in the vicinity of a client but is not actively engaged with the client interface. In such circumstances, it would be helpful to have a mechanism that is sometimes referred to as &lt;presence type='probe-irl'/&gt;: the ability to invoke a real-life means of determining the physical presence of the user. This document defines just such a mechanism.</p>
</section1>
<section1 topic='Approach' anchor='approach'>
  <p>Physical presence is best determined through direct interaction with an object. In this document, our approach is labelled "kinesthetic excitation": some form of physical contact is initiated with the object (in most cases a user), resulting in hard evidence of presence obtained by a sense modality such as sight, touch, or hearing. To ensure reliability, the physical contact MUST impinge upon the object or user to such an extent that it measurably reacts in the form of motion through space (e.g., moving in relation to a visual observation device), generation of an auditory event (e.g., vocalization), and the like. The exact means of excitation and perception are implementation-specific and therefore not specified fully in this document, although suggestions are provided in the <link url="#protocol-methods">Methods</link> section below.</p>
</section1>
<section1 topic='Protocol' anchor='protocol'>
  <p>In the past, some members of the Jabber community have suggested the addition of a new presence type: "probe-irl". However, this has several drawbacks. First, the XMPP specifications (<cite>XMPP Core</cite> and <cite>XMPP IM</cite>) approved by the IETF do not allow any values for the 'type' attribute other than those defined in the XML schemas for the 'jabber:client' and 'jabber:server' namespaces. Second, presence probes are handled by a server on behalf of a user and therefore are not routed to clients (which presumably often have the best opportunity for discovering evidence of physical presence); an &IQ; stanza is more appropriate for client-to-client information exchange. Therefore, this document defines a general extension mechanism that can be used in both &PRESENCE; and &IQ; stanzas.</p>
  <p>The extension mechanism is encapsulated in a &lt;poke/&gt; element qualified by the 'http://jabber.org/protocol/poke' namespace; this element MAY be included as a direct child of a &PRESENCE; stanza of type "probe" or an &IQ; stanza of type "get" (for a request), "result" (for a successful response), or "error" (for an unsuccessful response).</p>
  <p>The requesting entity MAY specify a preferred method of excitation and observation; in general, these methods correspond to particular sense modalities such as sight, touch, and hearing (see the <link url="#protocol-methods">Methods</link> section below).</p>
  <section2 topic='Presence' anchor='protocol-presence'>
    <p>As defined in <cite>XMPP IM</cite>, presence stanzas of type "probe" are handled on behalf of the target entity by the entity's server. While normally these presence stanzas are generated by the requesting entity's server (e.g., when the requesting entity sends initial presence), the requesting entity itself (or, more precisely, its client) is allowed to generate presence stanzas of type "probe". In this document we make use of this ability to query the target entity's server regarding the entity's physical presence.</p>
    <p>In the following example, a star-crossed lover pokes the server of his beloved to determine her physical presence (notice that the value of 'to' address lacks a resource identifier and therefore is a bare JID, not a full JID).</p>
    <example caption='Poking via the server'><![CDATA[
<presence 
    type='probe'
    from='romeo@montague.net/orchard'
    to='juliet@capulet.com'
    id='poke1'>
  <poke xmlns='http://jabber.org/protocol/poke'/>
</presence>
    ]]></example>
    <p>If the user's server does not support the POKE protocol, it SHOULD ignore the extension and treat the presence stanza as a normal (non-IRL) presence probe. However, the user's server MAY return a "Service Unavailable" error to the requesting entity to inform the requesting entity that IRL probes are not supported (for details regarding error syntax, refer to &xep0086;):</p>
    <example caption='Server returns service unavailable error'><![CDATA[
<presence 
    type='error'
    from='juliet@capulet.com'
    to='romeo@montague.net/orchard'
    id='poke1'>
  <poke xmlns='http://jabber.org/protocol/poke'/>
  <error code='503' type='cancel'>
    <service-unavailable 
        xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
  </error>
</presence>
    ]]></example>
    <p>If the user's server supports the POKE protocol, it MUST first perform appropriate access checks to determine if the requesting entity has permission to view the user's presence (e.g., by checking presence subscriptions and privacy lists). If the user's server determines that the requesting entity is not allowed to learn the user's physical presence information, it MUST return a "Forbidden" error:</p>
    <example caption='Server returns forbidden error'><![CDATA[
<presence 
    type='error'
    from='juliet@capulet.com'
    to='romeo@montague.net/orchard'
    id='poke1'>
  <poke xmlns='http://jabber.org/protocol/poke'/>
  <error code='403' type='auth'>
    <forbidden 
        xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
  </error>
</presence>
    ]]></example>
    <p>If the requesting entity has permission to discover the user's physical presence, the server SHOULD attempt to determine if the user is physically present. Methods for doing so are implementation-specific and therefore out of scope for this document, but possible mechanisms might include:</p>
    <ol>
      <li>sending messages to contacts in the user's roster who would be likely to have knowledge of the user's whereabouts (perhaps derived from physical proximity information gleaned from &xep0054; or &xep0080; data)</li>
      <li>generating an IQ "get" in the 'poke' namespace to each of the user's connected resources</li>
      <li>sending specialized commands to each of the user's connected resources using &xep0050;</li>
    </ol>
    <p>If the server determines that the user is physically present in the vicinity of a client, it SHOULD return that information to the requesting entity, including the appropriate resource:</p>
    <example caption='Server returns success'><![CDATA[
<presence 
    from='juliet@capulet.com/chamber'
    to='romeo@montague.net/orchard'
    id='poke1'>
  <poke xmlns='http://jabber.org/protocol/poke'/>
</presence>
    ]]></example>
    <p>The server SHOULD NOT wait an inordinate amount of time before returning the presence information (e.g., usually not more than two minutes), but the timeout period SHOULD be configurable. If the request times out, the server SHOULD return a "Request Timeout" error to the requesting entity:</p>
    <example caption='Server returns request timeout error'><![CDATA[
<presence 
    type='error'
    from='juliet@capulet.com'
    to='romeo@montague.net/orchard'
    id='poke1'>
  <poke xmlns='http://jabber.org/protocol/poke'/>
  <error code='408' type='wait'>
    <remote-server-timeout 
        xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
  </error>
</presence>
    ]]></example>
    <p>The server SHOULD NOT return a "Not Found" error unless the user does not exist. If the server determines that the user has died, it MAY return a "Gone" error with appropriate descriptive text, although it SHOULD wait to do so pending notification of next-of-kin; note well that such notification is out of scope for this document (though this seems like a sensible application of the &xep0060; protocol):</p>
    <example caption='Server returns gone error'><![CDATA[
<presence 
    type='error'
    from='juliet@capulet.com'
    to='romeo@montague.net/orchard'
    id='poke1'>
  <poke xmlns='http://jabber.org/protocol/poke'/>
  <error code='302' type='cancel'>
    <gone xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
    <text xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>
      Please accept our condolences: the user you are 
      trying to reach has died.
    </text>
  </error>
</presence>
    ]]></example>
  </section2>
  <section2 topic='IQ' anchor='protocol-iq'>
    <p>If the requesting entity knows at least one resource with which the user is currently connected, it MAY send an IQ to the user's full JID (&lt;user@host/resource&gt;) instead of sending a probe to the user's server.</p>
    <example caption='Poking via the client'><![CDATA[
<iq type='get'
    from='romeo@montague.net/orchard'
    to='juliet@capulet.com/balcony'
    id='poke2'>
  <poke xmlns='http://jabber.org/protocol/poke'
        method='taste'/>
</iq>
    ]]></example>
    <p>The same errors as shown above for presence stanzas SHOULD be used by clients responding to IQ stanzas containing POKE protocols (e.g., "Request Timeout" if the user cannot be found in some reasonable period of time), and therefore are not repeated here.</p>
    <p>Note that the preceding example includes the optional 'method' attribute. If the target entity does not support the specified method, it MAY return a "Feature Not Implemented" error:</p>
    <example caption='Client returns feature not implemented error'><![CDATA[
<iq type='error'
    from='juliet@capulet.com/balcony'
    to='romeo@montague.net/orchard'
    id='poke1'>
  <poke xmlns='http://jabber.org/protocol/poke'/>
  <error code='501' type='cancel'>
    <feature-not-implemented 
        xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
  </error>
</iq>
    ]]></example>
    <p>Alternatively, it MAY choose to use some other method that it does implement, in which case it SHOULD specify the method used in the IQ result (this is the recommended behavior).</p>
    <p>If the client determines that the user is physically present, it SHOULD return presence to the requesting entity (subject to privacy lists and any other appropriate access controls):</p>
    <example caption='Client returns success'><![CDATA[
<iq type='result'
    from='juliet@capulet.com/balcony'
    to='romeo@montague.net/orchard'
    id='poke1'>
  <poke xmlns='http://jabber.org/protocol/poke'
        method='touch'/>
</iq>
    ]]></example>
  </section2>
  <section2 topic='Methods' anchor='protocol-methods'>
    <p>The following values of the 'method' attribute are defined and SHOULD be supported by a compliant implementation:</p>
    <ul>
      <li><cite>dna</cite> -- the physical presence of the target entity shall be determined by means of DNA testing; for example, the user's client may take a hair or skin sample from the user (not recommended if the testing time is inordinately long)</li>
      <li><cite>infrared</cite> -- the physical presence of the target entity shall be determined by means of infrared wavelengths; for example, the user's client may scan the area for the telltale heat signature of the user</li>
      <li><cite>sight</cite> -- the physical presence of the target entity shall be determined by means of sight; for example, the user's client may flash a strobe light that draws the user within the range of visual observation (note: this method is limited to visual wavelengths)</li>
      <li><cite>smell</cite> -- the physical presence of the target entity shall be determined by means of olfaction; for example, the user's client may produce a stench known to make the user nervous and sweaty</li>
      <li><cite>sound</cite> -- the physical presence of the target entity shall be determined by means of sound; for example, the user's client may generate a sound so annoying that when the user hears it, he or she reacts vocally in the form of a yell, scream, or imprecation</li>
      <li><cite>taste</cite> -- the physical presence of the target entity shall be determined by means of taste; for example, the user's client may extend a device that licks the user's skin</li>
      <li><cite>touch</cite> -- the physical presence of the target entity shall be determined by means of bodily contact; for example, the user's client may extend a probe that comes into contact with the user's body</li>
    </ul>
  </section2>
</section1>
<section1 topic='Privacy Considerations' anchor='privacy'>
  <p>Determination of physical presence necessarily involves an invasion of the target entity's "personal space". The &XSF; shall not be held liable for any use of this protocol. Client implementations MUST enable the user to disable support for this protocol via configuration options.</p>
</section1>
<section1 topic='Security Considerations' anchor='security'>
  <p>Responding entities (whether server or client) MUST NOT return physical presence information to requesting entities that are not entitled to discover such information.</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'>
  <section2 topic='Protocol Namespaces' anchor='registrar-ns'>
    <p>The &REGISTRAR; shall add the 'http://jabber.org/protocol/poke' namespace to its registry of protocol namespaces.</p>
  </section2>
  <section2 topic='Method Values' anchor='registrar-methods'>
    <p>The XMPP Registrar shall maintain a registry of values for the 'method' attribute. The following values shall be added initially:</p>
    <ul>
      <li>dna</li>
      <li>infrared</li>
      <li>sight</li>
      <li>smell</li>
      <li>sound</li>
      <li>taste</li>
      <li>touch</li>
    </ul>
  </section2>
</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='http://jabber.org/protocol/poke'
    xmlns='http://jabber.org/protocol/poke'
    elementFormDefault='qualified'>

  <xs:annotation>
    <xs:documentation>
      The protocol documented by this schema is defined in
      XEP-0132: http://www.xmpp.org/extensions/xep-0132.html
    </xs:documentation>
  </xs:annotation>

  <xs:element name='poke'>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base='empty'>
          <xs:attribute name='method' 
                        use='optional' 
                        type='xs:NCName'/>
        </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>
  ]]></code>
</section1>
</xep>
