<?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>Server IP Check</title>
  <abstract>This specification defines a simple XMPP extension that enables a client to discover its external IP address.</abstract>
  &LEGALNOTICE;
  <number>xxxx</number>
  <status>ProtoXEP</status>
  <type>Standards Track</type>
  <sig>Standards</sig>
  <approver>Council</approver>
  <dependencies>
    <spec>XMPP Core</spec>
  </dependencies>
  <supersedes/>
  <supersededby/>
  <shortname>sic</shortname>
  &stpeter;
  <revision>
    <version>0.0.2</version>
    <date>2009-03-10</date>
    <initials>psa</initials>
    <remark><p>Removed client inclusion of its IP address; added IPv6 example.</p></remark>
  </revision>
  <revision>
    <version>0.0.1</version>
    <date>2009-03-10</date>
    <initials>psa</initials>
    <remark><p>First draft.</p></remark>
  </revision>
</header>

<section1 topic='Introduction' anchor='intro'>
  <p>There are times when a client might want or need to discover what its external Internet Protocol (IP) address is, e.g. when gathering transport candidates for &xep0065; or &xep0176;. One way to do so is for the client to ask the XMPP server to which it has connected. This simple specification defines such a method.</p>
</section1>

<section1 topic='Protocol' anchor='proto'>
  <p>First the client sends an IQ-get request to its server.</p>
  <example caption="Client requests its IP address from the server"><![CDATA[
<iq from='romeo@montague.lit/orchard'
    id='ik2s7159'
    type='get'>
  <ip xmlns='urn:xmpp:sic:0'/>
</iq>
  ]]></example>
  <p>The server then returns an IQ-result containing an &lt;ip/&gt; element whose XML character data specifies the client's IP address according to the server.</p>
  <example caption="Server returns IP address"><![CDATA[
<iq id='ik2s7159'
    to='romeo@montague.lit/orchard'
    type='result'>
  <ip xmlns='urn:xmpp:sic:0'>192.168.4.1</ip>
</iq>
  ]]></example>
  <p>The IP address could be IPv4 or IPv6.</p>
  <example caption="Server returns IPv6 address"><![CDATA[
<iq id='ik2s7159'
    to='romeo@montague.lit/orchard'
    type='result'>
  <ip xmlns='urn:xmpp:sic:0'>2001:db8::9:1</ip>
</iq>
  ]]></example>
</section1>

<section1 topic='Determining Support' anchor='support'>
  <p>If an entity supports this protocol, it MUST report that by including a service discovery feature of "urn:xmpp:sic:0" in response to disco#info requests &NSNOTE;.</p>
  <example caption="Service discovery information request"><![CDATA[
<iq from='romeo@montague.lit/orchard'
    id='ux71f395'
    to='montague.lit'
    type='get'>
  <query xmlns='http://jabber.org/protocol/disco#info'/>
</iq>
  ]]></example>
  <example caption="Service discovery information response"><![CDATA[
<iq from='montague.lit'
    id='ux71f395'
    to='romeo@montague.lit/orchard'
    type='result'>
  <query xmlns='http://jabber.org/protocol/disco#info'>
    <feature var='urn:xmpp:sic:0'/>
  </query>
</iq>
  ]]></example>
</section1>

<section1 topic='Security Considerations' anchor='security'>
  <p>&rfc3920; specifies that client IP addresses shall not be made public. If a client requests its own IP address, that policy is not violated. However, a server MUST NOT return the IP address of another client (e.g., if a connected client sends a SIC request to the bare JID of another user); instead, it MUST return a &forbidden; error.</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>This specification defines the following XML namespace:</p>
    <ul>
      <li>urn:xmpp:sic:0</li>
    </ul>
    <p>Upon advancement of this specification from a status of Experimental to a status of Draft, the &REGISTRAR; shall add the foregoing namespace to the registry located at &NAMESPACES;, as described in Section 4 of &xep0053;.</p>
  </section2>
  <section2 topic='Protocol Versioning' anchor='registrar-versioning'>
    &NSVER;
  </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='urn:xmpp:sic:0'
    xmlns='urn:xmpp:sic:0'
    elementFormDefault='qualified'>

  <xs:element name='ip' type='xs:string'/>

</xs:schema>
  ]]></code>
</section1>

<section1 topic='Acknowledgements' anchor='acks'>
  <p>Thanks to Thiago Camargo and Diana Cionoiu for their prodding to define this extension.</p>
</section1>

</xep>